mbed Phone Platform

Dependencies:   ulaw mbed ConfigFile

Revision:
4:41a3534d085f
Parent:
3:1d5dc4107558
Child:
5:30e2847d241b
--- a/IpLine.cpp	Thu Jan 06 17:04:13 2011 +0000
+++ b/IpLine.cpp	Fri Jan 07 18:20:41 2011 +0000
@@ -4,6 +4,10 @@
 
 #include "IpLine.h"
 
+#define NET_RETRY (FREQ)
+#define NET_TIMEOUT (FREQ * 3)
+#define PACKET_IDENT 0x6465626d // "mbed"
+
 IpLine::IpLine (AnalogOut p_dac, AnalogIn p_adc) : dac(p_dac), adc(p_adc), dial(DIAL_SIZE), dabuf(DATA_SIZE * 4), adbuf(DATA_SIZE * 2)
 , led1(LED1), led2(LED2), led3(LED3), led4(LED4) {
     EthernetErr r;
@@ -45,15 +49,15 @@
             // over sample
             if (dataskip) {
                 dataskip = 0;
-led1 = 1; led2 = 0; led3 = 0;
             } else {
                 if (! dabuf.get(c)) {
                     dac.write_u16(ulaw2pcm(c));
                 } else {
-//                    dac.write_u16(gaussian());
+                    dac.write_u16(gaussian());
                 }
                 dataskip = 1;
             }
+led1 = 1; led2 = 0; led3 = 0;
         } else {
             // normal
             dabuf.get(c);
@@ -114,7 +118,7 @@
     // get data
     len = udpsock->recvfrom((char *)&packet, sizeof(struct ipline_packet), &recv);
 
-    if (memcmp(packet.header.text, "mbed", 4) != 0) return;
+    if (packet.header.ident != PACKET_IDENT) return;
 
 led4 = 1;
     if (packet.header.status != StatusNone) {
@@ -183,7 +187,7 @@
 /// send packet (header only)
 void IpLine::send (struct ipline_header *header) {
 
-    memcpy(header->text, "mbed", 4);
+    header->ident = PACKET_IDENT;
     if (! header->num) {
         header->num = packet_num;
         packet_num ++;
@@ -201,7 +205,7 @@
 /// send packet
 void IpLine::send (struct ipline_packet *packet) {
 
-    memcpy(packet->header.text, "mbed", 4);
+    packet->header.ident = PACKET_IDENT;
     if (! packet->header.num) {
         packet->header.num = packet_num;
         packet_num ++;
@@ -281,3 +285,23 @@
     }
     remote.setPort(UDPPORT);
 }
+
+unsigned long IpLine::xor128 () {
+    static unsigned long x = 123456789;
+    static unsigned long y = 362436069, z = 521288629, w = 88675123;
+    unsigned long t; 
+    t = (x ^ (x << 11));
+    x = y; y = z; z = w;
+    return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)) ); 
+}
+
+int IpLine::gaussian () {
+    int i, j;
+
+    j = 0;
+    for (i = 0; i < 12; i ++) {
+       j = j + (xor128() >> 16);
+    }
+    j = (j - 0x60000) & 0xffff;
+    return 0x3fff + (j >> 1);
+}