BaseMachine UI Controllerに分離

Dependencies:   AverageAnalogIn PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD BaseMachineComon

Fork of BaseMachine_Sequencer by Ryo Od

Committer:
ryood
Date:
Sat Oct 01 23:12:21 2016 +0000
Revision:
41:48864f5f5424
Parent:
40:2f9616bdcf65
Child:
42:3c71f925a47b
impl: SPI Master

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 15:9813d8eaf57e 1 /*
ryood 15:9813d8eaf57e 2 * main.cpp
ryood 15:9813d8eaf57e 3 * SpiSequencerSender_test
ryood 15:9813d8eaf57e 4 *
ryood 38:cafa2fff5565 5 * 2016.10.02 UI Controllerに分割
ryood 15:9813d8eaf57e 6 * 2016.08.20 mbed Rev 121 / mbed-rtos Rev 117で動作確認
ryood 15:9813d8eaf57e 7 *
ryood 15:9813d8eaf57e 8 */
ryood 15:9813d8eaf57e 9
ryood 0:21e39bc75e31 10 #include "mbed.h"
ryood 5:4abac408b827 11 #include "rtos.h"
ryood 16:b0419e3c9079 12 #include "st7565LCD.h"
ryood 18:309f794eba74 13 #include "PinDetect.h"
ryood 20:00d3b6ace8c7 14 #include "RotaryEncoder.h"
ryood 19:241a4b355413 15 #include "AverageAnalogIn.h"
ryood 0:21e39bc75e31 16
ryood 38:cafa2fff5565 17 #define UART_TRACE (1)
ryood 38:cafa2fff5565 18 #include "Sequence.h"
ryood 17:557658db3e81 19 #include "ST7565_SequencerDisplay.h"
ryood 0:21e39bc75e31 20
ryood 38:cafa2fff5565 21 #define TITLE_STR1 ("BaseMachine UI Controller")
ryood 38:cafa2fff5565 22 #define TITLE_STR2 ("20161002")
ryood 16:b0419e3c9079 23
ryood 6:fc10eac60b91 24 #define SEQUENCE_N (16)
ryood 38:cafa2fff5565 25 #define SPI1_RATE (10000000)
ryood 38:cafa2fff5565 26 #define SPI2_RATE (1000000)
ryood 0:21e39bc75e31 27
ryood 20:00d3b6ace8c7 28 const int baseNoteNumber = 36;
ryood 20:00d3b6ace8c7 29 const int bpmMax = 240;
ryood 20:00d3b6ace8c7 30 const int bpmMin = 60;
ryood 40:2f9616bdcf65 31 const int octaveMax = 2;
ryood 40:2f9616bdcf65 32 const int octaveMin = -2;
ryood 38:cafa2fff5565 33 const int waveShapeMax = 1;
ryood 28:d8614d2b82f9 34 const int UImodeMax = 2;
ryood 14:c173e03ee3ad 35
ryood 14:c173e03ee3ad 36 // Initial Sequence
ryood 26:fbf48a178aeb 37 const int noteOn[SEQUENCE_N] = { 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 };
ryood 26:fbf48a178aeb 38 const int pitch[SEQUENCE_N] = {36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36 };
ryood 26:fbf48a178aeb 39 const int tie[SEQUENCE_N] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ryood 26:fbf48a178aeb 40 const int accent[SEQUENCE_N] = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 };
ryood 10:fb04f9959fd9 41
ryood 16:b0419e3c9079 42 // Devices
ryood 16:b0419e3c9079 43 //
ryood 16:b0419e3c9079 44 //SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 41:48864f5f5424 45 SPI SpiMaster(PA_7, PA_6, PA_5);
ryood 41:48864f5f5424 46 DigitalOut SpiMasterCs(PB_6);
ryood 38:cafa2fff5565 47 InterruptIn stepChangeInterrupt(PC_7);
ryood 16:b0419e3c9079 48
ryood 16:b0419e3c9079 49 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 16:b0419e3c9079 50 ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 16:b0419e3c9079 51
ryood 19:241a4b355413 52 AverageAnalogIn AinPulseWidth(PC_2);
ryood 19:241a4b355413 53 AverageAnalogIn AinCutOff(PB_0);
ryood 19:241a4b355413 54 AverageAnalogIn AinResonance(PC_1);
ryood 19:241a4b355413 55 AverageAnalogIn AinLevel(PC_0);
ryood 19:241a4b355413 56 AverageAnalogIn AinDuration(PA_4);
ryood 19:241a4b355413 57 AverageAnalogIn AinDecay(PA_1);
ryood 19:241a4b355413 58 AverageAnalogIn AinSustain(PA_0);
ryood 41:48864f5f5424 59 AverageAnalogIn AinAccentLevel(PC_3);
ryood 10:fb04f9959fd9 60
ryood 31:16d1fbf3a167 61 RotaryEncoder RotEncStep(PB_9, PB_8, 0, SEQUENCE_N - 1, 0);
ryood 26:fbf48a178aeb 62 RotaryEncoder RotEncPitch(PB_5, PB_4, 0, Sequence::getMaxPitch() - 1, 0);
ryood 31:16d1fbf3a167 63 RotaryEncoder RotEncBpm(PC_12, PC_10, bpmMin, bpmMax, 120);
ryood 20:00d3b6ace8c7 64
ryood 18:309f794eba74 65 PinDetect PinWaveShape(PD_2, PullUp);
ryood 28:d8614d2b82f9 66 PinDetect PinUIMode(PC_11, PullUp);
ryood 31:16d1fbf3a167 67 PinDetect PinOctaveUp(PB_3, PullUp);
ryood 31:16d1fbf3a167 68 PinDetect PinOctaveDown(PA_10, PullUp);
ryood 31:16d1fbf3a167 69 PinDetect PinNoteOnOff(PC_5, PullUp);
ryood 31:16d1fbf3a167 70 PinDetect PinTie(PC_6, PullUp);
ryood 31:16d1fbf3a167 71 PinDetect PinAccent(PC_8, PullUp);
ryood 31:16d1fbf3a167 72 PinDetect PinRunStop(PC_9, PullUp);
ryood 18:309f794eba74 73
ryood 16:b0419e3c9079 74 // Grobal Variables
ryood 16:b0419e3c9079 75 //
ryood 16:b0419e3c9079 76 Sequence sequences[SEQUENCE_N];
ryood 17:557658db3e81 77 ST7565_SequencerDisplay sequencerDisplay(&gLCD, sequences, SEQUENCE_N);
ryood 17:557658db3e81 78
ryood 38:cafa2fff5565 79 struct OscillatorParam {
ryood 38:cafa2fff5565 80 uint8_t waveShape;
ryood 38:cafa2fff5565 81 uint8_t pulseWidth;
ryood 38:cafa2fff5565 82 } oscillatorParam;
ryood 38:cafa2fff5565 83
ryood 38:cafa2fff5565 84 struct FilterParam {
ryood 38:cafa2fff5565 85 uint8_t cutoff;
ryood 38:cafa2fff5565 86 uint8_t resonance;
ryood 38:cafa2fff5565 87 } filterParam;
ryood 38:cafa2fff5565 88
ryood 38:cafa2fff5565 89 struct EnvelopeParam {
ryood 38:cafa2fff5565 90 int8_t level;
ryood 38:cafa2fff5565 91 int8_t length;
ryood 38:cafa2fff5565 92 int8_t duration;
ryood 38:cafa2fff5565 93 int8_t decay;
ryood 38:cafa2fff5565 94 int8_t sustain;
ryood 38:cafa2fff5565 95 } envelopeParam;
ryood 38:cafa2fff5565 96
ryood 38:cafa2fff5565 97 uint8_t bpm = 120;
ryood 38:cafa2fff5565 98 uint8_t accentLevel = 127;
ryood 38:cafa2fff5565 99
ryood 38:cafa2fff5565 100 int currentStep = 0;
ryood 38:cafa2fff5565 101 int playingStep = 0;
ryood 38:cafa2fff5565 102 bool isRunning = false;
ryood 38:cafa2fff5565 103 bool isDirty = true;
ryood 38:cafa2fff5565 104 int UImode = 0;
ryood 38:cafa2fff5565 105
ryood 38:cafa2fff5565 106 volatile bool isStepChanged = false;
ryood 16:b0419e3c9079 107 volatile uint8_t pinFlag = 0x00;
ryood 16:b0419e3c9079 108
ryood 16:b0419e3c9079 109 enum PinBit {
ryood 16:b0419e3c9079 110 bWaveShape = 0x01,
ryood 38:cafa2fff5565 111 bUIMode = 0x02,
ryood 16:b0419e3c9079 112 bOctaveUp = 0x04,
ryood 16:b0419e3c9079 113 bOctaveDown = 0x08,
ryood 16:b0419e3c9079 114 bNoteOnOff = 0x10,
ryood 16:b0419e3c9079 115 bTie = 0x20,
ryood 16:b0419e3c9079 116 bAccent = 0x40,
ryood 16:b0419e3c9079 117 bRunStop = 0x80
ryood 16:b0419e3c9079 118 };
ryood 16:b0419e3c9079 119
ryood 16:b0419e3c9079 120 //------------------------------------------------------------------------
ryood 38:cafa2fff5565 121 // InterruptIn ISR
ryood 16:b0419e3c9079 122 //------------------------------------------------------------------------
ryood 38:cafa2fff5565 123 void updateStep()
ryood 8:de409197ff95 124 {
ryood 38:cafa2fff5565 125 isStepChanged = true;
ryood 8:de409197ff95 126 }
ryood 8:de409197ff95 127
ryood 16:b0419e3c9079 128 //------------------------------------------------------------------------
ryood 18:309f794eba74 129 // PinDetect ISR
ryood 18:309f794eba74 130 //------------------------------------------------------------------------
ryood 18:309f794eba74 131 void swWaveShapePressed()
ryood 18:309f794eba74 132 {
ryood 18:309f794eba74 133 pinFlag |= bWaveShape;
ryood 18:309f794eba74 134 }
ryood 18:309f794eba74 135
ryood 28:d8614d2b82f9 136 void swUIModePressed()
ryood 18:309f794eba74 137 {
ryood 28:d8614d2b82f9 138 pinFlag |= bUIMode;
ryood 18:309f794eba74 139 }
ryood 18:309f794eba74 140
ryood 18:309f794eba74 141 void swOctaveUpPressed()
ryood 18:309f794eba74 142 {
ryood 18:309f794eba74 143 pinFlag |= bOctaveUp;
ryood 18:309f794eba74 144 }
ryood 18:309f794eba74 145
ryood 18:309f794eba74 146 void swOctaveDownPressed()
ryood 18:309f794eba74 147 {
ryood 18:309f794eba74 148 pinFlag |= bOctaveDown;
ryood 18:309f794eba74 149 }
ryood 18:309f794eba74 150
ryood 18:309f794eba74 151 void swNoteOnOffPressed()
ryood 18:309f794eba74 152 {
ryood 18:309f794eba74 153 pinFlag |= bNoteOnOff;
ryood 18:309f794eba74 154 }
ryood 18:309f794eba74 155
ryood 18:309f794eba74 156 void swTiePressed()
ryood 18:309f794eba74 157 {
ryood 18:309f794eba74 158 pinFlag |= bTie;
ryood 18:309f794eba74 159 }
ryood 18:309f794eba74 160
ryood 18:309f794eba74 161 void swAccentPressed()
ryood 18:309f794eba74 162 {
ryood 18:309f794eba74 163 pinFlag |= bAccent;
ryood 18:309f794eba74 164 }
ryood 18:309f794eba74 165
ryood 18:309f794eba74 166 void swRunStopPressed()
ryood 18:309f794eba74 167 {
ryood 18:309f794eba74 168 pinFlag |= bRunStop;
ryood 18:309f794eba74 169 }
ryood 18:309f794eba74 170
ryood 18:309f794eba74 171 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 172 // Functions
ryood 16:b0419e3c9079 173 //------------------------------------------------------------------------
ryood 19:241a4b355413 174 void pollingPots()
ryood 19:241a4b355413 175 {
ryood 38:cafa2fff5565 176 oscillatorParam.pulseWidth = AinPulseWidth.read_u16() >> 8;
ryood 20:00d3b6ace8c7 177
ryood 38:cafa2fff5565 178 filterParam.cutoff = AinCutOff.read_u16() >> 8;
ryood 38:cafa2fff5565 179 filterParam.resonance = AinResonance.read_u16() >> 8;
ryood 34:602ee5e771e3 180
ryood 38:cafa2fff5565 181 envelopeParam.level = AinLevel.read_u16() >> 8;
ryood 38:cafa2fff5565 182 envelopeParam.duration = AinDuration.read_u16() >> 8;
ryood 38:cafa2fff5565 183 envelopeParam.decay = AinDecay.read_u16() >> 8;
ryood 38:cafa2fff5565 184 envelopeParam.sustain = AinSustain.read_u16() >> 8;
ryood 20:00d3b6ace8c7 185 }
ryood 20:00d3b6ace8c7 186
ryood 20:00d3b6ace8c7 187 void pollingRotEncs()
ryood 20:00d3b6ace8c7 188 {
ryood 20:00d3b6ace8c7 189 int _bpm = RotEncBpm.getVal();
ryood 38:cafa2fff5565 190 if (_bpm != bpm) {
ryood 38:cafa2fff5565 191 bpm = _bpm;
ryood 25:7382bc0a0329 192 sequencerDisplay.setBpm(_bpm);
ryood 20:00d3b6ace8c7 193 isDirty = true;
ryood 20:00d3b6ace8c7 194 }
ryood 20:00d3b6ace8c7 195
ryood 20:00d3b6ace8c7 196 int _step = RotEncStep.getVal();
ryood 20:00d3b6ace8c7 197 if (_step != currentStep) {
ryood 20:00d3b6ace8c7 198 currentStep = _step;
ryood 20:00d3b6ace8c7 199 // syncronize sequence value & Rotary Encoder's value
ryood 20:00d3b6ace8c7 200 RotEncPitch.setVal(sequences[currentStep].getPitch());
ryood 20:00d3b6ace8c7 201 isDirty = true;
ryood 20:00d3b6ace8c7 202 }
ryood 20:00d3b6ace8c7 203
ryood 20:00d3b6ace8c7 204 int _pitch = RotEncPitch.getVal();
ryood 20:00d3b6ace8c7 205 if (_pitch != sequences[currentStep].getPitch()) {
ryood 20:00d3b6ace8c7 206 sequences[currentStep].setPitch(_pitch);
ryood 20:00d3b6ace8c7 207 isDirty = true;
ryood 20:00d3b6ace8c7 208 }
ryood 19:241a4b355413 209 }
ryood 19:241a4b355413 210
ryood 18:309f794eba74 211 void pollingPins()
ryood 18:309f794eba74 212 {
ryood 18:309f794eba74 213 if (pinFlag & bWaveShape) {
ryood 18:309f794eba74 214 #if (UART_TRACE)
ryood 18:309f794eba74 215 printf("PinWaveShape Pushed\r\n");
ryood 18:309f794eba74 216 #endif
ryood 38:cafa2fff5565 217 uint8_t _waveShape = oscillatorParam.waveShape;
ryood 38:cafa2fff5565 218 _waveShape++;
ryood 40:2f9616bdcf65 219 if (_waveShape > waveShapeMax) {
ryood 38:cafa2fff5565 220 _waveShape = 0;
ryood 18:309f794eba74 221 }
ryood 38:cafa2fff5565 222 oscillatorParam.waveShape = _waveShape;
ryood 38:cafa2fff5565 223 sequencerDisplay.setWaveShape(_waveShape);
ryood 18:309f794eba74 224 pinFlag &= ~bWaveShape;
ryood 28:d8614d2b82f9 225 isDirty = true;
ryood 18:309f794eba74 226 }
ryood 18:309f794eba74 227
ryood 28:d8614d2b82f9 228 if (pinFlag & bUIMode) {
ryood 18:309f794eba74 229 #if (UART_TRACE)
ryood 28:d8614d2b82f9 230 printf("PinUIMode Pushed\r\n");
ryood 18:309f794eba74 231 #endif
ryood 28:d8614d2b82f9 232 UImode++;
ryood 28:d8614d2b82f9 233 if (UImode > UImodeMax) {
ryood 28:d8614d2b82f9 234 UImode = 0;
ryood 18:309f794eba74 235 }
ryood 28:d8614d2b82f9 236 pinFlag &= ~bUIMode;
ryood 28:d8614d2b82f9 237 isDirty = true;
ryood 18:309f794eba74 238 }
ryood 18:309f794eba74 239
ryood 18:309f794eba74 240 if (pinFlag & bOctaveUp) {
ryood 18:309f794eba74 241 #if (UART_TRACE)
ryood 18:309f794eba74 242 printf("PinOctaveUp Pushed\r\n");
ryood 18:309f794eba74 243 #endif
ryood 40:2f9616bdcf65 244 if (sequencerDisplay.getOctave() < octaveMax ) {
ryood 40:2f9616bdcf65 245 sequencerDisplay.setOctave(sequencerDisplay.getOctave() + 1);
ryood 40:2f9616bdcf65 246 isDirty = true;
ryood 40:2f9616bdcf65 247 }
ryood 18:309f794eba74 248 pinFlag &= ~bOctaveUp;
ryood 18:309f794eba74 249 }
ryood 18:309f794eba74 250
ryood 18:309f794eba74 251 if (pinFlag & bOctaveDown) {
ryood 18:309f794eba74 252 #if (UART_TRACE)
ryood 18:309f794eba74 253 printf("PinOctaveDown Pushed\r\n");
ryood 18:309f794eba74 254 #endif
ryood 40:2f9616bdcf65 255 if (sequencerDisplay.getOctave () > octaveMin) {
ryood 40:2f9616bdcf65 256 sequencerDisplay.setOctave(sequencerDisplay.getOctave() - 1);
ryood 40:2f9616bdcf65 257 isDirty = true;
ryood 40:2f9616bdcf65 258 }
ryood 18:309f794eba74 259 pinFlag &= ~bOctaveDown;
ryood 18:309f794eba74 260 }
ryood 18:309f794eba74 261
ryood 18:309f794eba74 262 if (pinFlag & bNoteOnOff) {
ryood 18:309f794eba74 263 #if (UART_TRACE)
ryood 18:309f794eba74 264 printf("PinNoteOnOff Pushed\r\n");
ryood 18:309f794eba74 265 #endif
ryood 18:309f794eba74 266 sequences[currentStep].setNoteOn(!sequences[currentStep].isNoteOn());
ryood 18:309f794eba74 267 pinFlag &= ~bNoteOnOff;
ryood 28:d8614d2b82f9 268 isDirty = true;
ryood 18:309f794eba74 269 }
ryood 18:309f794eba74 270
ryood 18:309f794eba74 271 if (pinFlag & bTie) {
ryood 18:309f794eba74 272 #if (UART_TRACE)
ryood 18:309f794eba74 273 printf("PinTie Pushed\r\n");
ryood 18:309f794eba74 274 #endif
ryood 18:309f794eba74 275 sequences[currentStep].setTie(!sequences[currentStep].isTie());
ryood 18:309f794eba74 276 pinFlag &= ~bTie;
ryood 28:d8614d2b82f9 277 isDirty = true;
ryood 18:309f794eba74 278 }
ryood 18:309f794eba74 279
ryood 18:309f794eba74 280 if (pinFlag & bAccent) {
ryood 18:309f794eba74 281 #if (UART_TRACE)
ryood 18:309f794eba74 282 printf("PinAccent Pushed\r\n");
ryood 18:309f794eba74 283 #endif
ryood 18:309f794eba74 284 sequences[currentStep].setAccent(!sequences[currentStep].isAccent());
ryood 18:309f794eba74 285 pinFlag &= ~bAccent;
ryood 28:d8614d2b82f9 286 isDirty = true;
ryood 18:309f794eba74 287 }
ryood 18:309f794eba74 288
ryood 18:309f794eba74 289 if (pinFlag & bRunStop) {
ryood 18:309f794eba74 290 #if (UART_TRACE)
ryood 18:309f794eba74 291 printf("PinRunStop Pushed\r\n");
ryood 18:309f794eba74 292 #endif
ryood 18:309f794eba74 293 if (isRunning) {
ryood 18:309f794eba74 294 isRunning = false;
ryood 18:309f794eba74 295 } else {
ryood 18:309f794eba74 296 isRunning = true;
ryood 18:309f794eba74 297 }
ryood 18:309f794eba74 298 pinFlag &= ~bRunStop;
ryood 28:d8614d2b82f9 299 isDirty = true;
ryood 18:309f794eba74 300 }
ryood 18:309f794eba74 301 }
ryood 18:309f794eba74 302
ryood 28:d8614d2b82f9 303 void dumpToLCD00()
ryood 16:b0419e3c9079 304 {
ryood 16:b0419e3c9079 305 char buff[64];
ryood 16:b0419e3c9079 306 int col = 0;
ryood 16:b0419e3c9079 307
ryood 16:b0419e3c9079 308 gLCD.clear();
ryood 16:b0419e3c9079 309
ryood 38:cafa2fff5565 310 sprintf(buff, "Run:%d BPM:%03d", isRunning, bpm);
ryood 16:b0419e3c9079 311 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 312
ryood 24:040cdcb2ff14 313 sprintf(buff, "Stp:%02d Nto:%d Pch:%02d",
ryood 24:040cdcb2ff14 314 currentStep, sequences[currentStep].isNoteOn(), sequences[currentStep].getPitch());
ryood 24:040cdcb2ff14 315 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 316
ryood 24:040cdcb2ff14 317 sprintf(buff, "Oct:%-2d Tie:%d Acc:%d",
ryood 26:fbf48a178aeb 318 sequencerDisplay.getOctave(), sequences[currentStep].isTie(),sequences[currentStep].isAccent());
ryood 16:b0419e3c9079 319 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 320
ryood 41:48864f5f5424 321 sprintf(buff, "Wsp:%d Mod:%d pStp:%d", oscillatorParam.waveShape, UImode, playingStep);
ryood 16:b0419e3c9079 322 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 323
ryood 38:cafa2fff5565 324 sprintf(buff, "PW :%4d CO :%4d", oscillatorParam.pulseWidth, filterParam.cutoff);
ryood 24:040cdcb2ff14 325 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 326 sprintf(buff, "RSO:%4d ACL:%4d", filterParam.resonance, accentLevel);
ryood 24:040cdcb2ff14 327 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 328 sprintf(buff, "LVL:%4d DUR:%4d", envelopeParam.level, envelopeParam.duration);
ryood 24:040cdcb2ff14 329 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 330 sprintf(buff, "DCY:%4d SUS:%4d", envelopeParam.decay, envelopeParam.sustain);
ryood 24:040cdcb2ff14 331 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 332
ryood 16:b0419e3c9079 333 gLCD.display();
ryood 16:b0419e3c9079 334 }
ryood 16:b0419e3c9079 335
ryood 28:d8614d2b82f9 336 void dumpToLCD01()
ryood 28:d8614d2b82f9 337 {
ryood 28:d8614d2b82f9 338 char buff[64];
ryood 28:d8614d2b82f9 339 int col = 0;
ryood 28:d8614d2b82f9 340
ryood 28:d8614d2b82f9 341 gLCD.clear();
ryood 28:d8614d2b82f9 342
ryood 28:d8614d2b82f9 343 sprintf(buff, "Cutoff %5d", AinCutOff.read_u16() >> 8);
ryood 28:d8614d2b82f9 344 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 345 sprintf(buff, "Duration %5d", AinDuration.read_u16() >> 8);
ryood 28:d8614d2b82f9 346 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 347 sprintf(buff, "Decay %5d", AinDecay.read_u16() >> 8);
ryood 28:d8614d2b82f9 348 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 349 sprintf(buff, "Sustain %5d", AinSustain.read_u16() >> 8);
ryood 28:d8614d2b82f9 350 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 351
ryood 28:d8614d2b82f9 352
ryood 28:d8614d2b82f9 353 sprintf(buff, "Resonance %5d", AinResonance.read_u16() >> 8);
ryood 28:d8614d2b82f9 354 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 355 sprintf(buff, "Level %5d", AinLevel.read_u16() >> 8);
ryood 28:d8614d2b82f9 356 gLCD.drawstring(0, col++, buff);
ryood 30:0f652280d6ee 357 sprintf(buff, "PulseWidth %5d", AinPulseWidth.read_u16() >> 8);
ryood 28:d8614d2b82f9 358 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 359 sprintf(buff, "AccentLvl %5d", AinAccentLevel.read_u16() >> 8);
ryood 28:d8614d2b82f9 360 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 361
ryood 28:d8614d2b82f9 362 gLCD.display();
ryood 28:d8614d2b82f9 363 }
ryood 28:d8614d2b82f9 364
ryood 16:b0419e3c9079 365 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 366 // Main routine
ryood 16:b0419e3c9079 367 //------------------------------------------------------------------------
ryood 0:21e39bc75e31 368 int main()
ryood 0:21e39bc75e31 369 {
ryood 18:309f794eba74 370 #if (UART_TRACE)
ryood 38:cafa2fff5565 371 printf("*** BaseMachine UI Controller ***\r\n");
ryood 18:309f794eba74 372 #endif
ryood 18:309f794eba74 373
ryood 24:040cdcb2ff14 374 //--------------------------------------------------------------------
ryood 16:b0419e3c9079 375 // Setup Devices
ryood 16:b0419e3c9079 376 //
ryood 38:cafa2fff5565 377 gLCD.set_spi_frequency(SPI2_RATE);
ryood 16:b0419e3c9079 378 gLCD.begin(0x12);
ryood 16:b0419e3c9079 379 gLCD.clear();
ryood 16:b0419e3c9079 380 gLCD.drawstring(0, 0, TITLE_STR1);
ryood 16:b0419e3c9079 381 gLCD.drawstring(0, 1, TITLE_STR2);
ryood 16:b0419e3c9079 382 gLCD.display();
ryood 16:b0419e3c9079 383 Thread::wait(1000);
ryood 16:b0419e3c9079 384
ryood 20:00d3b6ace8c7 385 RotEncStep.setInterval(100);
ryood 20:00d3b6ace8c7 386 RotEncPitch.setInterval(100);
ryood 20:00d3b6ace8c7 387 RotEncBpm.setInterval(100);
ryood 17:557658db3e81 388
ryood 18:309f794eba74 389 PinWaveShape.attach_asserted(&swWaveShapePressed);
ryood 18:309f794eba74 390 PinWaveShape.setAssertValue(0);
ryood 18:309f794eba74 391 PinWaveShape.setSampleFrequency();
ryood 18:309f794eba74 392
ryood 28:d8614d2b82f9 393 PinUIMode.attach_asserted(&swUIModePressed);
ryood 28:d8614d2b82f9 394 PinUIMode.setAssertValue(0);
ryood 28:d8614d2b82f9 395 PinUIMode.setSampleFrequency();
ryood 18:309f794eba74 396
ryood 18:309f794eba74 397 PinOctaveUp.attach_asserted(&swOctaveUpPressed);
ryood 18:309f794eba74 398 PinOctaveUp.setAssertValue(0);
ryood 18:309f794eba74 399 PinOctaveUp.setSampleFrequency();
ryood 18:309f794eba74 400
ryood 18:309f794eba74 401 PinOctaveDown.attach_asserted(&swOctaveDownPressed);
ryood 18:309f794eba74 402 PinOctaveDown.setAssertValue(0);
ryood 18:309f794eba74 403 PinOctaveDown.setSampleFrequency();
ryood 18:309f794eba74 404
ryood 18:309f794eba74 405 PinNoteOnOff.attach_asserted(&swNoteOnOffPressed);
ryood 18:309f794eba74 406 PinNoteOnOff.setAssertValue(0);
ryood 18:309f794eba74 407 PinNoteOnOff.setSampleFrequency();
ryood 18:309f794eba74 408
ryood 18:309f794eba74 409 PinTie.attach_asserted(&swTiePressed);
ryood 18:309f794eba74 410 PinTie.setAssertValue(0);
ryood 18:309f794eba74 411 PinTie.setSampleFrequency();
ryood 18:309f794eba74 412
ryood 18:309f794eba74 413 PinAccent.attach_asserted(&swAccentPressed);
ryood 18:309f794eba74 414 PinAccent.setAssertValue(0);
ryood 18:309f794eba74 415 PinAccent.setSampleFrequency();
ryood 18:309f794eba74 416
ryood 18:309f794eba74 417 PinRunStop.attach_asserted(&swRunStopPressed);
ryood 18:309f794eba74 418 PinRunStop.setAssertValue(0);
ryood 41:48864f5f5424 419 PinRunStop.setSampleFrequency();
ryood 41:48864f5f5424 420
ryood 41:48864f5f5424 421 //--------------------------------------------------------------------
ryood 41:48864f5f5424 422 // Initialize SPI Master
ryood 41:48864f5f5424 423 //
ryood 41:48864f5f5424 424 SpiMasterCs = 1;
ryood 41:48864f5f5424 425 SpiMaster.format(8, 0);
ryood 41:48864f5f5424 426 SpiMaster.frequency(SPI1_RATE);
ryood 41:48864f5f5424 427
ryood 41:48864f5f5424 428 stepChangeInterrupt.fall(&updateStep);
ryood 18:309f794eba74 429
ryood 24:040cdcb2ff14 430 //--------------------------------------------------------------------
ryood 22:82f1e7877f9f 431 // Initialize objects
ryood 0:21e39bc75e31 432 //
ryood 15:9813d8eaf57e 433 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 14:c173e03ee3ad 434
ryood 0:21e39bc75e31 435 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 38:cafa2fff5565 436 Sequence& seq = sequences[i];
ryood 14:c173e03ee3ad 437 seq.setPitch(pitch[i]);
ryood 15:9813d8eaf57e 438 seq.setNoteOn(noteOn[i]);
ryood 15:9813d8eaf57e 439 seq.setTie(tie[i]);
ryood 26:fbf48a178aeb 440 seq.setAccent(accent[i]);
ryood 0:21e39bc75e31 441 }
ryood 26:fbf48a178aeb 442 RotEncPitch.setVal(sequences[0].getPitch());
ryood 6:fc10eac60b91 443
ryood 24:040cdcb2ff14 444 //--------------------------------------------------------------------
ryood 24:040cdcb2ff14 445 // Main loop
ryood 24:040cdcb2ff14 446 //
ryood 5:4abac408b827 447 for (;;) {
ryood 41:48864f5f5424 448 // Polling Devices
ryood 20:00d3b6ace8c7 449 pollingPots();
ryood 20:00d3b6ace8c7 450 pollingRotEncs();
ryood 18:309f794eba74 451 pollingPins();
ryood 41:48864f5f5424 452
ryood 41:48864f5f5424 453 // Send Params to SPI Slave
ryood 41:48864f5f5424 454 if (isDirty || isStepChanged) {
ryood 41:48864f5f5424 455 SpiMasterCs = 0;
ryood 41:48864f5f5424 456 uint8_t receivedVal = SpiMaster.write(currentStep);
ryood 41:48864f5f5424 457 SpiMasterCs = 1;
ryood 41:48864f5f5424 458
ryood 41:48864f5f5424 459 if (isStepChanged) {
ryood 41:48864f5f5424 460 playingStep = receivedVal;
ryood 41:48864f5f5424 461 isStepChanged = false;
ryood 41:48864f5f5424 462 isDirty = true;
ryood 41:48864f5f5424 463 }
ryood 41:48864f5f5424 464 }
ryood 41:48864f5f5424 465
ryood 41:48864f5f5424 466 // Display
ryood 23:5fe70293e34c 467 if (!isRunning) {
ryood 25:7382bc0a0329 468 if (isDirty) {
ryood 28:d8614d2b82f9 469 switch (UImode) {
ryood 28:d8614d2b82f9 470 case 0:
ryood 37:d4e50159baee 471 sequencerDisplay.update(SequencerDisplay::stop, currentStep, playingStep);
ryood 28:d8614d2b82f9 472 break;
ryood 28:d8614d2b82f9 473 case 1:
ryood 28:d8614d2b82f9 474 dumpToLCD00();
ryood 28:d8614d2b82f9 475 break;
ryood 28:d8614d2b82f9 476 }
ryood 28:d8614d2b82f9 477 isDirty = false;
ryood 28:d8614d2b82f9 478 }
ryood 28:d8614d2b82f9 479 if (UImode == 2) {
ryood 28:d8614d2b82f9 480 dumpToLCD01();
ryood 28:d8614d2b82f9 481 }
ryood 28:d8614d2b82f9 482 } else {
ryood 28:d8614d2b82f9 483 if (isDirty) {
ryood 37:d4e50159baee 484 sequencerDisplay.update(SequencerDisplay::run, currentStep, playingStep);
ryood 36:50ad7e0a9a95 485 isDirty = false;
ryood 25:7382bc0a0329 486 }
ryood 23:5fe70293e34c 487 }
ryood 5:4abac408b827 488 }
ryood 0:21e39bc75e31 489 }