Electric Skateboard using Wi-Fi controller.
Dependencies: Servo WizFi250Interface mbed
Diff: main.cpp
- Revision:
- 0:aca1f2f5443d
- Child:
- 1:a710607c27cd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 28 11:25:26 2015 +0000 @@ -0,0 +1,314 @@ +#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 + } +}