xair_nano/src/main.cpp

151 lines
3.0 KiB
C++

#include <Arduino.h>
#include <FreeRTOS_SAMD21.h>
#include "input_read.h"
#include "connect.h"
#include "color.h"
#include "encoder.h"
#include "led.h"
#include "main.h"
#include "mapping.h"
#include "network.h"
#include "osc.h"
#include "spinner.h"
#include "util.h"
State state = State::Connecting;
ChainMenu chain_menu = ChainMenu::Master;
ChainMode chain_mode = ChainMode::Meter;
float meter_value = 0.0;
float level_value = 0.0;
bool level_value_up_to_date = false;
void setup() {
Serial.begin(9600);
vSetErrorSerial(&Serial);
setup_input_read();
setup_connect();
setup_encoder();
setup_led();
setup_osc();
setup_spinner();
vTaskStartScheduler();
Serial.println("Start scheduler failed");
}
void loop() {
for(;;) {}
}
void connection_established() {
state = State::ChainMenu;
stop_spinner();
update_meter();
update_leds();
}
void connection_lost() {
state = State::Connecting;
start_spinner();
}
State get_state() {
State current_state = state;
return current_state;
}
void toggle_chain_mode() {
if(ChainMode::Meter == chain_mode) {
chain_mode = ChainMode::Level;
} else {
chain_mode = ChainMode::Meter;
}
update_leds();
}
ChainMode get_chain_mode() {
ChainMode current_chain_mode = chain_mode;
return current_chain_mode;
}
void previous_chain_menu_item() {
switch (chain_menu) {
case ChainMenu::Gain:
break;
case ChainMenu::Fader:
chain_menu = ChainMenu::Gain;
level_value_up_to_date = false;
update_value();
break;
case ChainMenu::Master:
chain_menu = ChainMenu::Fader;
level_value_up_to_date = false;
update_value();
break;
}
update_leds();
}
void next_chain_menu_item() {
switch (chain_menu) {
case ChainMenu::Gain:
chain_menu = ChainMenu::Fader;
level_value_up_to_date = false;
update_value();
break;
case ChainMenu::Fader:
chain_menu = ChainMenu::Master;
level_value_up_to_date = false;
update_value();
break;
case ChainMenu::Master:
break;
}
update_leds();
}
ChainMenu get_chain_menu_item() {
ChainMenu current_chain_menu = chain_menu;
return current_chain_menu;
}
void increment_level(float value) {
if(level_value_up_to_date) {
level_value += value;
if(state == State::ChainMenu
&& chain_menu == ChainMenu::Gain) {
set_gain(level_value);
} else if(state == State::ChainMenu
&& chain_menu == ChainMenu::Fader) {
set_fader(level_value);
} else if(state == State::ChainMenu
&& chain_menu == ChainMenu::Master) {
set_master(level_value);
}
}
update_leds();
}
void set_level(float value) {
level_value = value;
level_value_up_to_date = true;
update_leds();
}
float get_level() {
float current_level_value = level_value;
return current_level_value;
}
void set_meter(float value) {
meter_value = value;
update_leds();
}
float get_meter() {
float current_meter_value = meter_value;
return current_meter_value;
}