mbed Phone Platform UDP to DAC/ADC test

Dependencies:   mbed

main.cpp

Committer:
okini3939
Date:
2010-12-01
Revision:
0:c0c1269a8f51

File content as of revision 0:c0c1269a8f51:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "UDPSocket.h"
#include "RingBuffer.h"
#include "ulaw.h"

#define FREQ 8000
#define MTU 1500
#define MTU2 700
#define BUFSIZE (MTU * 2)
#define UDPPORT 10080

//EthernetNetIf eth;
EthernetNetIf eth(IpAddr(192,168,2,101), IpAddr(255,255,255,0), IpAddr(192,168,2,1), IpAddr(192,168,2,1));
UDPSocket dupsock;
Host remote;
Ticker ticker;

DigitalIn sw1(p29);
DigitalIn sw2(p30);
DigitalOut led0(p19), led1(LED1), led2(LED2), led3(LED3), led4(LED4);
AnalogIn adc(p17);
AnalogOut dac(p18);

DigitalOut line1a(p12), line1b(p13);
DigitalOut line2a(p14), line2b(p15);
DigitalIn hook1(p11), hook2(p16);
DigitalOut mixlocal(p21), mixline(p22), micsp(p23);
DigitalOut led_y(p25), led_g(p26);
DigitalIn eth_link(P1_25), eth_speed(P1_26);

RingBuffer buf1(BUFSIZE);
RingBuffer buf2(BUFSIZE);
int connect;
int timeout;

// UDPŠ„ž‚Ý
void onLisnerEvent (UDPSocketEvent e) {
    int len;
    char buf[MTU];
    Host recv;

    if (e != UDPSOCKET_READABLE) return;

    // ŽóMƒf[ƒ^Žæ“¾
    len = dupsock.recvfrom(buf, MTU, &recv);

    // Ú‘±’†‚ֈڍs
    if (connect == 0) {
        remote = recv;
        IpAddr ip = remote.getIp();
//        printf("connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);

        connect = 1;
//    mixline = 1;
    mixlocal = 1;
    micsp = 1;
        led2 = 1;
    }

    // Ú‘±’†‚Ì‘ŠŽèæ‚©ƒ`ƒFƒbƒN‚µAƒf[ƒ^•Û‘¶//
//    if (remote.getIp() == recv.getIp()) {
        buf2.put(buf, len);
        timeout = FREQ;
        led3 = led3 ? 0 : 1;
//    }
}

// ƒTƒ“ƒvƒŠƒ“ƒOŠ„‚荞‚Ý 8KHz
void int_sample () {
    char c;

    // ŽóMƒf[ƒ^Ä¶
    if (! buf2.get(c)) {
        dac.write_u16(ulaw2pcm(c));
//        dac.write_u16((unsigned short)c << 8);
    }

    // ‘—Mƒf[ƒ^¶¬
    if (connect && buf1.available()) {
        buf1.put(pcm2ulaw(adc.read_u16()));
    }

    if (timeout) timeout --;
}


int main () {
    int len, last;
    char buf[MTU];
    EthernetErr r;
    Host send;
    
    connect = 0;
    timeout = 0;

    // ƒlƒbƒgƒ[ƒN‰Šú‰»
    led_g = eth_link ? 0 : 1;
    led_y = eth_speed ? 0 : 1;
    r = eth.setup();
    if (r) {
        printf("Error %d in setup.\n", r);
        return -1;
    }
    dupsock.setOnEvent(&onLisnerEvent);
//    dupsock.bind(Host(IP_ADDR_ANY, UDPPORT));
    dupsock.bind(Host(eth.getIp(), UDPPORT));

    // Š„ž‚ÝŠJŽn
    ticker.attach_us(&int_sample, 1000000UL / FREQ);
    led0 = 1;
    led1 = 1;
    
    line1a = 1;
    hook1.mode(PullUp);
    hook2.mode(PullUp);

    last = hook1;
    for (;;) {
        led4 = hook1 ? 0 : 1;
        led_g = eth_link ? 0 : 1;
        led_y = eth_speed ? 0 : 1;

        if (hook1 != last) {
            buf[0] = hook1;
            dupsock.sendto(buf, 1, &remote);
            last = hook1;
        }
/*
        // ‘—Mƒoƒbƒtƒ@‚ª—­‚Ü‚Á‚½‚ç‘—M
        if (connect && buf1.use() >= MTU) {
            len = buf1.get(buf, MTU);
            if (len > 0)
                dupsock.sendto(buf, len, &remote);
        }
*/
/*
        // Ú‘±ƒ^ƒCƒ€ƒAƒEƒg or Ø’fƒ{ƒ^ƒ“
        if (connect && (! timeout || ! sw2)) {
            led1 = 0;
            connect = 0;
            buf1.clear();
            buf2.clear();
        }

        // Ú‘±ƒ{ƒ^ƒ“
        if (! connect && ! sw1) {
            send = Host(IpAddr(192,168,0,4), UDPPORT, NULL);
            dupsock.bind(send);
            buf1.clear();
            buf2.clear();
            timeout = FREQ;
            connect = 1;
        }
*/
        Net::poll();
    }

}