11
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(ð)); 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); } } }