KAMUI DIN-SYNC Example

Dependencies:   TextLCD mbed

Committer:
radiojunkbox
Date:
Sat May 05 11:34:19 2012 +0000
Revision:
0:e3174b02ec81
Rev. 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radiojunkbox 0:e3174b02ec81 1 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 2 // KAMUI DIN SYNC Example
radiojunkbox 0:e3174b02ec81 3 // Copyright (C) 2012 RJB RadioJunkBox
radiojunkbox 0:e3174b02ec81 4 // Released under the MIT License: http://mbed.org/license/mit
radiojunkbox 0:e3174b02ec81 5 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 6
radiojunkbox 0:e3174b02ec81 7 #include "mbed.h"
radiojunkbox 0:e3174b02ec81 8 #include "TextLCD.h"
radiojunkbox 0:e3174b02ec81 9
radiojunkbox 0:e3174b02ec81 10 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 11 // Define
radiojunkbox 0:e3174b02ec81 12
radiojunkbox 0:e3174b02ec81 13 #define AD5551 // 14bitDAC
radiojunkbox 0:e3174b02ec81 14
radiojunkbox 0:e3174b02ec81 15 #define SPI_RATE 1000000 // 1Mbps
radiojunkbox 0:e3174b02ec81 16 #define MIDI_RATE 31250 // 31.25kbps
radiojunkbox 0:e3174b02ec81 17 #define BEEP_FREQ 1760.0 // 1760Hz
radiojunkbox 0:e3174b02ec81 18 #define UPDATE_INTERVAL 50 // 50us
radiojunkbox 0:e3174b02ec81 19 #define SW_WATCH_INTERVAL (25000/UPDATE_INTERVAL) // 25ms
radiojunkbox 0:e3174b02ec81 20
radiojunkbox 0:e3174b02ec81 21 #define UPDATE_MODE0 0 // Update Interval CV ch1-6 600us, ch7,8 200us
radiojunkbox 0:e3174b02ec81 22 #define UPDATE_MODE1 1 // Update Interval CV ch1-6 N/A, ch7,8 100us
radiojunkbox 0:e3174b02ec81 23
radiojunkbox 0:e3174b02ec81 24 #define GATE1 0x01
radiojunkbox 0:e3174b02ec81 25 #define GATE2 0x02
radiojunkbox 0:e3174b02ec81 26 #define GATE3 0x04
radiojunkbox 0:e3174b02ec81 27 #define GATE4 0x08
radiojunkbox 0:e3174b02ec81 28
radiojunkbox 0:e3174b02ec81 29 #define SYNC1CLK 0x01
radiojunkbox 0:e3174b02ec81 30 #define SYNC1RUN 0x02
radiojunkbox 0:e3174b02ec81 31 #define SYNC2CLK 0x04
radiojunkbox 0:e3174b02ec81 32 #define SYNC2RUN 0x08
radiojunkbox 0:e3174b02ec81 33
radiojunkbox 0:e3174b02ec81 34 #define MODE_CV 0x00
radiojunkbox 0:e3174b02ec81 35 #define MODE_GATE 0x40
radiojunkbox 0:e3174b02ec81 36 #define MODE_SYNC 0x80
radiojunkbox 0:e3174b02ec81 37 #define MODE_SET_SYNC 0xC0
radiojunkbox 0:e3174b02ec81 38
radiojunkbox 0:e3174b02ec81 39 #define SW1 0x01
radiojunkbox 0:e3174b02ec81 40 #define SW2 0x02
radiojunkbox 0:e3174b02ec81 41 #define SW3 0x04
radiojunkbox 0:e3174b02ec81 42 #define SW4 0x08
radiojunkbox 0:e3174b02ec81 43 #define SYNC1CLK_IN 0x10
radiojunkbox 0:e3174b02ec81 44 #define SYNC1RUN_IN 0x20
radiojunkbox 0:e3174b02ec81 45 #define SYNC2CLK_IN 0x40
radiojunkbox 0:e3174b02ec81 46 #define GATE_IN 0x80
radiojunkbox 0:e3174b02ec81 47
radiojunkbox 0:e3174b02ec81 48 #define _ENABLE 0
radiojunkbox 0:e3174b02ec81 49 #define _DISABLE 1
radiojunkbox 0:e3174b02ec81 50
radiojunkbox 0:e3174b02ec81 51 #define TBASE (60*1000000/(48*UPDATE_INTERVAL))
radiojunkbox 0:e3174b02ec81 52
radiojunkbox 0:e3174b02ec81 53 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 54 // Functions
radiojunkbox 0:e3174b02ec81 55
radiojunkbox 0:e3174b02ec81 56 void InitKamui(void);
radiojunkbox 0:e3174b02ec81 57 void UpdateCV(void);
radiojunkbox 0:e3174b02ec81 58 void DinSync(unsigned char);
radiojunkbox 0:e3174b02ec81 59 unsigned char CheckSW(unsigned char);
radiojunkbox 0:e3174b02ec81 60
radiojunkbox 0:e3174b02ec81 61 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 62 // Global Variables
radiojunkbox 0:e3174b02ec81 63
radiojunkbox 0:e3174b02ec81 64 int gUpdateMode;
radiojunkbox 0:e3174b02ec81 65 unsigned short gCV[8];
radiojunkbox 0:e3174b02ec81 66 unsigned char gGATE;
radiojunkbox 0:e3174b02ec81 67 unsigned char gSYNC;
radiojunkbox 0:e3174b02ec81 68 unsigned short gT1,gT2;
radiojunkbox 0:e3174b02ec81 69
radiojunkbox 0:e3174b02ec81 70 union {
radiojunkbox 0:e3174b02ec81 71 unsigned short WORD;
radiojunkbox 0:e3174b02ec81 72 struct {
radiojunkbox 0:e3174b02ec81 73 unsigned char L;
radiojunkbox 0:e3174b02ec81 74 unsigned char H;
radiojunkbox 0:e3174b02ec81 75 } BYTE;
radiojunkbox 0:e3174b02ec81 76 } gDAC;
radiojunkbox 0:e3174b02ec81 77
radiojunkbox 0:e3174b02ec81 78 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 79 // mbed Functions
radiojunkbox 0:e3174b02ec81 80
radiojunkbox 0:e3174b02ec81 81 // TextLCD
radiojunkbox 0:e3174b02ec81 82 TextLCD gLCD(p23, p24, p25, p26, p29, p30); // rs, e, d4-d7
radiojunkbox 0:e3174b02ec81 83
radiojunkbox 0:e3174b02ec81 84 // SPI
radiojunkbox 0:e3174b02ec81 85 SPI gSPI(p11,p12,p13);
radiojunkbox 0:e3174b02ec81 86 DigitalOut gCSA(p14);
radiojunkbox 0:e3174b02ec81 87 DigitalOut gCSB(p22);
radiojunkbox 0:e3174b02ec81 88
radiojunkbox 0:e3174b02ec81 89 // Sirial MIDI
radiojunkbox 0:e3174b02ec81 90 Serial gMIDI(p9,p10);
radiojunkbox 0:e3174b02ec81 91
radiojunkbox 0:e3174b02ec81 92 // AnalogIn
radiojunkbox 0:e3174b02ec81 93 AnalogIn gAIN1(p15); // VR1
radiojunkbox 0:e3174b02ec81 94 AnalogIn gAIN2(p16); // VR2
radiojunkbox 0:e3174b02ec81 95 AnalogIn gAIN3(p17); // VR3
radiojunkbox 0:e3174b02ec81 96 AnalogIn gAIN4(p18); // VR4
radiojunkbox 0:e3174b02ec81 97 AnalogIn gAIN5(p19); // IN1
radiojunkbox 0:e3174b02ec81 98 AnalogIn gAIN6(p20); // IN2
radiojunkbox 0:e3174b02ec81 99
radiojunkbox 0:e3174b02ec81 100 // BEEP
radiojunkbox 0:e3174b02ec81 101 PwmOut gBEEP(p21);
radiojunkbox 0:e3174b02ec81 102
radiojunkbox 0:e3174b02ec81 103 // LED
radiojunkbox 0:e3174b02ec81 104 DigitalOut gLED1(LED1);
radiojunkbox 0:e3174b02ec81 105 DigitalOut gLED2(LED2);
radiojunkbox 0:e3174b02ec81 106 DigitalOut gLED3(LED3);
radiojunkbox 0:e3174b02ec81 107 DigitalOut gLED4(LED4);
radiojunkbox 0:e3174b02ec81 108 BusOut gLEDS(LED1,LED2,LED3,LED4);
radiojunkbox 0:e3174b02ec81 109
radiojunkbox 0:e3174b02ec81 110 // Ticker
radiojunkbox 0:e3174b02ec81 111 Ticker gTICKER;
radiojunkbox 0:e3174b02ec81 112
radiojunkbox 0:e3174b02ec81 113 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 114 // main
radiojunkbox 0:e3174b02ec81 115
radiojunkbox 0:e3174b02ec81 116 int main() {
radiojunkbox 0:e3174b02ec81 117
radiojunkbox 0:e3174b02ec81 118 unsigned int pot1, pot2, pot3, pot4;
radiojunkbox 0:e3174b02ec81 119 unsigned int tempo;
radiojunkbox 0:e3174b02ec81 120 unsigned int t,s;
radiojunkbox 0:e3174b02ec81 121
radiojunkbox 0:e3174b02ec81 122 InitKamui();
radiojunkbox 0:e3174b02ec81 123
radiojunkbox 0:e3174b02ec81 124 while(1) {
radiojunkbox 0:e3174b02ec81 125
radiojunkbox 0:e3174b02ec81 126 // POT1 Tempo 40 - 220 bpm
radiojunkbox 0:e3174b02ec81 127 // POT2 Suffle Rate
radiojunkbox 0:e3174b02ec81 128 // POT3 CV1 - CV4 0V - +10V
radiojunkbox 0:e3174b02ec81 129 // POT4 CV5 - CV8 -10V - +10V
radiojunkbox 0:e3174b02ec81 130
radiojunkbox 0:e3174b02ec81 131 pot1 = gAIN1.read_u16();
radiojunkbox 0:e3174b02ec81 132 pot2 = gAIN2.read_u16() / 0x0400;
radiojunkbox 0:e3174b02ec81 133 pot3 = gAIN3.read_u16() / 2 + 0x8000;
radiojunkbox 0:e3174b02ec81 134 pot4 = gAIN4.read_u16();
radiojunkbox 0:e3174b02ec81 135
radiojunkbox 0:e3174b02ec81 136 tempo = pot1 / 364 + 40;
radiojunkbox 0:e3174b02ec81 137 t = TBASE / tempo;
radiojunkbox 0:e3174b02ec81 138 s = t * pot2 / 127;
radiojunkbox 0:e3174b02ec81 139
radiojunkbox 0:e3174b02ec81 140 gT1 = t + s;
radiojunkbox 0:e3174b02ec81 141 gT2 = t - s;
radiojunkbox 0:e3174b02ec81 142
radiojunkbox 0:e3174b02ec81 143 gCV[0] = pot3;
radiojunkbox 0:e3174b02ec81 144 gCV[1] = pot3;
radiojunkbox 0:e3174b02ec81 145 gCV[2] = pot3;
radiojunkbox 0:e3174b02ec81 146 gCV[3] = pot3;
radiojunkbox 0:e3174b02ec81 147 gCV[4] = pot4;
radiojunkbox 0:e3174b02ec81 148 gCV[5] = pot4;
radiojunkbox 0:e3174b02ec81 149 gCV[6] = pot4;
radiojunkbox 0:e3174b02ec81 150 gCV[7] = pot4;
radiojunkbox 0:e3174b02ec81 151
radiojunkbox 0:e3174b02ec81 152 gLCD.locate( 0, 1 );
radiojunkbox 0:e3174b02ec81 153 gLCD.printf("TEMPO=%03d SFL=%02d", tempo, pot2);
radiojunkbox 0:e3174b02ec81 154 }
radiojunkbox 0:e3174b02ec81 155 }
radiojunkbox 0:e3174b02ec81 156
radiojunkbox 0:e3174b02ec81 157 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 158 // Initialize KAMUI
radiojunkbox 0:e3174b02ec81 159
radiojunkbox 0:e3174b02ec81 160 void InitKamui()
radiojunkbox 0:e3174b02ec81 161 {
radiojunkbox 0:e3174b02ec81 162 // Init. Variables
radiojunkbox 0:e3174b02ec81 163 for( int i=0; i<8; i++) {
radiojunkbox 0:e3174b02ec81 164 gCV[i] = 0x8000;
radiojunkbox 0:e3174b02ec81 165 }
radiojunkbox 0:e3174b02ec81 166 gGATE = 0;
radiojunkbox 0:e3174b02ec81 167 gSYNC = 0;
radiojunkbox 0:e3174b02ec81 168
radiojunkbox 0:e3174b02ec81 169 gUpdateMode = UPDATE_MODE0;
radiojunkbox 0:e3174b02ec81 170
radiojunkbox 0:e3174b02ec81 171 // Init. SPI
radiojunkbox 0:e3174b02ec81 172 gCSA = _DISABLE;
radiojunkbox 0:e3174b02ec81 173 gCSB = _DISABLE;
radiojunkbox 0:e3174b02ec81 174 gSPI.format(8,0);
radiojunkbox 0:e3174b02ec81 175 gSPI.frequency(SPI_RATE);
radiojunkbox 0:e3174b02ec81 176
radiojunkbox 0:e3174b02ec81 177 // Init. Serial MIDI
radiojunkbox 0:e3174b02ec81 178 gMIDI.baud(MIDI_RATE);
radiojunkbox 0:e3174b02ec81 179
radiojunkbox 0:e3174b02ec81 180 // Ticker
radiojunkbox 0:e3174b02ec81 181 gTICKER.attach_us(&UpdateCV, UPDATE_INTERVAL);
radiojunkbox 0:e3174b02ec81 182
radiojunkbox 0:e3174b02ec81 183 // Beep
radiojunkbox 0:e3174b02ec81 184 gBEEP.period(1.0/BEEP_FREQ);
radiojunkbox 0:e3174b02ec81 185 gBEEP.write(0.5);
radiojunkbox 0:e3174b02ec81 186 wait(0.2);
radiojunkbox 0:e3174b02ec81 187 gBEEP.write(0.0);
radiojunkbox 0:e3174b02ec81 188
radiojunkbox 0:e3174b02ec81 189 // Init Display
radiojunkbox 0:e3174b02ec81 190 gLCD.locate( 0, 0 );
radiojunkbox 0:e3174b02ec81 191 // 123456789ABCDEF
radiojunkbox 0:e3174b02ec81 192 gLCD.printf("DIN-SyncExample");
radiojunkbox 0:e3174b02ec81 193 }
radiojunkbox 0:e3174b02ec81 194
radiojunkbox 0:e3174b02ec81 195 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 196 // Update CV, GATE, SYNC
radiojunkbox 0:e3174b02ec81 197
radiojunkbox 0:e3174b02ec81 198 void UpdateCV()
radiojunkbox 0:e3174b02ec81 199 {
radiojunkbox 0:e3174b02ec81 200 unsigned char rcv,sw,ch;
radiojunkbox 0:e3174b02ec81 201 unsigned char ptn[] = { 0,1,6,7,2,3,6,7,4,5,6,7 };
radiojunkbox 0:e3174b02ec81 202 const int numptn = (sizeof ptn / sizeof ptn[0]) - 1;
radiojunkbox 0:e3174b02ec81 203 static unsigned char cnt;
radiojunkbox 0:e3174b02ec81 204
radiojunkbox 0:e3174b02ec81 205 // SET DAC
radiojunkbox 0:e3174b02ec81 206 ch = ptn[cnt];
radiojunkbox 0:e3174b02ec81 207 if(gUpdateMode) ch |= 0x06;
radiojunkbox 0:e3174b02ec81 208
radiojunkbox 0:e3174b02ec81 209 #ifdef AD5551 // 14bitDAC
radiojunkbox 0:e3174b02ec81 210 gDAC.WORD = gCV[ch] >> 2;
radiojunkbox 0:e3174b02ec81 211 #else
radiojunkbox 0:e3174b02ec81 212 gDAC.WORD = gCV[ch];
radiojunkbox 0:e3174b02ec81 213 #endif
radiojunkbox 0:e3174b02ec81 214
radiojunkbox 0:e3174b02ec81 215 gCSA = _ENABLE;
radiojunkbox 0:e3174b02ec81 216 gSPI.write(gDAC.BYTE.H);
radiojunkbox 0:e3174b02ec81 217 gSPI.write(gDAC.BYTE.L);
radiojunkbox 0:e3174b02ec81 218 gCSA = _DISABLE;
radiojunkbox 0:e3174b02ec81 219
radiojunkbox 0:e3174b02ec81 220 // GATE or SYNC OUT
radiojunkbox 0:e3174b02ec81 221 if(cnt & 0x01) {
radiojunkbox 0:e3174b02ec81 222 // GATE OUT
radiojunkbox 0:e3174b02ec81 223 gCSB = _ENABLE;
radiojunkbox 0:e3174b02ec81 224 rcv = gSPI.write(gGATE | MODE_GATE) & 0x0F;
radiojunkbox 0:e3174b02ec81 225 gCSB = _DISABLE;
radiojunkbox 0:e3174b02ec81 226 }
radiojunkbox 0:e3174b02ec81 227 else {
radiojunkbox 0:e3174b02ec81 228 // SYNC OUT
radiojunkbox 0:e3174b02ec81 229 gCSB = _ENABLE;
radiojunkbox 0:e3174b02ec81 230 rcv = gSPI.write(gSYNC | MODE_SYNC);
radiojunkbox 0:e3174b02ec81 231 gCSB = _DISABLE;
radiojunkbox 0:e3174b02ec81 232 }
radiojunkbox 0:e3174b02ec81 233
radiojunkbox 0:e3174b02ec81 234 // SEL CV CHANNEL
radiojunkbox 0:e3174b02ec81 235 gCSB = _ENABLE;
radiojunkbox 0:e3174b02ec81 236 gSPI.write(ch);
radiojunkbox 0:e3174b02ec81 237 gCSB = _DISABLE;
radiojunkbox 0:e3174b02ec81 238
radiojunkbox 0:e3174b02ec81 239 cnt < numptn ? cnt++ : cnt = 0;
radiojunkbox 0:e3174b02ec81 240
radiojunkbox 0:e3174b02ec81 241 sw = CheckSW(rcv);
radiojunkbox 0:e3174b02ec81 242 DinSync(sw);
radiojunkbox 0:e3174b02ec81 243 }
radiojunkbox 0:e3174b02ec81 244
radiojunkbox 0:e3174b02ec81 245 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 246 // DIN Sync
radiojunkbox 0:e3174b02ec81 247
radiojunkbox 0:e3174b02ec81 248 void DinSync(unsigned char sw) {
radiojunkbox 0:e3174b02ec81 249
radiojunkbox 0:e3174b02ec81 250 static unsigned int cnt;
radiojunkbox 0:e3174b02ec81 251 static unsigned char cnt48;
radiojunkbox 0:e3174b02ec81 252 static unsigned char _cnt48;
radiojunkbox 0:e3174b02ec81 253
radiojunkbox 0:e3174b02ec81 254 // BEAT COUNTER
radiojunkbox 0:e3174b02ec81 255 if((cnt48 % 24) < 12) {
radiojunkbox 0:e3174b02ec81 256 if( cnt >= gT1) {
radiojunkbox 0:e3174b02ec81 257 cnt = 0;
radiojunkbox 0:e3174b02ec81 258 cnt48++;
radiojunkbox 0:e3174b02ec81 259 }
radiojunkbox 0:e3174b02ec81 260 }
radiojunkbox 0:e3174b02ec81 261 else {
radiojunkbox 0:e3174b02ec81 262 if( cnt >= gT2) {
radiojunkbox 0:e3174b02ec81 263 cnt = 0;
radiojunkbox 0:e3174b02ec81 264 cnt48++;
radiojunkbox 0:e3174b02ec81 265 }
radiojunkbox 0:e3174b02ec81 266 }
radiojunkbox 0:e3174b02ec81 267 if(cnt48 >= 48) cnt48 = 0;
radiojunkbox 0:e3174b02ec81 268
radiojunkbox 0:e3174b02ec81 269 // START/STOP
radiojunkbox 0:e3174b02ec81 270 if(sw & (SW1 | SW2)) {
radiojunkbox 0:e3174b02ec81 271 if( !(gSYNC & (SYNC1RUN | SYNC2RUN))){
radiojunkbox 0:e3174b02ec81 272 cnt = 0;
radiojunkbox 0:e3174b02ec81 273 cnt48 = 0;
radiojunkbox 0:e3174b02ec81 274 gGATE = 0;
radiojunkbox 0:e3174b02ec81 275 }
radiojunkbox 0:e3174b02ec81 276 if(sw & SW1) gSYNC ^= SYNC1RUN;
radiojunkbox 0:e3174b02ec81 277 if(sw & SW2) gSYNC ^= SYNC2RUN;
radiojunkbox 0:e3174b02ec81 278 }
radiojunkbox 0:e3174b02ec81 279
radiojunkbox 0:e3174b02ec81 280 // TOGGLE SYNC CLOCK
radiojunkbox 0:e3174b02ec81 281 if(cnt48 & 0x01) {
radiojunkbox 0:e3174b02ec81 282 gSYNC &= ~(SYNC1CLK | SYNC2CLK);
radiojunkbox 0:e3174b02ec81 283 }
radiojunkbox 0:e3174b02ec81 284 else {
radiojunkbox 0:e3174b02ec81 285 gSYNC |= (SYNC1CLK | SYNC2CLK);
radiojunkbox 0:e3174b02ec81 286 }
radiojunkbox 0:e3174b02ec81 287
radiojunkbox 0:e3174b02ec81 288 // SYNC LED
radiojunkbox 0:e3174b02ec81 289 gLED1 = gSYNC & SYNC1RUN ? 1 : 0;
radiojunkbox 0:e3174b02ec81 290 gLED2 = gSYNC & SYNC2RUN ? 1 : 0;
radiojunkbox 0:e3174b02ec81 291 gLED4 = cnt48 < 8 ? 1 : 0;
radiojunkbox 0:e3174b02ec81 292
radiojunkbox 0:e3174b02ec81 293 // TOGGLE GATE OUT
radiojunkbox 0:e3174b02ec81 294 if(gSYNC & (SYNC1RUN | SYNC2RUN)) {
radiojunkbox 0:e3174b02ec81 295 if(cnt48 != _cnt48) {
radiojunkbox 0:e3174b02ec81 296 if((cnt48 % 6) == 0) gGATE ^= GATE1;
radiojunkbox 0:e3174b02ec81 297 if((cnt48 % 12) == 0) gGATE ^= GATE2;
radiojunkbox 0:e3174b02ec81 298 if((cnt48 % 24) == 0) gGATE ^= GATE3;
radiojunkbox 0:e3174b02ec81 299 if((cnt48 % 48) == 0) gGATE ^= GATE4;
radiojunkbox 0:e3174b02ec81 300 }
radiojunkbox 0:e3174b02ec81 301 }
radiojunkbox 0:e3174b02ec81 302 else gGATE = 0;
radiojunkbox 0:e3174b02ec81 303 _cnt48 = cnt48;
radiojunkbox 0:e3174b02ec81 304
radiojunkbox 0:e3174b02ec81 305 cnt++;
radiojunkbox 0:e3174b02ec81 306 }
radiojunkbox 0:e3174b02ec81 307
radiojunkbox 0:e3174b02ec81 308 //-------------------------------------------------------------
radiojunkbox 0:e3174b02ec81 309 // Check SW
radiojunkbox 0:e3174b02ec81 310
radiojunkbox 0:e3174b02ec81 311 unsigned char CheckSW(unsigned char c) {
radiojunkbox 0:e3174b02ec81 312
radiojunkbox 0:e3174b02ec81 313 static unsigned char swbuf[2];
radiojunkbox 0:e3174b02ec81 314 static unsigned int cntsw;
radiojunkbox 0:e3174b02ec81 315 unsigned char ret = 0;
radiojunkbox 0:e3174b02ec81 316
radiojunkbox 0:e3174b02ec81 317 if(cntsw > SW_WATCH_INTERVAL) {
radiojunkbox 0:e3174b02ec81 318 if(c &= 0x0F) {
radiojunkbox 0:e3174b02ec81 319 if(!swbuf[1]) {
radiojunkbox 0:e3174b02ec81 320 if( swbuf[0] == c) {
radiojunkbox 0:e3174b02ec81 321 swbuf[1] = c;
radiojunkbox 0:e3174b02ec81 322 ret = c;
radiojunkbox 0:e3174b02ec81 323 }
radiojunkbox 0:e3174b02ec81 324 else {
radiojunkbox 0:e3174b02ec81 325 swbuf[0] = c;
radiojunkbox 0:e3174b02ec81 326 }
radiojunkbox 0:e3174b02ec81 327 }
radiojunkbox 0:e3174b02ec81 328 }
radiojunkbox 0:e3174b02ec81 329 else {
radiojunkbox 0:e3174b02ec81 330 swbuf[1] = 0;
radiojunkbox 0:e3174b02ec81 331 swbuf[0] = 0;
radiojunkbox 0:e3174b02ec81 332 }
radiojunkbox 0:e3174b02ec81 333 cntsw = 0;
radiojunkbox 0:e3174b02ec81 334 }
radiojunkbox 0:e3174b02ec81 335 cntsw++;
radiojunkbox 0:e3174b02ec81 336 return ret;
radiojunkbox 0:e3174b02ec81 337 }