--- /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 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
+\r
+ var bt_x[4];\r
+ var mode_change[4];\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_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
+ 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
+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
+ cnt:=0;\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
+\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