diff --git a/src/app/foldhaus_app.h b/src/app/foldhaus_app.h index a8eb0f1..f9813fe 100644 --- a/src/app/foldhaus_app.h +++ b/src/app/foldhaus_app.h @@ -82,6 +82,17 @@ internal void OpenColorPicker(app_state* State, v4* Address); #include "engine/assembly/foldhaus_assembly.cpp" +internal assembly* +LoadAssembly(gs_const_string Path, app_state* State, context Context) +{ + return LoadAssembly(&State->Assemblies, + &State->LedSystem, + State->Transient, + Context, + Path, + State->GlobalLog); +} + #include "engine/user_space.cpp" #include "patterns/blumen_patterns.h" diff --git a/src/app/ss_blumen_lumen/blumen_lumen.cpp b/src/app/ss_blumen_lumen/blumen_lumen.cpp index 404a0c0..2c91b5b 100644 --- a/src/app/ss_blumen_lumen/blumen_lumen.cpp +++ b/src/app/ss_blumen_lumen/blumen_lumen.cpp @@ -57,16 +57,25 @@ DEBUG_SentMotorCommand(motor_packet Packet, gs_thread_context Ctx) } internal void -DEBUG_ReceivedMotorPositions(motor_packet Packet, gs_thread_context Ctx) +DEBUG_ReceivedMotorPositions(motor_packet NewPos, + motor_packet LastPos, + gs_thread_context Ctx) { - gs_string Str = PushStringF(Ctx.Transient, 256, "Motor Status Received\nCurrent Positions: %d %d %d\n", - Packet.FlowerPositions[0], - Packet.FlowerPositions[1], - Packet.FlowerPositions[2]); - DEBUG_AppendText(Str, Ctx); + bool PosChanged = (LastPos.FlowerPositions[0] != NewPos.FlowerPositions[0] || + LastPos.FlowerPositions[1] != NewPos.FlowerPositions[1] || + LastPos.FlowerPositions[2] != NewPos.FlowerPositions[2]); - NullTerminate(&Str); - OutputDebugStringA(Str.Str); + if (PosChanged) + { + gs_string Str = PushStringF(Ctx.Transient, 256, "Motor Status Received\nCurrent Positions: %d %d %d\n", + NewPos.FlowerPositions[0], + NewPos.FlowerPositions[1], + NewPos.FlowerPositions[2]); + DEBUG_AppendText(Str, Ctx); + + NullTerminate(&Str); + OutputDebugStringA(Str.Str); + } } // KB(1) is just bigger than any packet we send. Good for now @@ -261,34 +270,27 @@ BlumenLumen_CustomInit(app_state* State, context Context) BLState->MicListenThread = CreateThread(Context.ThreadManager, BlumenLumen_MicListenJob, (u8*)&BLState->MicListenJobData); #endif -#if 0 - gs_const_string SculpturePath = ConstString("data/test_blumen.fold"); - LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath, State->GlobalLog); -#else - gs_const_string SculpturePath0 = ConstString("data/ss_blumen_one.fold"); - gs_const_string SculpturePath1 = ConstString("data/ss_blumen_two.fold"); - gs_const_string SculpturePath2 = ConstString("data/ss_blumen_three.fold"); - assembly* Flower0 = LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath0, State->GlobalLog); - assembly* Flower1 = LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath1, State->GlobalLog); - assembly* Flower2 = LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath2, State->GlobalLog); + assembly* Flower0 = LoadAssembly(Flower0AssemblyPath, State, Context); + assembly* Flower1 = LoadAssembly(Flower1AssemblyPath, State, Context); + assembly* Flower2 = LoadAssembly(Flower2AssemblyPath, State, Context); BLState->AssemblyNameToClearCoreMapCount = 3; BLState->AssemblyNameToClearCore_Names = PushArray(&State->Permanent, u64, BLState->AssemblyNameToClearCoreMapCount); - BLState->AssemblyNameToClearCore_Names[0] = HashDJB2ToU32(StringExpand(Flower0->Name)); - BLState->AssemblyNameToClearCore_Names[1] = HashDJB2ToU32(StringExpand(Flower1->Name)); - BLState->AssemblyNameToClearCore_Names[2] = HashDJB2ToU32(StringExpand(Flower2->Name)); -#endif + BLState->AssemblyNameToClearCore_Names[0] = HashDJB2ToU64(Flower0->Name); + BLState->AssemblyNameToClearCore_Names[1] = HashDJB2ToU64(Flower1->Name); + BLState->AssemblyNameToClearCore_Names[2] = HashDJB2ToU64(Flower2->Name); - { - gs_file ColorPhraseCSVFile = ReadEntireFile(Context.ThreadContext.FileHandler, ConstString("data/flower_codes.tsv")); - gs_const_string ColorPhraseMapStr = ConstString((char*)ColorPhraseCSVFile.Memory, - ColorPhraseCSVFile.Size); - gscsv_sheet ColorPhraseSheet = CSV_Parse(ColorPhraseMapStr, { '\t' }, State->Transient); - - BLState->PhraseHueMap = PhraseHueMap_GenFromCSV(ColorPhraseSheet, &State->Permanent); - } + gs_file_handler FileHandler = Context.ThreadContext.FileHandler; + gs_file ColorPhraseCSVFile = ReadEntireFile(FileHandler, PhraseMapCSVPath); + gs_const_string ColorPhraseMapStr = DataToString(ColorPhraseCSVFile.Data); + gscsv_sheet ColorPhraseSheet = CSV_Parse(ColorPhraseMapStr, + { PhraseMapCSVSeparator }, + State->Transient); + + BLState->PhraseHueMap = PhraseHueMap_GenFromCSV(ColorPhraseSheet, + &State->Permanent); #if 1 { // Animation PLAYGROUND @@ -343,19 +345,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) bool SendMotorCommand = false; blumen_packet MotorCommand = {}; -#if 0 - MotorTimeElapsed += Context->DeltaTime; - BLState->TimeElapsed += Context->DeltaTime; - - if (BLState->TimeElapsed > 5) - { - u32 NextIndex = ++BLState->CurrAnim % 3; - animation_handle Next = BLState->AnimHandles[NextIndex]; - AnimationFadeGroup_FadeTo(&State->AnimationSystem.ActiveFadeGroup, Next, 5); - BLState->TimeElapsed = 0; - } -#endif - while (MessageQueue_CanRead(BLState->IncomingMsgQueue)) { gs_data PacketData = MessageQueue_Read(&BLState->IncomingMsgQueue); @@ -406,12 +395,7 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) T[1] << 0); motor_packet LastPos = BLState->LastKnownMotorState; - if (LastPos.FlowerPositions[0] != Motor.Pos.FlowerPositions[0] || - LastPos.FlowerPositions[1] != Motor.Pos.FlowerPositions[1] || - LastPos.FlowerPositions[2] != Motor.Pos.FlowerPositions[2]) - { - DEBUG_ReceivedMotorPositions(Motor.Pos, Context->ThreadContext); - } + DEBUG_ReceivedMotorPositions(LastPos, Motor.Pos, Context->ThreadContext); BLState->LastKnownMotorState = Motor.Pos; }break; @@ -429,7 +413,8 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) BLState->BrightnessPercent = 1.f; } - gs_string TempStr = PushStringF(State->Transient, 256, "\nTemperature: %d\n", + gs_string TempStr = PushStringF(State->Transient, 256, + "\nTemperature: %d\n", Temp.Temperature); NullTerminate(&TempStr); OutputDebugStringA(TempStr.Str); @@ -441,10 +426,8 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) // Open / Close the Motor - if (MessageQueue_CanWrite(BLState->OutgoingMsgQueue)) { -#if 1 for (u32 i = 0; i < MotorOpenTimesCount; i++) { time_range Range = MotorOpenTimes[i]; @@ -487,7 +470,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) MotorCommand = Packet; } } -#endif if (SendMotorCommand) { @@ -497,8 +479,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) } } // Dim the leds based on temp data -#define DIM_LED_BRIGHTNESS 1 -#if DIM_LED_BRIGHTNESS for (u32 i = 0; i < State->LedSystem.BuffersCount; i++) { led_buffer Buffer = State->LedSystem.Buffers[i]; @@ -517,11 +497,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) motor_packet CurrMotorPos = BLState->LastKnownMotorState; for (u32 a = 0; a < State->Assemblies.Count; a++) { - // TODO(PS): make sure to align which assembly goes with which - // flower index - bool FlowerIsOpen = BLState->LastKnownMotorState.FlowerPositions[a] == 2; - //if (!FlowerIsOpen) continue; - assembly Assembly = State->Assemblies.Values[a]; u64 AssemblyCCIndex = GetCCIndex(Assembly, BLState); @@ -547,7 +522,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) } } } -#endif // Send Status Packet { diff --git a/src/app/ss_blumen_lumen/blumen_lumen.h b/src/app/ss_blumen_lumen/blumen_lumen.h index c8fd808..b23378d 100644 --- a/src/app/ss_blumen_lumen/blumen_lumen.h +++ b/src/app/ss_blumen_lumen/blumen_lumen.h @@ -128,53 +128,6 @@ SystemTimeIsInTimeRange(system_time SysTime, time_range Range) return Result; } -global time_range MotorOpenTimes[] = { - { 00, 30, 00, 40 }, - { 00, 50, 01, 00 }, - { 01, 10, 01, 20 }, - { 01, 30, 01, 40 }, - { 01, 50, 02, 00 }, - { 02, 10, 02, 20 }, - { 02, 30, 02, 40 }, - { 02, 50, 03, 00 }, - { 03, 10, 03, 20 }, - { 03, 30, 03, 40 }, - { 03, 50, 04, 00 }, - { 04, 10, 04, 20 }, - { 04, 30, 04, 40 }, - { 04, 50, 05, 00 }, - { 05, 10, 05, 20 }, - { 05, 30, 05, 40 }, - { 05, 50, 06, 00 }, - { 06, 10, 06, 20 }, - { 06, 30, 06, 40 }, - { 06, 50, 07, 00 }, - { 07, 10, 07, 20 }, - { 07, 30, 07, 40 }, - { 07, 50, 8, 00 }, - { 8, 10, 8, 20 }, - { 8, 30, 8, 40 }, - { 8, 50, 9, 00 }, - { 9, 10, 9, 20 }, - { 9, 30, 9, 40 }, - { 9, 50, 10, 00 }, - { 10, 10, 10, 20 }, - { 10, 30, 10, 40 }, - { 10, 50, 11, 00 }, - { 11, 10, 11, 20 }, - { 11, 30, 11, 40 }, - { 11, 50, 12, 00 }, - { 12, 10, 12, 20 }, - { 12, 30, 12, 40 }, - { 12, 50, 13, 00 }, - { 13, 10, 13, 20 }, - { 13, 30, 13, 40 }, - { 13, 50, 14, 00 }, - { 14, 10, 14, 20 }, - { 14, 30, 14, 40 }, - { 14, 50, 15, 00 }, -}; -global u32 MotorOpenTimesCount = sizeof(MotorOpenTimes) / sizeof(MotorOpenTimes[0]);; struct phrase_string_to_anim_file { @@ -193,6 +146,8 @@ phrase_string_to_anim_file PhraseToAnimMap[] = { }; u32 PhraseToAnimMapCount = sizeof(PhraseToAnimMap) / sizeof(PhraseToAnimMap[0]); +#include "blumen_lumen_settings.h" + struct blumen_lumen_state { bool Running; diff --git a/src/app/ss_blumen_lumen/blumen_lumen_settings.h b/src/app/ss_blumen_lumen/blumen_lumen_settings.h new file mode 100644 index 0000000..4849ddf --- /dev/null +++ b/src/app/ss_blumen_lumen/blumen_lumen_settings.h @@ -0,0 +1,61 @@ +/* date = March 27th 2021 2:50 pm */ + +#ifndef BLUMEN_LUMEN_SETTINGS_H +#define BLUMEN_LUMEN_SETTINGS_H + +gs_const_string Flower0AssemblyPath = ConstString("data/ss_blumen_one.fold"); +gs_const_string Flower1AssemblyPath = ConstString("data/ss_blumen_two.fold"); +gs_const_string Flower2AssemblyPath = ConstString("data/ss_blumen_three.fold"); + +gs_const_string PhraseMapCSVPath = ConstString("data/flower_codes.tsv"); +char PhraseMapCSVSeparator = '\t'; + +global time_range MotorOpenTimes[] = { + { 00, 30, 00, 40 }, + { 00, 50, 01, 00 }, + { 01, 10, 01, 20 }, + { 01, 30, 01, 40 }, + { 01, 50, 02, 00 }, + { 02, 10, 02, 20 }, + { 02, 30, 02, 40 }, + { 02, 50, 03, 00 }, + { 03, 10, 03, 20 }, + { 03, 30, 03, 40 }, + { 03, 50, 04, 00 }, + { 04, 10, 04, 20 }, + { 04, 30, 04, 40 }, + { 04, 50, 05, 00 }, + { 05, 10, 05, 20 }, + { 05, 30, 05, 40 }, + { 05, 50, 06, 00 }, + { 06, 10, 06, 20 }, + { 06, 30, 06, 40 }, + { 06, 50, 07, 00 }, + { 07, 10, 07, 20 }, + { 07, 30, 07, 40 }, + { 07, 50, 8, 00 }, + { 8, 10, 8, 20 }, + { 8, 30, 8, 40 }, + { 8, 50, 9, 00 }, + { 9, 10, 9, 20 }, + { 9, 30, 9, 40 }, + { 9, 50, 10, 00 }, + { 10, 10, 10, 20 }, + { 10, 30, 10, 40 }, + { 10, 50, 11, 00 }, + { 11, 10, 11, 20 }, + { 11, 30, 11, 40 }, + { 11, 50, 12, 00 }, + { 12, 10, 12, 20 }, + { 12, 30, 12, 40 }, + { 12, 50, 13, 00 }, + { 13, 10, 13, 20 }, + { 13, 30, 13, 40 }, + { 13, 50, 14, 00 }, + { 14, 10, 14, 20 }, + { 14, 30, 14, 40 }, + { 14, 50, 15, 00 }, +}; +global u32 MotorOpenTimesCount = CArrayLength(MotorOpenTimes); + +#endif //BLUMEN_LUMEN_SETTINGS_H diff --git a/src/gs_libs/gs_types.cpp b/src/gs_libs/gs_types.cpp index 04fabd6..64dec4a 100644 --- a/src/gs_libs/gs_types.cpp +++ b/src/gs_libs/gs_types.cpp @@ -1390,6 +1390,13 @@ internal gs_data StringToData(gs_string String) { return StringToData(String.ConstString); } +internal gs_const_string DataToString(gs_data Data) +{ + gs_const_string Result = {}; + Result.Str = (char*)Data.Memory; + Result.Length = Data.Size; + return Result; +} internal bool IsSlash(char C) { return ((C == '/') || (C == '\\')); } internal bool IsUpper(char C) { return(('A' <= C) && (C <= 'Z')); } @@ -3783,6 +3790,16 @@ HashDJB2ToU32(u32 Length, char* String) } return Hash; } +internal u32 +HashDJB2ToU32(gs_const_string Str) +{ + return HashDJB2ToU32(StringExpand(Str)); +} +internal u32 +HashDJB2ToU32(gs_string Str) +{ + return HashDJB2ToU32(StringExpand(Str)); +} internal u64 HashDJB2ToU64(char* String) @@ -3805,6 +3822,16 @@ HashDJB2ToU64(u32 Length, char* String) } return Hash; } +internal u64 +HashDJB2ToU64(gs_const_string Str) +{ + return HashDJB2ToU64(StringExpand(Str)); +} +internal u64 +HashDJB2ToU64(gs_string Str) +{ + return HashDJB2ToU64(StringExpand(Str)); +} /////////////////////////// // diff --git a/src/gs_libs/gs_types.h b/src/gs_libs/gs_types.h index 5006ffe..293dbf2 100644 --- a/src/gs_libs/gs_types.h +++ b/src/gs_libs/gs_types.h @@ -273,6 +273,8 @@ Glue(gs_AssertFail_, __LINE__) = 1 / (int)(!!(c)), \ #define IsPowerOfTwo(x) (((x) & ((x) - 1)) == 0) #define IsOdd(x) (((x) & 1) != 0) +#define CArrayLength(arr) (sizeof(arr) / (sizeof(arr[0]))) + internal void ZeroMemory_(u8* Memory, u64 Size) {