Files
RP2350_MIDI_Lighter/Firmware/Command_Definition.h
Chris 128d42c586 - Fixed drawing of round objects (Circles, Rounded Rects) using a lookup table
- Added function to read out the display_buffer via USB-Serial
 - Added basic structure and files for later complete firmware (still in progress)
 - Added Doc folder with schematic in it
 - Added Python script and batch file to read out the display buffer and open the image in gimp
2025-09-07 08:55:39 +02:00

292 lines
6.8 KiB
C

/*
* Command_Definition.h
*
* Created: Wed Dec 08 2021 14:05:35
* Author Chris
*/
#ifndef COMMAND_DEFINITION_H_
#define COMMAND_DEFINITION_H_
// ============================================================================================
// Includes
#include <stdint.h>
#include "pico/types.h"
#include "pico/binary_info.h"
/////////////////////
// General Defines //
/////////////////////
#define NUM_LED_CHANNELS 1
#define NUM_LED_COLORS 3
#define RECEIVED_MIDI_HISTORY_BUFFER_SIZE 30
#define HISTORY_ENTRY_UNDEFINED -1
#define NOTES_PER_OCTAVE 12
#define TIMER_INTERVALL_LED_UPDATE_ms 10
#define FADE_SPEED_MAX 20
#define FADE_SPEED_MIN 1
#define PAUSE_LIGHT_DELAY_MAX_s 60
#define PAUSE_LIGHT_DELAY_MIN_s 1
#define SCREEN_TIMEOUT_MAX_s 600
#define SCREEN_TIMEOUT_MIN_s 0
#define CONFIRMATION_COUNTER_TICKS 24
#define NO_NOTE -1
#define CHANNEL_NAME_MAX_LENGTH 8
#define THRESHOLD_NO_SUPPLY_mV 1000
#define THRESHOLD_UNDERVOLTAGE_mV 11500
#define THRESHOLD_OVERVOLTAGE_mV 12500
#define THRESHOLD_MEASUREMENT_MAX_DEVIATION_mV 1000
//////////////////////
// Jam Mode Defines //
//////////////////////
#define COLOR_CHANGE_MAX 20
#define COLOR_CHANGE_MIN 1
#define DURATION_MAX_s 200
#define DURATION_MIN_s 1
/////////////////////
// Command Defines //
/////////////////////
#define MULTICORE_COMMAND_EMPTY 0
#define MULTICORE_NO_PARAMETER 0
// General //
#define MULTICORE_COMMAND_SET_MIDI_TO_LIGHT_ENABLED 'A'
// Direct Control //
#define MULTICORE_COMMAND_SET_DIRECT_RED 'B'
#define MULTICORE_COMMAND_SET_DIRECT_GREEN 'C'
#define MULTICORE_COMMAND_SET_DIRECT_BLUE 'D'
#define MULTICORE_COMMAND_SET_DIRECT_FADE_SPEED 'E'
// Voltage Supervision //
#define MULTICORE_COMMAND_SET_INA260_BUSVOLTAGE 'F'
#define MULTICORE_COMMAND_GET_ANALOG_VOLTAGE 'a'
#define MULTICORE_COMMAND_GET_LED_POWER_ERROR 'b'
// ============================================================================================
// Datatypes
/////////////////////
// Data Structrues //
/////////////////////
typedef int8_t Note_t;
typedef uint8_t Value_t;
typedef union
{
uint Data;
struct Command_s
{
uint8_t Command;
uint8_t Parameter;
int16_t Value;
} Fields;
} Command_u;
typedef union
{
struct
{
uint8_t Gap;
uint8_t B;
uint8_t R;
uint8_t G;
};
uint8_t Array[4];
uint Pixel;
} __packed LED_Data_t;
typedef struct {
int16_t Data;
uint64_t Timestamp_ms;
} History_Buffer_t;
typedef struct {
uint8_t Event;
Note_t Note;
Note_t Note_In_Octave;
uint8_t Velocity;
uint64_t Timestamp_ms;
} Info_Last_Received_Note_t;
typedef struct
{
uint8_t MIDI_Channel;
int8_t Octave;
uint8_t Note_Color_Red;
uint8_t Note_Color_Green;
uint8_t Note_Color_Blue;
uint8_t Skip_Note_Off_Event;
} __packed Channel_MIDI_Configuration_s;
typedef struct
{
uint8_t Enabled;
LED_Data_t Color;
uint Timeout;
uint8_t Reset_Condition;
uint8_t Fade_Speed;
} __packed Pause_Light_Configuration_s;
typedef struct
{
uint Timer;
bool Is_Active;
} Pause_Light_Timer_s;
typedef uint16_t Duration_t;
typedef struct
{
Duration_t Duration_Min_s;
Duration_t Duration_Max_s;
int Hue_Angle_Start_Color;
uint Color_Change;
uint8_t Fade_Speed;
} __packed Jam_Light_Configuration_s;
typedef struct
{
LED_Data_t Color;
uint8_t Fade_Speed;
} __packed Const_Light_Configuration_s;
//////////////////
// Enumerations //
//////////////////
enum LED_Channel
{
LED_Channel_1 = 0
};
enum LED_Color
{
Red = 0, R = 0, Any = 0,
Green = 1, G = 1,
Blue = 2, B = 2
};
enum Pause_Light_Reset_Condition_e
{
ANY_TRAFFIC,
CHANNEL_MATCH,
EVENT_MATCH,
CHANNEL_AND_EVENT_MATCH
};
typedef enum Pause_Light_Reset_Condition_e Pause_Light_Reset_Condition;
enum MIDI_Channel_e
{
MIDI_CHANNEL_1 = 0,
MIDI_CHANNEL_2 = 1,
MIDI_CHANNEL_3 = 2,
MIDI_CHANNEL_4 = 3,
MIDI_CHANNEL_5 = 4,
MIDI_CHANNEL_6 = 5,
MIDI_CHANNEL_7 = 6,
MIDI_CHANNEL_8 = 7,
MIDI_CHANNEL_9 = 8,
MIDI_CHANNEL_10 = 9,
MIDI_CHANNEL_11 = 10,
MIDI_CHANNEL_12 = 11,
MIDI_CHANNEL_13 = 12,
MIDI_CHANNEL_14 = 13,
MIDI_CHANNEL_15 = 14,
MIDI_CHANNEL_16 = 15
};
typedef enum MIDI_Channel_e MIDI_Channel;
enum Octave_Note_e
{
NOTE_C = 0,
NOTE_CS = 1,
NOTE_D = 2,
NOTE_DS = 3,
NOTE_E = 4,
NOTE_F = 5,
NOTE_FS = 6,
NOTE_G = 7,
NOTE_GS = 8,
NOTE_A = 9,
NOTE_AS = 10,
NOTE_B = 11
};
typedef enum Octave_Note_e Octave_Note;
enum Idle_Screen
{
IDLE_SCREEN_BLACK,
IDLE_SCREEN_LOGO,
IDLE_SCREEN_CURRENT_MODE,
IDLE_SCREEN_MODE_ACTIVITY
};
//////////////////////////////
// MIDI Messages Definition //
//////////////////////////////
// Upper Byte
#define MIDI_EVENT_NOTE_OFF 0x8 // Note off
#define MIDI_EVENT_NOTE_ON 0x9 // Note on
#define MIDI_EVENT_POLYPHONIC_KEY_PRESSURE 0xA // Polyphonic Key Pressure
#define MIDI_EVENT_CONTROL_CHANGE 0xB // Control Change
#define MIDI_EVENT_PROGRAM_CHANGE 0xC // Program Change
#define MIDI_EVENT_CHANNEL_PRESSURE 0xD // Channel Pressure
#define MIDI_EVENT_PITCH_BEND 0xE // Pitch Bend Change
#define MIDI_EVENT_SYSTEM 0xF // System Messages
// Lower Byte in case of System Event
#define MIDI_SYSTEM_EXCLUSIVE 0x0 // System Exclusive Messages
#define MIDI_SYSTEM_TIME_CODE_QUARTER_FRAME 0x1 // MIDI Time Code Quarter Frame
#define MIDI_SYSTEM_SONG_POSITION_POINTER 0x2 // Song Position Pointer
#define MIDI_SYSTEM_SONG_SELECT 0x3 // Song Select
#define MIDI_SYSTEM_UNDEFINED_1 0x4 // Undefined. (Reserved)
#define MIDI_SYSTEM_UNDEFINED_2 0x5 // Undefined. (Reserved)
#define MIDI_SYSTEM_TUNE_REQUEST 0x6 // System Tune Request
#define MIDI_SYSTEM_EXCLUSIVE_END 0x7 // End of Exclusive
#define MIDI_SYSTEM_TIMING_CLOCK 0x8 // Timing Clock
#define MIDI_SYSTEM_UNDEFINED_3 0x9 // Undefined. (Reserved)
#define MIDI_SYSTEM_START 0xA // Start Sequence
#define MIDI_SYSTEM_CONTINUE 0xB // Continue Sequence
#define MIDI_SYSTEM_STOP 0xC // Stop Sequence
#define MIDI_SYSTEM_UNDEFINED_4 0xD // Undefined. (Reserved)
#define MIDI_SYSTEM_ACTIVE_SENSING 0xE // Active Sensing (Keep Alive)
#define MIDI_SYSTEM_RESET 0xF // Reset
/////////////////////////////////////////
// Helping functions parsing MIDI Data //
/////////////////////////////////////////
#define IS_MIDI_COMMAND(__C__) ((__C__ & 0x80) > 0)
#define IS_MIDI_DATA(__D__) ((__D__ & 0x80) == 0)
#define MIDI_EVENT_FROM_COMMAND(__C__) ((__C__ & 0xF0) >> 4)
#define MIDI_CHANNEL_FROM_COMMAND(__C__) (__C__ & 0x0F)
#define IS_MIDI_COMMAND_WITH_CHANNEL(__C__) (MIDI_EVENT_FROM_COMMAND(__C__) >= MIDI_EVENT_NOTE_OFF && MIDI_EVENT_FROM_COMMAND(__C__) <= MIDI_EVENT_PITCH_BEND)
// ============================================================================================
// Function Declarations
#endif /* COMMAND_DEFINITION_H_ */