3 * @author (Martin Zidek) Mojmir Kittler
5 * @brief Library for communication with uOLED display using serial interface,
9 \defgroup uoled uOLED display
10 Set of libraries for interfacing the uOLED touchscreen attached to BOA.
15 \section uoled uoled library
17 Library uoled contains functions, which create control messages in proper format
18 for communication with the display on serial port.
20 \section protocol Communication protocol
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).
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.
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.
36 Tedka co bude displej letos zobrazovat. Vzhledem k tomu, ze vnitrni
37 mechanismy robota letos temer zadne nebudou, tak to bude dost
40 1) Status jednotlivych komponent. Stejne jako vloni, to budou barevne
41 ctverecky s nazvem komponenty. Mozne hodnoty (a barvy budou)
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
48 Jednotlive komponenty pro letosni rok budou (cislo udvava ccccc nize):
50 1. MOT - ridici jednotka motoru
53 4. PWR - napajeci zdroje
55 6. APP - ridici aplikace
56 7. VID - ovladani vidli a dvirek na vysypavani
57 8. STA - startovaci tlacitko
59 Format zpravy pro displej:
62 |------+-------------|
63 | 0x81 | 0ssccccc(b) | (b) znamena binarne tj. jednotlive bity
64 |------+-------------|
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.
73 | ID | Status | ASCII hodnoty napeti |
75 |------+---------------+----------------------|
76 | 0x82 | 000wabcd(b) | AAAABBBBCCCCDDDD |
77 |------+---------------+----------------------|
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
86 3) Aktualni stavy stavovych automatu:
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 |------+--------------------------------------------------|
99 | ID | ASCII hodnoty X, Y a uhel |
100 |------+---------------------------|
102 |------+---------------------------|
104 Priklad: 0x86 "175042122"
105 na displeji bude "X=1.75 Y=0.42 122°" (nebo tak nejak)
107 Uhel bude v rozsahu 0 - 359.
108 Kdybys chtel bejt frajer, tak by sel uhel zobrazovat graficky jako sipku (kompas).
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 '\'.
121 6) Rozpoznane kukurice
123 | ID | Rozpoznane kombinace kukuric |
124 |------+------------------------------|
127 A = kombinace bocnich kukuric 1 az 9
128 B = kombinace strednich kukuric 1 az 4
130 7) Barva za kterou hrajeme
136 B barva (0 = modra nebo 1 = zluta)
138 Data posilana z displeje do PC
139 ------------------------------
141 Myslim, ze budou stacit nasledujici jednobytove prikazy:
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 |
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
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
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
190 #define COMPONENTS_MASK 31
191 #define STATUS_MASK 96
192 #define STATUS_SHIFT 5
196 * 1. MOT - ridici jednotka motoru
199 * 4. PWR - napajeci zdroje
201 * 6. APP - ridici aplikace
202 * 7. VID - ovladani vidli a dvirek na vysypavani
203 * 8. STA - startovaci tlacitko
218 * 00 = HW_STATUS_FAILED
220 * 10 = HW_STATUS_WARNING
228 /** ID_DISPLAY_FSM + ...
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
250 RCMD_FORK_DOWN = 0x81,
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
260 * Initializes and opens serial port (sercom). *
262 * @param tty String of device.
263 * @return Pointer to structure (sercom_data) containing serial port data.
265 struct sercom_data* uoled_sercom_init(char * tty, void(*sighandler)(int));
268 * Close serial port (sercom). *
271 void uoled_sercom_close();
274 * Read data from serial port (sercom). *
276 * @param buff Will be filled by data.
277 * @param size Length of data, which will be read.
279 int uoled_read_cmd(uint8_t *buff, int size);
283 * Read command from serial port.
285 * @param cmd returned command
286 * @return success / errror (-1)
288 int uoled_recieve_cmd(UDE_recieve_cmd_t *cmd);
291 * Send the actual state of components to display.
293 * @param c Type of components, see enum UDE_component_t
294 * @param s Status of component, see enum UDE_hw_status_t
296 int uoled_display_status(UDE_component_t c, UDE_hw_status_t s);
299 * Send the actual state of FSM to display.
301 * @param fsm Type of FSM, see enum UDE_fsm_t
302 * @param state String identifying the state to be indicated
304 int uoled_display_fsm(UDE_fsm_t fsm, char * state);
307 * Used to refresh display indication that comunication is ok.
310 int uoled_display_alive();
313 * Used to refresh voltage readings on the display.
315 * @param volt Structure containing voltage readings was replaced by four parameters as follows
321 int uoled_display_voltage(double voltage33, double voltage50,
322 double voltage80, double voltageBAT);
325 * Used to refresh actual position on the display.
327 * @param pos The Structure containing position was replaced be tree parameters
330 * @param phi in [0, 359]
332 int uoled_display_position(double x, double y, double phi);
334 int uoled_display_color(int color);
335 int uoled_display_corns(int side, int center);