]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/displayd/uoled.h
4fd8f20f2cd28031c88beb17d23bcf135cc02e2a
[eurobot/public.git] / src / displayd / uoled.h
1 /**
2  * @file uoled.h
3  * @author (Martin Zidek) Mojmir Kittler
4  * 
5  * @brief Library for communication with uOLED display using serial interface,
6  */
7
8 /**
9 \defgroup uoled uOLED display
10 Set of libraries for interfacing the uOLED touchscreen attached to BOA.
11
12 Parts:
13 - \ref uoled
14
15 \section uoled uoled library
16
17 Library uoled contains functions, which create control messages in proper format
18 for communication with the display on serial port.
19
20 \section protocol Communication protocol
21
22 S displejem se bude komunikovat pomoci zprav. Z robota (ci PC) do
23    displeje bude obsahovat prvni byte identifikator toho co se posila
24    a pak data. Muze se to udelat tak, ze identifikator bude mit vzdy
25    nahozen bit c. 7 (tj. bude betsi nez 128) a data budou mit tento
26    bit vzdy 0 (jen spodnich 7 bitu = ASCII).
27
28    I kdyz se nejaky byte po ceste ztrati, displej bude schopen se
29    zasynchronizovat a nestane se to co vloni, ze obcas se to nejak
30    rozsynchronizovalo a displej zobrazoval kraviny.
31
32    Dalsi dusledek tohoto bude, ze kdyz se zmeni jen jeden udaj, nebude
33    potreba do displeje posilat vsechno a tim padem bude displej
34    reagovat rychleji na zmeny.
35
36 Tedka co bude displej letos zobrazovat. Vzhledem k tomu, ze vnitrni
37 mechanismy robota letos temer zadne nebudou, tak to bude dost
38 jednoduche:
39
40 1) Status jednotlivych komponent. Stejne jako vloni, to budou barevne
41    ctverecky s nazvem komponenty. Mozne hodnoty (a barvy budou)
42
43    - HW_STATUS_OK (zelena) ss=01: komponenty chodi spravna data
44    - HW_STATUS_WARNING (oranzova) ss=10: od komponenty data chodi, ale je v
45      nich signalizovan problem.
46    - HW_STATUS_FAILED (cervena) ss=00: od komponenty nechodi data
47
48    Jednotlive komponenty pro letosni rok budou (cislo udvava ccccc nize):
49
50    1. MOT - ridici jednotka motoru
51    2. ODO - odometrie
52    3. CAM - kamera
53    4. PWR - napajeci zdroje
54    5. HOK - Hokuyo
55    6. APP - ridici aplikace
56    7. VID - ovladani vidli a dvirek na vysypavani
57    8. STA - startovaci tlacitko
58
59    Format zpravy pro displej:
60
61    |   ID | Data        |
62    |------+-------------|
63    | 0x81 | 0ssccccc(b) | (b) znamena binarne tj. jednotlive bity
64    |------+-------------|
65      
66 2) Stav napajeni - stejne jako vloni: hodnoty napeti pro vetve 3.3V
67    (a), 5V (b), 8V (c) a na baterce (d). Pozadi bude cervene (x=1)
68    pokud hodnota klesne pod urcitou mez, a zelene pokud bude OK
69    (x=00). U napeti baterku jeste rozlisujeme 3. stav (varovani =
70    oranzova), ktery je signalizovan bitem w. Pokud je w = 1 a zaroven
71    d = 1, je pozadi cervene.
72
73    |   ID | Status        | ASCII hodnoty napeti |
74    |      | (odpovida xx) |                      |
75    |------+---------------+----------------------|
76    | 0x82 | 000wabcd(b)   | AAAABBBBCCCCDDDD     |
77    |------+---------------+----------------------|
78
79    Priklad:
80    - Vsechna napeti OK: 0x82 0x00 " 330 500 8001305"
81      Displej zobrazi na zelenem pozadi: 3,30V 5,00V 8,00V 13,05V
82    - Problem s 5V: 0x82 0x04 " 330 000 8001305"
83      Displej zobrazi jako v predchozim pripade, jen 0,00V bude na
84      cervenem pozadi: 3,30V 0,00V 8,00V 13,0
85
86 3) Aktualni stavy stavovych automatu:
87
88    |   ID | ASCII Nazev stavu (max 20?? znaku ukunceno '\0') |
89    |------+--------------------------------------------------|
90    | 0x83 | main_fsm_state\0                                 |
91    |------+--------------------------------------------------|
92    | 0x84 | move_fsm_state\0                                 |
93    |------+--------------------------------------------------|
94    | 0x85 | act_fsm_state\0                                  |
95    |------+--------------------------------------------------|
96
97 4) Poloha robota
98
99    |   ID | ASCII hodnoty X, Y a uhel |
100    |------+---------------------------|
101    | 0x86 | XXXYYYAAA                 |
102    |------+---------------------------|
103
104    Priklad: 0x86 "175042122"
105      na displeji bude "X=1.75 Y=0.42  122°" (nebo tak nejak)
106
107    Uhel bude v rozsahu 0 - 359.
108    Kdybys chtel bejt frajer, tak by sel uhel zobrazovat graficky jako sipku (kompas).
109
110 5) Keep-alive
111
112    |   ID |
113    |------|
114    | 0x87 |
115    |------|
116
117    Po projeti tohto prikazy se na displeji zmeni ukazatel toho, ze
118    funguje komunikace s displejem = napriklad klasicky ASCII mlejnek -
119    postupne zobrazovane znaky '-', '/', '|' a '\'.
120
121 6) Rozpoznane kukurice
122
123    |   ID | Rozpoznane kombinace kukuric |
124    |------+------------------------------|
125    | 0x88 | AB                           |
126
127    A = kombinace bocnich kukuric 1 az 9
128    B = kombinace strednich kukuric 1 az 4
129
130 7) Barva za kterou hrajeme
131
132    |   ID | Barva |
133    |------+-------|
134    | 0x89 | B     | 
135
136    B barva (0 = modra nebo 1 = zluta)
137
138 Data posilana z displeje do PC
139 ------------------------------
140
141 Myslim, ze budou stacit nasledujici jednobytove prikazy:
142
143 |   ID | Vyznam            |
144 |------+-------------------|
145 | 0x81 | Vidle dolu        |
146 | 0x82 | Vidle nahoru      |
147 | 0x83 | Dvere otevrit     |
148 | 0x84 | Dvere zavrit      |
149 | 0x85 | Valec zapnout     |
150 | 0x86 | Valec vypnout     |
151 | 0x87 | Posli cely status |
152 | 0x88 | Zmen barvu        |
153
154 */
155
156 #ifndef _UOLED_H
157 #define _UOLED_H
158
159 #include <sercom.h>
160
161
162 #ifdef __cplusplus
163 extern "C" {
164 #endif
165
166 #define ID_DISPLAY_STATUS 0x81
167 #define ID_DISPLAY_VOLTAGE 0x82
168 #define ID_DISPLAY_FSM 0x83
169 //#define ID_DISPLAY_SM_MOVE 0x84
170 //#define ID_DISPLAY_SM_ACT 0x85
171 #define ID_DISPLAY_POSITION 0x86
172 #define ID_DISPLAY_ALIVE 0x87
173 #define ID_DISPLAY_CORNS 0x88
174 #define ID_DISPLAY_COLOR 0x89
175
176 #define MGS_LENGTH_DISPLAY_STATUS 2
177 #define MGS_LENGTH_DISPLAY_SM 21
178 #define MGS_LENGTH_DISPLAY_VOLTAGE 18
179 #define MGS_LENGTH_DISPLAY_POSITION 10
180 #define MGS_LENGTH_DISPLAY_ALIVE 1
181 #define MGS_LENGTH_DISPLAY_CORNS 3
182 #define MGS_LENGTH_DISPLAY_COLOR 2
183
184 #define TRESHOLDS_VOLTAGE33 3.2
185 #define TRESHOLDS_VOLTAGE50 4.9
186 #define TRESHOLDS_VOLTAGE80 7.9
187 #define TRESHOLDS_VOLTAGEBAT 12.5
188 #define WARNING_VOLTAGEBAT 13.0
189
190 #define COMPONENTS_MASK 31
191 #define STATUS_MASK 96
192 #define STATUS_SHIFT 5
193
194 /**
195  * 0. (neni pouzito)
196  * 1. MOT - ridici jednotka motoru
197  * 2. ODO - odometrie
198  * 3. CAM - kamera
199  * 4. PWR - napajeci zdroje
200  * 5. HOK - Hokuyo
201  * 6. APP - ridici aplikace
202  * 7. VID - ovladani vidli a dvirek na vysypavani
203  * 8. STA - startovaci tlacitko
204  */
205 typedef enum {
206         UKN = 0,
207         MOT = 1,
208         ODO = 2,
209         CAM = 3,
210         PWR = 4,
211         HOK = 5,
212         APP = 6,
213         VID = 7,
214         STA = 8
215 } UDE_component_t;
216
217 /**
218  * 00 = HW_STATUS_FAILED
219  * 01 = HW_STATUS_OK
220  * 10 = HW_STATUS_WARNING
221  */
222 typedef enum {
223         STATUS_FAILED = 0,
224         STATUS_OK = 1,
225         STATUS_WARNING = 2
226 } UDE_hw_status_t;
227
228 /** ID_DISPLAY_FSM + ...
229  * 0 = MAIN FSM STATE
230  * 1 = MOVE FSM STATE
231  * 2 = ACT FSM STATE
232  */
233 typedef enum {
234         FSM_MAIN = 0, 
235         FSM_MOVE = 1,
236         FSM_ACT = 2
237 } UDE_fsm_t;
238
239 /**
240  * 0x81 = Vidle dolu        
241  * 0x82 = Vidle nahoru      
242  * 0x83 = Dvere otevrit     
243  * 0x84 = Dvere zavrit      
244  * 0x85 = Valec zapnout     
245  * 0x86 = Valec vypnout     
246  * 0x87 = Posli cely status 
247  */
248 typedef enum {
249         RCMD_NULL = 0x00,
250         RCMD_FORK_DOWN = 0x81,  
251         RCMD_FORK_UP = 0x82,    
252         RCMD_DOOR_OPEN = 0x83,  
253         RCMD_DOOR_CLOSE = 0x84, 
254         RCMD_CYLINDER_ON = 0x85,        
255         RCMD_CYLINDER_OFF = 0x86,       
256         RCMD_STATUS_ALL = 0x87  
257 } UDE_recieve_cmd_t;
258
259 /**
260  * Initializes and opens serial port (sercom). *
261  * @ingroup uoled
262  * @param tty String of device. 
263  * @return Pointer to structure (sercom_data) containing serial port data.
264  */
265 struct sercom_data* uoled_sercom_init(char * tty, void(*sighandler)(int));
266
267 /**
268  * Close serial port (sercom). *
269  * @ingroup uoled
270  */
271 void uoled_sercom_close();
272
273 /**
274  * Read data from serial port (sercom). *
275  * @ingroup uoled
276  * @param buff Will be filled by data.
277  * @param size Length of data, which will be read. 
278  */
279 int uoled_read_cmd(uint8_t *buff, int size);
280
281
282 /**
283  * Read command from serial port.
284  * @ingroup uoled
285  * @param cmd returned command
286  * @return success / errror (-1)
287  */
288 int uoled_recieve_cmd(UDE_recieve_cmd_t *cmd);
289
290 /**
291  * Send the actual state of components to display.
292  * @ingroup uoled
293  * @param c Type of components, see enum UDE_component_t
294  * @param s Status of component, see enum UDE_hw_status_t
295  */
296 int uoled_display_status(UDE_component_t c, UDE_hw_status_t s);
297
298 /**
299  * Send the actual state of FSM to display.
300  * @ingroup uoled
301  * @param fsm Type of FSM, see enum UDE_fsm_t
302  * @param state String identifying the state to be indicated
303  */
304 int uoled_display_fsm(UDE_fsm_t fsm, char * state);
305
306 /**
307  * Used to refresh display indication that comunication is ok. 
308  * @ingroup uoled
309  */
310 int uoled_display_alive();
311
312 /**
313  * Used to refresh voltage readings on the display. 
314  * @ingroup uoled
315  * @param volt Structure containing voltage readings was replaced by four parameters as follows
316  * @param voltage33 
317  * @param voltage50 
318  * @param voltage80 
319  * @param voltageBAT 
320  */
321 int uoled_display_voltage(double voltage33, double voltage50,
322                         double voltage80, double voltageBAT);
323
324 /**
325  * Used to refresh actual position on the display.
326  * @ingroup uoled
327  * @param pos The Structure containing position was replaced be tree parameters
328  * @param x 
329  * @param y 
330  * @param phi in [0, 359]  
331  */
332 int uoled_display_position(double x, double y, double phi);
333
334 int uoled_display_color(int color);
335
336
337 #ifdef __cplusplus
338 }
339 #endif
340 #endif