Files
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

158 lines
4.0 KiB
C

/*
* Command.c
*
* Created: Thu Oct 13 2022 16:37:17
* Author Chris
*/
// ============================================================================================
// Includes
#include "Command.h"
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "hardware/irq.h"
// ============================================================================================
// Defines
#define COMMAND_BUFFER_SIZE 16
#define INVALID -1
// ============================================================================================
// Variables
static Command_u _Command_Buffer[COMMAND_BUFFER_SIZE];
// ============================================================================================
// Function Declarations
void Command_Send_Multicore_Command(uint8_t command, uint8_t parameter, uint16_t value);
void Command_Add_Multicore_Command_To_Buffer(uint command);
/*******************************************************************
Interrupt Service Routines
*******************************************************************/
void ISR_MULTICORE_READ()
{
uint32_t Multicore_Data;
// Just record the latest entry
while(multicore_fifo_rvalid())
{
Multicore_Data = multicore_fifo_pop_blocking();
Command_Add_Multicore_Command_To_Buffer(Multicore_Data);
}
multicore_fifo_clear_irq();
}
/*******************************************************************
Functions
*******************************************************************/
void Command_Init()
{
for(uint i=0;i<COMMAND_BUFFER_SIZE;i++)
{
_Command_Buffer[i].Data = MULTICORE_COMMAND_EMPTY;
}
irq_set_exclusive_handler(SIO_FIFO_IRQ_NUM(0), ISR_MULTICORE_READ);
irq_set_enabled(SIO_FIFO_IRQ_NUM(0), true);
}
void Command_Issue_Get_Request(uint8_t command, uint8_t parameter)
{
Command_Send_Multicore_Command(command, parameter, 0);
}
void Command_Issue_Set_Request(uint8_t command, uint8_t parameter, uint16_t value)
{
Command_Send_Multicore_Command(command, parameter, value);
}
int Command_Get_Request_Response_By_Command_Only(uint8_t command, int timeout_us)
{
int Return_Value = INVALID;
uint64_t Timeout_Time_us = to_us_since_boot(get_absolute_time()) + timeout_us;
do
{
for(uint i=0;i<COMMAND_BUFFER_SIZE;i++)
{
if(_Command_Buffer[i].Fields.Command == command)
{
Return_Value = _Command_Buffer[i].Fields.Value;
_Command_Buffer[i].Data = MULTICORE_COMMAND_EMPTY;
}
}
} while (Return_Value == INVALID && Timeout_Time_us > to_us_since_boot(get_absolute_time()));
return Return_Value;
}
int Command_Get_Request_Response_By_Command_And_Parameter(uint8_t command, uint8_t parameter, int timeout_us)
{
int Return_Value = INVALID;
uint64_t Timeout_Time_us = to_us_since_boot(get_absolute_time()) + timeout_us;
do
{
for(uint i=0;i<COMMAND_BUFFER_SIZE;i++)
{
if(_Command_Buffer[i].Fields.Command == command && _Command_Buffer[i].Fields.Parameter == parameter)
{
Return_Value = _Command_Buffer[i].Fields.Value;
_Command_Buffer[i].Data = MULTICORE_COMMAND_EMPTY;
}
}
} while (Return_Value == INVALID && Timeout_Time_us > to_us_since_boot(get_absolute_time()));
return Return_Value;
}
uint Command_Get_Request_Response_Buffer_Fill_Count()
{
uint Fill_Count = 0;
for(uint i=0;i<COMMAND_BUFFER_SIZE;i++)
{
if(_Command_Buffer[i].Fields.Command != MULTICORE_COMMAND_EMPTY)
{
Fill_Count++;
}
}
return Fill_Count;
}
/*******************************************************************
Internal Functions
*******************************************************************/
void Command_Send_Multicore_Command(uint8_t command, uint8_t parameter, uint16_t value)
{
Command_u Command;
Command.Fields.Command = command;
Command.Fields.Parameter = parameter;
Command.Fields.Value = value;
multicore_fifo_push_blocking(Command.Data);
}
void Command_Add_Multicore_Command_To_Buffer(uint command)
{
for(uint i=0;i<COMMAND_BUFFER_SIZE;i++)
{
if(_Command_Buffer[i].Fields.Command == MULTICORE_COMMAND_EMPTY)
{
_Command_Buffer[i].Data = command;
return;
}
}
}