11

Dependencies:   millis

Revision:
1:2a5890e25db5
Parent:
0:9d6c79aa222a
--- a/lift-back-eth-keil/main.cpp	Sun Jul 29 12:56:17 2018 +0000
+++ b/lift-back-eth-keil/main.cpp	Tue Oct 02 17:03:10 2018 +0000
@@ -4,18 +4,38 @@
 #include "UDPSocket.h"
 #include <string>
 #include <math.h>
+#include <millis.h>
 
-#include "DebounceIn.h"
+
+int ID=8;
+
+char myIP[16] = "192.168.1.10";
+char serverIP[16] = "192.168.1.100";
+char netMask[16] = "255.255.255.0";
+char gateWay[16] = "192.168.1.1";
+
+
+int portSend = 8000;
+int portRecive = 9000;
+
+int delay=200;//msecond
+
 
 Serial pc(USBTX, USBRX);
 
 EthernetInterface eth;
 
-Thread recv_thread(osPriorityNormal, 16*1024);
+DigitalIn btn(A0);
+DigitalIn btn1(A1);
+int btn1Tick = 0;
+int btn1State= 0;
+
+Thread btn_thraed(osPriorityNormal, 16*1024);
 Thread send_thread(osPriorityNormal, 16*1024);
 Thread work_thread(osPriorityNormal, 16*1024);
 
-DigitalIn btn(USER_BUTTON);
+
+
 
 typedef struct {
     char data[100];
@@ -28,11 +48,34 @@
     
 Mutex datamutex;
 
-int speed=0;
-int dist=0;
+int bt1=0;
 
-int bt1=0;
-int bt2=0;
+void readBtn(void){
+    while(1){
+    	wait_us(100);
+    	datamutex.lock();
+	    if(!btn){
+	        btn1Tick++;
+	        if (btn1Tick>20){
+	            btn1Tick=21;
+	            btn1State=1;
+	        }else{
+	            datamutex.lock();
+	            btn1State=0;
+	            datamutex.unlock();
+	        }
+	    }else{ 
+	        btn1Tick--;
+	        if (btn1Tick<1){
+	            btn1Tick=1;
+	            btn1State=0;
+	        }       
+	    }
+	    datamutex.unlock();
+	}
+}     
+
+    
     
 void recv(void)
 {   
@@ -42,7 +85,7 @@
     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));
+	pc.printf("r:sock.bind=%d\r\n",sock.bind(portRecive));
    
     int ret;
     while(1)
@@ -59,26 +102,24 @@
         } 
         else
         {
-					pc.printf("r:%\r\n",recv_data);
+			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);
+			memset(mail->data,0,sizeof(mail->data));
+			memcpy (mail->data, recv_data,cpcnt);
             recv_box.put(mail);
-				pc.printf("r:put\r\n");
+			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;
@@ -90,9 +131,9 @@
         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);
+					//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);
+            ret = sock.sendto(serverIP,9000, mail->data, mail->size);
             if (ret < 0) 
             {
                 pc.printf("send error:%d\r\n",ret);
@@ -101,7 +142,9 @@
             } 
             else
             {
-                pc.printf("sent %d bytes\r\n",ret);
+                //pc.printf("sent %d bytes\r\n",ret);
+                bt1=0;
+
             }
             send_box.free(mail);
         }    
@@ -111,48 +154,7 @@
         
         
 }
-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)
 {
@@ -177,9 +179,9 @@
             break;
     }
 }
-Timer pingt;
-unsigned int
-endian_swap(unsigned int x)
+
+
+unsigned int endian_swap(unsigned int x)
 {
 return
 (x>>24) |
@@ -187,58 +189,46 @@
 ((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;
+		wait_ms(delay);
+		pc.printf("ID:%d\t State:%d\t\n",ID,btn1State);
+		char datastr[128];
+		mail_t *mail = send_box.alloc();
+	    const char send_data[]="/data\x00\x00\x00\x2cii\x00";
+	    memcpy(datastr,send_data,16);
+	    int tmp;
+	    tmp = endian_swap(ID);
+	    memcpy(datastr+12,&tmp,4);
+	    tmp = endian_swap(btn1State);
+	    memcpy(datastr+16,&tmp,4);
+	    memcpy (mail->data, datastr,20);
+		mail->size = 20;
+		send_box.put(mail);
 	}
 	
 	
 }
 int main()
-{   pc.baud(115200);
-    pc.printf("Hello. Bike!\r\n");
+{   startMillis();
+	sprintf(myIP,"%s%d",myIP, ID);
+
+
+	pc.baud(115200);
+    pc.printf("Hello. Alice!\r\n");
 	
-    pc.printf("eth.set=%d\r\n",eth.set_network("192.168.1.200","255.255.255.0","192.168.1.1"));
+    pc.printf("eth.set=%d\r\n",eth.set_network(myIP,netMask,gateWay));
     int rz=eth.connect();
     eth.attach(&status_callback);
     pc.printf("Status interrupt attached.\r\n");
     pc.printf("eth.connect=%d\r\n",rz);
+    
+    btn1.mode(PullUp);
+    
+    
 	if (rz<0) {
 		pc.printf("reset\r\n");
 		HAL_NVIC_SystemReset();
@@ -246,13 +236,13 @@
     
     pc.printf("IP address is '%s'\r\n", eth.get_ip_address());
     
-    recv_thread.start(recv);
     send_thread.start(send);
-    work_thread.start(work);
+    work_thread.start(work); 
+    btn_thraed.start(readBtn);
     
     pc.printf("threads started\r\n");
     
-		while (1)
+	while (1)
     {
         osEvent evt = recv_box.get(10);
         if (evt.status == osEventMail) 
@@ -263,8 +253,8 @@
                 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); 
+			mail->data[99]=0;
+            //parse(mail->data); 
             send_box.free(mail);
         }