11

Dependencies:   millis

Committer:
dimavb
Date:
Sun Jul 29 12:56:17 2018 +0000
Revision:
0:9d6c79aa222a
Child:
1:2a5890e25db5
Init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dimavb 0:9d6c79aa222a 1
dimavb 0:9d6c79aa222a 2 #include <mbed.h>
dimavb 0:9d6c79aa222a 3 #include "EthernetInterface.h"
dimavb 0:9d6c79aa222a 4 #include "UDPSocket.h"
dimavb 0:9d6c79aa222a 5 #include <string>
dimavb 0:9d6c79aa222a 6 #include <math.h>
dimavb 0:9d6c79aa222a 7
dimavb 0:9d6c79aa222a 8 #include "DebounceIn.h"
dimavb 0:9d6c79aa222a 9
dimavb 0:9d6c79aa222a 10 Serial pc(USBTX, USBRX);
dimavb 0:9d6c79aa222a 11
dimavb 0:9d6c79aa222a 12 EthernetInterface eth;
dimavb 0:9d6c79aa222a 13
dimavb 0:9d6c79aa222a 14 Thread recv_thread(osPriorityNormal, 16*1024);
dimavb 0:9d6c79aa222a 15 Thread send_thread(osPriorityNormal, 16*1024);
dimavb 0:9d6c79aa222a 16 Thread work_thread(osPriorityNormal, 16*1024);
dimavb 0:9d6c79aa222a 17
dimavb 0:9d6c79aa222a 18 DigitalIn btn(USER_BUTTON);
dimavb 0:9d6c79aa222a 19
dimavb 0:9d6c79aa222a 20 typedef struct {
dimavb 0:9d6c79aa222a 21 char data[100];
dimavb 0:9d6c79aa222a 22 int size;
dimavb 0:9d6c79aa222a 23 } mail_t;
dimavb 0:9d6c79aa222a 24
dimavb 0:9d6c79aa222a 25 Mail<mail_t, 16> recv_box;
dimavb 0:9d6c79aa222a 26 Mail<mail_t, 16> send_box;
dimavb 0:9d6c79aa222a 27
dimavb 0:9d6c79aa222a 28
dimavb 0:9d6c79aa222a 29 Mutex datamutex;
dimavb 0:9d6c79aa222a 30
dimavb 0:9d6c79aa222a 31 int speed=0;
dimavb 0:9d6c79aa222a 32 int dist=0;
dimavb 0:9d6c79aa222a 33
dimavb 0:9d6c79aa222a 34 int bt1=0;
dimavb 0:9d6c79aa222a 35 int bt2=0;
dimavb 0:9d6c79aa222a 36
dimavb 0:9d6c79aa222a 37 void recv(void)
dimavb 0:9d6c79aa222a 38 {
dimavb 0:9d6c79aa222a 39 SocketAddress sockAddr;
dimavb 0:9d6c79aa222a 40 // sockAddr.set_ip_address("192.168.2.1");
dimavb 0:9d6c79aa222a 41 // sockAddr.set_port(9000);
dimavb 0:9d6c79aa222a 42 UDPSocket sock;
dimavb 0:9d6c79aa222a 43 char recv_data[100];
dimavb 0:9d6c79aa222a 44 pc.printf("r:sock.open=%d\r\n",sock.open(&eth));
dimavb 0:9d6c79aa222a 45 pc.printf("r:sock.bind=%d\r\n",sock.bind(8000));
dimavb 0:9d6c79aa222a 46
dimavb 0:9d6c79aa222a 47 int ret;
dimavb 0:9d6c79aa222a 48 while(1)
dimavb 0:9d6c79aa222a 49 {
dimavb 0:9d6c79aa222a 50 pc.printf("r:listening...\r\n");
dimavb 0:9d6c79aa222a 51 ret = sock.recvfrom(&sockAddr, &recv_data, sizeof(recv_data));
dimavb 0:9d6c79aa222a 52 pc.printf("r:got\r\n");
dimavb 0:9d6c79aa222a 53 if (ret < 0)
dimavb 0:9d6c79aa222a 54 {
dimavb 0:9d6c79aa222a 55 pc.printf("receive error:%d\r\n",ret);
dimavb 0:9d6c79aa222a 56 pc.printf("reset\r\n");
dimavb 0:9d6c79aa222a 57 HAL_NVIC_SystemReset();
dimavb 0:9d6c79aa222a 58
dimavb 0:9d6c79aa222a 59 }
dimavb 0:9d6c79aa222a 60 else
dimavb 0:9d6c79aa222a 61 {
dimavb 0:9d6c79aa222a 62 pc.printf("r:%\r\n",recv_data);
dimavb 0:9d6c79aa222a 63 mail_t *mail = recv_box.alloc();
dimavb 0:9d6c79aa222a 64 int cpcnt;
dimavb 0:9d6c79aa222a 65 if (ret>sizeof(recv_data)) cpcnt=sizeof(recv_data); else cpcnt = ret; //copy no more than buffer size
dimavb 0:9d6c79aa222a 66
dimavb 0:9d6c79aa222a 67 memset(mail->data,0,sizeof(mail->data));
dimavb 0:9d6c79aa222a 68 memcpy (mail->data, recv_data,cpcnt);
dimavb 0:9d6c79aa222a 69 recv_box.put(mail);
dimavb 0:9d6c79aa222a 70 pc.printf("r:put\r\n");
dimavb 0:9d6c79aa222a 71 }
dimavb 0:9d6c79aa222a 72 }
dimavb 0:9d6c79aa222a 73 }
dimavb 0:9d6c79aa222a 74 void send(void)
dimavb 0:9d6c79aa222a 75 {
dimavb 0:9d6c79aa222a 76
dimavb 0:9d6c79aa222a 77 SocketAddress sockAddr;
dimavb 0:9d6c79aa222a 78 // sockAddr.set_ip_address("192.168.137.1");
dimavb 0:9d6c79aa222a 79 //sockAddr.set_port(8000);
dimavb 0:9d6c79aa222a 80 UDPSocket sock;
dimavb 0:9d6c79aa222a 81 //char recv_data[1500];
dimavb 0:9d6c79aa222a 82 pc.printf("sock.open=%d\r\n",sock.open(&eth));
dimavb 0:9d6c79aa222a 83
dimavb 0:9d6c79aa222a 84 int ret;
dimavb 0:9d6c79aa222a 85 while(1)
dimavb 0:9d6c79aa222a 86 {
dimavb 0:9d6c79aa222a 87 //pc.printf("s::waiting...\r\n");
dimavb 0:9d6c79aa222a 88
dimavb 0:9d6c79aa222a 89 osEvent evt = send_box.get(1);
dimavb 0:9d6c79aa222a 90 if (evt.status == osEventMail)
dimavb 0:9d6c79aa222a 91 {
dimavb 0:9d6c79aa222a 92 mail_t *mail = (mail_t*)evt.value.p;
dimavb 0:9d6c79aa222a 93 pc.printf("s:got data: %s; size: %d\n\r", mail->data,mail->size);
dimavb 0:9d6c79aa222a 94
dimavb 0:9d6c79aa222a 95 ret = sock.sendto("192.168.1.101",9000, mail->data, mail->size);
dimavb 0:9d6c79aa222a 96 if (ret < 0)
dimavb 0:9d6c79aa222a 97 {
dimavb 0:9d6c79aa222a 98 pc.printf("send error:%d\r\n",ret);
dimavb 0:9d6c79aa222a 99 pc.printf("reset\r\n");
dimavb 0:9d6c79aa222a 100 HAL_NVIC_SystemReset();
dimavb 0:9d6c79aa222a 101 }
dimavb 0:9d6c79aa222a 102 else
dimavb 0:9d6c79aa222a 103 {
dimavb 0:9d6c79aa222a 104 pc.printf("sent %d bytes\r\n",ret);
dimavb 0:9d6c79aa222a 105 }
dimavb 0:9d6c79aa222a 106 send_box.free(mail);
dimavb 0:9d6c79aa222a 107 }
dimavb 0:9d6c79aa222a 108
dimavb 0:9d6c79aa222a 109
dimavb 0:9d6c79aa222a 110 }
dimavb 0:9d6c79aa222a 111
dimavb 0:9d6c79aa222a 112
dimavb 0:9d6c79aa222a 113 }
dimavb 0:9d6c79aa222a 114 void zero_counters()
dimavb 0:9d6c79aa222a 115 {
dimavb 0:9d6c79aa222a 116 datamutex.lock();
dimavb 0:9d6c79aa222a 117 dist=0;
dimavb 0:9d6c79aa222a 118 datamutex.unlock();
dimavb 0:9d6c79aa222a 119 }
dimavb 0:9d6c79aa222a 120
dimavb 0:9d6c79aa222a 121 void parse(char *data)
dimavb 0:9d6c79aa222a 122 {
dimavb 0:9d6c79aa222a 123 char cmd[100];
dimavb 0:9d6c79aa222a 124 char mask[100];
dimavb 0:9d6c79aa222a 125
dimavb 0:9d6c79aa222a 126
dimavb 0:9d6c79aa222a 127 memset (cmd,0, sizeof(cmd));
dimavb 0:9d6c79aa222a 128 int val1=0;
dimavb 0:9d6c79aa222a 129 int val2=0;
dimavb 0:9d6c79aa222a 130 int val3=0;
dimavb 0:9d6c79aa222a 131
dimavb 0:9d6c79aa222a 132 if (1)
dimavb 0:9d6c79aa222a 133 {
dimavb 0:9d6c79aa222a 134 //pc.printf("r:%s",data);
dimavb 0:9d6c79aa222a 135 // rxready=0;
dimavb 0:9d6c79aa222a 136 uint8_t r = sscanf((const char *)data+1,"%s %s %d %d %d",cmd, mask, &val1, &val2, &val3);
dimavb 0:9d6c79aa222a 137 if (r==0)
dimavb 0:9d6c79aa222a 138 {
dimavb 0:9d6c79aa222a 139 pc.printf("waat?\r\n");
dimavb 0:9d6c79aa222a 140 }
dimavb 0:9d6c79aa222a 141 if (r<4) {
dimavb 0:9d6c79aa222a 142 if (!strcmp(cmd,"reset"))
dimavb 0:9d6c79aa222a 143 {
dimavb 0:9d6c79aa222a 144 pc.printf("cmd reset\r\n");
dimavb 0:9d6c79aa222a 145 zero_counters();
dimavb 0:9d6c79aa222a 146 return;
dimavb 0:9d6c79aa222a 147 }
dimavb 0:9d6c79aa222a 148
dimavb 0:9d6c79aa222a 149 }
dimavb 0:9d6c79aa222a 150
dimavb 0:9d6c79aa222a 151
dimavb 0:9d6c79aa222a 152 }
dimavb 0:9d6c79aa222a 153 pc.printf("unknown command:%s\r\n",data);
dimavb 0:9d6c79aa222a 154
dimavb 0:9d6c79aa222a 155 }
dimavb 0:9d6c79aa222a 156
dimavb 0:9d6c79aa222a 157 void status_callback(nsapi_event_t status, intptr_t param)
dimavb 0:9d6c79aa222a 158 {
dimavb 0:9d6c79aa222a 159 printf("Connection status changed!\r\n");
dimavb 0:9d6c79aa222a 160 switch(param) {
dimavb 0:9d6c79aa222a 161 case NSAPI_STATUS_LOCAL_UP:
dimavb 0:9d6c79aa222a 162 printf("Local IP address set!\r\n");
dimavb 0:9d6c79aa222a 163 break;
dimavb 0:9d6c79aa222a 164 case NSAPI_STATUS_GLOBAL_UP:
dimavb 0:9d6c79aa222a 165 printf("Global IP address set!\r\n");
dimavb 0:9d6c79aa222a 166 break;
dimavb 0:9d6c79aa222a 167 case NSAPI_STATUS_DISCONNECTED:
dimavb 0:9d6c79aa222a 168 printf("No connection to network!\r\n");
dimavb 0:9d6c79aa222a 169 printf("System reset.\r\n");
dimavb 0:9d6c79aa222a 170 HAL_NVIC_SystemReset();
dimavb 0:9d6c79aa222a 171 break;
dimavb 0:9d6c79aa222a 172 case NSAPI_STATUS_CONNECTING:
dimavb 0:9d6c79aa222a 173 printf("Connecting to network!\r\n");
dimavb 0:9d6c79aa222a 174 break;
dimavb 0:9d6c79aa222a 175 default:
dimavb 0:9d6c79aa222a 176 printf("Net status: %d\r\n",param);
dimavb 0:9d6c79aa222a 177 break;
dimavb 0:9d6c79aa222a 178 }
dimavb 0:9d6c79aa222a 179 }
dimavb 0:9d6c79aa222a 180 Timer pingt;
dimavb 0:9d6c79aa222a 181 unsigned int
dimavb 0:9d6c79aa222a 182 endian_swap(unsigned int x)
dimavb 0:9d6c79aa222a 183 {
dimavb 0:9d6c79aa222a 184 return
dimavb 0:9d6c79aa222a 185 (x>>24) |
dimavb 0:9d6c79aa222a 186 ((x>>8) & 0x0000ff00) |
dimavb 0:9d6c79aa222a 187 ((x<<8) & 0x00ff0000) |
dimavb 0:9d6c79aa222a 188 (x<<24);
dimavb 0:9d6c79aa222a 189 }
dimavb 0:9d6c79aa222a 190 void work(void)
dimavb 0:9d6c79aa222a 191 {int rnd;
dimavb 0:9d6c79aa222a 192 float s;
dimavb 0:9d6c79aa222a 193 uint32_t cnt=0;
dimavb 0:9d6c79aa222a 194 while(1)
dimavb 0:9d6c79aa222a 195 {
dimavb 0:9d6c79aa222a 196 cnt++;
dimavb 0:9d6c79aa222a 197 s=sin(float(cnt) / 100.0f);
dimavb 0:9d6c79aa222a 198 if (s<0) s=-s;
dimavb 0:9d6c79aa222a 199 if (btn==0) s=0;
dimavb 0:9d6c79aa222a 200 datamutex.lock();
dimavb 0:9d6c79aa222a 201 speed=s*100;
dimavb 0:9d6c79aa222a 202 dist=dist+speed;
dimavb 0:9d6c79aa222a 203 rnd = rand();
dimavb 0:9d6c79aa222a 204 if (rnd>2000000000) bt1=1; else bt1=0;
dimavb 0:9d6c79aa222a 205 if (rnd<200000000) bt2=1; else bt2=0;
dimavb 0:9d6c79aa222a 206
dimavb 0:9d6c79aa222a 207 datamutex.unlock();
dimavb 0:9d6c79aa222a 208 wait(0.2f);
dimavb 0:9d6c79aa222a 209 pc.printf("Dist:%d\t Speed:%d\tButton1:%d\tButton2:%d\t%d\n",dist,speed,bt1,bt2,rnd);
dimavb 0:9d6c79aa222a 210 char datastr[128];
dimavb 0:9d6c79aa222a 211 mail_t *mail = send_box.alloc();
dimavb 0:9d6c79aa222a 212 const char send_data[]="/data\x00\x00\x00\x2ciiii\x00\x00\x00";
dimavb 0:9d6c79aa222a 213 memcpy(datastr,send_data,16);
dimavb 0:9d6c79aa222a 214 int tmp;
dimavb 0:9d6c79aa222a 215 tmp = endian_swap(speed);
dimavb 0:9d6c79aa222a 216 memcpy(datastr+16,&tmp,4);
dimavb 0:9d6c79aa222a 217 tmp = endian_swap(dist);
dimavb 0:9d6c79aa222a 218 memcpy(datastr+20,&tmp,4);
dimavb 0:9d6c79aa222a 219 tmp = endian_swap(bt1);
dimavb 0:9d6c79aa222a 220 memcpy(datastr+24,&tmp,4);
dimavb 0:9d6c79aa222a 221 tmp = endian_swap(bt2);
dimavb 0:9d6c79aa222a 222 memcpy(datastr+28,&tmp,4);
dimavb 0:9d6c79aa222a 223 memcpy (mail->data, datastr,32);
dimavb 0:9d6c79aa222a 224 mail->size = 32;
dimavb 0:9d6c79aa222a 225 send_box.put(mail);
dimavb 0:9d6c79aa222a 226
dimavb 0:9d6c79aa222a 227 bt1=0;
dimavb 0:9d6c79aa222a 228 bt2=0;
dimavb 0:9d6c79aa222a 229 }
dimavb 0:9d6c79aa222a 230
dimavb 0:9d6c79aa222a 231
dimavb 0:9d6c79aa222a 232 }
dimavb 0:9d6c79aa222a 233 int main()
dimavb 0:9d6c79aa222a 234 { pc.baud(115200);
dimavb 0:9d6c79aa222a 235 pc.printf("Hello. Bike!\r\n");
dimavb 0:9d6c79aa222a 236
dimavb 0:9d6c79aa222a 237 pc.printf("eth.set=%d\r\n",eth.set_network("192.168.1.200","255.255.255.0","192.168.1.1"));
dimavb 0:9d6c79aa222a 238 int rz=eth.connect();
dimavb 0:9d6c79aa222a 239 eth.attach(&status_callback);
dimavb 0:9d6c79aa222a 240 pc.printf("Status interrupt attached.\r\n");
dimavb 0:9d6c79aa222a 241 pc.printf("eth.connect=%d\r\n",rz);
dimavb 0:9d6c79aa222a 242 if (rz<0) {
dimavb 0:9d6c79aa222a 243 pc.printf("reset\r\n");
dimavb 0:9d6c79aa222a 244 HAL_NVIC_SystemReset();
dimavb 0:9d6c79aa222a 245 }
dimavb 0:9d6c79aa222a 246
dimavb 0:9d6c79aa222a 247 pc.printf("IP address is '%s'\r\n", eth.get_ip_address());
dimavb 0:9d6c79aa222a 248
dimavb 0:9d6c79aa222a 249 recv_thread.start(recv);
dimavb 0:9d6c79aa222a 250 send_thread.start(send);
dimavb 0:9d6c79aa222a 251 work_thread.start(work);
dimavb 0:9d6c79aa222a 252
dimavb 0:9d6c79aa222a 253 pc.printf("threads started\r\n");
dimavb 0:9d6c79aa222a 254
dimavb 0:9d6c79aa222a 255 while (1)
dimavb 0:9d6c79aa222a 256 {
dimavb 0:9d6c79aa222a 257 osEvent evt = recv_box.get(10);
dimavb 0:9d6c79aa222a 258 if (evt.status == osEventMail)
dimavb 0:9d6c79aa222a 259 {
dimavb 0:9d6c79aa222a 260 mail_t *mail = (mail_t*)evt.value.p;
dimavb 0:9d6c79aa222a 261 for (uint8_t i =0; i<100; i++)
dimavb 0:9d6c79aa222a 262 {
dimavb 0:9d6c79aa222a 263 if (mail->data[i] == 0 || mail->data[i] == 0x2c || mail->data[i] == 0x2f) mail->data[i]=0x20;
dimavb 0:9d6c79aa222a 264 }
dimavb 0:9d6c79aa222a 265 //pc.printf("main thread: %s\r\n", mail->data);
dimavb 0:9d6c79aa222a 266 mail->data[99]=0;
dimavb 0:9d6c79aa222a 267 parse(mail->data);
dimavb 0:9d6c79aa222a 268 send_box.free(mail);
dimavb 0:9d6c79aa222a 269 }
dimavb 0:9d6c79aa222a 270
dimavb 0:9d6c79aa222a 271 }
dimavb 0:9d6c79aa222a 272
dimavb 0:9d6c79aa222a 273 }
dimavb 0:9d6c79aa222a 274