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

Files at this revision

API Documentation at this revision

Comitter:
flatbird
Date:
Fri Mar 13 14:36:43 2015 +0900
Parent:
0:f7596ed7ab5c
Child:
2:160c20430be3
Commit message:
add code to bind, listen, accept and receive TCP socket.

Changed in this revision

WebSocketServer.cpp Show annotated file Show diff for this revision Revisions of this file
WebSocketServer.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/WebSocketServer.cpp	Fri Mar 13 00:22:57 2015 +0000
+++ b/WebSocketServer.cpp	Fri Mar 13 14:36:43 2015 +0900
@@ -6,3 +6,83 @@
 WebSocketServer::~WebSocketServer() {
 }
 
+bool WebSocketServer::init(int port) {
+	mTCPSocketServer.set_blocking(true);
+
+	int ret = mTCPSocketServer.bind(port);
+	if (ret != 0) {
+		printf("ERROR: Failed to bind %d\r\n", ret);
+		return false;
+	}
+	ret = mTCPSocketServer.listen();
+	if (ret != 0) {
+		printf("ERROR: Failed to listen %d\r\n", ret);
+		return false;
+	}
+
+	return true;
+}
+
+void WebSocketServer::run() {
+	TCPSocketConnection connection;
+	char buf[1024];
+
+	while (true) {
+		bool isWebSocket = false;
+		int ret = mTCPSocketServer.accept(connection);
+		if (ret != 0) {
+			continue;
+		}
+		printf("New connection\r\n");
+		while (connection.is_connected()) {
+			ret = connection.receive(buf, sizeof(buf) - 1);
+			if (ret <= 0) {
+				if (ret == 0) {
+					printf("closed\r\n");
+				} else {
+					printf("ERROR: Failed to receive %d\r\n", ret);
+				}
+				break;
+			}
+			if (!isWebSocket) {
+				if (this->handleHTTP(buf, ret)) {
+					isWebSocket = true;
+				} else {
+					printf("ERROR: Non websocket\r\n");
+					break;
+				}
+			} else {
+				if (!this->handleWebSocket(buf, ret)) {
+					break;
+				}
+			}
+		}
+		connection.close();
+	}
+}
+
+bool WebSocketServer::setHandler(const char* path, WebSocketHandler* handler) {
+	return true;
+}
+
+bool WebSocketServer::handleHTTP(char* buf, int size) {
+	char* line = &buf[0];
+
+	for (int i = 0; i < size; i++) {
+		if (buf[i] == '\r' && i+1 < size && buf[i+1] == '\n') {
+			buf[i] = '\0';
+			if (strlen(buf) <= 0) {
+				break;
+			}
+			printf("%s\r\n", line);
+			i += 2;
+			line = &buf[i];
+		}
+	}
+
+	return true;
+}
+
+bool WebSocketServer::handleWebSocket(char* buf, int size) {
+	return true;
+}
--- a/WebSocketServer.h	Fri Mar 13 00:22:57 2015 +0000
+++ b/WebSocketServer.h	Fri Mar 13 14:36:43 2015 +0900
@@ -23,7 +23,9 @@
     bool setHandler(const char* path, WebSocketHandler* handler);
 
 private:
-    TCPSocketServer mTcpSocketServer;
+    bool handleHTTP(char* buf, int size);
+    bool handleWebSocket(char* buf, int size);
+    TCPSocketServer mTCPSocketServer;
 };
 
 #endif
\ No newline at end of file
--- a/main.cpp	Fri Mar 13 00:22:57 2015 +0000
+++ b/main.cpp	Fri Mar 13 14:36:43 2015 +0900
@@ -7,8 +7,6 @@
 #define SEC_TYPE    e_SEC_WPA2_AES
 #define SEC_KEY     ""
 
-//static char* getIPAddress();
-
 // tx, rx, cts, rts, reset, alarm=NC, baud=115200
 C_SNIC_WifiInterface wifi(p9, p10, NC, NC, p30);
 
@@ -39,56 +37,3 @@
     printf("WiFi connected: %s\r\n", wifi.getIPAddress());
 }
 
-// from http://developer.mbed.org/users/MACRUM/code/SNICInterface_mod/
-//char* ::getIPAddress() {
-//    C_SNIC_Core               *snic_core_p  = C_SNIC_Core::getInstance();
-//    C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand();
-//    
-//    snic_core_p->lockAPI();
-//    // Get local ip address.
-//    // Get buffer for response payload from MemoryPool
-//    tagMEMPOOL_BLOCK_T *payload_buf_p = snic_core_p->allocCmdBuf();
-//    if( payload_buf_p == NULL )
-//    {
-//        DEBUG_PRINT("getIPAddress payload_buf_p NULL\r\n");
-//        snic_core_p->unlockAPI();
-//        return 0;
-//    }
-//
-//    C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T req;
-//    // Make request
-//    req.cmd_sid      = UART_CMD_SID_SNIC_GET_DHCP_INFO_REQ;
-//    req.seq          = mUartRequestSeq++;
-//    req.interface    = 0;
-//    
-//    unsigned char *command_array_p = snic_core_p->getCommandBuf();
-//    unsigned int  command_len;
-//    // Preparation of command
-//    command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req
-//                            , sizeof(C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T), payload_buf_p->buf, command_array_p );
-//    // Send uart command request
-//    snic_core_p->sendUart( command_len, command_array_p );
-//    // Wait UART response
-//    int ret = uartCmdMgr_p->wait();
-//    if( ret != 0 )
-//    {
-//        DEBUG_PRINT( "getIPAddress failed\r\n" );
-//        snic_core_p->freeCmdBuf( payload_buf_p );
-//        snic_core_p->unlockAPI();
-//        return 0;
-//    }
-//    
-//    if( uartCmdMgr_p->getCommandStatus() != UART_CMD_RES_SNIC_SUCCESS )
-//    {
-//        snic_core_p->freeCmdBuf( payload_buf_p );
-//        snic_core_p->unlockAPI();
-//        return 0;
-//    }
-//    
-//    snic_core_p->freeCmdBuf( payload_buf_p );
-//    snic_core_p->unlockAPI();
-//
-//    sprintf(ip_addr, "%d.%d.%d.%d\0", payload_buf_p->buf[9], payload_buf_p->buf[10], payload_buf_p->buf[11], payload_buf_p->buf[12]);
-//
-//    return ip_addr;
-//}