11

Dependencies:   millis

Committer:
turumputum
Date:
Tue Oct 02 17:03:10 2018 +0000
Revision:
1:2a5890e25db5
Parent:
0:9d6c79aa222a
???

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>
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(&eth));
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(&eth));
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