Commit d4d5bb6dd9aab8aa3995380f51d21c258ced71ff
1 parent
3bdc9daf
Bus working
tweekd can now exit cleanly
Showing
8 changed files
with
203 additions
and
6 deletions
Show diff stats
Makefile
... | ... | @@ -0,0 +1,82 @@ |
1 | +#include <stdio.h> | |
2 | +#include <stdbool.h> | |
3 | +#include <unistd.h> | |
4 | +#include <sys/types.h> | |
5 | +#include <sys/stat.h> | |
6 | +#include <fcntl.h> | |
7 | +#include <errno.h> | |
8 | +#include <string.h> | |
9 | +#include "printx.h" | |
10 | +#include "ui.h" | |
11 | +#include "nfc.h" | |
12 | + | |
13 | +#define CMD_MAX 70 | |
14 | + | |
15 | +int bus; | |
16 | +bool busFree = true; | |
17 | +bool busStop = false; | |
18 | + | |
19 | +void stopBus() | |
20 | +{ | |
21 | + busStop = true; | |
22 | +} | |
23 | + | |
24 | +void processCmd(char* buffer) | |
25 | +{ | |
26 | + buffer[strlen(buffer)-1]='\0'; | |
27 | + if(strcmp(buffer, "quit") == 0 || strcmp(buffer, "exit") == 0) | |
28 | + { | |
29 | + printx(INFO, BUS, "Exit request receved, processing ...\n"); | |
30 | + stopNFC(); | |
31 | + //stopHVC(); | |
32 | + stopBus(); | |
33 | + stopUI(); | |
34 | + } | |
35 | + //else | |
36 | + //printx(DEBUG, BUS, "STRLEN : %d and strcmp ret %d", strlen(buffer), strcmp(buffer, "quit")); | |
37 | +} | |
38 | + | |
39 | +void* processBus(void* we) | |
40 | +{ | |
41 | + bus = open("bus.log", O_RDWR); | |
42 | + char buffer[CMD_MAX]; | |
43 | + printx(DEBUG, BUS, "Waiting for events\n"); | |
44 | + while(!busStop) | |
45 | + { | |
46 | + while(busFree); | |
47 | + while(!busFree); | |
48 | + printx(DEBUG, BUS, "Event receved !\n"); | |
49 | + busFree = false; | |
50 | + lseek(bus, 0, SEEK_SET); | |
51 | + printx(DEBUG, BUS, "Data read %d\n", read(bus, buffer, CMD_MAX)); | |
52 | + ftruncate(bus, 0); | |
53 | + sync(); | |
54 | + processCmd(buffer); | |
55 | + busFree = true; | |
56 | + printx(DEBUG, BUS, buffer); | |
57 | + } | |
58 | + return NULL; | |
59 | +} | |
60 | + | |
61 | +bool initBus() | |
62 | +{ | |
63 | + bus = creat("bus.log", 0666); | |
64 | + if(bus == -1) | |
65 | + { | |
66 | + printf("Unable to open the bus file\n"); | |
67 | + return false; | |
68 | + } | |
69 | + | |
70 | + return true; | |
71 | +} | |
72 | + | |
73 | +void sendToBus(char* cmd) | |
74 | +{ | |
75 | + while(!busFree); | |
76 | + busFree = false; | |
77 | + ftruncate(bus, 0); | |
78 | + ftruncate(bus, CMD_MAX); | |
79 | + lseek(bus, 0, SEEK_SET); | |
80 | + dprintf(bus, "%s\n", cmd); | |
81 | + busFree = true; | |
82 | +} | ... | ... |
... | ... | @@ -3,13 +3,14 @@ |
3 | 3 | #include "printx.h" |
4 | 4 | #include "ui.h" |
5 | 5 | #include "nfc.h" |
6 | +#include "bus.h" | |
6 | 7 | |
7 | 8 | #include <unistd.h> |
8 | 9 | |
9 | 10 | int main(void) |
10 | 11 | { |
11 | 12 | int ret; |
12 | - pthread_t tUI, tNFC;//tHVC | |
13 | + pthread_t tUI, tNFC, tBUS;//tHVC | |
13 | 14 | initUILog(); |
14 | 15 | if(!initLog()) |
15 | 16 | { |
... | ... | @@ -28,6 +29,12 @@ int main(void) |
28 | 29 | return 2; |
29 | 30 | } |
30 | 31 | pthread_create(&tNFC, NULL, processNFC, NULL); |
32 | + if(!initBus()) | |
33 | + { | |
34 | + printx(ERROR, MAIN, "Unable to start the BUS interface\n"); | |
35 | + return 3; | |
36 | + } | |
37 | + pthread_create(&tBUS, NULL, processBus, NULL); | |
31 | 38 | pthread_join(tUI, NULL); |
32 | 39 | closeLog(); |
33 | 40 | return 0; | ... | ... |
... | ... | @@ -27,7 +27,7 @@ |
27 | 27 | |
28 | 28 | // Globals |
29 | 29 | int serial_fd = -1; |
30 | -bool stop = false; | |
30 | +bool nfcStop = false; | |
31 | 31 | struct termios saveterm; |
32 | 32 | |
33 | 33 | bool init_serial(char* device, int speed) |
... | ... | @@ -61,6 +61,12 @@ void close_serial() |
61 | 61 | close(serial_fd); |
62 | 62 | } |
63 | 63 | |
64 | +void stopNFC() | |
65 | +{ | |
66 | + close_serial(); | |
67 | + nfcStop = true; | |
68 | +} | |
69 | + | |
64 | 70 | unsigned char getData() |
65 | 71 | { |
66 | 72 | unsigned char buf; |
... | ... | @@ -150,7 +156,7 @@ void* processNFC(void* we) |
150 | 156 | char myTag[NFC_TAG_LENGTH]; |
151 | 157 | char buffer[NFC_TAG_LENGTH]; |
152 | 158 | |
153 | - while(!stop) | |
159 | + while(!nfcStop) | |
154 | 160 | { |
155 | 161 | printx(DEBUG, NFC, "Scanning for tags\n"); |
156 | 162 | if(isTagPresent(buffer)) | ... | ... |
... | ... | @@ -3,7 +3,10 @@ |
3 | 3 | #include <unistd.h> |
4 | 4 | #include <string.h> |
5 | 5 | #include <time.h> |
6 | +#include <stdbool.h> | |
7 | +#include <termios.h> | |
6 | 8 | #include "ui.h" |
9 | +#include "bus.h" | |
7 | 10 | |
8 | 11 | #define TIME_LENGTH 24 |
9 | 12 | #define HEADER_TEXT_LENGTH 24 |
... | ... | @@ -17,11 +20,23 @@ char uilog[LOG_LINES][LOG_LENGTH]; |
17 | 20 | char started[TIME_LENGTH]; |
18 | 21 | char uid[HEADER_TEXT_LENGTH]; |
19 | 22 | char uidDate[HEADER_TEXT_LENGTH]; |
23 | +char cmd[LOG_LENGTH]; | |
20 | 24 | pid_t mainPid; |
25 | +bool heat = false; | |
26 | +bool pump = false; | |
27 | +unsigned int temp = 1; | |
28 | +unsigned int debit = 1; | |
29 | +struct termios old={0}; | |
30 | +bool uiStop = false; | |
31 | + | |
32 | +void stopUI() | |
33 | +{ | |
34 | + uiStop = true; | |
35 | +} | |
21 | 36 | |
22 | 37 | void* drawUI(void* we) |
23 | 38 | { |
24 | - while(1) | |
39 | + while(!uiStop) | |
25 | 40 | { |
26 | 41 | printf("\x1b[2J\x1b[1;1H"); |
27 | 42 | displayUI(); |
... | ... | @@ -31,6 +46,17 @@ void* drawUI(void* we) |
31 | 46 | return NULL; |
32 | 47 | } |
33 | 48 | |
49 | +void setDFG(void) | |
50 | +{ | |
51 | + if(tcgetattr(0, &old)<0) | |
52 | + perror("tcsetattr()"); | |
53 | + old.c_lflag&=~ICANON; | |
54 | + old.c_cc[VMIN]=1; | |
55 | + old.c_cc[VTIME]=0; | |
56 | + if(tcsetattr(0, TCSANOW, &old)<0) | |
57 | + perror("tcsetattr ICANON"); | |
58 | +} | |
59 | + | |
34 | 60 | void setTagName(char* tag) |
35 | 61 | { |
36 | 62 | time_t now = time(NULL); |
... | ... | @@ -40,6 +66,8 @@ void setTagName(char* tag) |
40 | 66 | |
41 | 67 | void initUILog() |
42 | 68 | { |
69 | + setDFG(); | |
70 | + cmd[0]='\0'; | |
43 | 71 | started[0]='\0'; |
44 | 72 | mainPid = getpid(); |
45 | 73 | uid[0]='\0'; |
... | ... | @@ -80,15 +108,36 @@ char* fillLogWithSpaces(char* buf, char* text) |
80 | 108 | return buf; |
81 | 109 | } |
82 | 110 | |
111 | +char* fillStatusWithSpaces(char* buf, char* text) | |
112 | +{ | |
113 | + strncpy(buf, text, LOG_LENGTH); | |
114 | + strncat(buf, SPACES, LOG_LENGTH-strlen(buf)-1-7); | |
115 | + | |
116 | + return buf; | |
117 | +} | |
83 | 118 | |
84 | 119 | void setStartTime(char* sT) |
85 | 120 | { |
86 | 121 | strcpy(started, sT); |
87 | 122 | } |
88 | 123 | |
124 | +char getch() | |
125 | +{ | |
126 | + char buf=0; | |
127 | + if(read(0,&buf,1)<0) | |
128 | + perror("read()"); | |
129 | + return buf; | |
130 | +} | |
131 | + | |
89 | 132 | void displayUI() |
90 | 133 | { |
91 | 134 | char buffer[LOG_LENGTH]; |
135 | + struct timeval tv = {0, 5000}; | |
136 | + char bufferO[4]; | |
137 | + fd_set rdfs; | |
138 | + FD_ZERO(&rdfs); | |
139 | + FD_SET(STDIN_FILENO, &rdfs); | |
140 | + select(1, &rdfs, NULL, NULL, &tv); | |
92 | 141 | //header |
93 | 142 | printf("\u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n"); |
94 | 143 | printf("\u2503 %s \u2503 T H E \u2503", fillHeaderWithSpaces(buffer, "Started since")); |
... | ... | @@ -100,7 +149,10 @@ void displayUI() |
100 | 149 | printf("\u2503 %s \u2503 P R O J E C T \u2503 ", fillHeaderWithSpaces(buffer, buffer)); |
101 | 150 | sprintf(buffer, "UID : %s", strlen(uid) > 0 ? uid : "Nope"); |
102 | 151 | printf("%s \u2503\n", fillHeaderWithSpaces(buffer, buffer)); |
103 | - printf("\u2522\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253B\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253B\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n"); | |
152 | + printf("\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253B\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u253B\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n"); | |
153 | + sprintf(buffer, "\u2503 HEAT[%s] %02d\u2103 PUMP[%s] %04d", heat ? "ON " : "OFF", temp, pump ? "ON " : "OFF", debit); | |
154 | + printf("%s \u2503\n", fillStatusWithSpaces(buffer, buffer)); | |
155 | + printf("\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n"); | |
104 | 156 | //body |
105 | 157 | int i=0; |
106 | 158 | while(i<LOG_LINES) |
... | ... | @@ -108,5 +160,45 @@ void displayUI() |
108 | 160 | printf("\u2503 %s \u2503\n", fillLogWithSpaces(buffer, uilog[LOG_LINES-i-1])); |
109 | 161 | i++; |
110 | 162 | } |
163 | + printf("\u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n"); | |
164 | + //cmd | |
165 | + if(FD_ISSET(STDIN_FILENO, &rdfs)) | |
166 | + { | |
167 | + bufferO[0] = getch(); | |
168 | + if(bufferO[0] >= 65 && bufferO[0] <= 90 && bufferO[1] == '\0') | |
169 | + { | |
170 | + sprintf(buffer, "%c", bufferO[0] + 32); | |
171 | + strcat(cmd, buffer); | |
172 | + } | |
173 | + else if(bufferO[0] >= 97 && bufferO[0] <= 122 && bufferO[1] == '\0') | |
174 | + { | |
175 | + sprintf(buffer, "%c", bufferO[0]); | |
176 | + strcat(cmd, buffer); | |
177 | + } | |
178 | + else if(bufferO[0] == 32) | |
179 | + { | |
180 | + sprintf(buffer, "%c", bufferO[0]); | |
181 | + strcat(cmd, buffer); | |
182 | + } | |
183 | + else if(bufferO[0] == 10) | |
184 | + { | |
185 | + sendToBus(cmd); | |
186 | + cmd[0]='\0'; | |
187 | + } | |
188 | + else if(bufferO[0] == 127) | |
189 | + { | |
190 | + if(strlen(cmd)>0) | |
191 | + cmd[strlen(cmd)-1]='\0'; | |
192 | + } | |
193 | + else | |
194 | + { | |
195 | + //sprintf(buffer, "Unrecognized %02x", bufferO[0]); | |
196 | + //strcat(cmd, buffer); | |
197 | + } | |
198 | + } | |
199 | + sprintf(buffer, "\u2503> %s", cmd); | |
200 | + printf("%s\u2503\n", fillStatusWithSpaces(buffer, buffer)); | |
111 | 201 | printf("\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n"); |
202 | + printf("\x1b[2A\x1b[%dC", strlen(cmd) + 3); | |
203 | + fflush(stdout); | |
112 | 204 | } | ... | ... |