Electric Skateboard using Wi-Fi controller.
Dependencies: Servo WizFi250Interface mbed
main.cpp
- Committer:
- kaizen
- Date:
- 2015-10-28
- Revision:
- 0:aca1f2f5443d
- Child:
- 1:a710607c27cd
File content as of revision 0:aca1f2f5443d:
#include "mbed.h" #include "Servo.h" #include "WizFi250Interface.h" #define SECURE WizFi250::SEC_WPA2_MIXED #define SSID "Kaizen_Skate" #define PASS "qwertyuiop" #define SERVER_PORT 5000 #define STOP_MOTOR 50 #if defined(TARGET_WIZwiki_W7500P) WizFi250Interface wizfi250(PC_2,PC_3,PC_13,PC_14,PC_12,NC,115200); Serial pc(USBTX, USBRX); Servo motor_speed(PC_8); // it used to percentage value ( 0 ~ 1 ) DigitalOut green_led(LED2); DigitalOut red_led(LED1); DigitalOut blue_led(LED3); #endif //#define START_SIGNAL 0x0102FEFD //#define END_SIGNAL 0x0201FDFE //#define CONTROL_UP 0x0304FCFB //#define CONTROL_DOWN 0x0403FBFD //#define CONTROL_CRUISER 0x0506FAF9 // //#define STATUS_CMD_OK 0x10101010 //#define STATUS_CMD_FAIL 0x01010101 #define START_MSG "START" #define END_MSG "END\n" #define CONTROL_UP "UPXX" #define CONTROL_DOWN "DOWN" #define CONTROL_CRUISER "CRUI" #define CONTROL_STOP "STOP" #define STATUS_CMD_OK "OKXX" #define STATUS_CMD_FAIL "FAIL" #define CONTROL_MSG_SIZE 19 // Control Pkt Format : START,CONTROL,SPEED_VALUE,END // START,UPXX,500,END // Status Pkt Format : START,CONTROL,SPEED_VALUE,STATUS,END struct control_pkt{ char start_msg[6]; char control_msg[5]; char speed_msg[4]; char end_msg[4]; }; void parse(char buffer[], int *j, char *string); //struct status_pkt{ // char start_msg[6]; // char speed_msg[4]; // char status_msg[5]; // char end_msg[4]; //} int main() { int recv_cnt,j; volatile float speed_value = 0.5; char recv_control_msg[100]; char status_msg[100]; control_pkt control; pc.baud(115200); green_led = 1; red_led = 1; blue_led = 1; wizfi250.init(); wizfi250.setAntMode(WizFi250::PCB); wizfi250.setAddress("192.168.100.2","255.255.255.0","192.168.100.1"); if ( wizfi250.connect(SECURE, SSID, PASS, WizFi250::WM_AP)) { red_led = 0; return -1; } printf("IP Address is %s\r\n", wizfi250.getIPAddress()); green_led = 0; red_led = 0; blue_led = 0; TCPSocketServer server; TCPSocketConnection client; while(true) { if( client.is_connected() == false ) { green_led = 1; red_led = 1; blue_led = 0; client.close(); server.close(); if(speed_value == 0.5) { server.bind(SERVER_PORT); server.listen(); printf("\nWait for new connection...\r\n"); server.accept(client); client.set_blocking(false, 1500); } else if(speed_value <= 0.45) { printf("Speed decrease +\r\n"); speed_value += 0.05; motor_speed = speed_value; } else if(speed_value >= 0.55) { printf("Speed decrease -\r\n"); speed_value -= 0.05; motor_speed = speed_value; } } else { motor_speed = speed_value; green_led = 0; red_led = 1; blue_led = 1; //recv_cnt = client.receive_all((char*)recv_control_msg, sizeof(control)-1); recv_cnt = client.receive_all((char*)recv_control_msg, sizeof(control)); j=0; parse(recv_control_msg, &j, control.start_msg); parse(recv_control_msg, &j, control.control_msg); parse(recv_control_msg, &j, control.speed_msg); parse(recv_control_msg, &j, control.end_msg); if(recv_cnt > 0) { if( (strncmp(control.start_msg,START_MSG,sizeof(control.start_msg)) != 0) || (strncmp(control.end_msg,END_MSG,sizeof(control.end_msg)) != 0) ) { printf("TEST Error\r\n"); sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_FAIL,END_MSG); client.send_all((char*)status_msg,strlen(status_msg)); continue; } if( strncmp(control.control_msg,CONTROL_UP,sizeof(control.control_msg)) == 0 ) { speed_value += 0.05; motor_speed = speed_value; printf("TEST UP %f\r\n",speed_value); } else if( strncmp(control.control_msg,CONTROL_DOWN,sizeof(control.control_msg)) == 0) { speed_value -= 0.05; motor_speed = speed_value; printf("TEST DOWN %f\r\n",speed_value); } else if( strncmp(control.control_msg,CONTROL_CRUISER,sizeof(control.control_msg)) == 0) { printf("TEST CRUISER\r\n"); speed_value = (float)(atoi(control.speed_msg)) / 100; motor_speed = speed_value; } else if( strncmp(control.control_msg,CONTROL_STOP,sizeof(control.control_msg)) == 0) { speed_value = 0.5; motor_speed = speed_value; printf("TEST STOP\r\n"); } else { printf("TEST Error 1-2\r\n"); sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_FAIL,END_MSG); client.send_all((char*)status_msg,strlen(status_msg)); continue; } sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_OK,END_MSG); client.send_all((char*)status_msg,strlen(status_msg)); } else { sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_OK,END_MSG); client.send_all((char*)status_msg,strlen(status_msg)); } } }// while } /* int main() { int recv_cnt; volatile float speed_value = 0.5; control_pkt skate_control_pkt; status_pkt skate_status_pkt; char recv_control_msg[100]; pc.baud(115200); green_led = 1; red_led = 1; blue_led = 1; wizfi250.init(); wizfi250.setAntMode(WizFi250::UFL); wizfi250.setAddress("192.168.100.2","255.255.255.0","192.168.100.1"); if ( wizfi250.connect(SECURE, SSID, PASS, WizFi250::WM_AP)) { red_led = 0; return -1; } printf("IP Address is %s\r\n", wizfi250.getIPAddress()); green_led = 0; red_led = 0; blue_led = 0; TCPSocketServer server; TCPSocketConnection client; while(true) { if( client.is_connected() == false ) { green_led = 1; red_led = 1; blue_led = 0; client.close(); server.close(); if(speed_value == 0.5) { server.bind(SERVER_PORT); server.listen(); printf("\nWait for new connection...\r\n"); server.accept(client); client.set_blocking(false, 1500); } else if(speed_value <= 0.45) { speed_value += 0.005; motor_speed = speed_value; } else if(speed_value >= 0.55) { speed_value -= 0.005; motor_speed = speed_value; } } else { motor_speed = speed_value; green_led = 0; red_led = 1; blue_led = 1; //recv_cnt = client.receive_all((char*)&skate_control_pkt, sizeof(skate_control_pkt)); recv_cnt = client.receive_all((char*)recv_control_msg, sizeof(recv_control_msg)); if(recv_cnt > 0) { //printf("%x,%x,%x,%x\r\n",skate_control_pkt.start_signal,skate_control_pkt.control,skate_control_pkt.speed_value,skate_control_pkt.end_signal); printf("TEST %s\r\n", if( (skate_control_pkt.start_signal != START_SIGNAL) || (skate_control_pkt.end_signal != END_SIGNAL) ) { printf("TEST 100\r\n"); skate_status_pkt.start_signal = START_SIGNAL; skate_status_pkt.end_signal = END_SIGNAL; skate_status_pkt.speed_value = speed_value * 100; skate_status_pkt.status = STATUS_CMD_FAIL; client.send_all((char*)&skate_status_pkt, sizeof(skate_status_pkt)); continue; } if( skate_control_pkt.control == CONTROL_UP ) { speed_value += 0.005; motor_speed = speed_value; printf("TEST UP %f\r\n",speed_value); } else if( skate_control_pkt.control == CONTROL_DOWN ) { speed_value -= 0.005; motor_speed = speed_value; printf("TEST DOWN %f\r\n",speed_value); } else if( skate_control_pkt.control == CONTROL_CRUISER ) { speed_value = skate_control_pkt.speed_value / 100; motor_speed = speed_value; printf("TEST CRUISER\r\n"); } else { printf("TEST 101\r\n"); skate_status_pkt.start_signal = START_SIGNAL; skate_status_pkt.end_signal = END_SIGNAL; skate_status_pkt.status = STATUS_CMD_FAIL; skate_status_pkt.speed_value = speed_value * 100; client.send_all((char*)&skate_status_pkt, sizeof(skate_status_pkt)); continue; } printf("TEST 103\r\n"); skate_status_pkt.start_signal = START_SIGNAL; skate_status_pkt.end_signal = END_SIGNAL; skate_status_pkt.status = STATUS_CMD_OK; skate_status_pkt.speed_value = speed_value * 100; client.send_all((char*)&skate_status_pkt, sizeof(skate_status_pkt)); } } }// while } */ void parse(char buffer[], int *j, char *string) { //extracts next location string data item from buffer int i=0; for (i=0; i<=strlen(buffer); i++) { //TOTAL SIZE OF RETURNED DATA if ((buffer[*j+i] == ',')||(buffer[*j+i] == '\0' )) { //IF comma or end of string //comma is the string field delimiter string[i]=0; //SETS END OF SRTRING TO 0 *j=*j+i+1; //UPDATES to 1 after comma seperated value break; } else string[i]=buffer[*j+i]; //Keep adding to the string } }