diff --git a/firmware/Include/main.h b/firmware/Include/main.h index 60655c8..6bdfffb 100644 --- a/firmware/Include/main.h +++ b/firmware/Include/main.h @@ -55,6 +55,7 @@ void Error_Handler(void); void set_input(uint8_t channel); void set_attenuation(uint8_t left, uint8_t right); +void set_mute(uint8_t mute); /* USER CODE BEGIN EFP */ diff --git a/firmware/Src/main.c b/firmware/Src/main.c index 2f137f3..d56aab1 100644 --- a/firmware/Src/main.c +++ b/firmware/Src/main.c @@ -102,23 +102,55 @@ int test_button_pressed() { #undef TEST_BUTTON } +struct ui_state { + uint8_t oldchannel; + uint8_t mute; +} ui_state = { + .oldchannel = -1, + .mute = 0, +}; void set_input(uint8_t channel) { - static uint8_t oldchannel = -1; - if (channel == oldchannel || channel >= 6) + if (ui_state.oldchannel == channel || channel >= 6) return; - channel = channel; - set_input_led(oldchannel, 0); - set_input_led(channel, 1); - - // invert bd inputs to match the numbers on the case - bd_set_input(&hi2c1, 5-channel); - oldchannel = channel; + set_input_led(ui_state.oldchannel, 0); + + // do not disturb the mute mode + if (!ui_state.mute) + { + set_input_led(channel, 1); + + // invert bd inputs to match the numbers on the case + bd_set_input(&hi2c1, 5-channel); + } + + ui_state.oldchannel = channel; printf("C%d\n", channel); } +void set_mute(uint8_t mute) { + if(ui_state.mute == mute) + return; + + if (0 == (ui_state.mute = mute)) { + // hack to make reactivation of the last channel easier + uint8_t old_input = ui_state.oldchannel; + ui_state.oldchannel = -1; + + set_input(old_input); + HAL_GPIO_WritePin(USER_LED_GPIO_Port, USER_LED_Pin, 0); + } + else { + HAL_GPIO_WritePin(USER_LED_GPIO_Port, USER_LED_Pin, 1); + set_input_led(ui_state.oldchannel, 0); + bd_set_input(&hi2c1, BD_INPUT_MUTE); + } + + printf("M%d\n", ui_state.mute?1:0); +} + void set_attenuation(uint8_t left, uint8_t right) { bd_set_attenuation(&hi2c1, 0, left); bd_set_attenuation(&hi2c1, 1, right); @@ -168,6 +200,8 @@ int main(void) // reset set input set_input(input); set_attenuation(0,0); + int count = 0; + int button_timeout = 0; /* USER CODE END 2 */ /* Infinite loop */ @@ -180,9 +214,26 @@ int main(void) // handle button inputs input = test_button_pressed(); - if (0 <= input) { + if (6 > input) { set_input(input); - } + + if (100 < ++count) { + count = 0; + button_timeout++; + } + + //printf("%d\n", count); + + if (1000 < button_timeout) { + // long press, toggle mute + set_mute(!ui_state.mute); + button_timeout = 0; + } + + } else { + count = 0; + button_timeout = 0; + } // parse serial commands parse_buffer(); diff --git a/firmware/Src/message_parser.c b/firmware/Src/message_parser.c index ee23b1a..695565d 100644 --- a/firmware/Src/message_parser.c +++ b/firmware/Src/message_parser.c @@ -150,6 +150,14 @@ int parse_buffer() { printf("%c%d\n", temp, bd_set_attenuation(&hi2c1, temp == 'R', att&0xFF)); } break; + case 'M': + { + uint16_t mute; + if (next_arg_unsigned(&mute)) break; + + set_mute(mute); + } + break; case 'B': case 'T':