|
|
@ -295,6 +295,9 @@ namespace Heck::OSP { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
|
// HEARTBEAT
|
|
|
|
//-------------------------------------------------
|
|
|
|
void task_heartbeat_func(u32) |
|
|
|
{ |
|
|
|
static bool heartbeat_led_state{ false }; |
|
|
@ -302,25 +305,97 @@ namespace Heck::OSP { |
|
|
|
seed.SetLed(heartbeat_led_state); |
|
|
|
} |
|
|
|
|
|
|
|
void task_logger_midi_print_func(u32) { |
|
|
|
dz::PeriodicTaskCT<task_heartbeat_func, 100> task_heartbeat{}; |
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
|
// MIDI LOGGER
|
|
|
|
//-------------------------------------------------
|
|
|
|
void task_logger_midi_print_func(u32) |
|
|
|
{ |
|
|
|
logger_midi.print(); |
|
|
|
} |
|
|
|
|
|
|
|
dz::PeriodicTaskCT<task_heartbeat_func, 100> task_heartbeat{}; |
|
|
|
dz::PeriodicTaskCT<task_logger_midi_print_func, 5> task_logger_midi_print{}; |
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
|
// REC BUTTON
|
|
|
|
//-------------------------------------------------
|
|
|
|
bool but_rec_update() |
|
|
|
{ |
|
|
|
but_rec.Debounce(); |
|
|
|
return but_rec.Pressed(); |
|
|
|
} |
|
|
|
|
|
|
|
void but_rec_changed(dz::Cache<bool>& cache) |
|
|
|
{ |
|
|
|
bool but_rec_current = cache.read(); |
|
|
|
if (!but_rec_current) { |
|
|
|
if (State::clear_mode) { |
|
|
|
seed.PrintLine("CLEAR SEQUENCE"); |
|
|
|
sequencer.clear_sequence(); |
|
|
|
} else { |
|
|
|
seed.PrintLine("BUTTON RECORD ON"); |
|
|
|
State::record_mode = true; |
|
|
|
} |
|
|
|
} else { |
|
|
|
seed.PrintLine("BUTTON RECORD OFF"); |
|
|
|
State::record_mode = false; |
|
|
|
} |
|
|
|
sequencer.recording = but_rec_current; |
|
|
|
} |
|
|
|
|
|
|
|
dz::Cache<bool> c_but_rec{ but_rec_update, but_rec_changed }; |
|
|
|
|
|
|
|
void task_but_rec_process_func(u32) |
|
|
|
{ |
|
|
|
c_but_rec.update_and_notify_change(); |
|
|
|
} |
|
|
|
|
|
|
|
dz::PeriodicTaskCT<task_but_rec_process_func, 1> task_but_rec_process{}; |
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
|
// CLEAR BUTTON
|
|
|
|
//-------------------------------------------------
|
|
|
|
bool but_clear_update() |
|
|
|
{ |
|
|
|
but_clear.Debounce(); |
|
|
|
return but_clear.Pressed(); |
|
|
|
} |
|
|
|
|
|
|
|
void but_clear_changed(dz::Cache<bool>& cache) |
|
|
|
{ |
|
|
|
bool but_clear_current = cache.read(); |
|
|
|
if (but_clear_current) { |
|
|
|
seed.PrintLine("BUTTON CLEAR ON"); |
|
|
|
State::clear_mode = true; |
|
|
|
} else { |
|
|
|
seed.PrintLine("BUTTON CLEAR OFF"); |
|
|
|
State::clear_mode = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
dz::Cache<bool> c_but_clear{ but_clear_update, but_clear_changed }; |
|
|
|
|
|
|
|
void task_but_clear_process_func(u32) |
|
|
|
{ |
|
|
|
c_but_clear.update_and_notify_change(); |
|
|
|
} |
|
|
|
|
|
|
|
dz::PeriodicTaskCT<task_but_rec_process_func, 1> task_but_clear_process{}; |
|
|
|
|
|
|
|
|
|
|
|
//==========================================================================================
|
|
|
|
// MAINLOOP
|
|
|
|
//==========================================================================================
|
|
|
|
|
|
|
|
void mainloop() |
|
|
|
{ |
|
|
|
seed.PrintLine("Entering MainLoop"); |
|
|
|
u32 uptime_ms{}; |
|
|
|
|
|
|
|
bool but_record_new{ false }; |
|
|
|
bool but_record_current{ false }; |
|
|
|
|
|
|
|
bool but_clear_new{ false }; |
|
|
|
bool but_clear_current{ false }; |
|
|
|
|
|
|
|
int clock_time_new{}; |
|
|
|
int clock_time_current{}; |
|
|
|
|
|
|
@ -334,10 +409,6 @@ namespace Heck::OSP { |
|
|
|
dly1.init(&buff1); |
|
|
|
|
|
|
|
while (1) { |
|
|
|
// Get current values for state
|
|
|
|
// if update is different
|
|
|
|
// Update state
|
|
|
|
// handle change
|
|
|
|
uptime_ms = ld::System::GetNow(); |
|
|
|
|
|
|
|
clock_time_new = clock.tick_infinite(); |
|
|
@ -365,42 +436,8 @@ namespace Heck::OSP { |
|
|
|
midi_from_sequencer(); |
|
|
|
midi_from_uart(); |
|
|
|
|
|
|
|
// REC
|
|
|
|
but_rec.Debounce(); |
|
|
|
but_record_new = but_rec.Pressed(); |
|
|
|
if (but_record_current != but_record_new) { |
|
|
|
// State changed
|
|
|
|
but_record_current = but_record_new; |
|
|
|
if (but_record_current) { |
|
|
|
if (State::clear_mode) { |
|
|
|
seed.PrintLine("CLEAR SEQUENCE"); |
|
|
|
sequencer.clear_sequence(); |
|
|
|
} else { |
|
|
|
seed.PrintLine("BUTTON RECORD ON"); |
|
|
|
State::record_mode = true; |
|
|
|
} |
|
|
|
} else { |
|
|
|
seed.PrintLine("BUTTON RECORD OFF"); |
|
|
|
State::record_mode = false; |
|
|
|
} |
|
|
|
sequencer.recording = but_record_current; |
|
|
|
} |
|
|
|
|
|
|
|
// CLEAR
|
|
|
|
but_clear.Debounce(); |
|
|
|
but_clear_new = but_clear.Pressed(); |
|
|
|
if (but_clear_current != but_clear_new) { |
|
|
|
// State changed
|
|
|
|
but_clear_current = but_clear_new; |
|
|
|
if (but_clear_current) { |
|
|
|
seed.PrintLine("BUTTON CLEAR ON"); |
|
|
|
State::clear_mode = true; |
|
|
|
} else { |
|
|
|
seed.PrintLine("BUTTON CLEAR OFF"); |
|
|
|
State::clear_mode = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
task_but_rec_process.run_pending(uptime_ms); |
|
|
|
task_but_clear_process.run_pending(uptime_ms); |
|
|
|
task_logger_midi_print.run_pending(uptime_ms); |
|
|
|
task_heartbeat.run_pending(uptime_ms); |
|
|
|
} |
|
|
|