
Simple WebSocket server to control a tank.
Dependencies: SNICInterface_mod WebSocketServer mbed-rtos mbed PowerControl C12832
au Firefox OS WoTハッカソン on ホワイトデーで使用した、タンクを動かすプログラムです。 ゲームパッドでタンクを操縦します。
ゲームパッドは PC に接続し、ブラウザ上の Web アプリから Gamepad API で入力を取得します。 取得した入力データは WebSocket で mbed 上の WebSocket サーバに送信します。
WebSocket サーバのコードはライブラリ化したので、他のプログラムでもインポートして使えます。
使用した機材
- LPC1768
- Murata TypeYD
- LPC1768 用アプリケーションボード
- TAMIYA トラック&ホイールセット
- TAMIYA ダブルキヤボックス(左右独立4速タイプ)
- TAMIYA ユニバーサルプレート
- TOSHIBA TA7291P x 2
- その他、モバイルバッテリー、電池ボックス等
左右のモータードライバにそれぞれ LPC1768 の p12, p13 と p14, p15 のピンを割り当てていますが、必要に応じてコードを変更してください。
コントローラー側(Webアプリ)
https://github.com/chikoski/wotxwot-control
Firefox ブラウザで動作確認しています(他のブラウザでは動かないかも)。 ゲームパッドの左右のスティックの前後の操作が左右それぞれのモータの前転・後転に対応しています。
動いているところの動画
https://www.facebook.com/video.php?v=456620974491805
ハッカソンでは ARM 賞をいただきました!
(参考) au Firefox OS WoTハッカソン on ホワイトデー
http://au-fx.kddi.com/event/20150314/wot_hackathon0314.html
Diff: WebSocketServer.cpp
- Revision:
- 8:6635ca3b5a5c
- Parent:
- 7:6cfe0638b957
- Child:
- 9:774f408b9740
--- a/WebSocketServer.cpp Sat Mar 14 00:14:40 2015 +0900 +++ b/WebSocketServer.cpp Sat Mar 14 07:52:50 2015 +0000 @@ -30,6 +30,7 @@ while (true) { bool isWebSocket = false; + printf("accepting\r\n"); int ret = mTCPSocketServer.accept(mConnection); if (ret != 0) { continue; @@ -56,6 +57,7 @@ } } else { if (!this->handleWebSocket(buf, ret)) { + printf("websocket closed\r\n"); break; } } @@ -86,23 +88,23 @@ if (strlen(buf) <= 0) { break; } - printf("%s\r\n", line); + printf("[%s]\r\n", line); if (line == &buf[0]) { char* method = strtok(buf, " "); char* path = strtok(NULL, " "); char* version = strtok(NULL, " "); - printf("[%s] [%s] [%s]\r\n", method, path, version); +// printf("[%s] [%s] [%s]\r\n", method, path, version); } else if (strncmp(line, UPGRADE_WEBSOCKET, strlen(UPGRADE_WEBSOCKET)) == 0) { isUpgradeWebSocket = true; - printf("%s found\r\n", UPGRADE_WEBSOCKET); + printf("*** %s found\r\n", UPGRADE_WEBSOCKET); } else if (strncmp(line, SEC_WEBSOCKET_KEY, strlen(SEC_WEBSOCKET_KEY)) == 0) { - printf("%s found\r\n", SEC_WEBSOCKET_KEY); + printf("*** %s found\r\n", SEC_WEBSOCKET_KEY); isSecWebSocketKeyFound = true; char* ptr = line + strlen(SEC_WEBSOCKET_KEY); while (*ptr == ' ') ++ptr; strcpy(key, ptr); - printf("key=%s\r\n", key); + printf("*** key=%s\r\n", key); } i += 2; line = &buf[i]; @@ -111,6 +113,7 @@ if (isUpgradeWebSocket && isSecWebSocketKeyFound) { this->sendUpgradeResponse(key); + mPrevFin = true; return true; } @@ -129,8 +132,11 @@ bool fin = (*ptr & 0x80) == 0x80; uint8_t opcode = *ptr & 0xF; +// printf("Byte1: %02X\r\n", *ptr); +// printf("fin=%d\r\n", fin); printf("opcode=%d\r\n", opcode); + if (opcode == OP_PING) { *ptr = ((*ptr & 0xF0) | OP_PONG); mConnection.send_all(buf, size); @@ -140,17 +146,22 @@ return false; } ptr++; +// printf("Byte2: %02X\r\n", *ptr); - mPrevFin = fin; - if (!fin || !mPrevFin) { + if (!fin || !mPrevFin) { printf("WARN: Data consists of multiple frame not supported\r\n"); + mPrevFin = fin; return true; // not an error, just discard it } + mPrevFin = fin; - bool mask = (*ptr & 0x80) == 1; + bool mask = (*ptr & 0x80) == 0x80; uint8_t len = *ptr & 0x7F; ptr++; - + +// printf("mask=%d\r\n", mask); +// printf("length=%d\r\n", len); + if (len > 125) { printf("WARN: Extended payload lenght not supported\r\n"); return true; // not an error, just discard it @@ -168,12 +179,15 @@ } if (mHandler) { if (opcode == OP_TEXT) { +// printf("OP_TEXT\r\n"); data[len] = '\0'; mHandler->onMessage(data); } else if (opcode == OP_BINARY) { +// printf("OP_BINARY %d\r\n", len); mHandler->onMessage(data, len); } } +// printf("return true\r\n"); return true; }