mbed Phone Platform
Dependencies: ulaw mbed ConfigFile
main.cpp
- Committer:
- okini3939
- Date:
- 2010-12-26
- Revision:
- 1:0f82c574096f
- Parent:
- 0:f18953137cb4
- Child:
- 2:e37117117e79
File content as of revision 1:0f82c574096f:
/* * mbed Phone Platform * Copyright (c) 2010 Hiroshi Suga * Released under the MIT License: http://mbed.org/license/mit */ /** @file * @brief mbed Phone Platform */ #include "mbed.h" #include "phone.h" #include "Line.h" #include "IpLine.h" Serial pc(USBTX, USBRX); Ticker ticker; DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); AnalogIn adc(p17); AnalogOut dac(p18); DigitalOut mixlocal(p21), mixline(p22), micsp(p23); Line line1(p12, p13, p11, dac); Line line2(p14, p15, p16, dac); DigitalOut led_y(p25), led_g(p26); DigitalIn eth_link(P1_25), eth_speed(P1_26); volatile int timeout; int dialcount; char dial[DIAL_SIZE]; enum PhoneType activesrc, activedest; struct PhoneBook phonebook[PB_SIZE] = { {{1, 10, 1}, PhoneLine1, ""}, {{1, 10, 2}, PhoneLine2, ""}, {{1, 10, 3}, PhoneMicSp, ""}, {{2, 10, 1}, PhoneLine1, "192.168.0.4"}, {{2, 10, 2}, PhoneLine2, "192.168.0.4"}, {{2, 10, 3}, PhoneMicSp, "192.168.0.4"} }; void int_sample () { if (timeout) timeout --; line1.poll(); line2.poll(); } int getpb (enum PhoneType *target, char *hostname) { int i, j; for (i = 0; i < PB_SIZE; i ++) { for (j = 0; j < DIAL_SIZE; j ++) { if (phonebook[i].dial[j] == 0 || dial[j] == 0 || j >= dialcount || phonebook[i].dial[j] != dial[j]) break; if (j == dialcount - 1) { *target = phonebook[i].target; strncpy(hostname, phonebook[i].hostname, 30); return 1; } } } return 0; } void enteranalog (enum PhoneType target) { micsp = 0; mixlocal = 0; mixline = 0; wait_ms(1); dac = 0x7fff; switch (target) { case PhoneLine1: case PhoneLine2: mixline = 1; break; case PhoneMicSp: micsp = 1; mixlocal = 1; break; } } int enterline (enum PhoneType target, enum Mode mode) { switch (target) { case PhoneLine1: return line1.enter(mode); case PhoneLine2: return line2.enter(mode); /* case PhoneMicSp: return micsp.enter(mode); case PhoneIpLine: ipline.target(dial[1]); return ipline.enter(mode); */ } return 0; } int scanline (enum PhoneType target, enum Scan type) { switch (target) { case PhoneLine1: return line1.scan(type); case PhoneLine2: return line2.scan(type); /* case PhoneMicSp: return micsp.scan(type); case PhoneIpLine: ipline.target(dial[1]); return ipline.scan(type); */ } return 0; } void checkline (enum PhoneType num) { int i; switch ((enum Mode)scanline(num, ScanMode)) { case ModeReady: if (scanline(num, ScanHook) == HookOn && activesrc == PhoneNone) { // on hook, dial tone dialcount = 0; enteranalog(num); enterline(num, ModeDT); activesrc = num; } break; case ModeDT: case ModeDial: if (scanline(num, ScanHook) == HookOff) { // off hook, exit enterline(num, ModeReady); activesrc = PhoneNone; break; } i = scanline(num, ScanDial); if (i > 0) { // detect dial dial[dialcount] = i; dialcount ++; pc.printf(" [ %d ] ", i); if (scanline(num, ScanMode) == ModeDT) enterline(num, ModeDial); timeout = FREQ * 5; } if ((! timeout && dialcount > 0) || dialcount >= DIAL_SIZE) { char buf[30]; enum PhoneType p; // call if (getpb(&p, buf)) { if (buf[0] == 0) { activedest = p; } else { activedest = PhoneIpLine; // ipline.settarget(i, buf); } enterline(num, ModeCall); enterline(activedest, ModeRing); timeout = FREQ * 10; } else { enterline(num, ModeBT); } } break; case ModeCall: if (scanline(num, ScanHook) == HookOff) { // off hook, exit enterline(num, ModeReady); enterline(activedest, ModeDisconnect); activesrc = PhoneNone; break; } if (timeout == 0) { // timeout, busy enterline(num, ModeBT); enterline(activedest, ModeDisconnect); break; } if (scanline(activedest, ScanStatus) == StatusOk) { // ok call, ring back tone enterline(num, ModeRBT); } break; case ModeRBT: if (scanline(num, ScanHook) == HookOff) { // off hook, exit enterline(num, ModeReady); enterline(activedest, ModeDisconnect); activesrc = PhoneNone; } break; case ModeRing: if (scanline(num, ScanHook) == HookOn) { // on hook, connect if (num == PhoneIpLine || activesrc == PhoneIpLine) { enteranalog(activesrc); } else { enteranalog(PhoneNone); } enterline(num, ModeTalk); enterline(activesrc, ModeTalk); } break; case ModeTalk: if (scanline(num, ScanHook) == HookOff) { // off hook, exit enterline(num, ModeReady); enterline(num == activesrc ? activedest : activesrc, ModeDisconnect); activesrc = PhoneNone; break; } if (scanline(activedest, ScanStatus) == StatusNg) { // disconnect enterline(num, ModeBT); } break; case ModeBT: if (scanline(num, ScanHook) == HookOff) { // off hook, exit enterline(num, ModeReady); if (activesrc == num) activesrc = PhoneNone; if (activedest == num) activedest = PhoneNone; } break; case ModeDisconnect: enterline(num, ModeBT); break; } } int main () { timeout = 0; dialcount = 0; activesrc = PhoneNone; activedest = PhoneNone; line1.enter(ModeReady); line2.enter(ModeReady); ticker.attach_us(&int_sample, 1000000 / FREQ); for (;;) { pc.printf("1: %d - ", scanline(PhoneLine1, ScanMode)); checkline(PhoneLine1); pc.printf("%d / ", scanline(PhoneLine1, ScanMode)); pc.printf("2: %d - ", scanline(PhoneLine2, ScanMode)); checkline(PhoneLine2); pc.printf("%d\r\n", scanline(PhoneLine2, ScanMode)); wait(0.2); } }