11
lift-back-eth-keil/main.cpp@1:2a5890e25db5, 2018-10-02 (annotated)
- Committer:
- turumputum
- Date:
- Tue Oct 02 17:03:10 2018 +0000
- Revision:
- 1:2a5890e25db5
- Parent:
- 0:9d6c79aa222a
???
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> |
turumputum | 1:2a5890e25db5 | 7 | #include <millis.h> |
dimavb | 0:9d6c79aa222a | 8 | |
turumputum | 1:2a5890e25db5 | 9 | |
turumputum | 1:2a5890e25db5 | 10 | int ID=8; |
turumputum | 1:2a5890e25db5 | 11 | |
turumputum | 1:2a5890e25db5 | 12 | char myIP[16] = "192.168.1.10"; |
turumputum | 1:2a5890e25db5 | 13 | char serverIP[16] = "192.168.1.100"; |
turumputum | 1:2a5890e25db5 | 14 | char netMask[16] = "255.255.255.0"; |
turumputum | 1:2a5890e25db5 | 15 | char gateWay[16] = "192.168.1.1"; |
turumputum | 1:2a5890e25db5 | 16 | |
turumputum | 1:2a5890e25db5 | 17 | |
turumputum | 1:2a5890e25db5 | 18 | int portSend = 8000; |
turumputum | 1:2a5890e25db5 | 19 | int portRecive = 9000; |
turumputum | 1:2a5890e25db5 | 20 | |
turumputum | 1:2a5890e25db5 | 21 | int delay=200;//msecond |
turumputum | 1:2a5890e25db5 | 22 | |
dimavb | 0:9d6c79aa222a | 23 | |
dimavb | 0:9d6c79aa222a | 24 | Serial pc(USBTX, USBRX); |
dimavb | 0:9d6c79aa222a | 25 | |
dimavb | 0:9d6c79aa222a | 26 | EthernetInterface eth; |
dimavb | 0:9d6c79aa222a | 27 | |
turumputum | 1:2a5890e25db5 | 28 | DigitalIn btn(A0); |
turumputum | 1:2a5890e25db5 | 29 | DigitalIn btn1(A1); |
turumputum | 1:2a5890e25db5 | 30 | int btn1Tick = 0; |
turumputum | 1:2a5890e25db5 | 31 | int btn1State= 0; |
turumputum | 1:2a5890e25db5 | 32 | |
turumputum | 1:2a5890e25db5 | 33 | Thread btn_thraed(osPriorityNormal, 16*1024); |
dimavb | 0:9d6c79aa222a | 34 | Thread send_thread(osPriorityNormal, 16*1024); |
dimavb | 0:9d6c79aa222a | 35 | Thread work_thread(osPriorityNormal, 16*1024); |
dimavb | 0:9d6c79aa222a | 36 | |
turumputum | 1:2a5890e25db5 | 37 | |
turumputum | 1:2a5890e25db5 | 38 | |
dimavb | 0:9d6c79aa222a | 39 | |
dimavb | 0:9d6c79aa222a | 40 | typedef struct { |
dimavb | 0:9d6c79aa222a | 41 | char data[100]; |
dimavb | 0:9d6c79aa222a | 42 | int size; |
dimavb | 0:9d6c79aa222a | 43 | } mail_t; |
dimavb | 0:9d6c79aa222a | 44 | |
dimavb | 0:9d6c79aa222a | 45 | Mail<mail_t, 16> recv_box; |
dimavb | 0:9d6c79aa222a | 46 | Mail<mail_t, 16> send_box; |
dimavb | 0:9d6c79aa222a | 47 | |
dimavb | 0:9d6c79aa222a | 48 | |
dimavb | 0:9d6c79aa222a | 49 | Mutex datamutex; |
dimavb | 0:9d6c79aa222a | 50 | |
turumputum | 1:2a5890e25db5 | 51 | int bt1=0; |
dimavb | 0:9d6c79aa222a | 52 | |
turumputum | 1:2a5890e25db5 | 53 | void readBtn(void){ |
turumputum | 1:2a5890e25db5 | 54 | while(1){ |
turumputum | 1:2a5890e25db5 | 55 | wait_us(100); |
turumputum | 1:2a5890e25db5 | 56 | datamutex.lock(); |
turumputum | 1:2a5890e25db5 | 57 | if(!btn){ |
turumputum | 1:2a5890e25db5 | 58 | btn1Tick++; |
turumputum | 1:2a5890e25db5 | 59 | if (btn1Tick>20){ |
turumputum | 1:2a5890e25db5 | 60 | btn1Tick=21; |
turumputum | 1:2a5890e25db5 | 61 | btn1State=1; |
turumputum | 1:2a5890e25db5 | 62 | }else{ |
turumputum | 1:2a5890e25db5 | 63 | datamutex.lock(); |
turumputum | 1:2a5890e25db5 | 64 | btn1State=0; |
turumputum | 1:2a5890e25db5 | 65 | datamutex.unlock(); |
turumputum | 1:2a5890e25db5 | 66 | } |
turumputum | 1:2a5890e25db5 | 67 | }else{ |
turumputum | 1:2a5890e25db5 | 68 | btn1Tick--; |
turumputum | 1:2a5890e25db5 | 69 | if (btn1Tick<1){ |
turumputum | 1:2a5890e25db5 | 70 | btn1Tick=1; |
turumputum | 1:2a5890e25db5 | 71 | btn1State=0; |
turumputum | 1:2a5890e25db5 | 72 | } |
turumputum | 1:2a5890e25db5 | 73 | } |
turumputum | 1:2a5890e25db5 | 74 | datamutex.unlock(); |
turumputum | 1:2a5890e25db5 | 75 | } |
turumputum | 1:2a5890e25db5 | 76 | } |
turumputum | 1:2a5890e25db5 | 77 | |
turumputum | 1:2a5890e25db5 | 78 | |
dimavb | 0:9d6c79aa222a | 79 | |
dimavb | 0:9d6c79aa222a | 80 | void recv(void) |
dimavb | 0:9d6c79aa222a | 81 | { |
dimavb | 0:9d6c79aa222a | 82 | SocketAddress sockAddr; |
dimavb | 0:9d6c79aa222a | 83 | // sockAddr.set_ip_address("192.168.2.1"); |
dimavb | 0:9d6c79aa222a | 84 | // sockAddr.set_port(9000); |
dimavb | 0:9d6c79aa222a | 85 | UDPSocket sock; |
dimavb | 0:9d6c79aa222a | 86 | char recv_data[100]; |
dimavb | 0:9d6c79aa222a | 87 | pc.printf("r:sock.open=%d\r\n",sock.open(ð)); |
turumputum | 1:2a5890e25db5 | 88 | pc.printf("r:sock.bind=%d\r\n",sock.bind(portRecive)); |
dimavb | 0:9d6c79aa222a | 89 | |
dimavb | 0:9d6c79aa222a | 90 | int ret; |
dimavb | 0:9d6c79aa222a | 91 | while(1) |
dimavb | 0:9d6c79aa222a | 92 | { |
dimavb | 0:9d6c79aa222a | 93 | pc.printf("r:listening...\r\n"); |
dimavb | 0:9d6c79aa222a | 94 | ret = sock.recvfrom(&sockAddr, &recv_data, sizeof(recv_data)); |
dimavb | 0:9d6c79aa222a | 95 | pc.printf("r:got\r\n"); |
dimavb | 0:9d6c79aa222a | 96 | if (ret < 0) |
dimavb | 0:9d6c79aa222a | 97 | { |
dimavb | 0:9d6c79aa222a | 98 | pc.printf("receive 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 | } |
dimavb | 0:9d6c79aa222a | 103 | else |
dimavb | 0:9d6c79aa222a | 104 | { |
turumputum | 1:2a5890e25db5 | 105 | pc.printf("r:%\r\n",recv_data); |
dimavb | 0:9d6c79aa222a | 106 | mail_t *mail = recv_box.alloc(); |
dimavb | 0:9d6c79aa222a | 107 | int cpcnt; |
dimavb | 0:9d6c79aa222a | 108 | if (ret>sizeof(recv_data)) cpcnt=sizeof(recv_data); else cpcnt = ret; //copy no more than buffer size |
dimavb | 0:9d6c79aa222a | 109 | |
turumputum | 1:2a5890e25db5 | 110 | memset(mail->data,0,sizeof(mail->data)); |
turumputum | 1:2a5890e25db5 | 111 | memcpy (mail->data, recv_data,cpcnt); |
dimavb | 0:9d6c79aa222a | 112 | recv_box.put(mail); |
turumputum | 1:2a5890e25db5 | 113 | pc.printf("r:put\r\n"); |
dimavb | 0:9d6c79aa222a | 114 | } |
dimavb | 0:9d6c79aa222a | 115 | } |
dimavb | 0:9d6c79aa222a | 116 | } |
turumputum | 1:2a5890e25db5 | 117 | |
dimavb | 0:9d6c79aa222a | 118 | void send(void) |
dimavb | 0:9d6c79aa222a | 119 | { |
dimavb | 0:9d6c79aa222a | 120 | |
dimavb | 0:9d6c79aa222a | 121 | SocketAddress sockAddr; |
dimavb | 0:9d6c79aa222a | 122 | UDPSocket sock; |
dimavb | 0:9d6c79aa222a | 123 | pc.printf("sock.open=%d\r\n",sock.open(ð)); |
dimavb | 0:9d6c79aa222a | 124 | |
dimavb | 0:9d6c79aa222a | 125 | int ret; |
dimavb | 0:9d6c79aa222a | 126 | while(1) |
dimavb | 0:9d6c79aa222a | 127 | { |
dimavb | 0:9d6c79aa222a | 128 | //pc.printf("s::waiting...\r\n"); |
dimavb | 0:9d6c79aa222a | 129 | |
dimavb | 0:9d6c79aa222a | 130 | osEvent evt = send_box.get(1); |
dimavb | 0:9d6c79aa222a | 131 | if (evt.status == osEventMail) |
dimavb | 0:9d6c79aa222a | 132 | { |
dimavb | 0:9d6c79aa222a | 133 | mail_t *mail = (mail_t*)evt.value.p; |
turumputum | 1:2a5890e25db5 | 134 | //pc.printf("s:got data: %s; size: %d\n\r", mail->data,mail->size); |
dimavb | 0:9d6c79aa222a | 135 | |
turumputum | 1:2a5890e25db5 | 136 | ret = sock.sendto(serverIP,9000, mail->data, mail->size); |
dimavb | 0:9d6c79aa222a | 137 | if (ret < 0) |
dimavb | 0:9d6c79aa222a | 138 | { |
dimavb | 0:9d6c79aa222a | 139 | pc.printf("send error:%d\r\n",ret); |
dimavb | 0:9d6c79aa222a | 140 | pc.printf("reset\r\n"); |
dimavb | 0:9d6c79aa222a | 141 | HAL_NVIC_SystemReset(); |
dimavb | 0:9d6c79aa222a | 142 | } |
dimavb | 0:9d6c79aa222a | 143 | else |
dimavb | 0:9d6c79aa222a | 144 | { |
turumputum | 1:2a5890e25db5 | 145 | //pc.printf("sent %d bytes\r\n",ret); |
turumputum | 1:2a5890e25db5 | 146 | bt1=0; |
turumputum | 1:2a5890e25db5 | 147 | |
dimavb | 0:9d6c79aa222a | 148 | } |
dimavb | 0:9d6c79aa222a | 149 | send_box.free(mail); |
dimavb | 0:9d6c79aa222a | 150 | } |
dimavb | 0:9d6c79aa222a | 151 | |
dimavb | 0:9d6c79aa222a | 152 | |
dimavb | 0:9d6c79aa222a | 153 | } |
dimavb | 0:9d6c79aa222a | 154 | |
dimavb | 0:9d6c79aa222a | 155 | |
dimavb | 0:9d6c79aa222a | 156 | } |
dimavb | 0:9d6c79aa222a | 157 | |
dimavb | 0:9d6c79aa222a | 158 | |
dimavb | 0:9d6c79aa222a | 159 | void status_callback(nsapi_event_t status, intptr_t param) |
dimavb | 0:9d6c79aa222a | 160 | { |
dimavb | 0:9d6c79aa222a | 161 | printf("Connection status changed!\r\n"); |
dimavb | 0:9d6c79aa222a | 162 | switch(param) { |
dimavb | 0:9d6c79aa222a | 163 | case NSAPI_STATUS_LOCAL_UP: |
dimavb | 0:9d6c79aa222a | 164 | printf("Local IP address set!\r\n"); |
dimavb | 0:9d6c79aa222a | 165 | break; |
dimavb | 0:9d6c79aa222a | 166 | case NSAPI_STATUS_GLOBAL_UP: |
dimavb | 0:9d6c79aa222a | 167 | printf("Global IP address set!\r\n"); |
dimavb | 0:9d6c79aa222a | 168 | break; |
dimavb | 0:9d6c79aa222a | 169 | case NSAPI_STATUS_DISCONNECTED: |
dimavb | 0:9d6c79aa222a | 170 | printf("No connection to network!\r\n"); |
dimavb | 0:9d6c79aa222a | 171 | printf("System reset.\r\n"); |
dimavb | 0:9d6c79aa222a | 172 | HAL_NVIC_SystemReset(); |
dimavb | 0:9d6c79aa222a | 173 | break; |
dimavb | 0:9d6c79aa222a | 174 | case NSAPI_STATUS_CONNECTING: |
dimavb | 0:9d6c79aa222a | 175 | printf("Connecting to network!\r\n"); |
dimavb | 0:9d6c79aa222a | 176 | break; |
dimavb | 0:9d6c79aa222a | 177 | default: |
dimavb | 0:9d6c79aa222a | 178 | printf("Net status: %d\r\n",param); |
dimavb | 0:9d6c79aa222a | 179 | break; |
dimavb | 0:9d6c79aa222a | 180 | } |
dimavb | 0:9d6c79aa222a | 181 | } |
turumputum | 1:2a5890e25db5 | 182 | |
turumputum | 1:2a5890e25db5 | 183 | |
turumputum | 1:2a5890e25db5 | 184 | unsigned int endian_swap(unsigned int x) |
dimavb | 0:9d6c79aa222a | 185 | { |
dimavb | 0:9d6c79aa222a | 186 | return |
dimavb | 0:9d6c79aa222a | 187 | (x>>24) | |
dimavb | 0:9d6c79aa222a | 188 | ((x>>8) & 0x0000ff00) | |
dimavb | 0:9d6c79aa222a | 189 | ((x<<8) & 0x00ff0000) | |
dimavb | 0:9d6c79aa222a | 190 | (x<<24); |
dimavb | 0:9d6c79aa222a | 191 | } |
turumputum | 1:2a5890e25db5 | 192 | |
dimavb | 0:9d6c79aa222a | 193 | void work(void) |
turumputum | 1:2a5890e25db5 | 194 | { |
dimavb | 0:9d6c79aa222a | 195 | while(1) |
dimavb | 0:9d6c79aa222a | 196 | { |
turumputum | 1:2a5890e25db5 | 197 | wait_ms(delay); |
turumputum | 1:2a5890e25db5 | 198 | pc.printf("ID:%d\t State:%d\t\n",ID,btn1State); |
turumputum | 1:2a5890e25db5 | 199 | char datastr[128]; |
turumputum | 1:2a5890e25db5 | 200 | mail_t *mail = send_box.alloc(); |
turumputum | 1:2a5890e25db5 | 201 | const char send_data[]="/data\x00\x00\x00\x2cii\x00"; |
turumputum | 1:2a5890e25db5 | 202 | memcpy(datastr,send_data,16); |
turumputum | 1:2a5890e25db5 | 203 | int tmp; |
turumputum | 1:2a5890e25db5 | 204 | tmp = endian_swap(ID); |
turumputum | 1:2a5890e25db5 | 205 | memcpy(datastr+12,&tmp,4); |
turumputum | 1:2a5890e25db5 | 206 | tmp = endian_swap(btn1State); |
turumputum | 1:2a5890e25db5 | 207 | memcpy(datastr+16,&tmp,4); |
turumputum | 1:2a5890e25db5 | 208 | memcpy (mail->data, datastr,20); |
turumputum | 1:2a5890e25db5 | 209 | mail->size = 20; |
turumputum | 1:2a5890e25db5 | 210 | send_box.put(mail); |
dimavb | 0:9d6c79aa222a | 211 | } |
dimavb | 0:9d6c79aa222a | 212 | |
dimavb | 0:9d6c79aa222a | 213 | |
dimavb | 0:9d6c79aa222a | 214 | } |
dimavb | 0:9d6c79aa222a | 215 | int main() |
turumputum | 1:2a5890e25db5 | 216 | { startMillis(); |
turumputum | 1:2a5890e25db5 | 217 | sprintf(myIP,"%s%d",myIP, ID); |
turumputum | 1:2a5890e25db5 | 218 | |
turumputum | 1:2a5890e25db5 | 219 | |
turumputum | 1:2a5890e25db5 | 220 | pc.baud(115200); |
turumputum | 1:2a5890e25db5 | 221 | pc.printf("Hello. Alice!\r\n"); |
dimavb | 0:9d6c79aa222a | 222 | |
turumputum | 1:2a5890e25db5 | 223 | pc.printf("eth.set=%d\r\n",eth.set_network(myIP,netMask,gateWay)); |
dimavb | 0:9d6c79aa222a | 224 | int rz=eth.connect(); |
dimavb | 0:9d6c79aa222a | 225 | eth.attach(&status_callback); |
dimavb | 0:9d6c79aa222a | 226 | pc.printf("Status interrupt attached.\r\n"); |
dimavb | 0:9d6c79aa222a | 227 | pc.printf("eth.connect=%d\r\n",rz); |
turumputum | 1:2a5890e25db5 | 228 | |
turumputum | 1:2a5890e25db5 | 229 | btn1.mode(PullUp); |
turumputum | 1:2a5890e25db5 | 230 | |
turumputum | 1:2a5890e25db5 | 231 | |
dimavb | 0:9d6c79aa222a | 232 | if (rz<0) { |
dimavb | 0:9d6c79aa222a | 233 | pc.printf("reset\r\n"); |
dimavb | 0:9d6c79aa222a | 234 | HAL_NVIC_SystemReset(); |
dimavb | 0:9d6c79aa222a | 235 | } |
dimavb | 0:9d6c79aa222a | 236 | |
dimavb | 0:9d6c79aa222a | 237 | pc.printf("IP address is '%s'\r\n", eth.get_ip_address()); |
dimavb | 0:9d6c79aa222a | 238 | |
dimavb | 0:9d6c79aa222a | 239 | send_thread.start(send); |
turumputum | 1:2a5890e25db5 | 240 | work_thread.start(work); |
turumputum | 1:2a5890e25db5 | 241 | btn_thraed.start(readBtn); |
dimavb | 0:9d6c79aa222a | 242 | |
dimavb | 0:9d6c79aa222a | 243 | pc.printf("threads started\r\n"); |
dimavb | 0:9d6c79aa222a | 244 | |
turumputum | 1:2a5890e25db5 | 245 | while (1) |
dimavb | 0:9d6c79aa222a | 246 | { |
dimavb | 0:9d6c79aa222a | 247 | osEvent evt = recv_box.get(10); |
dimavb | 0:9d6c79aa222a | 248 | if (evt.status == osEventMail) |
dimavb | 0:9d6c79aa222a | 249 | { |
dimavb | 0:9d6c79aa222a | 250 | mail_t *mail = (mail_t*)evt.value.p; |
dimavb | 0:9d6c79aa222a | 251 | for (uint8_t i =0; i<100; i++) |
dimavb | 0:9d6c79aa222a | 252 | { |
dimavb | 0:9d6c79aa222a | 253 | if (mail->data[i] == 0 || mail->data[i] == 0x2c || mail->data[i] == 0x2f) mail->data[i]=0x20; |
dimavb | 0:9d6c79aa222a | 254 | } |
dimavb | 0:9d6c79aa222a | 255 | //pc.printf("main thread: %s\r\n", mail->data); |
turumputum | 1:2a5890e25db5 | 256 | mail->data[99]=0; |
turumputum | 1:2a5890e25db5 | 257 | //parse(mail->data); |
dimavb | 0:9d6c79aa222a | 258 | send_box.free(mail); |
dimavb | 0:9d6c79aa222a | 259 | } |
dimavb | 0:9d6c79aa222a | 260 | |
dimavb | 0:9d6c79aa222a | 261 | } |
dimavb | 0:9d6c79aa222a | 262 | |
dimavb | 0:9d6c79aa222a | 263 | } |
dimavb | 0:9d6c79aa222a | 264 |