Lumenarium/src/app/ss_blumen_lumen/blumen_lumen.h

232 lines
3.8 KiB
C

//
// File: blumen_lumen.h
// Author: Peter Slattery
// Creation Date: 2021-01-15
//
#ifndef BLUMEN_LUMEN_H
enum bl_python_packet_type
{
PacketType_Invalid = 0,
PacketType_PatternCommand = 1,
PacketType_MotorState = 2,
PacketType_Temperature = 3,
PacketType_LumenariumStatus = 4,
};
#pragma pack(push, 1)
typedef struct motor_packet
{
u8 FlowerPositions[3];
} motor_packet;
typedef struct motor_status_packet
{
motor_packet Pos;
/*
u8 Motor1Pos;
u8 Motor2Pos;
u8 Motor3Pos;
*/
u8 MotorStatus[3];
u16 Temperature;
} motor_status_packet;
typedef struct microphone_packet
{
b8 ChangeAnimation;
char AnimationFileName[32];
b8 SetLayer;
char LayerName[32];
r32 LayerOpacity;
b8 SetLayerParamColor;
char LayerParamColor[7];
r32 OverrideDuration;
} microphone_packet;
typedef struct temp_packet
{
s8 Temperature;
} temp_packet;
enum motor_event_type
{
MotorEvent_Close = 0,
MotorEvent_Open = 1,
};
typedef struct status_packet
{
u8 NextMotorEventType;
// u16 Padding;
u32 NextEventTime;
char AnimFileName[32];
} status_packet;
typedef struct blumen_packet
{
u8 Type;
union
{
motor_packet MotorPacket;
motor_status_packet MotorStatusPacket;
microphone_packet MicPacket;
temp_packet TempPacket;
status_packet StatusPacket;
};
} blumen_packet;
#pragma pack(pop)
#define BLUMEN_MESSAGE_QUEUE_COUNT 32
typedef struct blumen_network_msg_queue
{
gs_data Buffers[BLUMEN_MESSAGE_QUEUE_COUNT];
u32 WriteHead;
u32 ReadHead;
} blumen_network_msg_queue;
// TODO(pjs): Refactor this -> blumen_network_job_state
struct mic_listen_job_data
{
bool* Running;
platform_socket_manager* SocketManager;
blumen_network_msg_queue* IncomingMsgQueue;
platform_socket_handle_ ListenSocket;
blumen_network_msg_queue* OutgoingMsgQueue;
};
typedef struct time_range
{
s32 StartHour;
s32 StartMinute;
s32 EndHour;
s32 EndMinute;
} time_range;
internal bool
SystemTimeIsInTimeRange(system_time SysTime, time_range Range)
{
bool Result = (SysTime.Hour >= Range.StartHour &&
SysTime.Minute >= Range.StartMinute &&
SysTime.Hour <= Range.EndHour &&
SysTime.Minute <= Range.EndMinute);
return Result;
}
global time_range MotorOpenTimes[] = {
{ 17, 56, 17, 56 },
{ 17, 58, 17, 56 },
{ 18, 00, 18, 00 },
};
global u32 MotorOpenTimesCount = 3;
struct phrase_string_to_anim_file
{
char* Phrase;
u32 PatternIndex;
};
phrase_string_to_anim_file PhraseToAnimMap[] = {
{ "begonia", 0},
{ "hyacinth", 1 },
{ "tulip", 1 },
{ "calla lilly", 0 },
{ "sunflower", 1 },
{ "salvia", 2 },
{ "freesia", 2 },
};
u32 PhraseToAnimMapCount = sizeof(PhraseToAnimMap) / sizeof(PhraseToAnimMap[0]);
struct blumen_lumen_state
{
bool Running;
blumen_network_msg_queue IncomingMsgQueue;
blumen_network_msg_queue OutgoingMsgQueue;
temp_job_req JobReq;
platform_thread_handle MicListenThread;
mic_listen_job_data MicListenJobData;
motor_packet LastKnownMotorState;
r64 TimeElapsed;
animation_handle AnimHandles[3];
u32 CurrAnim;
// NOTE(pjs): Based on temperature data from weatherman
// dim the leds.
r32 BrightnessPercent;
system_time LastStatusUpdateTime;
system_time LastSendTime;
};
// If you change anything, exit lumenarium if its running
// then in this application hit f1 to compile then
// go to remedybg (the debugger) and hit f5
// don't touch this
u8 LastPosition = 1;
u8 ClosedValue = 1;
u8 OpenValue = 2;
r64 MotorTimeElapsed = 0;
r64 OpenClosePeriod = 15.0f;
#define BLUMEN_LUMEN_H
#endif // BLUMEN_LUMEN_H