ea1218f1
henyxia
UI finished
|
1
2
3
4
5
|
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
|
d4d5bb6d
henyxia
Bus working
|
6
7
|
#include <stdbool.h>
#include <termios.h>
|
ea1218f1
henyxia
UI finished
|
8
|
#include "ui.h"
|
d4d5bb6d
henyxia
Bus working
|
9
|
#include "bus.h"
|
ea1218f1
henyxia
UI finished
|
10
11
12
|
#define TIME_LENGTH 24
#define HEADER_TEXT_LENGTH 24
|
3bdc9daf
henyxia
NFC Added
|
13
|
#define LOG_LINES 35
|
297a72df
henyxia
Added sender
|
14
|
#define LOG_LENGTH 82
|
cdaa873f
henyxia
Log fixed
|
15
16
|
#define IPS 20
#define SCREEN_TIME 1000000/IPS
|
19082eeb
henyxia
UI design not wor...
|
17
|
#define SPACES " "
|
ea1218f1
henyxia
UI finished
|
18
|
|
ea1218f1
henyxia
UI finished
|
19
20
21
22
|
char uilog[LOG_LINES][LOG_LENGTH];
char started[TIME_LENGTH];
char uid[HEADER_TEXT_LENGTH];
char uidDate[HEADER_TEXT_LENGTH];
|
d4d5bb6d
henyxia
Bus working
|
23
|
char cmd[LOG_LENGTH];
|
cdaa873f
henyxia
Log fixed
|
24
|
pid_t mainPid;
|
d4d5bb6d
henyxia
Bus working
|
25
26
27
28
29
30
31
32
33
34
35
|
bool heat = false;
bool pump = false;
unsigned int temp = 1;
unsigned int debit = 1;
struct termios old={0};
bool uiStop = false;
void stopUI()
{
uiStop = true;
}
|
cdaa873f
henyxia
Log fixed
|
36
37
38
|
void* drawUI(void* we)
{
|
d4d5bb6d
henyxia
Bus working
|
39
|
while(!uiStop)
|
cdaa873f
henyxia
Log fixed
|
40
41
42
43
44
45
46
47
|
{
printf("\x1b[2J\x1b[1;1H");
displayUI();
usleep(SCREEN_TIME);
}
return NULL;
}
|
ea1218f1
henyxia
UI finished
|
48
|
|
d4d5bb6d
henyxia
Bus working
|
49
50
51
52
53
54
55
56
57
58
59
|
void setDFG(void)
{
if(tcgetattr(0, &old)<0)
perror("tcsetattr()");
old.c_lflag&=~ICANON;
old.c_cc[VMIN]=1;
old.c_cc[VTIME]=0;
if(tcsetattr(0, TCSANOW, &old)<0)
perror("tcsetattr ICANON");
}
|
3bdc9daf
henyxia
NFC Added
|
60
61
62
63
64
65
66
|
void setTagName(char* tag)
{
time_t now = time(NULL);
strcpy(uid, tag);
strftime(uidDate, HEADER_TEXT_LENGTH, "%F-%T:%d", localtime(&now));
}
|
ea1218f1
henyxia
UI finished
|
67
68
|
void initUILog()
{
|
d4d5bb6d
henyxia
Bus working
|
69
70
|
setDFG();
cmd[0]='\0';
|
cdaa873f
henyxia
Log fixed
|
71
72
|
started[0]='\0';
mainPid = getpid();
|
ea1218f1
henyxia
UI finished
|
73
74
75
76
77
78
|
uid[0]='\0';
uidDate[0]='\0';
for(int i=0; i<LOG_LINES; i++)
uilog[i][0] = '\0';
}
|
19082eeb
henyxia
UI design not wor...
|
79
|
char* fillHeaderWithSpaces(char* buf, char* text)
|
ea1218f1
henyxia
UI finished
|
80
|
{
|
19082eeb
henyxia
UI design not wor...
|
81
|
char tmpretheader[HEADER_TEXT_LENGTH+1];
|
ea1218f1
henyxia
UI finished
|
82
83
84
85
|
strcpy(tmpretheader, text);
while(strlen(tmpretheader) < HEADER_TEXT_LENGTH)
strcat(tmpretheader, " ");
|
19082eeb
henyxia
UI design not wor...
|
86
87
88
89
90
|
for(int i=0; i<strlen(tmpretheader); i++)
buf[i] = tmpretheader[i];
buf[strlen(tmpretheader)] = '\0';
return buf;
|
ea1218f1
henyxia
UI finished
|
91
92
93
94
|
}
void addToLog(char* newStr)
{
|
cdaa873f
henyxia
Log fixed
|
95
|
for(int i=LOG_LINES-2; i>=0; i--)
|
ea1218f1
henyxia
UI finished
|
96
97
98
99
|
strcpy(uilog[i+1], uilog[i]);
strcpy(uilog[0], newStr);
}
|
19082eeb
henyxia
UI design not wor...
|
100
|
char* fillLogWithSpaces(char* buf, char* text)
|
ea1218f1
henyxia
UI finished
|
101
|
{
|
19082eeb
henyxia
UI design not wor...
|
102
|
strncpy(buf, text, LOG_LENGTH);
|
19082eeb
henyxia
UI design not wor...
|
103
|
if(strlen(buf) > 0)
|
297a72df
henyxia
Added sender
|
104
|
strncat(buf, SPACES, LOG_LENGTH-strlen(buf)-1);
|
19082eeb
henyxia
UI design not wor...
|
105
|
else
|
297a72df
henyxia
Added sender
|
106
|
strncat(buf, SPACES, LOG_LENGTH-strlen(buf)-1-12);
|
19082eeb
henyxia
UI design not wor...
|
107
108
|
return buf;
|
ea1218f1
henyxia
UI finished
|
109
110
|
}
|
d4d5bb6d
henyxia
Bus working
|
111
112
113
114
115
116
117
|
char* fillStatusWithSpaces(char* buf, char* text)
{
strncpy(buf, text, LOG_LENGTH);
strncat(buf, SPACES, LOG_LENGTH-strlen(buf)-1-7);
return buf;
}
|
ea1218f1
henyxia
UI finished
|
118
119
120
121
122
123
|
void setStartTime(char* sT)
{
strcpy(started, sT);
}
|
d4d5bb6d
henyxia
Bus working
|
124
125
126
127
128
129
130
131
|
char getch()
{
char buf=0;
if(read(0,&buf,1)<0)
perror("read()");
return buf;
}
|
ea1218f1
henyxia
UI finished
|
132
133
|
void displayUI()
{
|
19082eeb
henyxia
UI design not wor...
|
134
|
char buffer[LOG_LENGTH];
|
d4d5bb6d
henyxia
Bus working
|
135
136
137
138
139
140
|
struct timeval tv = {0, 5000};
char bufferO[4];
fd_set rdfs;
FD_ZERO(&rdfs);
FD_SET(STDIN_FILENO, &rdfs);
select(1, &rdfs, NULL, NULL, &tv);
|
ea1218f1
henyxia
UI finished
|
141
142
|
//header
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");
|
19082eeb
henyxia
UI design not wor...
|
143
|
printf("\u2503 %s \u2503 T H E \u2503", fillHeaderWithSpaces(buffer, "Started since"));
|
ea1218f1
henyxia
UI finished
|
144
|
sprintf(buffer, "%s", strlen(uidDate) > 0 ? uidDate : "Waiting for a tag");
|
3bdc9daf
henyxia
NFC Added
|
145
146
147
|
printf(" %s \u2503\n", fillHeaderWithSpaces(buffer, buffer));
printf("\u2503 %s \u2503 T W E E K \u2503 ", fillHeaderWithSpaces(buffer, started));
printf("%s \u2503\n", fillHeaderWithSpaces(buffer, " "));
|
cdaa873f
henyxia
Log fixed
|
148
|
sprintf(buffer, "PID %d", mainPid);
|
19082eeb
henyxia
UI design not wor...
|
149
|
printf("\u2503 %s \u2503 P R O J E C T \u2503 ", fillHeaderWithSpaces(buffer, buffer));
|
ea1218f1
henyxia
UI finished
|
150
|
sprintf(buffer, "UID : %s", strlen(uid) > 0 ? uid : "Nope");
|
19082eeb
henyxia
UI design not wor...
|
151
|
printf("%s \u2503\n", fillHeaderWithSpaces(buffer, buffer));
|
d4d5bb6d
henyxia
Bus working
|
152
153
154
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\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");
sprintf(buffer, "\u2503 HEAT[%s] %02d\u2103 PUMP[%s] %04d", heat ? "ON " : "OFF", temp, pump ? "ON " : "OFF", debit);
printf("%s \u2503\n", fillStatusWithSpaces(buffer, buffer));
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");
|
ea1218f1
henyxia
UI finished
|
156
|
//body
|
19082eeb
henyxia
UI design not wor...
|
157
158
159
160
161
162
|
int i=0;
while(i<LOG_LINES)
{
printf("\u2503 %s \u2503\n", fillLogWithSpaces(buffer, uilog[LOG_LINES-i-1]));
i++;
}
|
d4d5bb6d
henyxia
Bus working
|
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
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");
//cmd
if(FD_ISSET(STDIN_FILENO, &rdfs))
{
bufferO[0] = getch();
if(bufferO[0] >= 65 && bufferO[0] <= 90 && bufferO[1] == '\0')
{
sprintf(buffer, "%c", bufferO[0] + 32);
strcat(cmd, buffer);
}
else if(bufferO[0] >= 97 && bufferO[0] <= 122 && bufferO[1] == '\0')
{
sprintf(buffer, "%c", bufferO[0]);
strcat(cmd, buffer);
}
else if(bufferO[0] == 32)
{
sprintf(buffer, "%c", bufferO[0]);
strcat(cmd, buffer);
}
else if(bufferO[0] == 10)
{
sendToBus(cmd);
cmd[0]='\0';
}
else if(bufferO[0] == 127)
{
if(strlen(cmd)>0)
cmd[strlen(cmd)-1]='\0';
}
else
{
//sprintf(buffer, "Unrecognized %02x", bufferO[0]);
//strcat(cmd, buffer);
}
}
sprintf(buffer, "\u2503> %s", cmd);
printf("%s\u2503\n", fillStatusWithSpaces(buffer, buffer));
|
ea1218f1
henyxia
UI finished
|
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");
|
d4d5bb6d
henyxia
Bus working
|
202
203
|
printf("\x1b[2A\x1b[%dC", strlen(cmd) + 3);
fflush(stdout);
|
ea1218f1
henyxia
UI finished
|
204
|
}
|