+++ /dev/null
-#platform "uOLED-32028-PMD3T"\r
-\r
-/* 4DGL Demo Application\r
- - Packed String Manipulation -\r
- -- PICASO Platform --\r
-*/\r
-\r
-\r
-#inherit "4DGL_16bitColours.fnc"\r
-\r
-#constant NEWLINE $print("\n") // a macro for carriage return\r
-#constant LEFT_BT1 0\r
-#constant TOP_BT 290\r
-\r
-#constant MODE_CONS 0\r
-#constant MODE_STATUS 1\r
-#constant MODE_MAP 2\r
-#constant MODE_MISC 3\r
-\r
-#constant MSG_START 150\r
-#constant MSG_VOLTAGE 160\r
-#constant MSG_FSM_STATE 161\r
-#constant MSG_BALLS 162\r
-#constant MSG_HW_STATUS 163\r
-#constant MSG_COLOR 164\r
-#constant MSG_POSITION 165\r
-#constant CHANGE_MODE_REP 200\r
-#constant CHANGE_MODE_OK 201\r
-\r
-#constant MSG_TERM 254\r
-\r
-#constant MSG_BUFF_LEN 20\r
-\r
-#constant TEXTWIDTH 1\r
-#constant TEXTHEIGHT 1 \r
-#constant TXT_BT_1 $"CONS"\r
-#constant TXT_BT_2 $"STATUS"\r
-#constant TXT_BT_3 $" MAP "\r
-#constant TXT_BT_4 $" MISC "\r
-\r
-#constant VOLTAGE_OK 1\r
-\r
-\r
- var bt_x[4];\r
- var mode_change[4];\r
-\r
- var voltage33[4];\r
- var voltage50[4];\r
- var voltage80[4];\r
- var voltageBAT[5];\r
- \r
- var position[8];\r
- var color;\r
- var fsm_state[41];\r
- var fsm_state_len;\r
-\r
- var msg_buff[MSG_BUFF_LEN];\r
- var msg_len;\r
-\r
- var cnt, ch, rep;\r
- \r
- var isConsole, isStatus, isMap, isMisc;\r
- \r
- var state, x, y;\r
- \r
- var change_mode_req_flag;\r
-\r
-func draw_voltage33(var status, var value)\r
- var col_rect;\r
-\r
- if(status==VOLTAGE_OK)\r
- col_rect := RED;\r
- else\r
- col_rect := GREEN;\r
- endif\r
-\r
- gfx_Rectangle(0,10,60,50,col_rect);\r
- gfx_Line(59, 10, 59, 50, BLACK);\r
- txt_Set(TEXT_COLOUR, WHITE);\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(1,1);\r
- putstr("3,30V");\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_MoveCursor(2,0);\r
- print([CHR] voltage33[0]);\r
- print([CHR] voltage33[1]);\r
- print([CHR] voltage33[2]);\r
- print([CHR] voltage33[3]);\r
-endfunc\r
-\r
-func draw_voltage50(var status, var value)\r
- var col_rect;\r
-\r
- if(status==VOLTAGE_OK)\r
- col_rect := RED;\r
- else\r
- col_rect := GREEN;\r
- endif\r
-\r
- gfx_Rectangle(60,10,120,50,col_rect);\r
- gfx_Line(119, 10, 119, 50, BLACK);\r
- txt_Set(TEXT_COLOUR, WHITE);\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(1,9);\r
- putstr("5,00V");\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_MoveCursor(2,5);\r
- print([CHR] voltage50[0]);\r
- print([CHR] voltage50[1]);\r
- print([CHR] voltage50[2]);\r
- print([CHR] voltage50[3]);\r
-endfunc\r
-\r
-func draw_voltage80(var status, var value)\r
- var col_rect;\r
-\r
- if(status==VOLTAGE_OK)\r
- col_rect := RED;\r
- else\r
- col_rect := GREEN;\r
- endif\r
-\r
- gfx_Rectangle(120,10,180,50,col_rect);\r
- gfx_Line(179, 10, 179, 50, BLACK);\r
- txt_Set(TEXT_COLOUR, WHITE);\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(1,17);\r
- putstr("8,00V");\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_MoveCursor(2,10);\r
- print([CHR] voltage80[0]);\r
- print([CHR] voltage80[1]);\r
- print([CHR] voltage80[2]);\r
- print([CHR] voltage80[3]);\r
-endfunc\r
-\r
-func draw_voltageBAT(var status, var value)\r
- var col_rect;\r
-\r
- if(status==VOLTAGE_OK)\r
- col_rect := RED;\r
- else\r
- col_rect := GREEN;\r
- endif\r
-\r
- gfx_Rectangle(180,10,240,50,col_rect);\r
- txt_Set(TEXT_COLOUR, WHITE);\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(1,25);\r
- putstr("BATT");\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_MoveCursor(2,15);\r
- print([CHR] voltageBAT[0]);\r
- print([CHR] voltageBAT[1]);\r
- print([CHR] voltageBAT[2]);\r
- print([CHR] voltageBAT[3]);\r
- print([CHR] voltageBAT[4]);\r
-endfunc\r
-\r
-func draw_fsm_state()\r
- var idx;\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(5, 6); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, RED);\r
- \r
- putstr("CURRENT FSM STATE");\r
- gfx_Rectangle(0, 70, 239, 100, BLACK);\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_MoveCursor(5, 0); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, WHITE);\r
- idx:=0;\r
- repeat\r
- print([CHR] fsm_state[idx]);\r
- idx++;\r
- until(idx==fsm_state_len)\r
-endfunc\r
-\r
-func draw_balls()\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(9, 12); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, RED);\r
- \r
- putstr("BALLS");\r
- gfx_Set(0,0);\r
- gfx_Circle(24, 150, 22, BLUE);\r
- gfx_Circle(72, 150, 22, BLUE);\r
- gfx_Circle(120, 150, 22, RED);\r
- gfx_Circle(168, 150, 22, BLUE);\r
- gfx_Circle(216, 150, 22, WHITE);\r
-endfunc\r
-\r
-func draw_carousel_pos(var up, var down)\r
- var x_up, x_down;\r
-\r
- x_up := up*48 + 24;\r
- x_down := down*48 + 24;\r
- \r
- gfx_Set(1,0);\r
- gfx_Triangle(x_up-15, 160, x_up+15, 160, x_up, 135, BLACK);\r
- gfx_Triangle(x_down, 165, x_down+15, 140, x_down-15, 140, BLACK);\r
-endfunc\r
-\r
-func draw_position()\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(21, 6); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, RED);\r
- \r
- putstr("POSITION AND COLOR");\r
-\r
- gfx_Rectangle(0,266,239,289,color);\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_Set(TEXT_COLOUR, WHITE);\r
- txt_MoveCursor(17,0);\r
- print("X,Y: ");\r
- print([CHR] position[0]);\r
- print([CHR] position[1]);\r
- print([CHR] position[2]);\r
- print([CHR] position[3]);\r
- print(" ");\r
- print([CHR] position[4]);\r
- print([CHR] position[5]);\r
- print([CHR] position[6]);\r
- print([CHR] position[7]);\r
- print(" [m]");\r
- \r
-endfunc\r
-\r
-func draw_hw1()\r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(15, 10); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, RED);\r
- \r
- putstr("HW STATUS");\r
- \r
- gfx_Rectangle(0,193,79,218,GREEN);\r
- gfx_Rectangle(81,193,159,218,GREEN);\r
- gfx_Rectangle(161,193,240,218,GREEN);\r
- \r
- gfx_Rectangle(0,220,79,245,GREEN);\r
- gfx_Rectangle(81,220,159,245,GREEN);\r
- gfx_Rectangle(161,220,240,245,GREEN);\r
-endfunc\r
- \r
-func draw_status() \r
- txt_Set(FONT_SIZE, FONT3);\r
- txt_MoveCursor(0, 12); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, RED);\r
- \r
- putstr("VOLTAGE");\r
- draw_voltage33(0, 1);\r
- draw_voltage50(0, 1);\r
- draw_voltage80(0, 1);\r
- draw_voltageBAT(0, 1);\r
- \r
- fsm_state_len := 1;\r
- draw_fsm_state();\r
-\r
- draw_balls();\r
- draw_carousel_pos(3, 2);\r
- draw_hw1();\r
- draw_position();\r
-endfunc\r
-\r
-func draw_misc()\r
- txt_Set(FONT_SIZE, FONT4);\r
- txt_MoveCursor(0, 9); // move the cursor to line 4, column 5\r
- txt_Set(TEXT_COLOUR, RED);\r
- putstr("MISC");\r
-endfunc\r
-\r
-func draw_console()\r
- gfx_Cls();\r
- \r
- gfx_Set(1, BLACK);\r
- txt_Set(2, 0); \r
- \r
- bt_x[0] := 0;\r
- gfx_Button(UP, bt_x[0], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_1);\r
- bt_x[1] := gfx_Get(2);\r
- gfx_Button(UP, bt_x[1], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_2);\r
- bt_x[2] := gfx_Get(2);\r
- gfx_Button(UP, bt_x[2], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_3);\r
- bt_x[3] := gfx_Get(2);\r
- gfx_Button(UP, bt_x[3], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_4);\r
- txt_MoveCursor(0, 0);\r
- return;\r
-endfunc\r
-\r
-func clear_screen()\r
- gfx_Rectangle(0, 0, 239, 284, BLACK); // clear the text portion of the display, much faster than redrawing the whole screen.\r
- txt_MoveCursor(0, 0);\r
- return;\r
-endfunc\r
-\r
-func get_msg()\r
- var in, idx;\r
-\r
- idx:=0;\r
-\r
- repeat\r
- in:=serin();\r
- if(in!=-1)\r
- msg_buff[idx] := in;\r
- idx++;\r
- endif\r
- until((in==MSG_TERM)||(idx==MSG_BUFF_LEN))\r
- msg_len := idx;\r
-\r
-endfunc\r
-\r
-func print_msg_buff()\r
- var idx;\r
- idx:=0;\r
- repeat\r
- print(msg_buff[idx],",");\r
- idx++;\r
- until(idx==msg_len-1)\r
-endfunc\r
-\r
-func print_ser()\r
- \r
- print([CHR]ch);\r
- cnt++;\r
- if(cnt==1400)\r
- clear_screen();\r
- cnt := 0;\r
- endif\r
- \r
-endfunc\r
-\r
-\r
-\r
-func set_mode(var mode)\r
- if(mode==MODE_CONS)\r
- clear_screen();\r
- putstr("CONSOLE");\r
- endif\r
- \r
- if(mode==MODE_STATUS)\r
- clear_screen();\r
- print("STATUS");\r
- endif\r
- \r
- if(mode==MODE_MAP)\r
- clear_screen();\r
- print("MAP");\r
- endif\r
- \r
- if(mode==MODE_MISC)\r
- clear_screen();\r
- print("MISC");\r
- endif\r
-endfunc\r
-\r
-func process_msg()\r
- var idx;\r
- if(msg_buff[0]==CHANGE_MODE_REP)\r
- if(msg_buff[1]==CHANGE_MODE_OK)\r
- set_mode(msg_buff[2]);\r
- mode_change[msg_buff[2]]:=0;\r
- else\r
- print("CHANGE MODE FAILED!!!");\r
- endif\r
- endif\r
- if(msg_buff[0]==MSG_VOLTAGE)\r
- voltage33[0]:=msg_buff[1];\r
- voltage33[1]:=msg_buff[2];\r
- voltage33[2]:=msg_buff[3];\r
- voltage33[3]:=msg_buff[4];\r
- \r
- voltage50[0]:=msg_buff[5];\r
- voltage50[1]:=msg_buff[6];\r
- voltage50[2]:=msg_buff[7];\r
- voltage50[3]:=msg_buff[8];\r
- \r
- voltage80[0]:=msg_buff[9];\r
- voltage80[1]:=msg_buff[10];\r
- voltage80[2]:=msg_buff[11];\r
- voltage80[3]:=msg_buff[12];\r
- \r
- voltageBAT[0]:=msg_buff[13];\r
- voltageBAT[1]:=msg_buff[14];\r
- voltageBAT[2]:=msg_buff[15];\r
- voltageBAT[3]:=msg_buff[16];\r
- voltageBAT[4]:=msg_buff[17];\r
- draw_voltage33(0,0);\r
- draw_voltage50(0,0);\r
- draw_voltage80(0,0);\r
- draw_voltageBAT(0,0);\r
- endif\r
- if(msg_buff[0]==MSG_POSITION)\r
- idx:=1;\r
- repeat\r
- position[idx-1] := msg_buff[idx];\r
- idx++;\r
- until (msg_buff[idx]==MSG_TERM)\r
- draw_position();\r
- endif\r
- if(msg_buff[0]==MSG_FSM_STATE)\r
- idx:=1;\r
- repeat\r
- fsm_state[idx-1] := msg_buff[idx];\r
- idx++;\r
- until(msg_buff[idx]==MSG_TERM)\r
- fsm_state_len := idx-1;\r
- draw_fsm_state();\r
- endif\r
- if(msg_buff[0]==MSG_COLOR)\r
- if(msg_buff[1]==1)\r
- color := RED;\r
- else\r
- color := BLUE;\r
- endif\r
- endif\r
-endfunc\r
-\r
-func change_mode_rq(var mode)\r
- mode_change[mode] := 1;\r
- isConsole := 0;\r
- serout(mode); \r
-endfunc\r
-\r
-func change_mode()\r
- var ch, i;\r
-\r
- ch := serin();\r
- i:=0;\r
- print("CHANGE MODE OK ",ch);\r
- if(ch==CHANGE_MODE_OK)\r
- \r
- repeat\r
- if(mode_change[i]==1)\r
- set_mode(i);\r
- mode_change[i]:=0;\r
- endif\r
- i++;\r
- until (i<4);\r
-\r
- endif\r
-endfunc\r
-\r
-\r
-\r
-func bt_pressed(var x)\r
- if(x < bt_x[1]) // CONSOLE button\r
- change_mode_rq(MODE_CONS);\r
- gfx_Button(DOWN, bt_x[0], TOP_BT, YELLOW, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_1);\r
- endif\r
- \r
- if((x > bt_x[1]) & (x < bt_x[2])) // STATUS button\r
- change_mode_rq(MODE_STATUS);\r
- gfx_Button(DOWN, bt_x[1], TOP_BT, YELLOW, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_2);\r
- endif\r
- \r
- if((x > bt_x[2]) & (x < bt_x[3])) // MAP button\r
- change_mode_rq(MODE_MAP);\r
- gfx_Button(DOWN, bt_x[2], TOP_BT, YELLOW, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_3);\r
- endif\r
- \r
- if(x > bt_x[3]) // MISC button\r
- change_mode_rq(MODE_MISC);\r
- gfx_Button(DOWN, bt_x[3], TOP_BT, YELLOW, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_4);\r
- endif\r
-endfunc\r
-\r
-func bt_released(var x)\r
-\r
-endfunc\r
-\r
-func touchscreen()\r
- var col;\r
- state := touch_Get(TOUCH_STATUS); // get touchscreen status\r
- \r
- if(state == NOTOUCH)\r
- return;\r
- endif\r
- //-----------------------------------------------------------------------------------------\r
- if(state == TOUCH_PRESS) // if there's a press\r
- x := touch_Get(TOUCH_GETX); \r
- y := touch_Get(TOUCH_GETY);\r
- \r
- if(y > TOP_BT)\r
- bt_pressed(x); \r
- endif \r
- endif\r
- \r
- //-----------------------------------------------------------------------------------------\r
- if(state == TOUCH_RELEASE) // if there's a release\r
- if(y > TOP_BT)\r
- \r
- if(x < bt_x[1])\r
- gfx_Button(UP, 0, TOP_BT, GREEN, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_1);\r
- gfx_Button(UP, bt_x[1], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_2);\r
- gfx_Button(UP, bt_x[2], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_3);\r
- gfx_Button(UP, bt_x[3], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_4);\r
- endif\r
- \r
- if(x > bt_x[1])\r
- gfx_Button(UP, 0, TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_1);\r
- gfx_Button(UP, bt_x[1], TOP_BT, GREEN, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_2);\r
- gfx_Button(UP, bt_x[2], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_3);\r
- gfx_Button(UP, bt_x[3], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_4);\r
- endif\r
- \r
- if(x > bt_x[2])\r
- gfx_Button(UP, 0, TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_1);\r
- gfx_Button(UP, bt_x[1], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_2);\r
- gfx_Button(UP, bt_x[2], TOP_BT, GREEN, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_3);\r
- gfx_Button(UP, bt_x[3], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_4);\r
- endif\r
- \r
- if(x > bt_x[3])\r
- gfx_Button(UP, 0, TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_1);\r
- gfx_Button(UP, bt_x[1], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_2);\r
- gfx_Button(UP, bt_x[2], TOP_BT, BLUE, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_3);\r
- gfx_Button(UP, bt_x[3], TOP_BT, GREEN, RED, FONT3, TEXTWIDTH, TEXTHEIGHT, TXT_BT_4);\r
- endif\r
- endif \r
-\r
- endif\r
- \r
- //-----------------------------------------------------------------------------------------\r
- if(state == TOUCH_MOVING) // if it's moving\r
- x := touch_Get(TOUCH_GETX); \r
- y := touch_Get(TOUCH_GETY);\r
- //\r
- //+++++++++++CODE++++++++++++++++++\r
- //\r
- endif\r
-endfunc\r
-\r
-func main()\r
- var n;\r
- isConsole := 0;\r
- isStatus := 1;\r
- cnt:=0;\r
- color:=BLACK;\r
- draw_console();\r
-\r
- // first, set all the buttons to the up state\r
- \r
- setbaud(BAUD_2400); \r
- touch_Set(TOUCH_ENABLE);\r
- touch_Set(2); \r
- draw_status();\r
- repeat\r
- \r
- touchscreen();\r
- ch := serin();\r
- if(ch!=-1)\r
- if(isConsole==1)\r
- print_ser();\r
- else\r
- if(ch==MSG_START) \r
- get_msg();\r
- process_msg();\r
- endif\r
- endif\r
- endif\r
- \r
- forever\r
-\r
-endfunc\r
-//----------------------------------------------------------------------------------------//\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r