Compare commits
	
		
			2 Commits 
		
	
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 463fe60a1b | 3 years ago | 
|  | d883385d8c | 3 years ago | 
| @ -0,0 +1,13 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | struct Connection; | ||||||
|  | typedef Connection* Connection; | ||||||
|  | 
 | ||||||
|  | struct Connection* | ||||||
|  | conn_new ( | ||||||
|  |         struct Connection* connection, | ||||||
|  |         unsigned int source_port, | ||||||
|  |         const char* source_ip, | ||||||
|  |         unsigned int dest_port, | ||||||
|  |         const char* dest_ip ); | ||||||
|  | extern const size_t SIZEOF_CONN; | ||||||
| @ -0,0 +1,248 @@ | |||||||
|  | #include "roboeasy.h" | ||||||
|  | #include "robomaster.h" | ||||||
|  | #include "connection.h" | ||||||
|  | 
 | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | 
 | ||||||
|  | struct Robot { | ||||||
|  | 
 | ||||||
|  |     struct Client* client; | ||||||
|  |     uint16_t seq; | ||||||
|  | 
 | ||||||
|  |     int16_t wheels[4]; | ||||||
|  |     bool dirty_wheels; | ||||||
|  | 
 | ||||||
|  |     uint8_t colors[3]; | ||||||
|  |     bool dirty_colors; | ||||||
|  | 
 | ||||||
|  |     bool sdk_mode; | ||||||
|  | 
 | ||||||
|  |     enum { | ||||||
|  |         CONNECTING_TO_PROXY_PORT, | ||||||
|  |         SETTING_SDK_CONNECTION, | ||||||
|  |         CONNECTING_TO_DEVICE_PORT, | ||||||
|  |         SETTING_SDK_MODE, | ||||||
|  |         RESETTING_SUBNODE, | ||||||
|  |         SUSBCRIBING_SUBNODE, | ||||||
|  |         SETTING_MOVEMENT_MODE, | ||||||
|  |         SENDING_HEARTBEAT, | ||||||
|  |         WAITING, | ||||||
|  |         READY, | ||||||
|  |         STOPPED | ||||||
|  |     } state; | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | robot_drive(Robot robot, float x, float y, float r) { | ||||||
|  |     // TODO: move individual wheel speed calculation to work function
 | ||||||
|  |     // This function may be used in a timer handler, so fast as possible
 | ||||||
|  |     robot->wheels[0] = (y + x + r) * 1000; | ||||||
|  |     robot->wheels[1] = -(y - x - r) * 1000; | ||||||
|  |     robot->wheels[2] = -(y + x - r) * 1000; | ||||||
|  |     robot->wheels[3] = (y - x + r) * 1000; | ||||||
|  |     robot->dirty_wheels = true; | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | robot_led(Robot robot, unsigned char r, unsigned char g, unsigned char b) { | ||||||
|  |     robot->colors[0] = r; | ||||||
|  |     robot->colors[1] = g; | ||||||
|  |     robot->colors[2] = b; | ||||||
|  |     robot->dirty_colors = true; | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | robot_heartbeat(Robot robot) { | ||||||
|  | 
 | ||||||
|  |     if(robot->state != READY) | ||||||
|  |         return 0; | ||||||
|  | 
 | ||||||
|  |     robot->state = SENDING_HEARTBEAT; | ||||||
|  | 
 | ||||||
|  |     return 1; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | robot_work(Robot robot) { | ||||||
|  | 
 | ||||||
|  |     union Request req = {0}; | ||||||
|  | 
 | ||||||
|  |     switch(robot->state) { | ||||||
|  | 
 | ||||||
|  |         case WAITING: | ||||||
|  |             break; | ||||||
|  | 
 | ||||||
|  |         case CONNECTING_TO_PROXY_PORT: | ||||||
|  |         { | ||||||
|  |             robot->client->sdk_conn = connection_new(0, 0, 30030, "192.168.2.1"); | ||||||
|  |             robot->state = SETTING_SDK_CONNECTION; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case SETTING_SDK_CONNECTION: | ||||||
|  |         { | ||||||
|  |             set_sdk_connection(&req, robot->seq++, true, CONNECTION_WIFI_AP, 0, 10010); | ||||||
|  |             req_send(robot->client->sdk_conn, &req); | ||||||
|  |             robot->state = WAITING; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case CONNECTING_TO_DEVICE_PORT: | ||||||
|  |         { | ||||||
|  |             robot->client->dev_conn = connection_new(10010, "192.168.2.24", 20020, "192.168.2.1"); | ||||||
|  |             robot->state = SETTING_SDK_MODE; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case SETTING_SDK_MODE: | ||||||
|  |         { | ||||||
|  |             set_sdk_mode(&req, robot->seq++, true, robot->sdk_mode); | ||||||
|  |             req_send(robot->client->dev_conn, &req); | ||||||
|  |             robot->state = WAITING; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case RESETTING_SUBNODE: | ||||||
|  |         { | ||||||
|  |             subnode_reset(&req, robot->seq++, true); | ||||||
|  |             req_send(robot->client->dev_conn, &req); | ||||||
|  |             robot->state = WAITING; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case SUSBCRIBING_SUBNODE: | ||||||
|  |         { | ||||||
|  |             subscribe_add_node(&req, robot->seq++, true); | ||||||
|  |             req_send(robot->client->dev_conn, &req); | ||||||
|  |             robot->state = WAITING; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case SETTING_MOVEMENT_MODE: | ||||||
|  |         { | ||||||
|  |             set_robot_mode(&req, robot->seq++, true, MOVEMENTMODE_FREE); | ||||||
|  |             req_send(robot->client->dev_conn, &req); | ||||||
|  |             robot->state = WAITING; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case SENDING_HEARTBEAT: | ||||||
|  |         { | ||||||
|  |             sdk_heartbeat(&req, robot->seq++, true); | ||||||
|  |             req_send(robot->client->sdk_conn, &req); | ||||||
|  |             robot->state = WAITING; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case READY: | ||||||
|  |         { | ||||||
|  |             if(robot->dirty_wheels) { | ||||||
|  |                 set_wheel_speed ( | ||||||
|  |                         &req, robot->seq++, false, | ||||||
|  |                         robot->wheels[0], | ||||||
|  |                         robot->wheels[1], | ||||||
|  |                         robot->wheels[2], | ||||||
|  |                         robot->wheels[3] ); | ||||||
|  |                 req_send(robot->client->dev_conn, &req); | ||||||
|  |                 robot->dirty_wheels = false; | ||||||
|  |             } | ||||||
|  |             if(robot->dirty_colors) { | ||||||
|  |                 set_system_led ( | ||||||
|  |                         &req, robot->seq++, false, | ||||||
|  |                         robot->colors[0], | ||||||
|  |                         robot->colors[1], | ||||||
|  |                         robot->colors[2], | ||||||
|  |                         LEDCOMP_ALL, | ||||||
|  |                         0xFFFF, | ||||||
|  |                         LEDEFFECT_ON, | ||||||
|  |                         100, | ||||||
|  |                         100 ); | ||||||
|  |                 req_send(robot->client->dev_conn, &req); | ||||||
|  |                 robot->dirty_colors = false; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         case STOPPED: | ||||||
|  |             return 0; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     union Message resp; | ||||||
|  |     poll_message(robot->client, &resp); | ||||||
|  |     switch(resp.header.cmd) { | ||||||
|  |         case 0: | ||||||
|  |             break; | ||||||
|  |         case SET_SDK_CONNECTION_CMD: | ||||||
|  |             // TODO: Do more with this
 | ||||||
|  |             if(resp.resp.sdkconn.retcode) { | ||||||
|  |                 robot->state = STOPPED; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             robot->state = CONNECTING_TO_DEVICE_PORT; | ||||||
|  |             break; | ||||||
|  |         case SET_SDK_MODE_CMD: | ||||||
|  |             // TODO: Do more with this
 | ||||||
|  |             if(resp.resp.sdkmode.retcode) { | ||||||
|  |                 robot->state = STOPPED; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             robot->state = robot->sdk_mode ? RESETTING_SUBNODE : STOPPED; | ||||||
|  |             break; | ||||||
|  |         case SUBNODE_RESET_CMD: | ||||||
|  |             if(resp.resp.subnodereset.retcode) { | ||||||
|  |                 robot->state = STOPPED; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             robot->state = SUSBCRIBING_SUBNODE; | ||||||
|  |             break; | ||||||
|  |         case SUBSCRIBE_ADD_NODE_CMD: | ||||||
|  |             if(resp.resp.subnodeadd.retcode && resp.resp.subnodeadd.retcode != 0x50) { | ||||||
|  |                 robot->state = STOPPED; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             robot->state = SETTING_MOVEMENT_MODE; | ||||||
|  |             break; | ||||||
|  |         case SET_ROBOT_MODE_CMD: | ||||||
|  |             if(resp.resp.mvmode.retcode) { | ||||||
|  |                 robot->state = STOPPED; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             robot->state = SENDING_HEARTBEAT; | ||||||
|  |             break; | ||||||
|  |         case SDK_HEARTBEAT_CMD: | ||||||
|  |             if(resp.resp.heartbeat.retcode) { | ||||||
|  |                 robot->state = STOPPED; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             robot->state = READY; | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return 1; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Robot robot_new() { | ||||||
|  |     struct Robot* robot = malloc(sizeof(struct Robot)); | ||||||
|  |     memset(robot, 0, sizeof(struct Robot)); | ||||||
|  |     return robot; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int robot_init(Robot robot) { | ||||||
|  |     robot->client = client_new(); | ||||||
|  |     robot->sdk_mode = true; | ||||||
|  |     robot->state = CONNECTING_TO_PROXY_PORT; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int robot_stop(Robot robot) { | ||||||
|  |     robot->sdk_mode = false; | ||||||
|  |     robot->state = SETTING_SDK_MODE; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue