1 #platform "uOLED-32028-PMD3T"
3 #inherit "4DGL_16bitColours.fnc"
\r
4 //#inherit "4DGL-System.fnc"
6 #constant MSG_TERM '~'
\r
7 #constant MSG_BUFF_LEN 103
\r
8 #constant MSG_POWER 'V'
\r
9 #constant MSG_POSITION 'P'
\r
10 #constant MSG_FSM_STATE 'F'
\r
11 #constant MSG_MOVE_FSM_STATE 'M'
\r
13 #constant MSG_START 150
\r
14 #constant MSG_TERM_LF 10
\r
16 #constant MSG_SWITCH_TO_STATUS_DONE 185
\r
18 #constant MSG_STATUS 'S'
\r
20 // Indices to the voltage_status array
24 #constant VOLTAGE_BAT 3
26 /*Voltage branch OK indication*/
27 #constant VOLTAGE_OK 1
\r
29 #constant HW_STATUS_OK 1
\r
30 #constant HW_STATUS_WARN 2
\r
32 #constant MSG_CONTROL_REQ 184
\r
33 #constant MSG_SWITCH_REP 200
\r
42 var msg_buff[MSG_BUFF_LEN]; // serial RX buffer
\r
43 var msg_rcvd[MSG_BUFF_LEN]; // serial RX buffer
\r
51 var voltage_status[4]; // status of individual voltage branches
58 var move_fsm_state[20];
\r
59 var move_fsm_state_len;
\r
79 voltage33[idx]:=' ';
\r
84 voltage50[idx]:=' ';
\r
89 voltage80[idx]:=' ';
\r
94 voltageBAT[idx]:=' ';
\r
108 gfx_Rectangle(0, 0, 239, 319, BLACK);
112 func bt_control(var state)
\r
113 gfx_Button(state, 2, 290, GRAY, WHITE, FONT3, 1, 1, " CONTROL ");
\r
116 func draw_voltage33() // draw the 3.3 V voltage status indicator
119 if(voltage_status[VOLTAGE33]==VOLTAGE_OK)
125 gfx_Rectangle(0,10,60,50,col_rect);
126 gfx_Line(59, 10, 59, 50, BLACK);
127 txt_Set(TEXT_COLOUR, WHITE);
128 txt_Set(FONT_SIZE, FONT3);
131 txt_Set(FONT_SIZE, FONT4);
140 func draw_voltage50()
143 if(voltage_status[VOLTAGE50]==VOLTAGE_OK)
149 gfx_Rectangle(60,10,120,50,col_rect);
150 gfx_Line(119, 10, 119, 50, BLACK);
151 txt_Set(TEXT_COLOUR, WHITE);
152 txt_Set(FONT_SIZE, FONT3);
155 txt_Set(FONT_SIZE, FONT4);
164 func draw_voltage80()
167 if(voltage_status[VOLTAGE80]==VOLTAGE_OK)
173 gfx_Rectangle(120,10,180,50,col_rect);
174 gfx_Line(179, 10, 179, 50, BLACK);
175 txt_Set(TEXT_COLOUR, WHITE);
176 txt_Set(FONT_SIZE, FONT3);
177 txt_MoveCursor(1,17);
179 txt_Set(FONT_SIZE, FONT4);
180 txt_MoveCursor(2,10);
188 func draw_voltageBAT()
191 if(voltage_status[VOLTAGE_BAT]==VOLTAGE_OK)
197 gfx_Rectangle(180,10,240,50,col_rect);
198 txt_Set(TEXT_COLOUR, WHITE);
199 txt_Set(FONT_SIZE, FONT3);
200 txt_MoveCursor(1,25);
202 txt_Set(FONT_SIZE, FONT4);
203 txt_MoveCursor(2,15);
204 putch(voltageBAT[0]);
205 putch(voltageBAT[1]);
206 putch(voltageBAT[2]);
207 putch(voltageBAT[3]);
208 putch(voltageBAT[4]);
221 txt_Set(FONT_SIZE, FONT3);
222 txt_MoveCursor(21, 6);
223 txt_Set(TEXT_COLOUR, GRAY);
225 putstr("POSITION AND COLOR");
227 gfx_Rectangle(0,266,239,289,game_color);
228 txt_Set(FONT_SIZE, FONT4);
229 txt_Set(TEXT_COLOUR, WHITE);
230 txt_MoveCursor(17,0);
245 func draw_fsm_state()
247 txt_Set(FONT_SIZE, FONT3);
248 txt_MoveCursor(5, 6); // move the cursor to line 4, column 5
249 txt_Set(TEXT_COLOUR, GRAY);
251 putstr("CURRENT FSM STATE");
255 func update_fsm_state()
257 gfx_Rectangle(0, 70, 239, 99, BLACK);
258 txt_Set(FONT_SIZE, FONT4);
259 txt_MoveCursor(5, 0); // move the cursor to line 4, column 5
260 txt_Set(TEXT_COLOUR, WHITE);
263 putch(fsm_state[idx]);
269 func update_move_fsm_state()
\r
271 gfx_Rectangle(0, 99, 239, 112, BLACK);
\r
272 txt_Set(FONT_SIZE, FONT4);
\r
273 txt_MoveCursor(6, 0); // move the cursor to line 4, column 5
\r
274 txt_Set(TEXT_COLOUR, WHITE);
\r
277 putch(move_fsm_state[idx]);
\r
283 func draw_hw1(var status)
\r
284 txt_Set(FONT_SIZE, FONT3);
\r
285 txt_Set(TEXT_COLOUR, WHITE);
\r
287 if(status==HW_STATUS_OK)
\r
288 gfx_Rectangle(0,193,59,218,GREEN);
\r
290 if(status==HW_STATUS_WARN)
291 gfx_Rectangle(0,193,59,218,ORANGE);
\r
293 gfx_Rectangle(0,193,59,218,RED);
\r
297 txt_MoveCursor(17,3);
\r
301 func draw_hw2(var status)
\r
302 txt_Set(FONT_SIZE, FONT3);
\r
303 txt_Set(TEXT_COLOUR, WHITE);
\r
305 if(status==HW_STATUS_OK)
\r
306 gfx_Rectangle(61,193,120,218,GREEN);
\r
308 if(status==HW_STATUS_WARN)
309 gfx_Rectangle(61,193,120,218,ORANGE);
\r
311 gfx_Rectangle(61,193,120,218,RED);
\r
314 txt_MoveCursor(17,10);
\r
318 func draw_hw3(var status)
\r
319 txt_Set(FONT_SIZE, FONT3);
\r
320 txt_Set(TEXT_COLOUR, WHITE);
\r
322 if(status==HW_STATUS_OK)
\r
323 gfx_Rectangle(122,193,181,218,GREEN);
\r
325 if(status==HW_STATUS_WARN)
326 gfx_Rectangle(122,193,181,218,ORANGE);
\r
328 gfx_Rectangle(122,193,181,218,RED);
\r
332 txt_MoveCursor(17,17);
\r
336 func draw_hw3a(var status)
\r
337 txt_Set(FONT_SIZE, FONT3);
\r
338 txt_Set(TEXT_COLOUR, WHITE);
\r
340 if(status==HW_STATUS_OK)
\r
341 gfx_Rectangle(183,193,239,218,GREEN);
\r
343 if(status==HW_STATUS_WARN)
344 gfx_Rectangle(183,193,239,218,ORANGE);
\r
346 gfx_Rectangle(183,193,239,218,RED);
\r
350 txt_MoveCursor(17,25);
\r
354 func draw_hw4(var status)
\r
355 txt_Set(FONT_SIZE, FONT3);
\r
356 txt_Set(TEXT_COLOUR, WHITE);
\r
358 if(status==HW_STATUS_OK)
\r
359 gfx_Rectangle(0,220,59,245,GREEN);
\r
361 if(status==HW_STATUS_WARN)
362 gfx_Rectangle(0,220,59,245,ORANGE);
\r
364 gfx_Rectangle(0,220,59,245,RED);
\r
368 txt_MoveCursor(19,3);
\r
372 func draw_hw5(var status)
\r
373 txt_Set(FONT_SIZE, FONT3);
\r
374 txt_Set(TEXT_COLOUR, WHITE);
\r
376 if(status==HW_STATUS_OK)
\r
377 gfx_Rectangle(61,220,120,245,GREEN);
\r
379 if(status==HW_STATUS_WARN)
380 gfx_Rectangle(61,220,120,245,ORANGE);
\r
382 gfx_Rectangle(61,220,120,245,RED);
\r
386 txt_MoveCursor(19,10);
\r
390 func draw_hw6(var status)
\r
391 txt_Set(FONT_SIZE, FONT3);
\r
392 txt_Set(TEXT_COLOUR, WHITE);
\r
394 if(status==HW_STATUS_OK)
\r
395 gfx_Rectangle(122,220,181,245,GREEN);
\r
397 if(status==HW_STATUS_WARN)
398 gfx_Rectangle(122,220,181,245,ORANGE);
\r
400 gfx_Rectangle(122,220,181,245,RED);
\r
404 txt_MoveCursor(19,17);
\r
408 func draw_hw6a(var status)
\r
409 txt_Set(FONT_SIZE, FONT3);
\r
410 txt_Set(TEXT_COLOUR, WHITE);
\r
412 if(status==HW_STATUS_OK)
\r
413 gfx_Rectangle(183,220,239,245,GREEN);
\r
415 if(status==HW_STATUS_WARN)
\r
416 gfx_Rectangle(183,220,239,245,ORANGE);
\r
418 gfx_Rectangle(183,220,239,245,RED);
\r
422 txt_MoveCursor(19,25);
\r
427 txt_Set(FONT_SIZE, FONT3);
\r
428 txt_MoveCursor(15, 10); // move the cursor to line 4, column 5
\r
429 txt_Set(TEXT_COLOUR, GRAY);
\r
431 putstr("HW STATUS");
\r
433 txt_Set(TEXT_COLOUR, WHITE);
\r
435 draw_hw1(HW_STATUS_OK);
\r
436 draw_hw2(HW_STATUS_OK);
\r
437 draw_hw3(HW_STATUS_OK);
\r
438 draw_hw3a(HW_STATUS_OK);
\r
439 draw_hw4(HW_STATUS_OK);
\r
440 draw_hw5(HW_STATUS_OK);
\r
441 draw_hw6(HW_STATUS_OK);
\r
442 draw_hw6a(HW_STATUS_OK);
\r
446 func update_pucks()
\r
447 gfx_Rectangle(0, 142, 50, 170, BLACK);
\r
448 txt_Set(FONT_SIZE, FONT4);
\r
449 txt_MoveCursor(9, 3); // move the cursor to line 4, column 5
\r
450 txt_Set(TEXT_COLOUR, LEMONCHIFFON);
\r
455 txt_Set(FONT_SIZE, FONT3);
\r
456 txt_MoveCursor(10, 1); // move the cursor to line 4, column 5
\r
457 txt_Set(TEXT_COLOUR, GRAY);
\r
459 putstr("PUCKS nr.");
\r
464 gfx_Rectangle(170, 142, 239, 170, BLACK);
\r
465 txt_Set(FONT_SIZE, FONT4);
\r
466 txt_MoveCursor(9, 15); // move the cursor to line 4, column 5
\r
467 txt_Set(TEXT_COLOUR, LEMONCHIFFON);
\r
468 putch(lift_pos[0]);
\r
469 putch(lift_pos[1]);
\r
470 putch(lift_pos[2]);
\r
471 putch(lift_pos[3]);
\r
475 txt_Set(FONT_SIZE, FONT3);
\r
476 txt_MoveCursor(10, 20); // move the cursor to line 4, column 5
\r
477 txt_Set(TEXT_COLOUR, GRAY);
\r
479 putstr("LIFT pos.");
\r
484 gfx_Rectangle(70, 142, 140, 170, BLACK);
\r
485 txt_Set(FONT_SIZE, FONT4);
\r
486 txt_MoveCursor(9, 9); // move the cursor to line 4, column 5
\r
487 txt_Set(TEXT_COLOUR, LEMONCHIFFON);
\r
492 txt_Set(FONT_SIZE, FONT3);
\r
493 txt_MoveCursor(10, 10); // move the cursor to line 4, column 5
\r
494 txt_Set(TEXT_COLOUR, GRAY);
\r
496 putstr("GAME conf.");
\r
502 txt_Set(FONT_SIZE, FONT3);
503 txt_MoveCursor(0, 12); // move the cursor to line 4, column 5
504 txt_Set(TEXT_COLOUR, GRAY);
517 draw_hw1(hw_status[0]);
\r
518 draw_hw2(hw_status[1]);
\r
519 draw_hw3(hw_status[2]);
\r
520 draw_hw3a(hw_status[3]);
\r
521 draw_hw4(hw_status[4]);
\r
522 draw_hw5(hw_status[5]);
\r
523 draw_hw6(hw_status[6]);
\r
524 draw_hw6a(hw_status[7]);
\r
527 func load_control()
\r
529 file_Run("CTRL.4XE",0);
\r
532 /*Process the message received on serial line*/
535 if(msg_rcvd[0]==MSG_STATUS)
\r
536 mem_Copy(msg_rcvd+2, voltage33, 8);
\r
537 mem_Copy(msg_rcvd+6, voltage50, 8);
\r
538 mem_Copy(msg_rcvd+10, voltage80, 8);
\r
539 mem_Copy(msg_rcvd+14, voltageBAT, 10);
\r
541 mem_Copy(msg_rcvd+21, position, 16);
\r
543 mem_Copy(msg_rcvd+35, fsm_state, 40);
\r
544 mem_Copy(msg_rcvd+57, move_fsm_state, 40);
\r
546 if(msg_rcvd[79]==0)
\r
547 game_color := GREEN;
\r
552 mem_Copy(msg_rcvd+82, lift_pos, 8);
\r
553 pucks_nr := msg_rcvd[88];
\r
555 mem_Copy(msg_rcvd+91, hw_status, 16);
\r
556 //mem_Copy(msg_rcvd+101, game_conf, 2);
\r
557 game_conf:=msg_rcvd[101];
\r
564 update_fsm_state();
\r
565 update_move_fsm_state();
\r
573 if(msg_rcvd[0]==200)
\r
582 var in, idx, bad, msg_len;
599 com_Init(msg_buff, MSG_BUFF_LEN, ':');
605 func act_control()
\r
608 out_buff[0]:=MSG_START;
\r
609 out_buff[1]:=MSG_CONTROL_REQ;
\r
610 out_buff[2]:=MSG_TERM_LF;
\r
614 serout(out_buff[idx]);
\r
619 func touchscreen()
\r
620 var col, state, x, y;
\r
621 state := touch_Get(TOUCH_STATUS); // get touchscreen status
\r
623 if(state == NOTOUCH)
\r
626 //-----------------------------------------------------------------------------------------
\r
627 if(state == TOUCH_PRESS) // if there's a press
\r
628 x := touch_Get(TOUCH_GETX);
\r
629 y := touch_Get(TOUCH_GETY);
\r
634 if(state == TOUCH_RELEASE) // if there's a press
\r
635 x := touch_Get(TOUCH_GETX);
\r
636 y := touch_Get(TOUCH_GETY);
\r
647 setbaud(8); // 19200 baud
648 com_Init(msg_buff, MSG_BUFF_LEN, ':');
\r
650 out_buff[0]:=MSG_START;
\r
651 out_buff[1]:=MSG_SWITCH_TO_STATUS_DONE;
\r
652 out_buff[2]:=MSG_TERM_LF;
\r
655 serout(out_buff[idx]);
\r
660 touch_Set(TOUCH_ENABLE); // enable TS
661 touch_Set(TOUCH_REGIONDEFAULT); // reset touch area to fullscreen
\r
666 repeat // the main application loop