shares are updated now and visible
[mTask.git] / client / sds.c
1 #include <stdlib.h>
2 #include <string.h>
3
4 #ifndef STM
5 #include <unistd.h>
6 #include <stdio.h>
7 #endif
8
9 #include "interface.h"
10 #include "interpret.h"
11 #include "sds.h"
12
13 struct sds sdss[MAXSDSS];
14 uint8_t c;
15
16 void sds_init(void)
17 {
18 memset(&sdss, 0, sizeof(struct sds)*MAXSDSS);
19 }
20
21 void sds_register(void)
22 {
23 uint8_t cs;
24 for(cs = 0; cs<MAXSDSS; cs++)
25 if(!sdss[cs].used)
26 break;
27
28 if(cs == MAXSDSS)
29 die("Trying to add too much sdss...");
30
31 memset(&sdss[cs], 0, sizeof(struct sds));
32 //Read identifier
33 sdss[cs].id = read16();
34 //Read value
35 sdss[cs].type = read_byte();
36 sdss[cs].value = read16();
37
38 debug("Received sds %d: %d", sdss[cs].id, sdss[cs].value);
39 sdss[cs].used = true;
40
41 write_byte('s');
42 write16(sdss[cs].id);
43 write_byte('\n');
44 }
45
46 void sds_delete(void)
47 {
48 uint8_t cs;
49 cs = read16();
50 sdss[cs].used = false;
51 write_byte('a');
52 write16(sdss[cs].id);
53 write_byte('\n');
54 }
55
56 bool sds_update(void)
57 {
58 uint8_t cs, id;
59 //Read identifier
60 id = read16();
61
62 for(cs = 0; cs<MAXSDSS; cs++){
63 if(!sdss[cs].used)
64 continue;
65 if(sdss[cs].id == id){
66 //Read value
67 sdss[cs].value = read16();
68 debug("Received sds update %d: %d",
69 sdss[cs].id, sdss[cs].value);
70 write_byte('u');
71 write16(sdss[cs].id);
72 write_byte('\n');
73 return true;
74 }
75 }
76 return false;
77 }
78
79 void sds_publish(int id)
80 {
81 uint8_t cs;
82 for(cs = 0; cs<MAXSDSS; cs++){
83 if(sdss[cs].used && sdss[cs].id == id){
84 debug("Publish %d=%d", sdss[cs].id, sdss[cs].value);
85 write_byte('p');
86 write16(sdss[cs].id);
87 write_byte(sdss[cs].type);
88 write16(sdss[cs].value);
89 write_byte('\n');
90 return;
91 }
92 }
93 debug("SDS identifier unknown: %d", id);
94 die("");
95 }
96
97 int sds_fetch(int id)
98 {
99 uint8_t cs;
100 for(cs = 0; cs<MAXSDSS; cs++)
101 if(sdss[cs].used && sdss[cs].id == id)
102 return sdss[cs].value;
103 debug("SDS identifier unknown: %d", id);
104 die("");
105 return 0;
106 }
107
108 void sds_store(int id, int val)
109 {
110 uint8_t cs;
111 for(cs = 0; cs<MAXSDSS; cs++) {
112 if(sdss[cs].used && sdss[cs].id == id){
113 sdss[cs].value = val;
114 return;
115 }
116 }
117 debug("SDS identifier unknown: %d", id);
118 die("");
119 }