KAMUI OSC-CV Example refer to OSCReceiver by xshige http://mbed.org/users/xshige/programs/OSCReceiver/
Dependencies: NetServices TextLCD mbed
main.cpp@0:eabe87e89290, 2012-05-06 (annotated)
- Committer:
- radiojunkbox
- Date:
- Sun May 06 07:17:59 2012 +0000
- Revision:
- 0:eabe87e89290
Rev. 1.0
Who changed what in which revision?
User | Revision | Line number | New 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 | } |