Files
RP2350_MIDI_Lighter/Firmware/Mode_Manager.c
Christian Leibold 43f37e0b57 - Added POGRAM CHANGES to switch Mode via MIDI
- Added Control Change to switch On/Off Pause Light
2025-11-24 09:37:03 +01:00

229 lines
7.1 KiB
C

/*
* Mode_Manager.c
*
* Created: Fri Jan 27 2023 22:13:26
* Author Chris
*/
// ============================================================================================
// Includes
#include "Mode_Manager.h"
#include "Hue.h"
#include "Command.h"
#include "Screens.h"
#include "EEPROM_M24C64.h"
#include "Command_Definition.h"
#include "Display_Default_Configurations.h"
#include "pico/rand.h"
// ============================================================================================
// Defines
#define TIME_INTERVAL_TICK_ms 40
#define TICKS_PER_SECOND (1000/TIME_INTERVAL_TICK_ms)
// ============================================================================================
// Variables
static volatile Mode _Current_Mode;
static volatile uint32_t _Jam_Current_Angle;
static volatile uint32_t _Jam_Next_Angle;
static volatile uint32_t _Jam_Duration_Until_Next_s;
static volatile uint32_t _Jam_Timer;
// ============================================================================================
// Function Declarations
void Mode_Manager_Jam_Mode_Init(void);
uint32_t Mode_Manager_Jam_Select_Next_Angle(uint32_t current_angle);
uint32_t Mode_Manager_Jam_Get_Duration(void);
void Mode_Manager_Jam_Set_Color(uint32_t angle);
void Mode_Manager_Jam_Step(void);
/*******************************************************************
Functions
*******************************************************************/
void Mode_Manager_Init(void)
{
_Current_Mode = MIDI;
}
void Mode_Manager_Tick(void)
{
Command_Issue_Get_Request(MULTICORE_COMMAND_GET_MODE_CHANGE_RECEIVED, 0);
bool New_Mode_Received = Command_Get_Request_Response_By_Command_Only(MULTICORE_COMMAND_GET_MODE_CHANGE_RECEIVED, 100) > 0;
if(New_Mode_Received) {
Command_Issue_Get_Request(MULTICORE_COMMAND_GET_MODE_CHANGE_NEW_MODE, 0);
_Current_Mode = Command_Get_Request_Response_By_Command_Only(MULTICORE_COMMAND_GET_MODE_CHANGE_NEW_MODE, 100);
Mode_Manager_Set_Mode(_Current_Mode);
Screen_Setup_Mode_Change(TRANSITION_NONE, TRANSITION_NONE, SCREEN_TRANSITION_DEFAULT_EASING, SCREEN_TRANSITION_DEFAULT_FRAMES, _Current_Mode);
return;
}
if(_Current_Mode != JAM) {
return;
}
if(_Jam_Timer >= _Jam_Duration_Until_Next_s * TICKS_PER_SECOND) {
Mode_Manager_Jam_Step();
}
_Jam_Timer++;
}
void Mode_Manager_Cycle_Mode(void)
{
_Current_Mode++;
if(_Current_Mode == PREVIEW) {
_Current_Mode = MIDI;
}
Mode_Manager_Set_Mode(_Current_Mode);
Screen_Setup_Mode_Change(TRANSITION_NONE, TRANSITION_NONE, SCREEN_TRANSITION_DEFAULT_EASING, SCREEN_TRANSITION_DEFAULT_FRAMES, _Current_Mode);
}
void Mode_Manager_Set_Mode(Mode mode)
{
switch (mode)
{
case MIDI:
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_MIDI_TO_LIGHT_ENABLED, MULTICORE_NO_PARAMETER, (uint16_t)true);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_RED , MULTICORE_NO_PARAMETER, 0);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_GREEN, MULTICORE_NO_PARAMETER, 0);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_BLUE , MULTICORE_NO_PARAMETER, 0);
break;
case JAM:
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_MIDI_TO_LIGHT_ENABLED, MULTICORE_NO_PARAMETER, (uint16_t)false);
Mode_Manager_Jam_Mode_Init();
break;
case CONSTANT:
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_MIDI_TO_LIGHT_ENABLED, MULTICORE_NO_PARAMETER, (uint16_t)false);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_FADE_SPEED, MULTICORE_NO_PARAMETER, (uint16_t)_EEPROM_Content.Const_Light_Configuration.Fade_Speed);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_RED , MULTICORE_NO_PARAMETER, _EEPROM_Content.Const_Light_Configuration.Color.R);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_GREEN, MULTICORE_NO_PARAMETER, _EEPROM_Content.Const_Light_Configuration.Color.G);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_BLUE , MULTICORE_NO_PARAMETER, _EEPROM_Content.Const_Light_Configuration.Color.B);
break;
case PREVIEW:
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_MIDI_TO_LIGHT_ENABLED, MULTICORE_NO_PARAMETER, (uint16_t)false);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_FADE_SPEED, MULTICORE_NO_PARAMETER, 2);
break;
default:
break;
}
}
Mode Mode_Manager_Get_Current_Mode(void)
{
return _Current_Mode;
}
void Mode_Manager_Set_Default_Color_Notes(void)
{
_EEPROM_Content.Channel_MIDI_Configuration[0].Note_Color_Red = NOTE_C;
_EEPROM_Content.Channel_MIDI_Configuration[0].Note_Color_Green = NOTE_D;
_EEPROM_Content.Channel_MIDI_Configuration[0].Note_Color_Blue = NOTE_E;
}
uint Mode_Manager_Jam_Get_Current_Angle()
{
return _Jam_Current_Angle;
}
uint Mode_Manager_Jam_Get_Next_Angle()
{
return _Jam_Next_Angle;
}
uint Mode_Manager_Jam_Get_Duration_s()
{
return _Jam_Duration_Until_Next_s;
}
uint Mode_Manager_Jam_Get_Duration_Tick()
{
return _Jam_Duration_Until_Next_s * TICKS_PER_SECOND;
}
uint Mode_Manager_Jam_Get_Time_Left_s()
{
return _Jam_Duration_Until_Next_s - (_Jam_Timer / TICKS_PER_SECOND);
}
uint Mode_Manager_Jam_Get_Time_Left_Tick()
{
return _Jam_Duration_Until_Next_s * TICKS_PER_SECOND - _Jam_Timer;
}
/*******************************************************************
Internal Functions
*******************************************************************/
/////////////////////////////
// Jam Mode Implementation //
/////////////////////////////
void Mode_Manager_Jam_Mode_Init(void)
{
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_FADE_SPEED, MULTICORE_NO_PARAMETER, _EEPROM_Content.Jam_Light_Configuration.Fade_Speed);
_Jam_Current_Angle = _EEPROM_Content.Jam_Light_Configuration.Hue_Angle_Start_Color % HUE_MAX_ANGLE;
_Jam_Duration_Until_Next_s = Mode_Manager_Jam_Get_Duration();
_Jam_Next_Angle = Mode_Manager_Jam_Select_Next_Angle(_Jam_Current_Angle);
_Jam_Timer = 0;
Mode_Manager_Jam_Set_Color(_Jam_Current_Angle);
}
uint32_t Mode_Manager_Jam_Select_Next_Angle(uint32_t current_angle)
{
uint32_t Random_Value = get_rand_32();
uint32_t Angle_Step = ((Random_Value & 0x07) + 1) * _EEPROM_Content.Jam_Light_Configuration.Color_Change;
return (current_angle + Angle_Step) % 360;
}
uint32_t Mode_Manager_Jam_Get_Duration(void)
{
uint32_t Duration_Span_s = _EEPROM_Content.Jam_Light_Configuration.Durations.Max - _EEPROM_Content.Jam_Light_Configuration.Durations.Min;
uint32_t Random_Value = get_rand_32();
uint32_t Factor = ((Random_Value & 0x07) << 4);
Duration_Span_s = (Duration_Span_s * Factor) / 112;
return _EEPROM_Content.Jam_Light_Configuration.Durations.Min + Duration_Span_s;
}
void Mode_Manager_Jam_Set_Color(uint32_t angle)
{
LED_Data_t Color;
Color.Pixel = Hue_Get_Color_From_Angle(angle);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_RED , MULTICORE_NO_PARAMETER, Color.R);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_GREEN, MULTICORE_NO_PARAMETER, Color.G);
Command_Issue_Set_Request(MULTICORE_COMMAND_SET_DIRECT_BLUE , MULTICORE_NO_PARAMETER, Color.B);
}
void Mode_Manager_Jam_Step(void)
{
_Jam_Current_Angle = _Jam_Next_Angle;
_Jam_Duration_Until_Next_s = Mode_Manager_Jam_Get_Duration();
_Jam_Next_Angle = Mode_Manager_Jam_Select_Next_Angle(_Jam_Current_Angle);
_Jam_Timer = 0;
Mode_Manager_Jam_Set_Color(_Jam_Current_Angle);
}