11
Diff: lift-back-eth-keil/main.cpp
- Revision:
- 0:9d6c79aa222a
- Child:
- 1:2a5890e25db5
diff -r 000000000000 -r 9d6c79aa222a lift-back-eth-keil/main.cpp --- /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(ð)); + 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(ð)); + + 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); + } + + } + +} +