11

Dependencies:   millis

Revision:
0:9d6c79aa222a
Child:
1:2a5890e25db5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lift-back-eth-keil/main.cpp	Sun Jul 29 12:56:17 2018 +0000
@@ -0,0 +1,274 @@
+
+#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);
+        }   
+       
+    }
+ 
+}
+