Measurement of three analogue signals a filtration and transfer of their values through Ethernet (UDP)

Dependencies:   mbed EthernetNetIf

Revision:
0:72d0d2736b7f
Child:
1:be04a186a221
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 26 06:24:23 2012 +0000
@@ -0,0 +1,230 @@
+
+#define SAMPLE_RATE    150000
+#include "mbed.h"
+#include "adc.h"
+#include "EthernetNetIf.h"
+#include "UDPSocket.h"
+
+EthernetNetIf eth( IpAddr(192,168,1,5), //IP Address
+    IpAddr(255,255,255,0), //Network Mask
+    IpAddr(192,168,1,254), //Gateway
+    IpAddr(192,168,1,254)  //DNS
+    );
+//EthernetNetIf eth;
+UDPSocket udp;
+
+DigitalOut int_led(LED1);
+DigitalOut P15(p15);
+Serial pc(USBTX,USBRX);
+Host multicast(IpAddr(192,168,1,10),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 sm1, sm2, sm3;
+unsigned short im1, im2, im3;
+unsigned short am1;
+unsigned short smag, imag;
+float s0;
+//int k=0;
+//Timer tmr;
+Timeout timeout;
+char str[50];
+unsigned char buf[10];
+int count_puls;
+int led1_on = 0;
+void Timer_Handler() 
+{
+    if(count_puls) {
+        printf("cp %d\n", count_puls);
+        count_puls--;
+        led1_on = !led1_on;
+        int_led = led1_on;
+        P15 = !led1_on;
+        timeout.attach_us(Timer_Handler, 100);
+    } else
+        timeout.detach();
+}
+
+void onUDPSocketEvent(UDPSocketEvent e) {  //Incoming UDP packet processing
+    switch (e) {
+        case UDPSOCKET_READABLE: //The only event for now
+            char buf[64] = {0};
+            Host host;
+            while ( int len = udp.recvfrom( buf, 63, &host ) ) {
+                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 '1':
+                count_puls = 8;
+                break;
+            case '2':
+                count_puls = 4;
+                break;
+            case '3':
+                count_puls = 6;
+                break;
+            case '4':
+                count_puls = 2;
+                break;
+            case '5':
+                count_puls = 10;
+                break;
+            default:
+                count_puls = 0;
+            }
+            timeout.attach_us(Timer_Handler, 100);
+            break;
+    }
+}
+/*
+ void adc_comlete(uint32_t value) {
+    samples1 = adc.read(p20);
+        Net::poll();                //Do network stuff
+    sprintf(str, "1=%4u\0", samples1);
+    printf("%d\n", samples1);
+    udp.sendto( str, strlen(str)+1, &multicast );
+    
+ }
+*/ 
+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;
+}
+int delta;
+float err;
+static int number = 0;
+
+void flip() {                       // interrupt function: measurement and sending a UDP packet
+    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(p17);
+        break;
+    case 5:
+        number++;
+        a2 = adc.read(p17);
+        break;
+    case 8:
+        number=0;
+        a3 = adc.read(p17);
+        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);
+    //Ethernet initializing, Serial Interface - 57600 kbit/s
+    printf("Setting up...\n");
+    P15 = 1;
+    EthernetErr ethErr = eth.setup();
+    if (ethErr) {
+//        printf("Error %d in setup.\n", ethErr);
+        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 in3(p17);
+//    AnalogIn in4(p16);
+//    AnalogIn in5(p15);
+//    PortOut(Port0, MASK);
+//    DigitalOut P19(p19);
+    AnalogOut tri(p18);
+//    DigitalOut P17(p17);
+    DigitalOut P16(p16);
+    P16 = 0; // P17 = 0;// = P19 = 0;
+
+    udp.setOnEvent(&onUDPSocketEvent);
+    udp.bind(multicast);
+    
+    Net::poll();
+    
+//    tmr.start();
+
+    //Turning ON Burst-mode ADC on pins 17,18,19,20  note: connect not used ADC ping to ground
+//    adc.startmode(0,0);
+    adc.burst(1);
+     adc.setup(p20,1);
+     adc.setup(p19,1);
+//     adc.select(p20);
+//     adc.start();
+//    adc.setup(p18,1);
+    adc.setup(p17,1);
+//    printf("start\n");
+//    printf("%d\n", adc.channel_to_pin_number(0));
+
+    flipper.attach_us(&flip, 83); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
+    tri = 0;
+    while(1) {
+        tri = tri + 0.001;
+        wait_us(100);
+        if(tri >= 0.06) {
+            tri = 0;
+        }
+    }
+}
\ No newline at end of file