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

Dependencies:   mbed EthernetNetIf

main.cpp

Committer:
AndrewK
Date:
2012-11-27
Revision:
5:926b094680d1
Parent:
4:b04a24076feb

File content as of revision 5:926b094680d1:

#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,155), //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_led1(LED1);
DigitalOut int_led2(LED2);
DigitalOut int_led3(LED3);
DigitalOut int_led4(LED4);
//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;

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;
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) {
        unsigned char v = count_puls % 2;
        count_puls--;
//        led1_on = !led1_on;
//        int_led1 = led1_on;
        port_in_out[device_no-1] = v;
/*        switch(device_no) {
        case 1:
            P21 = v;
            break;
        case 2:
            P22 = v;
            break;
        case 3:
            P23 = v;
            break;
        case 4:
            P24 = v;
            break;
        default:
            timeout.detach();
            return;    
        }
*/        
        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 ( 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;
                break;
            case '2':
                device_no = 2;
//                int_led2 = 1;
                break;
            case '3':
                device_no = 3;
//                int_led3 = 1;
                break;
            case '4':
                device_no = 4;
//                int_led3 = 1;
                break;
            default:
                device_no = 0;
//                int_led4 = 1;
                count_puls = 0;
                return;
            }
                int_led1 = 0;
                int_led2 = 0;
                int_led3 = 0;
                int_led4 = 0;
            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;
    }
}



//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) {
//    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 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;
void adc_comlete16(uint32_t value) {
//    if(++d16 == 10000)
//                int_led4 = 1;
//    if(d16 == 20000) {
//                int_led4 = 0;
//                d16 = 0;
//    }
        a1 = adc.read(p16);
        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",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
        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(p16, 1);
//            int_led4 = 0;
//        LPC_ADC->ADINTEN &= ~0x100;
//        LPC_ADC->ADINTEN |= 1 << chan;
//        LPC_ADC->ADINTEN |= 0x32;
        /* Enable the ADC Interrupt */
//        NVIC_EnableIRQ(ADC_IRQn);
    } 
//    else {
//            int_led4 = 0;
//    }
}

#define MASK 0xC700000C
//#define MASK 0x00000000

int main() {
//    pc.baud(57600);
    //Ethernet initializing, Serial Interface - 57600 kbit/s
//    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) {
//        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(p17);
    AnalogIn in3(p16);
//    PortOut(Port0, MASK);
//    DigitalOut P19(p19);
    AnalogOut tri(p18);
 //   DigitalOut P17(p17);
    DigitalOut P15(p15);
 //   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);
    
    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(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, 200); // 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;
        }
    }
}