嵌入式網路程式設計 期中專題 微算機原理及應用實習
Midterm Project: RS-232界面之井字遊戲 Key1之定義 按Key1即與對方建立連線 (連線狀態應顯示於LCD上) 建立連線後,按Key1(開始鍵)即表示連線遊戲開始 兩方皆播於遊戲開始之音效 先按「開始鍵」者即為『 先玩者』 Key2之定義:「Reset」鍵 利用LED面板顯示與觸控決定「0」與「x」之位置 先玩者用符號「0」 Board A Board B RS-232 Key2 Key1 Key2 Key1
程式要確保未輪到你玩時, 所按的觸控按鍵無效, 除了「Reset」鍵外 勝負由「先玩者」那一方之程式判斷決定 勝負決定後, 勝方要產生「勝利音樂」 輸方要產生「失敗之音樂」
雙方通訊之格式 1 2 3 4 5 6 :開始 7 8 9 :結束, 勝利 :結束, 輸了 :Reset C :建立連線 Ack 1byte Type 4 5 6 :開始 S 7 8 9 :結束, 勝利 W L :結束, 輸了 R :Reset C :建立連線 C Ack A :Ack與Ack number 連線建立 連線建立 :走的位置 1~9
構思 Local Events Remote Events 建立連線 (按Key1) 開始遊戲 (按Key1) 重置(按Key2) 觸控位置 遊戲結束 Remote Events 連線要求(收到「C」) 開始遊戲要求(收到「S」) 重置要求(收到「R」) 觸控位置要求(收到「1~9」) 遊戲結束-勝利(收到「W」) 遊戲結束-失敗(收到「L」)
Tasks Key_Task Rx_Task Tx_Task Touch_Task LCD_Task Result_Task 判斷是否有按 Key1 or Key2 Rx_Task 接收RS-232資料 Tx_Task 傳送資料至RS-232 Touch_Task 偵測Touch pannel是否有被按,被按之位置 LCD_Task 畫井字型與畫「0」與「x」 Result_Task 判斷輸贏 Music_Task Play music FSM_Task 根據按鍵值與收到的資料,決定系統目前所處之狀態
FSM 目前狀態 輸入 次一狀態 x=0 x=1 輸出 x=0 x=1 AB y 00 01 10 11 1 輸入 輸出 目前狀態 次一狀態
FSM_Task (1) Idle End2 End1 Connet1 Connet2 Play other Rx_C key1 Rx_R or Rx_R End key1 Rx_W Rx_S Rx_L Play
Task Relationship FSM_Task Key_Task Rx_Task Music_Task Result_Task W L 1~9 1~9 Key_Task Rx_Task Touch_Task Mail Queue Music_Task S 1~9 Rx 1~9 FSM_Task Result_Task LCD_Task 1~9 Rx 1~9 W, L C, R, S, 1~9 Tx_Task
FSM_Task(1) OS_EVENT *FSM_Mbox; INT8U os_err; FSM_Mbox = OSMboxCreate((void *) 0); void FSM_Task(void) { INT8U Rx_Event; *Rx_Event = (INT8U *) OSMboxPend(FSM_Mbox, 0, &os_err); switch(Rx_Event) case Key1: if (state=idle) , state = connect1, 要求Tx_task送出「C」 if (state = connect1), state = play, 要求Tx_task送出「S」 case Key2: state = idle, 要求Tx_task送出「R」 case C: if (state=idle) , state = connect2 case R: state = idle, case S: if (state = connect2), state = play, case W: case L: case L1~9: case R1~9: default: } INT8U Event; OSMboxPost(FSM_Mbox, (void*) &Event);
FSM_Task(2) OS_EVENT *FSM_Mbox; INT8U os_err; FSM_Mbox = OSMboxCreate((void *) 0); void FSM_Task(void) { INT8U Rx_Event; *Rx_Event = (INT8U *) OSMboxPend(FSM_Mbox, 0, &os_err); switch(state) case idle: if (Rx_Event=Key1) , state = connect1, 要求Tx_task送出「C」 if (Rx_Event=Rx_C), state = connect2 case connect1: case connect2: case play1: case play2: case end1: case end2: }