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
    }
}