|
|
|
@ -23,6 +23,8 @@ |
|
|
|
|
#include <limits.h> |
|
|
|
|
#include <EEPROM.h> |
|
|
|
|
|
|
|
|
|
#define DEBUG |
|
|
|
|
|
|
|
|
|
#define STROBE_TM 9 |
|
|
|
|
#define CLOCK_TM 8 |
|
|
|
|
#define DIO_TM 7 |
|
|
|
@ -37,7 +39,6 @@ bool high_freq = false; |
|
|
|
|
#define BRIGHTNESS 6 |
|
|
|
|
#define INITIAL_MIDI_CHANNEL 1 |
|
|
|
|
#define BUTTON_DEBOUNCE_TIME_MS 150 |
|
|
|
|
#define BUTTON_DOUBLE_PRESS_MS 250 |
|
|
|
|
#define BLINK_FREQUENCY_MS 500 |
|
|
|
|
#define EEPROM_ADDRESS 0x42 |
|
|
|
|
|
|
|
|
@ -52,20 +53,26 @@ void setup() { |
|
|
|
|
Serial.begin(9600); |
|
|
|
|
delay(50); |
|
|
|
|
|
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.println("<SETUP>"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
tm.displayBegin(); |
|
|
|
|
tm.brightness(BRIGHTNESS); |
|
|
|
|
tm.DisplayStr("MIDIHOST", 0); |
|
|
|
|
tm.DisplayStr("HLLOWRLD", 0); |
|
|
|
|
|
|
|
|
|
uint8_t tmp_channel = EEPROM.read(EEPROM_ADDRESS); |
|
|
|
|
if (tmp_channel & 0xf0 != 0xf0) { |
|
|
|
|
actual_channel = 1; |
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.println("Setting channel to 1"); |
|
|
|
|
#endif |
|
|
|
|
} else { |
|
|
|
|
actual_channel = 0x0f & tmp_channel; |
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.print("Reading channel from EEPROM: "); |
|
|
|
|
Serial.println(actual_channel, DEC); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
new_channel = actual_channel; |
|
|
|
|
|
|
|
|
@ -76,11 +83,13 @@ void setup() { |
|
|
|
|
|
|
|
|
|
SetMidiChannel(INITIAL_MIDI_CHANNEL); |
|
|
|
|
|
|
|
|
|
delay(500); |
|
|
|
|
delay(200); |
|
|
|
|
|
|
|
|
|
tm.DisplayDecNum(actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
|
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.println("</SETUP>"); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void loop() { |
|
|
|
@ -90,20 +99,25 @@ void loop() { |
|
|
|
|
|
|
|
|
|
if (button > 0 && button != actual_channel && button_debounce_timer > BUTTON_DEBOUNCE_TIME_MS) { |
|
|
|
|
if (button != new_channel) { |
|
|
|
|
// Button pressed once
|
|
|
|
|
Serial.print("Button once: "); |
|
|
|
|
// Button pressed once
|
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.print("Button pressed once: "); |
|
|
|
|
Serial.println(button, DEC); |
|
|
|
|
#endif |
|
|
|
|
button_debounce_timer = 0; |
|
|
|
|
blink_timer = 0; |
|
|
|
|
new_channel = button; |
|
|
|
|
tm.DisplayDecNumNibble(new_channel, actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} else { |
|
|
|
|
// Button pressed twice
|
|
|
|
|
Serial.print("Button twice: "); |
|
|
|
|
// Button pressed twice
|
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.print("Button pressed twice: "); |
|
|
|
|
Serial.println(button, DEC); |
|
|
|
|
#endif |
|
|
|
|
actual_channel = new_channel; |
|
|
|
|
EEPROM.update(EEPROM_ADDRESS, 0xf0 | actual_channel); |
|
|
|
|
SetMidiChannel(actual_channel); |
|
|
|
|
tm.DisplayDecNum(actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -114,21 +128,25 @@ void loop() { |
|
|
|
|
} else if (blink_timer > BLINK_FREQUENCY_MS / 2) { |
|
|
|
|
tm.DisplayDecNumNibble(new_channel, actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} |
|
|
|
|
} else tm.DisplayDecNum(actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SetMidiChannel(uint8_t channel) { |
|
|
|
|
if (channel < 1 || channel > 16) { |
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.print("ERROR: MIDI channel number out of range: "); |
|
|
|
|
Serial.print(channel, DEC); |
|
|
|
|
#endif |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
Serial.print("Setting MIDI channel to: "); |
|
|
|
|
Serial.print(channel, DEC); |
|
|
|
|
channel--; |
|
|
|
|
Serial.print(" ("); |
|
|
|
|
printBinary(channel, 4); |
|
|
|
|
printBinary(--channel, 4); |
|
|
|
|
Serial.println(")"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
digitalWrite(MIDI_CH_BIT0, channel & 0x00); |
|
|
|
|
digitalWrite(MIDI_CH_BIT1, channel & 0x01); |
|
|
|
@ -136,8 +154,10 @@ void SetMidiChannel(uint8_t channel) { |
|
|
|
|
digitalWrite(MIDI_CH_BIT3, channel & 0x08); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(DEBUG) |
|
|
|
|
void printBinary(uint32_t value, uint8_t len) { |
|
|
|
|
for (uint8_t b = len; b > 0; --b) { |
|
|
|
|
Serial.print((char)('0' + ((value >> (b - 1)) & 1))); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |