mbed Phone Platform

Dependencies:   ulaw mbed ConfigFile

Committer:
okini3939
Date:
Thu Jan 06 17:04:13 2011 +0000
Revision:
3:1d5dc4107558
Parent:
2:e37117117e79
Child:
4:41a3534d085f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:f18953137cb4 1 /*
okini3939 0:f18953137cb4 2 * mbed Phone Platform
okini3939 0:f18953137cb4 3 * Copyright (c) 2010 Hiroshi Suga
okini3939 0:f18953137cb4 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:f18953137cb4 5 */
okini3939 0:f18953137cb4 6
okini3939 2:e37117117e79 7 /** @file main.cpp
okini3939 0:f18953137cb4 8 * @brief mbed Phone Platform
okini3939 0:f18953137cb4 9 */
okini3939 2:e37117117e79 10
okini3939 0:f18953137cb4 11 #include "mbed.h"
okini3939 1:0f82c574096f 12 #include "phone.h"
okini3939 0:f18953137cb4 13 #include "Line.h"
okini3939 1:0f82c574096f 14 #include "IpLine.h"
okini3939 0:f18953137cb4 15
okini3939 0:f18953137cb4 16 Serial pc(USBTX, USBRX);
okini3939 0:f18953137cb4 17 Ticker ticker;
okini3939 0:f18953137cb4 18
okini3939 0:f18953137cb4 19 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:f18953137cb4 20
okini3939 0:f18953137cb4 21 AnalogIn adc(p17);
okini3939 0:f18953137cb4 22 AnalogOut dac(p18);
okini3939 0:f18953137cb4 23 DigitalOut mixlocal(p21), mixline(p22), micsp(p23);
okini3939 0:f18953137cb4 24 Line line1(p12, p13, p11, dac);
okini3939 0:f18953137cb4 25 Line line2(p14, p15, p16, dac);
okini3939 2:e37117117e79 26 IpLine ipline(dac, adc);
okini3939 0:f18953137cb4 27
okini3939 0:f18953137cb4 28 DigitalOut led_y(p25), led_g(p26);
okini3939 0:f18953137cb4 29 DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:f18953137cb4 30
okini3939 0:f18953137cb4 31 volatile int timeout;
okini3939 0:f18953137cb4 32 int dialcount;
okini3939 0:f18953137cb4 33 char dial[DIAL_SIZE];
okini3939 0:f18953137cb4 34 enum PhoneType activesrc, activedest;
okini3939 0:f18953137cb4 35
okini3939 1:0f82c574096f 36 struct PhoneBook phonebook[PB_SIZE] = {
okini3939 1:0f82c574096f 37 {{1, 10, 1}, PhoneLine1, ""},
okini3939 1:0f82c574096f 38 {{1, 10, 2}, PhoneLine2, ""},
okini3939 1:0f82c574096f 39 {{1, 10, 3}, PhoneMicSp, ""},
okini3939 3:1d5dc4107558 40 {{2, 10, 1}, PhoneLine1, "192.168.0.2"},
okini3939 3:1d5dc4107558 41 {{2, 10, 2}, PhoneLine2, "192.168.0.2"},
okini3939 3:1d5dc4107558 42 {{2, 10, 3}, PhoneMicSp, "192.168.0.2"}
okini3939 2:e37117117e79 43 /*
okini3939 2:e37117117e79 44 {{2, 10, 1}, PhoneLine1, "192.168.10.100"},
okini3939 2:e37117117e79 45 {{2, 10, 2}, PhoneLine2, "192.168.10.100"},
okini3939 2:e37117117e79 46 {{2, 10, 3}, PhoneMicSp, "192.168.10.100"}
okini3939 2:e37117117e79 47 */
okini3939 1:0f82c574096f 48 };
okini3939 1:0f82c574096f 49
okini3939 1:0f82c574096f 50
okini3939 0:f18953137cb4 51 void int_sample () {
okini3939 2:e37117117e79 52 line1.intr();
okini3939 2:e37117117e79 53 line2.intr();
okini3939 2:e37117117e79 54 ipline.intr();
okini3939 2:e37117117e79 55
okini3939 0:f18953137cb4 56 if (timeout) timeout --;
okini3939 0:f18953137cb4 57 }
okini3939 0:f18953137cb4 58
okini3939 1:0f82c574096f 59 int getpb (enum PhoneType *target, char *hostname) {
okini3939 1:0f82c574096f 60 int i, j;
okini3939 1:0f82c574096f 61
okini3939 1:0f82c574096f 62 for (i = 0; i < PB_SIZE; i ++) {
okini3939 1:0f82c574096f 63 for (j = 0; j < DIAL_SIZE; j ++) {
okini3939 1:0f82c574096f 64 if (phonebook[i].dial[j] == 0 || dial[j] == 0 ||
okini3939 1:0f82c574096f 65 j >= dialcount || phonebook[i].dial[j] != dial[j]) break;
okini3939 1:0f82c574096f 66 if (j == dialcount - 1) {
okini3939 1:0f82c574096f 67 *target = phonebook[i].target;
okini3939 3:1d5dc4107558 68 strncpy(hostname, phonebook[i].hostname, HOSTNAME_SIZE);
okini3939 1:0f82c574096f 69 return 1;
okini3939 1:0f82c574096f 70 }
okini3939 1:0f82c574096f 71 }
okini3939 1:0f82c574096f 72 }
okini3939 1:0f82c574096f 73
okini3939 1:0f82c574096f 74 return 0;
okini3939 0:f18953137cb4 75 }
okini3939 0:f18953137cb4 76
okini3939 0:f18953137cb4 77 void enteranalog (enum PhoneType target) {
okini3939 0:f18953137cb4 78
okini3939 0:f18953137cb4 79 micsp = 0;
okini3939 0:f18953137cb4 80 mixlocal = 0;
okini3939 0:f18953137cb4 81 mixline = 0;
okini3939 0:f18953137cb4 82
okini3939 0:f18953137cb4 83 wait_ms(1);
okini3939 0:f18953137cb4 84 dac = 0x7fff;
okini3939 0:f18953137cb4 85
okini3939 0:f18953137cb4 86 switch (target) {
okini3939 0:f18953137cb4 87 case PhoneLine1:
okini3939 0:f18953137cb4 88 case PhoneLine2:
okini3939 2:e37117117e79 89 case PhoneIpLine:
okini3939 0:f18953137cb4 90 mixline = 1;
okini3939 0:f18953137cb4 91 break;
okini3939 0:f18953137cb4 92 case PhoneMicSp:
okini3939 0:f18953137cb4 93 micsp = 1;
okini3939 0:f18953137cb4 94 mixlocal = 1;
okini3939 0:f18953137cb4 95 break;
okini3939 0:f18953137cb4 96 }
okini3939 0:f18953137cb4 97 }
okini3939 0:f18953137cb4 98
okini3939 0:f18953137cb4 99 int enterline (enum PhoneType target, enum Mode mode) {
okini3939 0:f18953137cb4 100
okini3939 0:f18953137cb4 101 switch (target) {
okini3939 0:f18953137cb4 102 case PhoneLine1:
okini3939 0:f18953137cb4 103 return line1.enter(mode);
okini3939 0:f18953137cb4 104 case PhoneLine2:
okini3939 0:f18953137cb4 105 return line2.enter(mode);
okini3939 0:f18953137cb4 106 /*
okini3939 0:f18953137cb4 107 case PhoneMicSp:
okini3939 0:f18953137cb4 108 return micsp.enter(mode);
okini3939 2:e37117117e79 109 */
okini3939 0:f18953137cb4 110 case PhoneIpLine:
okini3939 0:f18953137cb4 111 return ipline.enter(mode);
okini3939 0:f18953137cb4 112 }
okini3939 0:f18953137cb4 113 return 0;
okini3939 0:f18953137cb4 114 }
okini3939 0:f18953137cb4 115
okini3939 0:f18953137cb4 116 int scanline (enum PhoneType target, enum Scan type) {
okini3939 0:f18953137cb4 117
okini3939 0:f18953137cb4 118 switch (target) {
okini3939 0:f18953137cb4 119 case PhoneLine1:
okini3939 0:f18953137cb4 120 return line1.scan(type);
okini3939 0:f18953137cb4 121 case PhoneLine2:
okini3939 0:f18953137cb4 122 return line2.scan(type);
okini3939 0:f18953137cb4 123 /*
okini3939 0:f18953137cb4 124 case PhoneMicSp:
okini3939 0:f18953137cb4 125 return micsp.scan(type);
okini3939 2:e37117117e79 126 */
okini3939 0:f18953137cb4 127 case PhoneIpLine:
okini3939 0:f18953137cb4 128 return ipline.scan(type);
okini3939 0:f18953137cb4 129 }
okini3939 0:f18953137cb4 130 return 0;
okini3939 0:f18953137cb4 131 }
okini3939 0:f18953137cb4 132
okini3939 0:f18953137cb4 133 void checkline (enum PhoneType num) {
okini3939 0:f18953137cb4 134 int i;
okini3939 0:f18953137cb4 135
okini3939 0:f18953137cb4 136 switch ((enum Mode)scanline(num, ScanMode)) {
okini3939 0:f18953137cb4 137 case ModeReady:
okini3939 0:f18953137cb4 138 if (scanline(num, ScanHook) == HookOn && activesrc == PhoneNone) {
okini3939 0:f18953137cb4 139 // on hook, dial tone
okini3939 0:f18953137cb4 140 dialcount = 0;
okini3939 0:f18953137cb4 141 enteranalog(num);
okini3939 0:f18953137cb4 142 enterline(num, ModeDT);
okini3939 0:f18953137cb4 143 activesrc = num;
okini3939 0:f18953137cb4 144 }
okini3939 0:f18953137cb4 145 break;
okini3939 0:f18953137cb4 146
okini3939 0:f18953137cb4 147 case ModeDT:
okini3939 0:f18953137cb4 148 case ModeDial:
okini3939 0:f18953137cb4 149 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 150 // off hook, exit
okini3939 0:f18953137cb4 151 enterline(num, ModeReady);
okini3939 0:f18953137cb4 152 activesrc = PhoneNone;
okini3939 0:f18953137cb4 153 break;
okini3939 0:f18953137cb4 154 }
okini3939 0:f18953137cb4 155 i = scanline(num, ScanDial);
okini3939 2:e37117117e79 156 if (i > 0 && i < 12) {
okini3939 0:f18953137cb4 157 // detect dial
okini3939 0:f18953137cb4 158 dial[dialcount] = i;
okini3939 0:f18953137cb4 159 dialcount ++;
okini3939 3:1d5dc4107558 160 pc.printf("Dial [%d]\r\n", i);
okini3939 0:f18953137cb4 161 if (scanline(num, ScanMode) == ModeDT) enterline(num, ModeDial);
okini3939 2:e37117117e79 162 timeout = DIAL_TIMEOUT;
okini3939 0:f18953137cb4 163 }
okini3939 2:e37117117e79 164 if ((! timeout && dialcount > 0) || dialcount >= DIAL_SIZE || i >= 12) {
okini3939 3:1d5dc4107558 165 char buf[HOSTNAME_SIZE];
okini3939 1:0f82c574096f 166 enum PhoneType p;
okini3939 0:f18953137cb4 167 // call
okini3939 1:0f82c574096f 168 if (getpb(&p, buf)) {
okini3939 1:0f82c574096f 169 if (buf[0] == 0) {
okini3939 1:0f82c574096f 170 activedest = p;
okini3939 1:0f82c574096f 171 } else {
okini3939 1:0f82c574096f 172 activedest = PhoneIpLine;
okini3939 2:e37117117e79 173 ipline.settarget(p, buf);
okini3939 1:0f82c574096f 174 }
okini3939 1:0f82c574096f 175 enterline(num, ModeCall);
okini3939 1:0f82c574096f 176 enterline(activedest, ModeRing);
okini3939 2:e37117117e79 177 timeout = CALL_TIMEOUT;
okini3939 1:0f82c574096f 178 } else {
okini3939 1:0f82c574096f 179 enterline(num, ModeBT);
okini3939 1:0f82c574096f 180 }
okini3939 0:f18953137cb4 181 }
okini3939 0:f18953137cb4 182 break;
okini3939 0:f18953137cb4 183
okini3939 0:f18953137cb4 184 case ModeCall:
okini3939 0:f18953137cb4 185 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 186 // off hook, exit
okini3939 0:f18953137cb4 187 enterline(num, ModeReady);
okini3939 0:f18953137cb4 188 enterline(activedest, ModeDisconnect);
okini3939 0:f18953137cb4 189 activesrc = PhoneNone;
okini3939 0:f18953137cb4 190 break;
okini3939 0:f18953137cb4 191 }
okini3939 2:e37117117e79 192 i = scanline(activedest, ScanStatus);
okini3939 2:e37117117e79 193 if (i == StatusOk) {
okini3939 2:e37117117e79 194 // ok call, ring back tone
okini3939 2:e37117117e79 195 enterline(num, ModeRBT);
okini3939 2:e37117117e79 196 }
okini3939 2:e37117117e79 197 if (timeout == 0 || i == StatusNg) {
okini3939 0:f18953137cb4 198 // timeout, busy
okini3939 0:f18953137cb4 199 enterline(num, ModeBT);
okini3939 0:f18953137cb4 200 enterline(activedest, ModeDisconnect);
okini3939 0:f18953137cb4 201 break;
okini3939 0:f18953137cb4 202 }
okini3939 0:f18953137cb4 203 break;
okini3939 0:f18953137cb4 204
okini3939 0:f18953137cb4 205 case ModeRBT:
okini3939 0:f18953137cb4 206 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 207 // off hook, exit
okini3939 0:f18953137cb4 208 enterline(num, ModeReady);
okini3939 0:f18953137cb4 209 enterline(activedest, ModeDisconnect);
okini3939 0:f18953137cb4 210 activesrc = PhoneNone;
okini3939 0:f18953137cb4 211 }
okini3939 0:f18953137cb4 212 break;
okini3939 0:f18953137cb4 213
okini3939 0:f18953137cb4 214 case ModeRing:
okini3939 0:f18953137cb4 215 if (scanline(num, ScanHook) == HookOn) {
okini3939 0:f18953137cb4 216 // on hook, connect
okini3939 0:f18953137cb4 217 if (num == PhoneIpLine || activesrc == PhoneIpLine) {
okini3939 2:e37117117e79 218 enteranalog(PhoneIpLine);
okini3939 0:f18953137cb4 219 } else {
okini3939 0:f18953137cb4 220 enteranalog(PhoneNone);
okini3939 0:f18953137cb4 221 }
okini3939 0:f18953137cb4 222 enterline(num, ModeTalk);
okini3939 0:f18953137cb4 223 enterline(activesrc, ModeTalk);
okini3939 0:f18953137cb4 224 }
okini3939 0:f18953137cb4 225 break;
okini3939 0:f18953137cb4 226
okini3939 0:f18953137cb4 227 case ModeTalk:
okini3939 0:f18953137cb4 228 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 229 // off hook, exit
okini3939 0:f18953137cb4 230 enterline(num, ModeReady);
okini3939 0:f18953137cb4 231 enterline(num == activesrc ? activedest : activesrc, ModeDisconnect);
okini3939 0:f18953137cb4 232 activesrc = PhoneNone;
okini3939 0:f18953137cb4 233 break;
okini3939 0:f18953137cb4 234 }
okini3939 1:0f82c574096f 235 if (scanline(activedest, ScanStatus) == StatusNg) {
okini3939 0:f18953137cb4 236 // disconnect
okini3939 0:f18953137cb4 237 enterline(num, ModeBT);
okini3939 0:f18953137cb4 238 }
okini3939 0:f18953137cb4 239 break;
okini3939 0:f18953137cb4 240
okini3939 0:f18953137cb4 241 case ModeBT:
okini3939 0:f18953137cb4 242 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 243 // off hook, exit
okini3939 0:f18953137cb4 244 enterline(num, ModeReady);
okini3939 0:f18953137cb4 245 if (activesrc == num) activesrc = PhoneNone;
okini3939 0:f18953137cb4 246 if (activedest == num) activedest = PhoneNone;
okini3939 0:f18953137cb4 247 }
okini3939 0:f18953137cb4 248 break;
okini3939 0:f18953137cb4 249
okini3939 0:f18953137cb4 250 case ModeDisconnect:
okini3939 0:f18953137cb4 251 enterline(num, ModeBT);
okini3939 0:f18953137cb4 252 break;
okini3939 0:f18953137cb4 253
okini3939 0:f18953137cb4 254 }
okini3939 0:f18953137cb4 255
okini3939 0:f18953137cb4 256 }
okini3939 0:f18953137cb4 257
okini3939 0:f18953137cb4 258
okini3939 0:f18953137cb4 259 int main () {
okini3939 2:e37117117e79 260 int i;
okini3939 2:e37117117e79 261
okini3939 0:f18953137cb4 262 timeout = 0;
okini3939 0:f18953137cb4 263 dialcount = 0;
okini3939 0:f18953137cb4 264 activesrc = PhoneNone;
okini3939 0:f18953137cb4 265 activedest = PhoneNone;
okini3939 0:f18953137cb4 266 line1.enter(ModeReady);
okini3939 0:f18953137cb4 267 line2.enter(ModeReady);
okini3939 2:e37117117e79 268 ipline.enter(ModeReady);
okini3939 0:f18953137cb4 269
okini3939 0:f18953137cb4 270 ticker.attach_us(&int_sample, 1000000 / FREQ);
okini3939 0:f18953137cb4 271
okini3939 0:f18953137cb4 272 for (;;) {
okini3939 2:e37117117e79 273 ipline.poll();
okini3939 2:e37117117e79 274
okini3939 2:e37117117e79 275 i = scanline(PhoneLine1, ScanMode);
okini3939 0:f18953137cb4 276 checkline(PhoneLine1);
okini3939 2:e37117117e79 277 if (i != scanline(PhoneLine1, ScanMode))
okini3939 2:e37117117e79 278 pc.printf("(1) %d -> %d\r\n", i, scanline(PhoneLine1, ScanMode));
okini3939 2:e37117117e79 279
okini3939 2:e37117117e79 280 i = scanline(PhoneLine2, ScanMode);
okini3939 0:f18953137cb4 281 checkline(PhoneLine2);
okini3939 2:e37117117e79 282 if (i != scanline(PhoneLine2, ScanMode))
okini3939 2:e37117117e79 283 pc.printf("(2) %d -> %d\r\n", i, scanline(PhoneLine2, ScanMode));
okini3939 2:e37117117e79 284
okini3939 2:e37117117e79 285 i = scanline(PhoneIpLine, ScanMode);
okini3939 2:e37117117e79 286 checkline(PhoneIpLine);
okini3939 2:e37117117e79 287 if (i != scanline(PhoneIpLine, ScanMode))
okini3939 2:e37117117e79 288 pc.printf("(3) %d -> %d\r\n", i, scanline(PhoneIpLine, ScanMode));
okini3939 2:e37117117e79 289
okini3939 2:e37117117e79 290 // debug
okini3939 2:e37117117e79 291 if(pc.readable()) {
okini3939 2:e37117117e79 292 if (pc.getc() == 'a') {
okini3939 2:e37117117e79 293 char buf[30];
okini3939 2:e37117117e79 294 enum PhoneType p;
okini3939 2:e37117117e79 295 dial[0] = 2;
okini3939 2:e37117117e79 296 dial[1] = 10;
okini3939 2:e37117117e79 297 dial[2] = 1;
okini3939 2:e37117117e79 298 dialcount = 3;
okini3939 2:e37117117e79 299 if (getpb(&p, buf)) {
okini3939 2:e37117117e79 300 if (buf[0] != 0) {
okini3939 2:e37117117e79 301 activedest = PhoneIpLine;
okini3939 2:e37117117e79 302 ipline.settarget(p, buf);
okini3939 2:e37117117e79 303 enterline(PhoneLine1, ModeCall);
okini3939 2:e37117117e79 304 enterline(activedest, ModeRing);
okini3939 2:e37117117e79 305 }
okini3939 2:e37117117e79 306 }
okini3939 2:e37117117e79 307 }
okini3939 2:e37117117e79 308 }
okini3939 2:e37117117e79 309
okini3939 0:f18953137cb4 310 }
okini3939 0:f18953137cb4 311 }