robustify task and sds initialization
[mTask.git] / int / sds.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5
6 #include "mTaskSymbols.h"
7 #include "interpret.h"
8 #include "misc.h"
9 #include "sds.h"
10
11 struct sds sdss[MAXSDSS];
12 uint8_t c;
13
14 void sds_init()
15 {
16 memset(&sdss, 0, sizeof(struct sds)*MAXSDSS);
17 }
18
19 void sds_register(int fd)
20 {
21 uint8_t cs;
22 for(cs = 0; cs<MAXSDSS; cs++)
23 if(!sdss[cs].used)
24 break;
25
26 if(cs == MAXSDSS)
27 die("Trying to add too much tasks...\n");
28
29 memset(&sdss[cs], 0, sizeof(struct sds));
30 //Read identifier
31 read16(fd, c, sdss[cs].id);
32 //Read value
33 read16(fd, c, sdss[cs].value);
34
35 debug("\nReceived sds %d: %d\n", sdss[cs].id, sdss[cs].value);
36 sdss[cs].used = true;
37 }
38
39 bool sds_update(int fd)
40 {
41 uint8_t cs, id;
42 //Read identifier
43 read(fd, &id, 1);
44
45 for(cs = 0; cs<MAXSDSS; cs++){
46 if(!sdss[cs].used)
47 continue;
48 if(sdss[cs].id == id){
49 //Read value
50 read16(fd, c, sdss[cs].value);
51 return true;
52 }
53 }
54 return false;
55 }
56
57 void sds_publish(int id, int fd)
58 {
59 uint8_t cs;
60 char msg[6];
61 for(cs = 0; cs<MAXSDSS; cs++){
62 if(sdss[cs].used && sdss[cs].id == id){
63 debug("Publish %d=%d\n", sdss[cs].id, sdss[cs].value);
64 sprintf(msg, "u%c%c%c%c\n",
65 0,
66 sdss[cs].id,
67 sdss[cs].value/265,
68 sdss[cs].value%265);
69 write(fd, msg, 6);
70 return;
71 }
72 }
73 debug("SDS identifier unknown: %d\n", id);
74 }
75
76 int sds_fetch(int id)
77 {
78 uint8_t cs;
79 for(cs = 0; cs<MAXSDSS; cs++)
80 if(sdss[cs].used && sdss[cs].id == id)
81 return sdss[cs].value;
82 debug("SDS identifier unknown: %d\n", id);
83 return 0;
84 }
85
86 void sds_store(int id, int val)
87 {
88 uint8_t cs;
89 for(cs = 0; cs<MAXSDSS; cs++) {
90 if(sdss[cs].used && sdss[cs].id == id){
91 sdss[cs].value = val;
92 return;
93 }
94 }
95 debug("SDS identifier unknown: %d\n", id);
96 }