From 942003449e15ecf1573eeaf3ead5d3caea0730de Mon Sep 17 00:00:00 2001 From: heck Date: Thu, 7 Nov 2024 00:38:37 +0100 Subject: [PATCH] Buttons (Rec,Clear) mnigrate to using libdizzy 'Cache' and 'PeriodicTaskCT' --- src/main_osp.cc | 133 +++++++++++++++++++++++++++++++----------------- 1 file changed, 85 insertions(+), 48 deletions(-) diff --git a/src/main_osp.cc b/src/main_osp.cc index a7143e4..4d7ef5d 100644 --- a/src/main_osp.cc +++ b/src/main_osp.cc @@ -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{}; + + + //------------------------------------------------- + // MIDI LOGGER + //------------------------------------------------- + void task_logger_midi_print_func(u32) + { logger_midi.print(); } - dz::PeriodicTaskCT task_heartbeat{}; dz::PeriodicTaskCT task_logger_midi_print{}; + //------------------------------------------------- + // REC BUTTON + //------------------------------------------------- + bool but_rec_update() + { + but_rec.Debounce(); + return but_rec.Pressed(); + } + + void but_rec_changed(dz::Cache& 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 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{}; + + + //------------------------------------------------- + // CLEAR BUTTON + //------------------------------------------------- + bool but_clear_update() + { + but_clear.Debounce(); + return but_clear.Pressed(); + } + + void but_clear_changed(dz::Cache& 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 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_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); }