11

Dependencies:   millis

lift-back-eth-keil/main.cpp

Committer:
dimavb
Date:
2018-07-29
Revision:
0:9d6c79aa222a
Child:
1:2a5890e25db5

File content as of revision 0:9d6c79aa222a:


#include <mbed.h>
#include "EthernetInterface.h"
#include "UDPSocket.h"
#include <string>
#include <math.h>

#include "DebounceIn.h"

Serial pc(USBTX, USBRX);

EthernetInterface eth;

Thread recv_thread(osPriorityNormal, 16*1024);
Thread send_thread(osPriorityNormal, 16*1024);
Thread work_thread(osPriorityNormal, 16*1024);

DigitalIn btn(USER_BUTTON);

typedef struct {
    char data[100];
		int size;
} mail_t;

Mail<mail_t, 16> recv_box;
Mail<mail_t, 16> send_box;    
    
    
Mutex datamutex;

int speed=0;
int dist=0;

int bt1=0;
int bt2=0;
    
void recv(void)
{   
	SocketAddress sockAddr;
   // sockAddr.set_ip_address("192.168.2.1");
   // sockAddr.set_port(9000);
    UDPSocket sock;
    char  recv_data[100];
	pc.printf("r:sock.open=%d\r\n",sock.open(&eth));
	pc.printf("r:sock.bind=%d\r\n",sock.bind(8000));
   
    int ret;
    while(1)
    {
			pc.printf("r:listening...\r\n");
        ret = sock.recvfrom(&sockAddr, &recv_data, sizeof(recv_data));
			pc.printf("r:got\r\n");
        if (ret < 0) 
        {
					pc.printf("receive error:%d\r\n",ret);
					pc.printf("reset\r\n");
  				HAL_NVIC_SystemReset();

        } 
        else
        {
					pc.printf("r:%\r\n",recv_data);
            mail_t *mail = recv_box.alloc();
            int cpcnt;
            if (ret>sizeof(recv_data)) cpcnt=sizeof(recv_data); else cpcnt = ret; //copy no more than buffer size
            
						memset(mail->data,0,sizeof(mail->data));
						memcpy (mail->data, recv_data,cpcnt);
            recv_box.put(mail);
				pc.printf("r:put\r\n");
        }
    }    
}
void send(void)
{
    
    SocketAddress sockAddr;
   // sockAddr.set_ip_address("192.168.137.1");
    //sockAddr.set_port(8000);
    UDPSocket sock;
    //char  recv_data[1500];
    pc.printf("sock.open=%d\r\n",sock.open(&eth));
    
    int ret;
    while(1)
    {
        //pc.printf("s::waiting...\r\n");
        
        osEvent evt = send_box.get(1);
        if (evt.status == osEventMail) 
        {
            mail_t *mail = (mail_t*)evt.value.p;
					pc.printf("s:got data: %s; size: %d\n\r", mail->data,mail->size);
            
            ret = sock.sendto("192.168.1.101",9000, mail->data, mail->size);
            if (ret < 0) 
            {
                pc.printf("send error:%d\r\n",ret);
								pc.printf("reset\r\n");
								HAL_NVIC_SystemReset();
            } 
            else
            {
                pc.printf("sent %d bytes\r\n",ret);
            }
            send_box.free(mail);
        }    
                
            
        }
        
        
}
void zero_counters()
{
	datamutex.lock();
	dist=0;
	datamutex.unlock();
}

void parse(char *data)
{
        char cmd[100];
        char mask[100];

        
        memset (cmd,0, sizeof(cmd));
        int val1=0;
        int val2=0;
        int val3=0;
    
        if (1) 
            {
                //pc.printf("r:%s",data);
               // rxready=0;
                uint8_t r = sscanf((const char *)data+1,"%s %s %d %d %d",cmd, mask, &val1, &val2, &val3);
                if (r==0) 
                { 
                    pc.printf("waat?\r\n");
                }
                if (r<4) { 
                    if (!strcmp(cmd,"reset")) 
                    {
                     pc.printf("cmd reset\r\n");
                     zero_counters();
                     return;
                     }
                     
                }
                
                    
                }
                pc.printf("unknown command:%s\r\n",data);
            
}

void status_callback(nsapi_event_t status, intptr_t param)
{
    printf("Connection status changed!\r\n");
    switch(param) {
        case NSAPI_STATUS_LOCAL_UP:
            printf("Local IP address set!\r\n");
            break;
        case NSAPI_STATUS_GLOBAL_UP:
            printf("Global IP address set!\r\n");
            break;
        case NSAPI_STATUS_DISCONNECTED:
            printf("No connection to network!\r\n");
            printf("System reset.\r\n");
            HAL_NVIC_SystemReset();
            break;
        case NSAPI_STATUS_CONNECTING:
            printf("Connecting to network!\r\n");
            break;
        default:
            printf("Net status: %d\r\n",param);
            break;
    }
}
Timer pingt;
unsigned int
endian_swap(unsigned int x)
{
return
(x>>24) |
((x>>8) & 0x0000ff00) |
((x<<8) & 0x00ff0000) |
(x<<24);
}
void work(void)
{int rnd;
	float s;
	uint32_t cnt=0;
	while(1)
	{
	cnt++;
	s=sin(float(cnt) / 100.0f);
	if (s<0) s=-s;
	if (btn==0) s=0;
	datamutex.lock();
	speed=s*100;
	dist=dist+speed;
	rnd = rand();
	if (rnd>2000000000) bt1=1; else bt1=0;
	if (rnd<200000000) bt2=1; else bt2=0;
	
	datamutex.unlock();
	wait(0.2f);
	pc.printf("Dist:%d\t Speed:%d\tButton1:%d\tButton2:%d\t%d\n",dist,speed,bt1,bt2,rnd);
	char datastr[128];
	mail_t *mail = send_box.alloc();
    const char send_data[]="/data\x00\x00\x00\x2ciiii\x00\x00\x00";
    memcpy(datastr,send_data,16);
    int tmp;
    tmp = endian_swap(speed);
    memcpy(datastr+16,&tmp,4);
    tmp = endian_swap(dist);
    memcpy(datastr+20,&tmp,4);
    tmp = endian_swap(bt1);
    memcpy(datastr+24,&tmp,4);
    tmp = endian_swap(bt2);
    memcpy(datastr+28,&tmp,4);
    memcpy (mail->data, datastr,32);
	mail->size = 32;
	send_box.put(mail);
	
	bt1=0;
	bt2=0;
	}
	
	
}
int main()
{   pc.baud(115200);
    pc.printf("Hello. Bike!\r\n");
	
    pc.printf("eth.set=%d\r\n",eth.set_network("192.168.1.200","255.255.255.0","192.168.1.1"));
    int rz=eth.connect();
    eth.attach(&status_callback);
    pc.printf("Status interrupt attached.\r\n");
    pc.printf("eth.connect=%d\r\n",rz);
	if (rz<0) {
		pc.printf("reset\r\n");
		HAL_NVIC_SystemReset();
	}
    
    pc.printf("IP address is '%s'\r\n", eth.get_ip_address());
    
    recv_thread.start(recv);
    send_thread.start(send);
    work_thread.start(work);
    
    pc.printf("threads started\r\n");
    
		while (1)
    {
        osEvent evt = recv_box.get(10);
        if (evt.status == osEventMail) 
        {
            mail_t *mail = (mail_t*)evt.value.p;
            for (uint8_t i =0; i<100; i++)
            {
                if (mail->data[i] == 0 || mail->data[i] == 0x2c || mail->data[i] == 0x2f) mail->data[i]=0x20;
            }
            //pc.printf("main thread: %s\r\n", mail->data);
						mail->data[99]=0;
            parse(mail->data); 
            send_box.free(mail);
        }   
       
    }
 
}