mbed Phone Platform

Dependencies:   ulaw mbed ConfigFile

Committer:
okini3939
Date:
Thu Jan 20 13:50:10 2011 +0000
Revision:
5:30e2847d241b
Parent:
4:41a3534d085f
Child:
6:bd62b12de751

        

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 volatile int timeout;
okini3939 0:f18953137cb4 29 int dialcount;
okini3939 0:f18953137cb4 30 char dial[DIAL_SIZE];
okini3939 0:f18953137cb4 31 enum PhoneType activesrc, activedest;
okini3939 0:f18953137cb4 32
okini3939 1:0f82c574096f 33 struct PhoneBook phonebook[PB_SIZE] = {
okini3939 1:0f82c574096f 34 {{1, 10, 1}, PhoneLine1, ""},
okini3939 1:0f82c574096f 35 {{1, 10, 2}, PhoneLine2, ""},
okini3939 1:0f82c574096f 36 {{1, 10, 3}, PhoneMicSp, ""},
okini3939 5:30e2847d241b 37 {{2, 10, 1}, PhoneLine1, "192.168.1.2"},
okini3939 5:30e2847d241b 38 {{2, 10, 2}, PhoneLine2, "192.168.1.2"},
okini3939 5:30e2847d241b 39 {{2, 10, 3}, PhoneMicSp, "192.168.1.2"}
okini3939 2:e37117117e79 40 /*
okini3939 2:e37117117e79 41 {{2, 10, 1}, PhoneLine1, "192.168.10.100"},
okini3939 2:e37117117e79 42 {{2, 10, 2}, PhoneLine2, "192.168.10.100"},
okini3939 2:e37117117e79 43 {{2, 10, 3}, PhoneMicSp, "192.168.10.100"}
okini3939 2:e37117117e79 44 */
okini3939 1:0f82c574096f 45 };
okini3939 1:0f82c574096f 46
okini3939 1:0f82c574096f 47
okini3939 0:f18953137cb4 48 void int_sample () {
okini3939 2:e37117117e79 49 line1.intr();
okini3939 2:e37117117e79 50 line2.intr();
okini3939 2:e37117117e79 51 ipline.intr();
okini3939 2:e37117117e79 52
okini3939 0:f18953137cb4 53 if (timeout) timeout --;
okini3939 0:f18953137cb4 54 }
okini3939 0:f18953137cb4 55
okini3939 1:0f82c574096f 56 int getpb (enum PhoneType *target, char *hostname) {
okini3939 1:0f82c574096f 57 int i, j;
okini3939 1:0f82c574096f 58
okini3939 1:0f82c574096f 59 for (i = 0; i < PB_SIZE; i ++) {
okini3939 1:0f82c574096f 60 for (j = 0; j < DIAL_SIZE; j ++) {
okini3939 1:0f82c574096f 61 if (phonebook[i].dial[j] == 0 || dial[j] == 0 ||
okini3939 1:0f82c574096f 62 j >= dialcount || phonebook[i].dial[j] != dial[j]) break;
okini3939 1:0f82c574096f 63 if (j == dialcount - 1) {
okini3939 1:0f82c574096f 64 *target = phonebook[i].target;
okini3939 3:1d5dc4107558 65 strncpy(hostname, phonebook[i].hostname, HOSTNAME_SIZE);
okini3939 1:0f82c574096f 66 return 1;
okini3939 1:0f82c574096f 67 }
okini3939 1:0f82c574096f 68 }
okini3939 1:0f82c574096f 69 }
okini3939 1:0f82c574096f 70
okini3939 1:0f82c574096f 71 return 0;
okini3939 0:f18953137cb4 72 }
okini3939 0:f18953137cb4 73
okini3939 0:f18953137cb4 74 void enteranalog (enum PhoneType target) {
okini3939 0:f18953137cb4 75
okini3939 0:f18953137cb4 76 micsp = 0;
okini3939 0:f18953137cb4 77 mixlocal = 0;
okini3939 0:f18953137cb4 78 mixline = 0;
okini3939 0:f18953137cb4 79
okini3939 0:f18953137cb4 80 wait_ms(1);
okini3939 5:30e2847d241b 81 dac.write_u16(0x7fff);
okini3939 0:f18953137cb4 82
okini3939 0:f18953137cb4 83 switch (target) {
okini3939 0:f18953137cb4 84 case PhoneLine1:
okini3939 0:f18953137cb4 85 case PhoneLine2:
okini3939 2:e37117117e79 86 case PhoneIpLine:
okini3939 0:f18953137cb4 87 mixline = 1;
okini3939 0:f18953137cb4 88 break;
okini3939 0:f18953137cb4 89 case PhoneMicSp:
okini3939 0:f18953137cb4 90 micsp = 1;
okini3939 0:f18953137cb4 91 mixlocal = 1;
okini3939 0:f18953137cb4 92 break;
okini3939 0:f18953137cb4 93 }
okini3939 0:f18953137cb4 94 }
okini3939 0:f18953137cb4 95
okini3939 0:f18953137cb4 96 int enterline (enum PhoneType target, enum Mode mode) {
okini3939 0:f18953137cb4 97
okini3939 0:f18953137cb4 98 switch (target) {
okini3939 0:f18953137cb4 99 case PhoneLine1:
okini3939 0:f18953137cb4 100 return line1.enter(mode);
okini3939 0:f18953137cb4 101 case PhoneLine2:
okini3939 0:f18953137cb4 102 return line2.enter(mode);
okini3939 0:f18953137cb4 103 /*
okini3939 0:f18953137cb4 104 case PhoneMicSp:
okini3939 0:f18953137cb4 105 return micsp.enter(mode);
okini3939 2:e37117117e79 106 */
okini3939 0:f18953137cb4 107 case PhoneIpLine:
okini3939 0:f18953137cb4 108 return ipline.enter(mode);
okini3939 0:f18953137cb4 109 }
okini3939 0:f18953137cb4 110 return 0;
okini3939 0:f18953137cb4 111 }
okini3939 0:f18953137cb4 112
okini3939 0:f18953137cb4 113 int scanline (enum PhoneType target, enum Scan type) {
okini3939 0:f18953137cb4 114
okini3939 0:f18953137cb4 115 switch (target) {
okini3939 0:f18953137cb4 116 case PhoneLine1:
okini3939 0:f18953137cb4 117 return line1.scan(type);
okini3939 0:f18953137cb4 118 case PhoneLine2:
okini3939 0:f18953137cb4 119 return line2.scan(type);
okini3939 0:f18953137cb4 120 /*
okini3939 0:f18953137cb4 121 case PhoneMicSp:
okini3939 0:f18953137cb4 122 return micsp.scan(type);
okini3939 2:e37117117e79 123 */
okini3939 0:f18953137cb4 124 case PhoneIpLine:
okini3939 0:f18953137cb4 125 return ipline.scan(type);
okini3939 0:f18953137cb4 126 }
okini3939 0:f18953137cb4 127 return 0;
okini3939 0:f18953137cb4 128 }
okini3939 0:f18953137cb4 129
okini3939 0:f18953137cb4 130 void checkline (enum PhoneType num) {
okini3939 0:f18953137cb4 131 int i;
okini3939 0:f18953137cb4 132
okini3939 0:f18953137cb4 133 switch ((enum Mode)scanline(num, ScanMode)) {
okini3939 0:f18953137cb4 134 case ModeReady:
okini3939 0:f18953137cb4 135 if (scanline(num, ScanHook) == HookOn && activesrc == PhoneNone) {
okini3939 0:f18953137cb4 136 // on hook, dial tone
okini3939 0:f18953137cb4 137 dialcount = 0;
okini3939 0:f18953137cb4 138 enteranalog(num);
okini3939 0:f18953137cb4 139 enterline(num, ModeDT);
okini3939 0:f18953137cb4 140 activesrc = num;
okini3939 0:f18953137cb4 141 }
okini3939 0:f18953137cb4 142 break;
okini3939 0:f18953137cb4 143
okini3939 0:f18953137cb4 144 case ModeDT:
okini3939 0:f18953137cb4 145 case ModeDial:
okini3939 0:f18953137cb4 146 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 147 // off hook, exit
okini3939 0:f18953137cb4 148 enterline(num, ModeReady);
okini3939 0:f18953137cb4 149 activesrc = PhoneNone;
okini3939 0:f18953137cb4 150 break;
okini3939 0:f18953137cb4 151 }
okini3939 0:f18953137cb4 152 i = scanline(num, ScanDial);
okini3939 2:e37117117e79 153 if (i > 0 && i < 12) {
okini3939 0:f18953137cb4 154 // detect dial
okini3939 0:f18953137cb4 155 dial[dialcount] = i;
okini3939 0:f18953137cb4 156 dialcount ++;
okini3939 3:1d5dc4107558 157 pc.printf("Dial [%d]\r\n", i);
okini3939 0:f18953137cb4 158 if (scanline(num, ScanMode) == ModeDT) enterline(num, ModeDial);
okini3939 2:e37117117e79 159 timeout = DIAL_TIMEOUT;
okini3939 0:f18953137cb4 160 }
okini3939 2:e37117117e79 161 if ((! timeout && dialcount > 0) || dialcount >= DIAL_SIZE || i >= 12) {
okini3939 3:1d5dc4107558 162 char buf[HOSTNAME_SIZE];
okini3939 1:0f82c574096f 163 enum PhoneType p;
okini3939 0:f18953137cb4 164 // call
okini3939 1:0f82c574096f 165 if (getpb(&p, buf)) {
okini3939 1:0f82c574096f 166 if (buf[0] == 0) {
okini3939 1:0f82c574096f 167 activedest = p;
okini3939 1:0f82c574096f 168 } else {
okini3939 1:0f82c574096f 169 activedest = PhoneIpLine;
okini3939 2:e37117117e79 170 ipline.settarget(p, buf);
okini3939 1:0f82c574096f 171 }
okini3939 1:0f82c574096f 172 enterline(num, ModeCall);
okini3939 1:0f82c574096f 173 enterline(activedest, ModeRing);
okini3939 2:e37117117e79 174 timeout = CALL_TIMEOUT;
okini3939 1:0f82c574096f 175 } else {
okini3939 1:0f82c574096f 176 enterline(num, ModeBT);
okini3939 1:0f82c574096f 177 }
okini3939 0:f18953137cb4 178 }
okini3939 0:f18953137cb4 179 break;
okini3939 0:f18953137cb4 180
okini3939 0:f18953137cb4 181 case ModeCall:
okini3939 0:f18953137cb4 182 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 183 // off hook, exit
okini3939 0:f18953137cb4 184 enterline(num, ModeReady);
okini3939 0:f18953137cb4 185 enterline(activedest, ModeDisconnect);
okini3939 0:f18953137cb4 186 activesrc = PhoneNone;
okini3939 0:f18953137cb4 187 break;
okini3939 0:f18953137cb4 188 }
okini3939 2:e37117117e79 189 i = scanline(activedest, ScanStatus);
okini3939 2:e37117117e79 190 if (i == StatusOk) {
okini3939 2:e37117117e79 191 // ok call, ring back tone
okini3939 2:e37117117e79 192 enterline(num, ModeRBT);
okini3939 2:e37117117e79 193 }
okini3939 2:e37117117e79 194 if (timeout == 0 || i == StatusNg) {
okini3939 0:f18953137cb4 195 // timeout, busy
okini3939 0:f18953137cb4 196 enterline(num, ModeBT);
okini3939 0:f18953137cb4 197 enterline(activedest, ModeDisconnect);
okini3939 0:f18953137cb4 198 break;
okini3939 0:f18953137cb4 199 }
okini3939 0:f18953137cb4 200 break;
okini3939 0:f18953137cb4 201
okini3939 0:f18953137cb4 202 case ModeRBT:
okini3939 0:f18953137cb4 203 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 204 // off hook, exit
okini3939 0:f18953137cb4 205 enterline(num, ModeReady);
okini3939 0:f18953137cb4 206 enterline(activedest, ModeDisconnect);
okini3939 0:f18953137cb4 207 activesrc = PhoneNone;
okini3939 0:f18953137cb4 208 }
okini3939 0:f18953137cb4 209 break;
okini3939 0:f18953137cb4 210
okini3939 0:f18953137cb4 211 case ModeRing:
okini3939 0:f18953137cb4 212 if (scanline(num, ScanHook) == HookOn) {
okini3939 0:f18953137cb4 213 // on hook, connect
okini3939 0:f18953137cb4 214 if (num == PhoneIpLine || activesrc == PhoneIpLine) {
okini3939 2:e37117117e79 215 enteranalog(PhoneIpLine);
okini3939 0:f18953137cb4 216 } else {
okini3939 0:f18953137cb4 217 enteranalog(PhoneNone);
okini3939 0:f18953137cb4 218 }
okini3939 0:f18953137cb4 219 enterline(num, ModeTalk);
okini3939 0:f18953137cb4 220 enterline(activesrc, ModeTalk);
okini3939 0:f18953137cb4 221 }
okini3939 0:f18953137cb4 222 break;
okini3939 0:f18953137cb4 223
okini3939 0:f18953137cb4 224 case ModeTalk:
okini3939 0:f18953137cb4 225 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 226 // off hook, exit
okini3939 0:f18953137cb4 227 enterline(num, ModeReady);
okini3939 0:f18953137cb4 228 enterline(num == activesrc ? activedest : activesrc, ModeDisconnect);
okini3939 0:f18953137cb4 229 activesrc = PhoneNone;
okini3939 0:f18953137cb4 230 break;
okini3939 0:f18953137cb4 231 }
okini3939 1:0f82c574096f 232 if (scanline(activedest, ScanStatus) == StatusNg) {
okini3939 0:f18953137cb4 233 // disconnect
okini3939 0:f18953137cb4 234 enterline(num, ModeBT);
okini3939 0:f18953137cb4 235 }
okini3939 0:f18953137cb4 236 break;
okini3939 0:f18953137cb4 237
okini3939 0:f18953137cb4 238 case ModeBT:
okini3939 0:f18953137cb4 239 if (scanline(num, ScanHook) == HookOff) {
okini3939 0:f18953137cb4 240 // off hook, exit
okini3939 0:f18953137cb4 241 enterline(num, ModeReady);
okini3939 0:f18953137cb4 242 if (activesrc == num) activesrc = PhoneNone;
okini3939 0:f18953137cb4 243 if (activedest == num) activedest = PhoneNone;
okini3939 0:f18953137cb4 244 }
okini3939 0:f18953137cb4 245 break;
okini3939 0:f18953137cb4 246
okini3939 0:f18953137cb4 247 case ModeDisconnect:
okini3939 0:f18953137cb4 248 enterline(num, ModeBT);
okini3939 0:f18953137cb4 249 break;
okini3939 0:f18953137cb4 250
okini3939 0:f18953137cb4 251 }
okini3939 0:f18953137cb4 252
okini3939 0:f18953137cb4 253 }
okini3939 0:f18953137cb4 254
okini3939 0:f18953137cb4 255
okini3939 0:f18953137cb4 256 int main () {
okini3939 2:e37117117e79 257 int i;
okini3939 2:e37117117e79 258
okini3939 0:f18953137cb4 259 timeout = 0;
okini3939 0:f18953137cb4 260 dialcount = 0;
okini3939 0:f18953137cb4 261 activesrc = PhoneNone;
okini3939 0:f18953137cb4 262 activedest = PhoneNone;
okini3939 0:f18953137cb4 263 line1.enter(ModeReady);
okini3939 0:f18953137cb4 264 line2.enter(ModeReady);
okini3939 2:e37117117e79 265 ipline.enter(ModeReady);
okini3939 0:f18953137cb4 266
okini3939 5:30e2847d241b 267 // NVIC_SetPriority(TIMER3_IRQn, 0); // preemption=1, sub-priority=1
okini3939 0:f18953137cb4 268 ticker.attach_us(&int_sample, 1000000 / FREQ);
okini3939 0:f18953137cb4 269
okini3939 0:f18953137cb4 270 for (;;) {
okini3939 5:30e2847d241b 271 led1 = 1;
okini3939 2:e37117117e79 272 ipline.poll();
okini3939 5:30e2847d241b 273 led1 = 0;
okini3939 5:30e2847d241b 274 led2 = 1;
okini3939 4:41a3534d085f 275 line1.poll();
okini3939 5:30e2847d241b 276 led2 = 0;
okini3939 5:30e2847d241b 277 led3 = 1;
okini3939 4:41a3534d085f 278 line2.poll();
okini3939 5:30e2847d241b 279 led3 = 0;
okini3939 2:e37117117e79 280
okini3939 2:e37117117e79 281 i = scanline(PhoneLine1, ScanMode);
okini3939 0:f18953137cb4 282 checkline(PhoneLine1);
okini3939 2:e37117117e79 283 if (i != scanline(PhoneLine1, ScanMode))
okini3939 2:e37117117e79 284 pc.printf("(1) %d -> %d\r\n", i, scanline(PhoneLine1, ScanMode));
okini3939 2:e37117117e79 285
okini3939 2:e37117117e79 286 i = scanline(PhoneLine2, ScanMode);
okini3939 0:f18953137cb4 287 checkline(PhoneLine2);
okini3939 2:e37117117e79 288 if (i != scanline(PhoneLine2, ScanMode))
okini3939 2:e37117117e79 289 pc.printf("(2) %d -> %d\r\n", i, scanline(PhoneLine2, ScanMode));
okini3939 2:e37117117e79 290
okini3939 2:e37117117e79 291 i = scanline(PhoneIpLine, ScanMode);
okini3939 2:e37117117e79 292 checkline(PhoneIpLine);
okini3939 2:e37117117e79 293 if (i != scanline(PhoneIpLine, ScanMode))
okini3939 2:e37117117e79 294 pc.printf("(3) %d -> %d\r\n", i, scanline(PhoneIpLine, ScanMode));
okini3939 2:e37117117e79 295
okini3939 0:f18953137cb4 296 }
okini3939 0:f18953137cb4 297 }