mbed Phone Platform
Dependencies: ulaw mbed ConfigFile
main.cpp@3:1d5dc4107558, 2011-01-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |