Andrew Kuznetsov / Mbed 2 deprecated Monitor00_copy

Dependencies:   EthernetNetIf mbed

Fork of Monitor0 by Andrew Kuznetsov

Revision:
6:926b094680d1
Parent:
4:b04a24076feb
--- a/main.cpp	Mon Aug 27 15:02:29 2012 +0000
+++ b/main.cpp	Tue Nov 27 10:44:23 2012 +0000
@@ -1,11 +1,19 @@
-
-#define SAMPLE_RATE    150000
+#define SAMPLE_RATE    50000
 #include "mbed.h"
 #include "adc.h"
 #include "EthernetNetIf.h"
 #include "UDPSocket.h"
+#include "MedianFilter.h"
+struct {
+    char key;
+    unsigned short v1;
+    unsigned short v2;
+    unsigned short v3;
+    unsigned short v4;
+} buff;
 
-EthernetNetIf eth( IpAddr(192,168,1,5), //IP Address
+
+EthernetNetIf eth( IpAddr(192,168,1,155), //IP Address
     IpAddr(255,255,255,0), //Network Mask
     IpAddr(192,168,1,254), //Gateway
     IpAddr(192,168,1,254)  //DNS
@@ -17,69 +25,160 @@
 DigitalOut int_led2(LED2);
 DigitalOut int_led3(LED3);
 DigitalOut int_led4(LED4);
-DigitalOut P21(p21);
-DigitalOut P22(p22);
-DigitalOut P23(p23);
-Serial pc(USBTX,USBRX);
-Host multicast(IpAddr(192,168,1,10),27200, NULL);   //Target IP and port
+//DigitalOut P21(p21);
+//DigitalOut P22(p22);
+//DigitalOut P23(p23);
+//DigitalOut P24(p24);
+//Serial pc(USBTX,USBRX);
+Host multicast(IpAddr(192,168,1,51),27200, NULL);   //Target IP and port
 ADC adc(SAMPLE_RATE, 1);
 Ticker flipper;
 unsigned short s1,s2,s3;
 unsigned short i1,i2,i3;
 unsigned short a1,a2,a3;
+unsigned short b1,b2,b3;
+unsigned short bm1;
 unsigned short sm1, sm2, sm3;
 unsigned short im1, im2, im3;
 unsigned short am1, am2, am3;
 unsigned short smag, imag, amag;
 float s0;
-//int k=0;
-//Timer tmr;
+
+MedianFilter mf16(9);
+MedianFilter mf17(9);
+MedianFilter mf19(9);
+MedianFilter mf20(9);
+void flip();
+/////////////////////////////////////////
+DigitalInOut port_in_out[4] = {DigitalInOut(p21),DigitalInOut(p22),DigitalInOut(p23),DigitalInOut(p24)};
+//DigitalInOut P21(p21);
+//DigitalInOut P22(p22);
+//DigitalInOut P23(p23);
+//DigitalInOut P24(p24);
+int count_puls;
+int mode_read;
+int device_no;
 Timeout timeout;
-char str[50];
-unsigned char buf[10];
-int count_puls;
-int device_no;
-int led1_on = 0;
+Timeout timeout2;
+InterruptIn port_interrupt[4] = {InterruptIn(p21),InterruptIn(p22),InterruptIn(p23),InterruptIn(p24)};
+//InterruptIn impuls21(p21);
+//InterruptIn impuls22(p22);
+//InterruptIn impuls23(p23);
+//InterruptIn impuls24(p24);
+int count_imp = 0;
+void impuls_fall() {count_imp++;}
+/////////////////////////////////////////
+unsigned char send_buf[16];
+
+void Handler21() {
+}
+
+void Timer_Handler21() {
+    send_buf[0] = '5';
+    send_buf[2] = device_no - 1;
+    switch(count_imp) {
+        case 0:
+            send_buf[1] = 0;
+            break;
+        case 1:
+            send_buf[1] = 1;
+            break;
+        case 2:
+            send_buf[1] = 3;
+            break;
+        case 3:
+            send_buf[1] = 4;
+            break;
+        case 4:
+            send_buf[1] = 2;
+            break;
+        case 5:
+            send_buf[1] = 5;
+            break;
+    }
+    Net::poll();                //Do network stuff
+    udp.sendto((char*)&send_buf, 3, &multicast );
+    timeout2.detach();
+//    pc.printf("%d  %s\n", count_imp, (char*)&send_buf);
+}
+
+
 void Timer_Handler() 
 {
     if(count_puls) {
-//        printf("cp %d\n", count_puls);
+        unsigned char v = count_puls % 2;
         count_puls--;
-        led1_on = !led1_on;
- //       int_led1 = led1_on;
-        switch(device_no) {
+//        led1_on = !led1_on;
+//        int_led1 = led1_on;
+        port_in_out[device_no-1] = v;
+/*        switch(device_no) {
         case 1:
-            P21 = !led1_on;
+            P21 = v;
             break;
         case 2:
-            P22 = !led1_on;
+            P22 = v;
             break;
         case 3:
-            P23 = !led1_on;
+            P23 = v;
+            break;
+        case 4:
+            P24 = v;
             break;
         default:
             timeout.detach();
             return;    
         }
-        timeout.attach_us(Timer_Handler, 1000);
-    } else
+*/        
+        if(mode_read) {
+            timeout.attach_us(Timer_Handler, 30000);
+            mode_read = 0;
+            int_led1 = 1;
+
+        } else {
+            timeout.attach_us(Timer_Handler, 1000);
+            int_led1 = 0;
+        }
+    } else {
         timeout.detach();
+        port_in_out[device_no-1].input();
+        timeout2.attach_us(Timer_Handler21, 200000);
+        count_imp = 0;
+
+    }
+}
+bool transmit_enable = false;
+void StartTransmit(bool start) {
+    if(start) {
+        transmit_enable = true;
+//        flipper.attach_us(&flip, 200); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
+    } else {
+        transmit_enable = false;
+//        flipper.detach();
+//        flipper.attach_us(&flip, 200000); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
+    }
 }
 
 void onUDPSocketEvent(UDPSocketEvent e) {  //Incoming UDP packet processing
+    int len;
     switch (e) {
         case UDPSOCKET_READABLE: //The only event for now
             char buf[64] = {0};
             Host host;
-            while ( int len = udp.recvfrom( buf, 63, &host ) ) {
+            while ( len = udp.recvfrom( buf, 63, &host ), len ) {
                 if ( len <= 0 )
                     break;
       //          printf("From %d.%d.%d.%d: %s\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], buf);
             }
             switch(buf[0]) {
+            case 'S':
+                StartTransmit(true);
+                return;        
+            case 's':
+                StartTransmit(false);
+                return;
             case '1':
                 device_no = 1;
-                int_led1 = 1;
+//                int_led1 = 1;
                 break;
             case '2':
                 device_no = 2;
@@ -89,6 +188,10 @@
                 device_no = 3;
 //                int_led3 = 1;
                 break;
+            case '4':
+                device_no = 4;
+//                int_led3 = 1;
+                break;
             default:
                 device_no = 0;
 //                int_led4 = 1;
@@ -99,211 +202,151 @@
                 int_led2 = 0;
                 int_led3 = 0;
                 int_led4 = 0;
-            switch(buf[1]) {
-            case '1':
-                count_puls = 2; //8
- //               int_led1 = 1;
-                break;
-            case '2':
-                count_puls = 8; //4;
- //               int_led2 = 1;
-                break;
-            case '3':
-                count_puls = 4; //6;
- //               int_led3 = 1;
-                break;
-            case '4':
-                count_puls = 6; //2;8
- //                int_led4 = 1;
-               break;
-            case '5':
-                count_puls = 10;
- //                int_led1 = 1;
- //                 int_led2 = 1;
-             break;
-            default:
-                count_puls = 0;
-             }
-            timeout.attach_us(Timer_Handler, 1000);
-            break;
+            if(buf[2] == 0) {
+                mode_read = 0;
+                switch(buf[1]) {
+                case '1':
+                    count_puls = 2; //8
+     //               int_led1 = 1;
+                    break;
+                case '2':
+                    count_puls = 8; //4;
+     //               int_led2 = 1;
+                    break;
+                case '3':
+                    count_puls = 4; //6;
+     //               int_led3 = 1;
+                    break;
+                case '4':
+                    count_puls = 6; //2;8
+     //                int_led4 = 1;
+                   break;
+                case '5':
+                    count_puls = 10;
+     //                int_led1 = 1;
+     //                 int_led2 = 1;
+                 break;
+                default:
+                    count_puls = 0;
+                 }
+            } else {
+              count_puls = 2;
+                mode_read = 1;
+                
+//                led1_on = 1;
+            }
+            port_in_out[device_no-1].output();
+             timeout.attach_us(Timer_Handler, 1000);
+           break;
     }
 }
 
-unsigned short Major(unsigned short dadc2, unsigned short dadc0, unsigned short dadc1)
-{
-//printf("%d %d %d\n", dadc2, dadc0, dadc1);
-    unsigned short rez;
-    int dif01, dif02, dif12;
-    dif01 = dadc0 - dadc1;
-    dif02 = dadc0 - dadc2;
-    dif12 = dadc1 - dadc2;
-    if (dif01 < 0) dif01 = -dif01;
-    if (dif02 < 0) dif02 = -dif02;
-    if (dif12 < 0) dif12 = -dif12;
-    if (dif01 < dif02) {
-        if (dif12 < dif01)
-            dadc0 = dadc2;
-        //else // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 2
-    } else {
-        if (dif12 < dif02)
-            dadc0 = dadc2; // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 0
-        else
-            dadc1 = dadc2; // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 1
-    }
-    rez = dadc0 + dadc1;
-    rez >>= 1;
-    return rez;
-}
+
 
-static int number20 = 0;
-static int pass20 = 0;
+//static int number20 = 0;
+//static int pass20 = 0;
 int ccc = 0;
 int number = 0;
 int complete20 = 1;
+int d20 = 0;
 void adc_comlete20(uint32_t value) {
-// void adc_comlete() {
-    if(++ccc == 1000)
-                int_led1 = 1;
-    if(ccc == 2000) {
-                int_led1 = 0;
-                ccc = 0;
-    }
-//printf("%d\n", number);
-    switch(number20) {
-    case 0:
-        s1 = adc.read(p20);
-//        printf("%d\n", s1);
-        number20++;
-        break;
-    case 1:
-        s2 = adc.read(p20);
-//        printf("%d\n", s2);
-        number20++;
-        break;
-    case 2:
-        s3 = adc.read(p20);
-        switch(++pass20) {
-        case 1:
-            sm1 =  Major(s1, s2, s3);
-            break;
-        case 2:
-            sm2 =  Major(s1, s2, s3);
-            break;
-        case 3:
-            sm3 =  Major(s1, s2, s3);
-            smag = Major(sm1, sm2, sm3);
-            adc.interrupt_state(p20, 0);
-//            adc.interrupt_state(p19, 1);
-            pass20 = 0;
-            complete20 = 1;
-            break;
-       }
-       number20 = 0;
-    }
- }
-int ddd = 0;
-static int number19 = 0;
-int complete19 = 1;
-static int pass19 = 0;
-void adc_comlete19(uint32_t value) {
-    if(++ddd == 1000)
-                int_led2 = 1;
-    if(ddd == 2000) {
-                int_led2 = 0;
-                ddd = 0;
-    }
-//printf("%d\n", number);
-    switch(number19) {
-    case 0:
-        i1 = adc.read(p19);
-//        printf("           %d\n", i1);
-        number19++;
-        break;
-    case 1:
-        i2 = adc.read(p19);
-//        printf("           %d\n", i2);
-        number19++;
-        break;
-    case 2:
-        i3 = adc.read(p19);
-         switch(++pass19) {
-        case 1:
-            im1 =  Major(i1, i2, i3);
-            break;
-        case 2:
-            im2 =  Major(i1, i2, i3);
-            break;
-        case 3:
-            im3 =  Major(i1, i2, i3);
-            smag = Major(im1, im2, im3);
-            adc.interrupt_state(p19, 0);
-//            adc.interrupt_state(p16, 1);
-            pass19 = 0;
-            complete19 = 1;
-            break;
-       }
-        number19=0;
-    }
+//    if(++d20 == 10000)
+//                int_led1 = 1;
+//    if(d20 == 20000) {
+//                int_led1 = 0;
+//                d20 = 0;
+//    }
+       s1 = adc.read(p20);
+       sm1 = mf20.GetMedian(s1);
+//       adc.interrupt_state(p20, 0);
+       complete20 = 1;
+        adc.interrupt_state(p20, 0);
+//        adc.select(p16);
+         adc.interrupt_state(p16, 1);
  }
 
-int eee = 0;
-static int number16 = 0;
+ 
+int d19 = 0;
+//static int number19 = 0;
+int complete19 = 1;
+//static int pass19 = 0;
+void adc_comlete19(uint32_t value) {
+//    if(++d19 == 10000)
+//                int_led2 = 1;
+//    if(d19 == 20000) {
+//                int_led2 = 0;
+//                d19 = 0;
+//    }
+        i1 = adc.read(p19);
+        im1 = mf19.GetMedian(i1);
+        complete19 = 1;
+         adc.interrupt_state(p19, 0);
+ //       adc.select(p20);
+         adc.interrupt_state(p20, 1);
+}
+
+int complete17 = 1;
+int d17 = 0;
+void adc_comlete17(uint32_t value) {
+//    if(++d17 == 10000)
+//                int_led3 = 1;
+//    if(d17 == 20000) {
+//                int_led3 = 0;
+//                d17 = 0;
+//    }
+        b1 = adc.read(p17);
+        bm1 = mf17.GetMedian(b1);
+        complete17 = 1;
+        adc.interrupt_state(p17, 0);
+ //       adc.select(p19);
+         adc.interrupt_state(p19, 1);
+ }
+
+int d16 = 0;
+//static int number16 = 0;
 int complete16 = 1;
-int pass16 = 0;
+//int pass16 = 0;
 void adc_comlete16(uint32_t value) {
-    if(++eee == 1000)
-                int_led3 = 1;
-    if(eee == 2000) {
-                int_led3 = 0;
-                eee = 0;
-    }
-//printf("%d\n", number);
-    switch(number16) {
-    case 0:
+//    if(++d16 == 10000)
+//                int_led4 = 1;
+//    if(d16 == 20000) {
+//                int_led4 = 0;
+//                d16 = 0;
+//    }
         a1 = adc.read(p16);
-//        printf("                    %d\n", a1);
-        number16++;
-        break;
-    case 1:
-        a2 = adc.read(p16);
-//        printf("                    %d\n", a2);
-        number16++;
-        break;
-    case 2:
-        a3 = adc.read(p16);
-        switch(++pass16) {
-        case 1:
-            am1 =  Major(a1, a2, a3);
-            break;
-        case 2:
-            am2 =  Major(a1, a2, a3);
-            break;
-        case 3:
-            am3 =  Major(a1, a2, a3);
-            amag = Major(am1, am2, am3);
-            adc.interrupt_state(p16, 0);
-            pass16 = 0;
-            complete16 = 1;
-            break;
-       }
-        number16=0;
-    }
- }
+        am1 = mf16.GetMedian(a1);
+        complete16 = 1;
+        adc.interrupt_state(p16, 0);
+//        adc.select(p17);
+         adc.interrupt_state(p17, 1);
+}
  
 int delta;
 float err;
 
 void flip() {
+//if(!complete20)
+//    int_led4 = 1;
 //    if(complete20 && complete19 && complete16) {
-  {      complete20 = complete19 = complete16 = 0;
-        int_led4 = 1;
-        sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1);
+  {      //complete20 = complete19 = 
+  complete16 = 0;
+ //       int_led4 = 1;
+ //       sprintf(str, "2=%4u %4u %4u\0",a1, im1, a1);
+ //       printf(str);
+    buff.key = '2';
+    buff.v1 = sm1;
+    buff.v2 = im1;
+    buff.v3 = am1;
+    buff.v4 = bm1;
         Net::poll();                //Do network stuff
-        udp.sendto( str, strlen(str)+1, &multicast );
+        if(transmit_enable)
+            udp.sendto((char*)&buff, sizeof(buff), &multicast );
+ //       udp.sendto( str, strlen(str)+1, &multicast );
 //        LPC_ADC->ADINTEN = 0;
-        adc.interrupt_state(p20, 1);
-        adc.interrupt_state(p19, 1);
+//        adc.interrupt_state(p20, 1);
+//        adc.interrupt_state(p19, 1);
         adc.interrupt_state(p16, 1);
+//            int_led4 = 0;
 //        LPC_ADC->ADINTEN &= ~0x100;
 //        LPC_ADC->ADINTEN |= 1 << chan;
 //        LPC_ADC->ADINTEN |= 0x32;
@@ -314,85 +357,44 @@
 //            int_led4 = 0;
 //    }
 }
-/*    switch(number) {
-    case 0:
-//        s1 = adc.read(p20);
-        number++;
-        break;
-    case 3:
-//        s2 = adc.read(p20);
-        number++;
-        break;
-    case 6:
-//        s3 = adc.read(p20);
-        number++;
-        sm1 =  Major(s1, s2, s3);
-//        sprintf(str, "1=%4u\0",sm1);
-//        Net::poll();                //Do network stuff
-//        udp.sendto( str, strlen(str)+1, &multicast );
-        break;
-    case 1:
-        number++;
-//        i1 = adc.read(p19);
-        break;
-    case 4:
-        number++;
-//        i2 = adc.read(p19);
-        break;
-    case 7:
-        number++;
-//        i3 = adc.read(p19);
-        im1 =  Major(i1, i2, i3);
-//        sprintf(str, "2=%4u %4u\0",sm1, im1);
-//        Net::poll();                //Do network stuff
-//        udp.sendto( str, strlen(str)+1, &multicast );
-        break;
-    case 2:
-        number++;
-//        a1 = adc.read(p16);
-        break;
-    case 5:
-        number++;
-//        a2 = adc.read(p16);
-        break;
-    case 8:
-        number=0;
-//        a3 = adc.read(p16);
-        am1 =  Major(a1, a2, a3);
-        sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1);
-        Net::poll();                //Do network stuff
-        udp.sendto( str, strlen(str)+1, &multicast );
-        break;
-    }
-}
-*/
+
 #define MASK 0xC700000C
 //#define MASK 0x00000000
 
 int main() {
-    pc.baud(57600);
+//    pc.baud(57600);
     //Ethernet initializing, Serial Interface - 57600 kbit/s
-    printf("Setting up...\n");
-    P21 = P22 = P23 = 1;
+//    printf("Setting up...\n");
+    port_in_out[0].output();
+    port_in_out[1].output();
+    port_in_out[2].output();
+    port_in_out[3].output();
+    port_in_out[0]=1;
+    port_in_out[1]=1;
+    port_in_out[2]=1;
+    port_in_out[3]=1;
     EthernetErr ethErr = eth.setup();
-    if (ethErr) {
+//    if (ethErr) {
 //        printf("Error %d in setup.\n", ethErr);
-        return -1;
-    }
+//        return -1;
+//    }
 //    printf("Setup OK\n");
  //   Host multicast(IpAddr(239, 192, 1, 100), 50000, NULL); //Join multicast group on port 50000
     AnalogIn in0(p20);
     AnalogIn in1(p19);
-//    AnalogIn in2(p18);
+    AnalogIn in2(p17);
     AnalogIn in3(p16);
-//    AnalogIn in4(p16);
-//    AnalogIn in5(p15);
 //    PortOut(Port0, MASK);
 //    DigitalOut P19(p19);
     AnalogOut tri(p18);
-    DigitalOut P17(p17);
+ //   DigitalOut P17(p17);
     DigitalOut P15(p15);
-    P17 = 0;  P15 = 0;// = P19 = 0;
+ //   P17 = 0;  
+    P15 = 0;// = P19 = 0;
+    port_interrupt[0].fall(&impuls_fall);
+    port_interrupt[1].fall(&impuls_fall);
+    port_interrupt[2].fall(&impuls_fall);
+    port_interrupt[3].fall(&impuls_fall);
 
     udp.setOnEvent(&onUDPSocketEvent);
     udp.bind(multicast);
@@ -408,18 +410,21 @@
      adc.setup(p19,1);
 //     adc.select(p20);
 //     adc.start();
-//    adc.setup(p18,1);
+    adc.setup(p17,1);
     adc.setup(p16,1);
 //    printf("start\n");
 //    printf("%d\n", adc.channel_to_pin_number(0));
-
+//complete20 = complete19 = 
+complete16 = 0;
     adc.append(p20, adc_comlete20);
     adc.interrupt_state(p20, 0);
     adc.append(p19, adc_comlete19);
     adc.interrupt_state(p19, 0);
+    adc.append(p17, adc_comlete17);
+    adc.interrupt_state(p17, 0);
     adc.append(p16, adc_comlete16);
     adc.interrupt_state(p16, 0);
-    flipper.attach_us(&flip, 500); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
+    flipper.attach_us(&flip, 200); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
     tri = 0;
     while(1) {
         tri = tri + 0.001;