KAMUI OSC-CV Example refer to OSCReceiver by xshige http://mbed.org/users/xshige/programs/OSCReceiver/

Dependencies:   NetServices TextLCD mbed

Committer:
radiojunkbox
Date:
Sun May 06 07:17:59 2012 +0000
Revision:
0:eabe87e89290
Rev. 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radiojunkbox 0:eabe87e89290 1 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 2 // KAMUI OSC-CV Exapmple
radiojunkbox 0:eabe87e89290 3 // referred to xshige's OSCReceiver
radiojunkbox 0:eabe87e89290 4 // http://mbed.org/users/xshige/programs/OSCReceiver/
radiojunkbox 0:eabe87e89290 5 // Copyright (C) 2012 RJB RadioJunkBox
radiojunkbox 0:eabe87e89290 6 // Released under the MIT License: http://mbed.org/license/mit
radiojunkbox 0:eabe87e89290 7 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 8
radiojunkbox 0:eabe87e89290 9 #include "mbed.h"
radiojunkbox 0:eabe87e89290 10 #include "TextLCD.h"
radiojunkbox 0:eabe87e89290 11 #include "EthernetNetIf.h"
radiojunkbox 0:eabe87e89290 12 #include "UDPSocket.h"
radiojunkbox 0:eabe87e89290 13 #include "OSCReceiver.h"
radiojunkbox 0:eabe87e89290 14 #include <stdlib.h>
radiojunkbox 0:eabe87e89290 15 #include <ctype.h>
radiojunkbox 0:eabe87e89290 16 #include <math.h>
radiojunkbox 0:eabe87e89290 17
radiojunkbox 0:eabe87e89290 18 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 19 // Define
radiojunkbox 0:eabe87e89290 20
radiojunkbox 0:eabe87e89290 21 #define AD5551 // 14bitDAC
radiojunkbox 0:eabe87e89290 22
radiojunkbox 0:eabe87e89290 23 #define SPI_RATE 1000000 // 1Mbps
radiojunkbox 0:eabe87e89290 24 #define MIDI_RATE 31250 // 31.25kbps
radiojunkbox 0:eabe87e89290 25 #define BEEP_FREQ 1760.0 // 1760Hz
radiojunkbox 0:eabe87e89290 26 #define UPDATE_INTERVAL 100 // 100us
radiojunkbox 0:eabe87e89290 27 #define SW_WATCH_INTERVAL (25000/UPDATE_INTERVAL) // 25ms
radiojunkbox 0:eabe87e89290 28 #define PARAM_GLIDE 6554.0
radiojunkbox 0:eabe87e89290 29
radiojunkbox 0:eabe87e89290 30 #define UPDATE_MODE0 0 // Update Interval CV ch1-6 1200us, ch7,8 400us
radiojunkbox 0:eabe87e89290 31 #define UPDATE_MODE1 1 // Update Interval CV ch1-6 N/A, ch7,8 200us
radiojunkbox 0:eabe87e89290 32
radiojunkbox 0:eabe87e89290 33 #define GATE1 0x01
radiojunkbox 0:eabe87e89290 34 #define GATE2 0x02
radiojunkbox 0:eabe87e89290 35 #define GATE3 0x04
radiojunkbox 0:eabe87e89290 36 #define GATE4 0x08
radiojunkbox 0:eabe87e89290 37
radiojunkbox 0:eabe87e89290 38 #define SYNC1CLK 0x01
radiojunkbox 0:eabe87e89290 39 #define SYNC1RUN 0x02
radiojunkbox 0:eabe87e89290 40 #define SYNC2CLK 0x04
radiojunkbox 0:eabe87e89290 41 #define SYNC2RUN 0x08
radiojunkbox 0:eabe87e89290 42
radiojunkbox 0:eabe87e89290 43 #define MODE_CV 0x00
radiojunkbox 0:eabe87e89290 44 #define MODE_GATE 0x40
radiojunkbox 0:eabe87e89290 45 #define MODE_SYNC 0x80
radiojunkbox 0:eabe87e89290 46 #define MODE_SET_SYNC 0xC0
radiojunkbox 0:eabe87e89290 47
radiojunkbox 0:eabe87e89290 48 #define SW1 0x01
radiojunkbox 0:eabe87e89290 49 #define SW2 0x02
radiojunkbox 0:eabe87e89290 50 #define SW3 0x04
radiojunkbox 0:eabe87e89290 51 #define SW4 0x08
radiojunkbox 0:eabe87e89290 52 #define SYNC1CLK_IN 0x10
radiojunkbox 0:eabe87e89290 53 #define SYNC1RUN_IN 0x20
radiojunkbox 0:eabe87e89290 54 #define SYNC2CLK_IN 0x40
radiojunkbox 0:eabe87e89290 55 #define GATE_IN 0x80
radiojunkbox 0:eabe87e89290 56
radiojunkbox 0:eabe87e89290 57 #define _ENABLE 0
radiojunkbox 0:eabe87e89290 58 #define _DISABLE 1
radiojunkbox 0:eabe87e89290 59
radiojunkbox 0:eabe87e89290 60 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 61 // Functions
radiojunkbox 0:eabe87e89290 62
radiojunkbox 0:eabe87e89290 63 void InitKamui(void);
radiojunkbox 0:eabe87e89290 64 void UpdateCV(void);
radiojunkbox 0:eabe87e89290 65 unsigned char CheckSW(unsigned char);
radiojunkbox 0:eabe87e89290 66
radiojunkbox 0:eabe87e89290 67 void SetCV(void);
radiojunkbox 0:eabe87e89290 68 int SetupEthNetIf(void);
radiojunkbox 0:eabe87e89290 69 void onUDPSocketEvent(UDPSocketEvent);
radiojunkbox 0:eabe87e89290 70
radiojunkbox 0:eabe87e89290 71 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 72 // Global Variables
radiojunkbox 0:eabe87e89290 73
radiojunkbox 0:eabe87e89290 74 int gUpdateMode;
radiojunkbox 0:eabe87e89290 75 unsigned short gCV[8];
radiojunkbox 0:eabe87e89290 76 unsigned char gGATE;
radiojunkbox 0:eabe87e89290 77 unsigned char gSYNC;
radiojunkbox 0:eabe87e89290 78 unsigned char gSW;
radiojunkbox 0:eabe87e89290 79
radiojunkbox 0:eabe87e89290 80 union {
radiojunkbox 0:eabe87e89290 81 unsigned short WORD;
radiojunkbox 0:eabe87e89290 82 struct {
radiojunkbox 0:eabe87e89290 83 unsigned char L;
radiojunkbox 0:eabe87e89290 84 unsigned char H;
radiojunkbox 0:eabe87e89290 85 } BYTE;
radiojunkbox 0:eabe87e89290 86 } gDAC;
radiojunkbox 0:eabe87e89290 87
radiojunkbox 0:eabe87e89290 88 float gGLIDE[8];
radiojunkbox 0:eabe87e89290 89 float gOSC_CV[8];
radiojunkbox 0:eabe87e89290 90
radiojunkbox 0:eabe87e89290 91 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 92 // mbed Functions
radiojunkbox 0:eabe87e89290 93
radiojunkbox 0:eabe87e89290 94 // TextLCD
radiojunkbox 0:eabe87e89290 95 TextLCD gLCD(p23, p24, p25, p26, p29, p30); // rs, e, d4-d7
radiojunkbox 0:eabe87e89290 96
radiojunkbox 0:eabe87e89290 97 // SPI
radiojunkbox 0:eabe87e89290 98 SPI gSPI(p11,p12,p13);
radiojunkbox 0:eabe87e89290 99 DigitalOut gCSA(p14);
radiojunkbox 0:eabe87e89290 100 DigitalOut gCSB(p22);
radiojunkbox 0:eabe87e89290 101
radiojunkbox 0:eabe87e89290 102 // Sirial MIDI
radiojunkbox 0:eabe87e89290 103 //Serial gMIDI(p9,p10);
radiojunkbox 0:eabe87e89290 104
radiojunkbox 0:eabe87e89290 105 // AnalogIn
radiojunkbox 0:eabe87e89290 106 AnalogIn gAIN1(p15); // VR1
radiojunkbox 0:eabe87e89290 107 AnalogIn gAIN2(p16); // VR2
radiojunkbox 0:eabe87e89290 108 AnalogIn gAIN3(p17); // VR3
radiojunkbox 0:eabe87e89290 109 AnalogIn gAIN4(p18); // VR4
radiojunkbox 0:eabe87e89290 110 AnalogIn gAIN5(p19); // IN1
radiojunkbox 0:eabe87e89290 111 AnalogIn gAIN6(p20); // IN2
radiojunkbox 0:eabe87e89290 112
radiojunkbox 0:eabe87e89290 113 // BEEP
radiojunkbox 0:eabe87e89290 114 PwmOut gBEEP(p21);
radiojunkbox 0:eabe87e89290 115
radiojunkbox 0:eabe87e89290 116 // LED
radiojunkbox 0:eabe87e89290 117 DigitalOut gLED1(LED1);
radiojunkbox 0:eabe87e89290 118 DigitalOut gLED2(LED2);
radiojunkbox 0:eabe87e89290 119 DigitalOut gLED3(LED3);
radiojunkbox 0:eabe87e89290 120 DigitalOut gLED4(LED4);
radiojunkbox 0:eabe87e89290 121 BusOut gLEDS(LED1,LED2,LED3,LED4);
radiojunkbox 0:eabe87e89290 122
radiojunkbox 0:eabe87e89290 123 // Ticker
radiojunkbox 0:eabe87e89290 124 Ticker gTICKER;
radiojunkbox 0:eabe87e89290 125
radiojunkbox 0:eabe87e89290 126 // Ethernet
radiojunkbox 0:eabe87e89290 127 EthernetNetIf gEth;
radiojunkbox 0:eabe87e89290 128 UDPSocket gUdp;
radiojunkbox 0:eabe87e89290 129
radiojunkbox 0:eabe87e89290 130 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 131 // main
radiojunkbox 0:eabe87e89290 132
radiojunkbox 0:eabe87e89290 133 int main() {
radiojunkbox 0:eabe87e89290 134
radiojunkbox 0:eabe87e89290 135 int i;
radiojunkbox 0:eabe87e89290 136 int pot[4],_pot[4];
radiojunkbox 0:eabe87e89290 137 unsigned char ch = 0;
radiojunkbox 0:eabe87e89290 138 unsigned char mode = 7; // for Intialize
radiojunkbox 0:eabe87e89290 139 unsigned char edit[4];
radiojunkbox 0:eabe87e89290 140 int val[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
radiojunkbox 0:eabe87e89290 141
radiojunkbox 0:eabe87e89290 142 // Initialize
radiojunkbox 0:eabe87e89290 143 for( i=0; i<4; i++) {
radiojunkbox 0:eabe87e89290 144 pot[i] = _pot[i] = 0;
radiojunkbox 0:eabe87e89290 145 edit[i] = 0;
radiojunkbox 0:eabe87e89290 146 gGLIDE[i] = 1.0 / expf(val[i]*656.0/PARAM_GLIDE);
radiojunkbox 0:eabe87e89290 147 gGLIDE[i+4] = 1.0 / expf(val[i+4]*656.0/PARAM_GLIDE);
radiojunkbox 0:eabe87e89290 148 }
radiojunkbox 0:eabe87e89290 149 gSW = SW4; // for Intialize
radiojunkbox 0:eabe87e89290 150
radiojunkbox 0:eabe87e89290 151 InitKamui();
radiojunkbox 0:eabe87e89290 152 if(SetupEthNetIf() == -1)
radiojunkbox 0:eabe87e89290 153 {
radiojunkbox 0:eabe87e89290 154 gBEEP.write(0.5);
radiojunkbox 0:eabe87e89290 155 wait(1);
radiojunkbox 0:eabe87e89290 156 gBEEP.write(0.0);
radiojunkbox 0:eabe87e89290 157 return -1;
radiojunkbox 0:eabe87e89290 158 }
radiojunkbox 0:eabe87e89290 159
radiojunkbox 0:eabe87e89290 160 // loop
radiojunkbox 0:eabe87e89290 161 while(1) {
radiojunkbox 0:eabe87e89290 162
radiojunkbox 0:eabe87e89290 163 // Ethernet Polling
radiojunkbox 0:eabe87e89290 164 Net::poll();
radiojunkbox 0:eabe87e89290 165
radiojunkbox 0:eabe87e89290 166 // Read pot
radiojunkbox 0:eabe87e89290 167 pot[0] = gAIN1.read_u16();
radiojunkbox 0:eabe87e89290 168 pot[1] = gAIN2.read_u16();
radiojunkbox 0:eabe87e89290 169 pot[2] = gAIN3.read_u16();
radiojunkbox 0:eabe87e89290 170 pot[3] = gAIN4.read_u16();
radiojunkbox 0:eabe87e89290 171
radiojunkbox 0:eabe87e89290 172 // change pot amount?
radiojunkbox 0:eabe87e89290 173 if(abs(pot[ch] - _pot[ch]) > 0x2000) edit[ch] = 1;
radiojunkbox 0:eabe87e89290 174
radiojunkbox 0:eabe87e89290 175 if(edit[ch]) {
radiojunkbox 0:eabe87e89290 176 switch(mode) {
radiojunkbox 0:eabe87e89290 177 case 0:
radiojunkbox 0:eabe87e89290 178 gGLIDE[ch] = 1.0 / expf(pot[ch]/PARAM_GLIDE);
radiojunkbox 0:eabe87e89290 179 val[ch] = pot[ch] / 656;
radiojunkbox 0:eabe87e89290 180 break;
radiojunkbox 0:eabe87e89290 181 case 1:
radiojunkbox 0:eabe87e89290 182 gGLIDE[ch+4] = 1.0 / expf(pot[ch]/PARAM_GLIDE);
radiojunkbox 0:eabe87e89290 183 val[ch+4] = pot[ch] / 656;
radiojunkbox 0:eabe87e89290 184 break;
radiojunkbox 0:eabe87e89290 185 default:
radiojunkbox 0:eabe87e89290 186 break;
radiojunkbox 0:eabe87e89290 187 }
radiojunkbox 0:eabe87e89290 188 }
radiojunkbox 0:eabe87e89290 189
radiojunkbox 0:eabe87e89290 190 // Push Mode SW
radiojunkbox 0:eabe87e89290 191 if(gSW & SW4) {
radiojunkbox 0:eabe87e89290 192 mode++;
radiojunkbox 0:eabe87e89290 193 mode &= 0x01;
radiojunkbox 0:eabe87e89290 194 for( i=0; i<4; i++) {
radiojunkbox 0:eabe87e89290 195 _pot[i] = pot[i];
radiojunkbox 0:eabe87e89290 196 edit[i] = 0;
radiojunkbox 0:eabe87e89290 197 }
radiojunkbox 0:eabe87e89290 198 }
radiojunkbox 0:eabe87e89290 199 gSW = 0;
radiojunkbox 0:eabe87e89290 200
radiojunkbox 0:eabe87e89290 201 // LCD Display
radiojunkbox 0:eabe87e89290 202 gLCD.locate( 0, 1 );
radiojunkbox 0:eabe87e89290 203 switch(mode) {
radiojunkbox 0:eabe87e89290 204 case 0:
radiojunkbox 0:eabe87e89290 205 gLCD.printf("G1-4 %02d %02d %02d %02d",
radiojunkbox 0:eabe87e89290 206 val[0], val[1], val[2], val[3]);
radiojunkbox 0:eabe87e89290 207 break;
radiojunkbox 0:eabe87e89290 208 case 1:
radiojunkbox 0:eabe87e89290 209 gLCD.printf("G5-8 %02d %02d %02d %02d",
radiojunkbox 0:eabe87e89290 210 val[4], val[5], val[6], val[7]);
radiojunkbox 0:eabe87e89290 211 break;
radiojunkbox 0:eabe87e89290 212 }
radiojunkbox 0:eabe87e89290 213
radiojunkbox 0:eabe87e89290 214 ch++;
radiojunkbox 0:eabe87e89290 215 ch &= 0x03;
radiojunkbox 0:eabe87e89290 216 }
radiojunkbox 0:eabe87e89290 217 }
radiojunkbox 0:eabe87e89290 218
radiojunkbox 0:eabe87e89290 219 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 220 // Initialize KAMUI
radiojunkbox 0:eabe87e89290 221
radiojunkbox 0:eabe87e89290 222 void InitKamui()
radiojunkbox 0:eabe87e89290 223 {
radiojunkbox 0:eabe87e89290 224 // Init. Variables
radiojunkbox 0:eabe87e89290 225 for( int i=0; i<8; i++) {
radiojunkbox 0:eabe87e89290 226 gCV[i] = 0x8000;
radiojunkbox 0:eabe87e89290 227 }
radiojunkbox 0:eabe87e89290 228 gGATE = 0;
radiojunkbox 0:eabe87e89290 229 gSYNC = 0;
radiojunkbox 0:eabe87e89290 230
radiojunkbox 0:eabe87e89290 231 gUpdateMode = UPDATE_MODE0;
radiojunkbox 0:eabe87e89290 232
radiojunkbox 0:eabe87e89290 233 // Init. SPI
radiojunkbox 0:eabe87e89290 234 gCSA = _DISABLE;
radiojunkbox 0:eabe87e89290 235 gCSB = _DISABLE;
radiojunkbox 0:eabe87e89290 236 gSPI.format(8,0);
radiojunkbox 0:eabe87e89290 237 gSPI.frequency(SPI_RATE);
radiojunkbox 0:eabe87e89290 238
radiojunkbox 0:eabe87e89290 239 // Init. Serial MIDI
radiojunkbox 0:eabe87e89290 240 // gMIDI.baud(MIDI_RATE);
radiojunkbox 0:eabe87e89290 241
radiojunkbox 0:eabe87e89290 242 // Ticker
radiojunkbox 0:eabe87e89290 243 gTICKER.attach_us(&UpdateCV, UPDATE_INTERVAL);
radiojunkbox 0:eabe87e89290 244
radiojunkbox 0:eabe87e89290 245 // Beep
radiojunkbox 0:eabe87e89290 246 gBEEP.period(1.0/BEEP_FREQ);
radiojunkbox 0:eabe87e89290 247 gBEEP.write(0.5);
radiojunkbox 0:eabe87e89290 248 wait(0.2);
radiojunkbox 0:eabe87e89290 249 gBEEP.write(0.0);
radiojunkbox 0:eabe87e89290 250
radiojunkbox 0:eabe87e89290 251 // Init Display
radiojunkbox 0:eabe87e89290 252 gLCD.locate( 0, 0 );
radiojunkbox 0:eabe87e89290 253 // 123456789ABCDEF
radiojunkbox 0:eabe87e89290 254 gLCD.printf("OSC-CV Example ");
radiojunkbox 0:eabe87e89290 255 }
radiojunkbox 0:eabe87e89290 256
radiojunkbox 0:eabe87e89290 257 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 258 // Update CV, GATE, SYNC
radiojunkbox 0:eabe87e89290 259
radiojunkbox 0:eabe87e89290 260 void UpdateCV()
radiojunkbox 0:eabe87e89290 261 {
radiojunkbox 0:eabe87e89290 262 unsigned char rcv,ch;
radiojunkbox 0:eabe87e89290 263 unsigned char ptn[] = { 0,1,6,7,2,3,6,7,4,5,6,7 };
radiojunkbox 0:eabe87e89290 264 const int numptn = (sizeof ptn / sizeof ptn[0]) - 1;
radiojunkbox 0:eabe87e89290 265 static unsigned char cnt;
radiojunkbox 0:eabe87e89290 266
radiojunkbox 0:eabe87e89290 267 __disable_irq();
radiojunkbox 0:eabe87e89290 268
radiojunkbox 0:eabe87e89290 269 // SET DAC
radiojunkbox 0:eabe87e89290 270 ch = ptn[cnt];
radiojunkbox 0:eabe87e89290 271 if(gUpdateMode) ch |= 0x06;
radiojunkbox 0:eabe87e89290 272
radiojunkbox 0:eabe87e89290 273 #ifdef AD5551 // 14bitDAC
radiojunkbox 0:eabe87e89290 274 gDAC.WORD = gCV[ch] >> 2;
radiojunkbox 0:eabe87e89290 275 #else
radiojunkbox 0:eabe87e89290 276 gDAC.WORD = gCV[ch];
radiojunkbox 0:eabe87e89290 277 #endif
radiojunkbox 0:eabe87e89290 278
radiojunkbox 0:eabe87e89290 279 gCSA = _ENABLE;
radiojunkbox 0:eabe87e89290 280 gSPI.write(gDAC.BYTE.H);
radiojunkbox 0:eabe87e89290 281 gSPI.write(gDAC.BYTE.L);
radiojunkbox 0:eabe87e89290 282 gCSA = _DISABLE;
radiojunkbox 0:eabe87e89290 283
radiojunkbox 0:eabe87e89290 284 // GATE or SYNC OUT
radiojunkbox 0:eabe87e89290 285 if(cnt & 0x01) {
radiojunkbox 0:eabe87e89290 286 // GATE OUT
radiojunkbox 0:eabe87e89290 287 gCSB = _ENABLE;
radiojunkbox 0:eabe87e89290 288 rcv = gSPI.write(gGATE | MODE_GATE) & 0x0F;
radiojunkbox 0:eabe87e89290 289 gCSB = _DISABLE;
radiojunkbox 0:eabe87e89290 290 }
radiojunkbox 0:eabe87e89290 291 else {
radiojunkbox 0:eabe87e89290 292 // SYNC OUT
radiojunkbox 0:eabe87e89290 293 gCSB = _ENABLE;
radiojunkbox 0:eabe87e89290 294 rcv = gSPI.write(gSYNC | MODE_SYNC);
radiojunkbox 0:eabe87e89290 295 gCSB = _DISABLE;
radiojunkbox 0:eabe87e89290 296 }
radiojunkbox 0:eabe87e89290 297
radiojunkbox 0:eabe87e89290 298 // SEL CV CHANNEL
radiojunkbox 0:eabe87e89290 299 gCSB = _ENABLE;
radiojunkbox 0:eabe87e89290 300 gSPI.write(ch);
radiojunkbox 0:eabe87e89290 301 gCSB = _DISABLE;
radiojunkbox 0:eabe87e89290 302
radiojunkbox 0:eabe87e89290 303 cnt < numptn ? cnt++ : cnt = 0;
radiojunkbox 0:eabe87e89290 304
radiojunkbox 0:eabe87e89290 305 __enable_irq();
radiojunkbox 0:eabe87e89290 306
radiojunkbox 0:eabe87e89290 307 gSW |= CheckSW(rcv);
radiojunkbox 0:eabe87e89290 308 SetCV();
radiojunkbox 0:eabe87e89290 309 }
radiojunkbox 0:eabe87e89290 310
radiojunkbox 0:eabe87e89290 311 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 312 // Check SW
radiojunkbox 0:eabe87e89290 313
radiojunkbox 0:eabe87e89290 314 unsigned char CheckSW(unsigned char c) {
radiojunkbox 0:eabe87e89290 315
radiojunkbox 0:eabe87e89290 316 static unsigned char swbuf[2];
radiojunkbox 0:eabe87e89290 317 static unsigned int cntsw;
radiojunkbox 0:eabe87e89290 318 unsigned char ret = 0;
radiojunkbox 0:eabe87e89290 319
radiojunkbox 0:eabe87e89290 320 if(cntsw > SW_WATCH_INTERVAL) {
radiojunkbox 0:eabe87e89290 321 if(c &= 0x0F) {
radiojunkbox 0:eabe87e89290 322 if(!swbuf[1]) {
radiojunkbox 0:eabe87e89290 323 if( swbuf[0] == c) {
radiojunkbox 0:eabe87e89290 324 swbuf[1] = c;
radiojunkbox 0:eabe87e89290 325 ret = c;
radiojunkbox 0:eabe87e89290 326 }
radiojunkbox 0:eabe87e89290 327 else {
radiojunkbox 0:eabe87e89290 328 swbuf[0] = c;
radiojunkbox 0:eabe87e89290 329 }
radiojunkbox 0:eabe87e89290 330 }
radiojunkbox 0:eabe87e89290 331 }
radiojunkbox 0:eabe87e89290 332 else {
radiojunkbox 0:eabe87e89290 333 swbuf[1] = 0;
radiojunkbox 0:eabe87e89290 334 swbuf[0] = 0;
radiojunkbox 0:eabe87e89290 335 }
radiojunkbox 0:eabe87e89290 336 cntsw = 0;
radiojunkbox 0:eabe87e89290 337 }
radiojunkbox 0:eabe87e89290 338 cntsw++;
radiojunkbox 0:eabe87e89290 339 return ret;
radiojunkbox 0:eabe87e89290 340 }
radiojunkbox 0:eabe87e89290 341
radiojunkbox 0:eabe87e89290 342 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 343 // Set CV
radiojunkbox 0:eabe87e89290 344
radiojunkbox 0:eabe87e89290 345 void SetCV()
radiojunkbox 0:eabe87e89290 346 {
radiojunkbox 0:eabe87e89290 347 static unsigned char ch;
radiojunkbox 0:eabe87e89290 348 static float cvf[8];
radiojunkbox 0:eabe87e89290 349 unsigned int cv;
radiojunkbox 0:eabe87e89290 350
radiojunkbox 0:eabe87e89290 351 // Calculate CV
radiojunkbox 0:eabe87e89290 352 cvf[ch] = (gOSC_CV[ch] - cvf[ch]) * gGLIDE[ch] + cvf[ch];
radiojunkbox 0:eabe87e89290 353 cv = (unsigned int)cvf[ch] + 0x8000;
radiojunkbox 0:eabe87e89290 354 if(cv > 0xFFFF) cv = 0xFFFF;
radiojunkbox 0:eabe87e89290 355 gCV[ch] = cv;
radiojunkbox 0:eabe87e89290 356
radiojunkbox 0:eabe87e89290 357 ch++;
radiojunkbox 0:eabe87e89290 358 ch &= 0x07;
radiojunkbox 0:eabe87e89290 359 }
radiojunkbox 0:eabe87e89290 360
radiojunkbox 0:eabe87e89290 361 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 362 // Setup Ethernet port
radiojunkbox 0:eabe87e89290 363
radiojunkbox 0:eabe87e89290 364 int SetupEthNetIf()
radiojunkbox 0:eabe87e89290 365 {
radiojunkbox 0:eabe87e89290 366 gLCD.locate( 0, 1 );
radiojunkbox 0:eabe87e89290 367 gLCD.printf("Setting up... ");
radiojunkbox 0:eabe87e89290 368 // printf("Setting up...\r\n");
radiojunkbox 0:eabe87e89290 369
radiojunkbox 0:eabe87e89290 370 EthernetErr ethErr = gEth.setup();
radiojunkbox 0:eabe87e89290 371 if(ethErr)
radiojunkbox 0:eabe87e89290 372 {
radiojunkbox 0:eabe87e89290 373 gLCD.locate( 0, 1 );
radiojunkbox 0:eabe87e89290 374 gLCD.printf("Error in setup.");
radiojunkbox 0:eabe87e89290 375 // printf("Error %d in setup.\r\n", ethErr);
radiojunkbox 0:eabe87e89290 376 return -1;
radiojunkbox 0:eabe87e89290 377 }
radiojunkbox 0:eabe87e89290 378 // printf("Setup OK\r\n");
radiojunkbox 0:eabe87e89290 379
radiojunkbox 0:eabe87e89290 380 // printf("IP address %d.%d.%d.%d\r\n", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
radiojunkbox 0:eabe87e89290 381 Host broadcast(IpAddr(gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], 255), 12345, NULL);
radiojunkbox 0:eabe87e89290 382 gUdp.setOnEvent(&onUDPSocketEvent);
radiojunkbox 0:eabe87e89290 383 gUdp.bind(broadcast);
radiojunkbox 0:eabe87e89290 384
radiojunkbox 0:eabe87e89290 385 gLCD.locate( 0, 1 );
radiojunkbox 0:eabe87e89290 386 gLCD.printf("%03d.%03d.%03d.%03d", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
radiojunkbox 0:eabe87e89290 387 wait(2.0);
radiojunkbox 0:eabe87e89290 388
radiojunkbox 0:eabe87e89290 389 return 0;
radiojunkbox 0:eabe87e89290 390 }
radiojunkbox 0:eabe87e89290 391
radiojunkbox 0:eabe87e89290 392 //-------------------------------------------------------------
radiojunkbox 0:eabe87e89290 393 // Handller receive UDP Packet
radiojunkbox 0:eabe87e89290 394
radiojunkbox 0:eabe87e89290 395 void onUDPSocketEvent(UDPSocketEvent e)
radiojunkbox 0:eabe87e89290 396 {
radiojunkbox 0:eabe87e89290 397 union OSCarg msg[10];
radiojunkbox 0:eabe87e89290 398 int num;
radiojunkbox 0:eabe87e89290 399
radiojunkbox 0:eabe87e89290 400 switch(e)
radiojunkbox 0:eabe87e89290 401 {
radiojunkbox 0:eabe87e89290 402 case UDPSOCKET_READABLE: //The only event for now
radiojunkbox 0:eabe87e89290 403 char buf[256] = {0};
radiojunkbox 0:eabe87e89290 404 Host host;
radiojunkbox 0:eabe87e89290 405
radiojunkbox 0:eabe87e89290 406 while( int len = gUdp.recvfrom( buf, 256, &host ) )
radiojunkbox 0:eabe87e89290 407 {
radiojunkbox 0:eabe87e89290 408 if(len <= 0) break;
radiojunkbox 0:eabe87e89290 409 // printf("\r\nFrom %d.%d.%d.%d:\r\n",
radiojunkbox 0:eabe87e89290 410 // host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
radiojunkbox 0:eabe87e89290 411
radiojunkbox 0:eabe87e89290 412 getOSCmsg(buf,msg);
radiojunkbox 0:eabe87e89290 413 // printf("OSCmsg: %s %s %f %i\r\n",
radiojunkbox 0:eabe87e89290 414 // msg[0].address, msg[1].typeTag, msg[2].f, msg[2].i);
radiojunkbox 0:eabe87e89290 415
radiojunkbox 0:eabe87e89290 416 len = strlen(msg[0].address);
radiojunkbox 0:eabe87e89290 417 if(isdigit(msg[0].address[len-1])) num = msg[0].address[len-1] - '0' - 1;
radiojunkbox 0:eabe87e89290 418 else num = -1;
radiojunkbox 0:eabe87e89290 419
radiojunkbox 0:eabe87e89290 420 // address pattern CV
radiojunkbox 0:eabe87e89290 421 if((strncmp(msg[0].address,"/kamui/cv",9)==0) && (num != -1)) {
radiojunkbox 0:eabe87e89290 422
radiojunkbox 0:eabe87e89290 423 if(num > 7) break;
radiojunkbox 0:eabe87e89290 424 if(msg[1].typeTag[1] == 'f') gOSC_CV[num] = msg[2].f * 3072.0;
radiojunkbox 0:eabe87e89290 425 if(msg[1].typeTag[1] == 'i') gOSC_CV[num] = msg[2].i * 3072.0;
radiojunkbox 0:eabe87e89290 426
radiojunkbox 0:eabe87e89290 427 break;
radiojunkbox 0:eabe87e89290 428 }
radiojunkbox 0:eabe87e89290 429
radiojunkbox 0:eabe87e89290 430 // address pattern GATE
radiojunkbox 0:eabe87e89290 431 if((strncmp(msg[0].address,"/kamui/gate",11)==0) && (num != -1)) {
radiojunkbox 0:eabe87e89290 432
radiojunkbox 0:eabe87e89290 433 if(num > 3) break;
radiojunkbox 0:eabe87e89290 434 if(msg[2].i) gGATE |= (0x01 << num);
radiojunkbox 0:eabe87e89290 435 else gGATE &= ~(0x01 << num);
radiojunkbox 0:eabe87e89290 436
radiojunkbox 0:eabe87e89290 437 break;
radiojunkbox 0:eabe87e89290 438 }
radiojunkbox 0:eabe87e89290 439
radiojunkbox 0:eabe87e89290 440 // printf("undefined OSCmsg:%s %s\r\n",msg[0].address, msg[1].typeTag);
radiojunkbox 0:eabe87e89290 441 }
radiojunkbox 0:eabe87e89290 442 break;
radiojunkbox 0:eabe87e89290 443 }
radiojunkbox 0:eabe87e89290 444 }