diff --git a/src/midipin.cpp b/src/midipin.cpp index d03d73a..aeab2f8 100644 --- a/src/midipin.cpp +++ b/src/midipin.cpp @@ -38,6 +38,11 @@ unsigned CMIDIPin::Read (void) return m_nValue; } +unsigned CMIDIPin::ReadRaw (void) +{ + return m_nRawValue; +} + void CMIDIPin::Write (unsigned nValue) { // Takes values in the MIDI controller range 0 to 127 @@ -50,6 +55,10 @@ void CMIDIPin::Write (unsigned nValue) // "off" m_nValue = HIGH; } + + // Save the raw value for INC and DEC + m_nRawValue = nValue; + return; } diff --git a/src/midipin.h b/src/midipin.h index 7fa3f1d..f400f66 100644 --- a/src/midipin.h +++ b/src/midipin.h @@ -43,6 +43,9 @@ public: // i.e. treated as "active low" (LOW) when pressed. unsigned Read (void); + // returns the raw CC value + unsigned ReadRaw (void); + // MIDI CC values >=64 will set the MIDI pin to LOW ("on") // MIDI CC values <= 63 will set the MIDI pin to HIGH ("off") void Write (unsigned nValue); @@ -50,6 +53,7 @@ public: private: unsigned m_nPinNumber; unsigned m_nValue; + unsigned m_nRawValue; }; #endif diff --git a/src/minidexed.ini b/src/minidexed.ini index 04ee01f..d04d998 100644 --- a/src/minidexed.ini +++ b/src/minidexed.ini @@ -112,7 +112,8 @@ LongPressTimeout=400 # MIDI Button Navigation # Specify MIDI CC to act as a button (0 = ununsed, so don't use CC 0) -# NB: Off < 64 < ON +# NB: Off < 64 < ON for longpress / click / doubleclick actions +# 60 < DEC < 64 < INC < 68 for inc / dec actions # CC channel: 0=OFF; 1-16 MIDI Ch; >16 Omni # If MIDIButtonNotes>0 then treat MIDIButton numbers as MIDI # Note numbers, triggered with NoteOn/NoteOff, not CC numbers. diff --git a/src/uibuttons.cpp b/src/uibuttons.cpp index ebc9d58..9f49df3 100644 --- a/src/uibuttons.cpp +++ b/src/uibuttons.cpp @@ -36,6 +36,8 @@ CUIButton::CUIButton (void) m_clickEvent(BtnEventNone), m_doubleClickEvent(BtnEventNone), m_longPressEvent(BtnEventNone), + m_decEvent(BtnEventNone), + m_incEvent(BtnEventNone), m_doubleClickTimeout(0), m_longPressTimeout(0) { @@ -101,6 +103,16 @@ void CUIButton::setLongPressEvent(BtnEvent longPressEvent) m_longPressEvent = longPressEvent; } +void CUIButton::setDecEvent(BtnEvent decEvent) +{ + m_decEvent = decEvent; +} + +void CUIButton::setIncEvent(BtnEvent incEvent) +{ + m_incEvent = incEvent; +} + unsigned CUIButton::getPinNumber(void) { return m_pinNumber; @@ -109,6 +121,7 @@ unsigned CUIButton::getPinNumber(void) CUIButton::BtnTrigger CUIButton::ReadTrigger (void) { unsigned value; + unsigned raw = 0; if (isMidiPin(m_pinNumber)) { if (!m_midipin) @@ -117,6 +130,7 @@ CUIButton::BtnTrigger CUIButton::ReadTrigger (void) return BtnTriggerNone; } value = m_midipin->Read(); + raw = m_midipin->ReadRaw(); } else { @@ -128,6 +142,21 @@ CUIButton::BtnTrigger CUIButton::ReadTrigger (void) value = m_pin->Read(); } + if (m_decEvent && 60 < raw && raw < 64) + { + reset(); + // reset value to trigger only once + m_midipin->Write(0); + return BtnTriggerDec; + } + else if (m_incEvent && 64 < raw && raw < 68) + { + reset(); + // reset value to trigger only once + m_midipin->Write(0); + return BtnTriggerInc; + } + if (m_timer < m_longPressTimeout) { m_timer++; @@ -230,6 +259,12 @@ CUIButton::BtnEvent CUIButton::Read (void) { else if (trigger == BtnTriggerLongPress) { return m_longPressEvent; } + else if (trigger == BtnTriggerDec) { + return m_decEvent; + } + else if (trigger == BtnTriggerInc) { + return m_incEvent; + } assert (trigger == BtnTriggerNone); @@ -250,6 +285,12 @@ CUIButton::BtnTrigger CUIButton::triggerTypeFromString(const char* triggerString else if (strcmp(triggerString, "longpress") == 0) { return BtnTriggerLongPress; } + else if (strcmp(triggerString, "dec") == 0) { + return BtnTriggerDec; + } + else if (strcmp(triggerString, "inc") == 0) { + return BtnTriggerInc; + } LOGERR("Invalid action: %s", triggerString); @@ -347,7 +388,7 @@ boolean CUIButtons::Initialize (void) // Each normal button can be assigned up to 3 actions: click, doubleclick and // longpress. We may not initialise all of the buttons. - // MIDI buttons can be assigned to click, doubleclick, lopngpress + // MIDI buttons can be assigned to click, doubleclick, lopngpress, dec ,inc unsigned pins[MAX_BUTTONS] = { m_prevPin, m_nextPin, m_backPin, m_selectPin, m_homePin, m_pgmUpPin, m_pgmDownPin, m_TGUpPin, m_TGDownPin, m_prevMidi, m_nextMidi, m_backMidi, m_selectMidi, m_homeMidi, m_pgmUpMidi, m_pgmDownMidi, m_TGUpMidi, m_TGDownMidi @@ -454,6 +495,12 @@ void CUIButtons::bindButton(unsigned pinNumber, CUIButton::BtnTrigger trigger, C else if (trigger == CUIButton::BtnTriggerLongPress) { m_buttons[i].setLongPressEvent(event); } + else if (trigger == CUIButton::BtnTriggerDec) { + m_buttons[i].setDecEvent(event); + } + else if (trigger == CUIButton::BtnTriggerInc) { + m_buttons[i].setIncEvent(event); + } else { assert (trigger == CUIButton::BtnTriggerNone); } diff --git a/src/uibuttons.h b/src/uibuttons.h index c38310b..ac192da 100644 --- a/src/uibuttons.h +++ b/src/uibuttons.h @@ -41,7 +41,9 @@ public: BtnTriggerNone = 0, BtnTriggerClick = 1, BtnTriggerDoubleClick = 2, - BtnTriggerLongPress = 3 + BtnTriggerLongPress = 3, + BtnTriggerDec = 4, + BtnTriggerInc = 5, }; enum BtnEvent @@ -68,6 +70,8 @@ public: void setClickEvent(BtnEvent clickEvent); void setDoubleClickEvent(BtnEvent doubleClickEvent); void setLongPressEvent(BtnEvent longPressEvent); + void setDecEvent(BtnEvent DecEvent); + void setIncEvent(BtnEvent IncEvent); unsigned getPinNumber(void); @@ -98,6 +102,10 @@ private: BtnEvent m_doubleClickEvent; // Event to fire on long press BtnEvent m_longPressEvent; + // Event to fire on dec + BtnEvent m_decEvent; + // Event to fire on inc + BtnEvent m_incEvent; // Timeout for double click in tenths of a millisecond unsigned m_doubleClickTimeout;