11
lift-back-eth-keil/main.cpp@0:9d6c79aa222a, 2018-07-29 (annotated)
- Committer:
- dimavb
- Date:
- Sun Jul 29 12:56:17 2018 +0000
- Revision:
- 0:9d6c79aa222a
- Child:
- 1:2a5890e25db5
Init
Who changed what in which revision?
User | Revision | Line number | New 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(ð)); |
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(ð)); |
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 |