diff --git a/src/app/blumen_lumen.cpp b/src/app/blumen_lumen.cpp index 54a21ce..ccc04c1 100644 --- a/src/app/blumen_lumen.cpp +++ b/src/app/blumen_lumen.cpp @@ -9,11 +9,6 @@ // - need to request opening a network port and getting messages from it pumped into CustomUpdate // -struct foo_ -{ - u32 Heyo; -}; - internal gs_data BlumenLumen_CustomInit(app_state* State, context Context) { @@ -23,9 +18,10 @@ BlumenLumen_CustomInit(app_state* State, context Context) // the sculpture's CustomUpdate function; gs_data Result = {}; - Result = PushSizeToData(&State->Permanent, sizeof(foo_)); - foo_* MyFoo = (foo_*)Result.Memory; - MyFoo->Heyo = 5; + Result = PushSizeToData(&State->Permanent, sizeof(blumen_lumen_state)); + + blumen_lumen_state* BLState = (blumen_lumen_state*)Result.Memory; + BLState->JobReq.Memory = (u8*)&BLState->MicPacketBuffer; #if 1 gs_const_string SculpturePath = ConstString("data/test_blumen.fold"); @@ -41,7 +37,7 @@ BlumenLumen_CustomInit(app_state* State, context Context) Anim0.PlayableRange.Max = SecondsToFrames(15, State->AnimationSystem); Animation_AddLayer(&Anim0, MakeString("Base Layer"), BlendMode_Overwrite, &State->AnimationSystem); - Animation_AddBlock(&Anim0, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(5), 0); + Animation_AddBlock(&Anim0, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(11), 0); AnimationArray_Push(&State->AnimationSystem.Animations, Anim0); @@ -53,10 +49,22 @@ BlumenLumen_CustomInit(app_state* State, context Context) Anim1.PlayableRange.Max = SecondsToFrames(15, State->AnimationSystem); Animation_AddLayer(&Anim1, MakeString("Base Layer"), BlendMode_Overwrite, &State->AnimationSystem); - Animation_AddBlock(&Anim1, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(5), 0); + Animation_AddBlock(&Anim1, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(12), 0); AnimationArray_Push(&State->AnimationSystem.Animations, Anim1); + animation Anim2 = {0}; + Anim2.Name = PushStringF(&State->Permanent, 256, "i_love_you"); + Anim2.Layers = AnimLayerArray_Create(State->AnimationSystem.Storage, 8); + Anim2.Blocks_ = AnimBlockArray_Create(State->AnimationSystem.Storage, 8); + Anim2.PlayableRange.Min = 0; + Anim2.PlayableRange.Max = SecondsToFrames(15, State->AnimationSystem); + Animation_AddLayer(&Anim2, MakeString("Base Layer"), BlendMode_Overwrite, &State->AnimationSystem); + + Animation_AddBlock(&Anim2, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(10), 0); + + AnimationArray_Push(&State->AnimationSystem.Animations, Anim2); + State->AnimationSystem.TimelineShouldAdvance = true; } // End Animation Playground @@ -66,8 +74,42 @@ BlumenLumen_CustomInit(app_state* State, context Context) internal void BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) { - foo_* MyFoo = (foo_*)UserData.Memory; - Assert(MyFoo->Heyo == 5); + blumen_lumen_state* BLState = (blumen_lumen_state*)UserData.Memory; + + gs_string BlueString = MakeString("blue"); + gs_string GreenString = MakeString("green"); + gs_string ILoveYouString = MakeString("i_love_you"); + + while (BLState->MicPacketBuffer.ReadHead != BLState->MicPacketBuffer.WriteHead) + { + gs_data PacketData = BLState->MicPacketBuffer.Values[BLState->MicPacketBuffer.ReadHead++]; + microphone_packet Packet = *(microphone_packet*)PacketData.Memory; + + u32 NameLen = CStringLength(Packet.AnimationFileName); + if (StringEqualsCharArray(BlueString.ConstString, Packet.AnimationFileName, NameLen)) + { + State->AnimationSystem.ActiveAnimationIndex = 0; + } + else if (StringEqualsCharArray(GreenString.ConstString, Packet.AnimationFileName, NameLen)) + { + State->AnimationSystem.ActiveAnimationIndex = 1; + } + else if (StringEqualsCharArray(ILoveYouString.ConstString, Packet.AnimationFileName, NameLen)) + { + State->AnimationSystem.ActiveAnimationIndex = 2; + } + + gs_string TempString = PushStringF(State->Transient, 256, "%.*s", 32, Packet.AnimationFileName); + NullTerminate(&TempString); + + OutputDebugStringA("Received\n"); + OutputDebugStringA(TempString.Str); + + if (BLState->MicPacketBuffer.ReadHead >= PACKETS_MAX) + { + BLState->MicPacketBuffer.ReadHead = 0; + } + } } diff --git a/src/app/blumen_lumen.h b/src/app/blumen_lumen.h index e93c247..25220bb 100644 --- a/src/app/blumen_lumen.h +++ b/src/app/blumen_lumen.h @@ -10,6 +10,26 @@ typedef struct motor_packet u8 FlowerPositions[3]; } motor_packet; +#pragma pack(push, 1) +struct microphone_packet +{ + b8 ChangeAnimation; + char AnimationFileName[32]; + b8 SetLayer; + char LayerName[32]; + r32 LayerOpacity; + b8 SetLayerParamColor; + char LayerParamColor[7]; + r32 OverrideDuration; +}; +#pragma pack(pop) + +struct blumen_lumen_state +{ + packet_ringbuffer MicPacketBuffer; + temp_job_req JobReq; +}; + #define BLUMEN_LUMEN_H #endif // BLUMEN_LUMEN_H \ No newline at end of file diff --git a/src/app/foldhaus_app.cpp b/src/app/foldhaus_app.cpp index f8fbe20..7bec2d8 100644 --- a/src/app/foldhaus_app.cpp +++ b/src/app/foldhaus_app.cpp @@ -27,6 +27,8 @@ ClearAndPushPatterns(animation_pattern_array* Patterns) Patterns_PushPattern(Patterns, Pattern_SmoothGrowRainbow); Patterns_PushPattern(Patterns, Pattern_GrowAndFade); Patterns_PushPattern(Patterns, Pattern_ColorToWhite); + Patterns_PushPattern(Patterns, Pattern_Blue); + Patterns_PushPattern(Patterns, Pattern_Green); } RELOAD_STATIC_DATA(ReloadStaticData) @@ -93,6 +95,10 @@ INITIALIZE_APPLICATION(InitializeApplication) State->AnimationSystem = AnimationSystem_Init(AnimSysDesc); State->UserData = BlumenLumen_CustomInit(State, Context); + + // TEMP + blumen_lumen_state* BLState = (blumen_lumen_state*)State->UserData.Memory; + return (temp_job_req*)&BLState->JobReq; } UPDATE_AND_RENDER(UpdateAndRender) diff --git a/src/app/foldhaus_app.h b/src/app/foldhaus_app.h index a6608dc..43f0f84 100644 --- a/src/app/foldhaus_app.h +++ b/src/app/foldhaus_app.h @@ -41,6 +41,8 @@ typedef struct panel panel; #include "engine/animation/foldhaus_animation_serializer.cpp" #include "engine/animation/foldhaus_animation_renderer.cpp" +#include "blumen_lumen.h" + struct app_state { gs_memory_arena Permanent; diff --git a/src/app/foldhaus_platform.h b/src/app/foldhaus_platform.h index 5778c7f..459c1af 100644 --- a/src/app/foldhaus_platform.h +++ b/src/app/foldhaus_platform.h @@ -50,7 +50,23 @@ typedef struct context context; // Application Functions -#define INITIALIZE_APPLICATION(name) void name(context Context) +// TODO(pjs): TEMP +typedef void temp_job_req_proc(gs_thread_context* Ctx, u8* Memory); +struct temp_job_req +{ + temp_job_req_proc* Proc; + u8* Memory; +}; +// This isn't necessarily temp but I'm not sure it goes here +#define PACKETS_MAX 32 +struct packet_ringbuffer +{ + gs_data Values[PACKETS_MAX]; + u32 ReadHead; + u32 WriteHead; +}; + +#define INITIALIZE_APPLICATION(name) temp_job_req* name(context Context) typedef INITIALIZE_APPLICATION(initialize_application); #define UPDATE_AND_RENDER(name) void name(context* Context, input_queue InputQueue, render_command_buffer* RenderBuffer, addressed_data_buffer_list* OutputData) @@ -200,6 +216,5 @@ struct context platform_get_socket_handle* PlatformGetSocketHandle; }; - #define FOLDHAUS_PLATFORM_H #endif // FOLDHAUS_PLATFORM_H \ No newline at end of file diff --git a/src/app/patterns/blumen_patterns.h b/src/app/patterns/blumen_patterns.h index 0560339..966587a 100644 --- a/src/app/patterns/blumen_patterns.h +++ b/src/app/patterns/blumen_patterns.h @@ -5,6 +5,29 @@ // #ifndef BLUMEN_PATTERNS_H +internal void +SolidColorPattern(led_buffer* Leds, pixel Color) +{ + for (u32 LedIndex = 0; LedIndex < Leds->LedCount; LedIndex++) + { + Leds->Colors[LedIndex] = Color; + } +} + +internal void +Pattern_Blue(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Transient, u8* UserData) +{ + pixel Blue = pixel{0, 0, 255}; + SolidColorPattern(Leds, Blue); +} + +internal void +Pattern_Green(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Transient, u8* UserData) +{ + pixel Green = pixel{0, 255, 0}; + SolidColorPattern(Leds, Green); +} + internal void TestPatternOne(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Transient, u8* UserData) { diff --git a/src/app/platform_win32/win32_foldhaus.cpp b/src/app/platform_win32/win32_foldhaus.cpp index 1e1dd7b..9fec14f 100644 --- a/src/app/platform_win32/win32_foldhaus.cpp +++ b/src/app/platform_win32/win32_foldhaus.cpp @@ -27,6 +27,8 @@ #include "../foldhaus_renderer.cpp" +#include "win32_test_code.cpp" + global b32 Running = false; global b32 WindowIsActive = false; @@ -423,26 +425,6 @@ Win32_SendAddressedDataBuffer_Job(gs_thread_context Context, gs_data Arg) Win32_SendAddressedDataBuffer(Context, OutputData); } -#pragma pack(push, 1) -struct test_microphone_packet -{ - b8 ChangeAnimation; - char AnimationFileName[32]; - b8 SetLayer; - char LayerName[32]; - r32 LayerOpacity; - b8 SetLayerParamColor; - char LayerParamColor[7]; - r32 OverrideDuration; -}; -#pragma pack(pop) - -inline u32 -UpackB4(const u8* ptr) -{ - return (u32)(ptr[3] | (ptr[2] << 8) | (ptr[1] << 16) | (ptr[0] << 24)); -} - internal bool ReloadAndLinkDLL(win32_dll_refresh* DLL, context* Context, gs_work_queue* WorkQueue, bool ShouldError) { @@ -524,7 +506,9 @@ WinMain ( addressed_data_buffer_list OutputData = AddressedDataBufferList_Create(ThreadContext); - Context.InitializeApplication(Context); + temp_job_req* Req = Context.InitializeApplication(Context); + Req->Proc = BlumenLumen_MicListenJob; + Win32_TestCode_SocketReading(ThreadContext, Req); Running = true; Context.WindowIsVisible = true; diff --git a/src/app/platform_win32/win32_test_code.cpp b/src/app/platform_win32/win32_test_code.cpp index b9fa377..8173e73 100644 --- a/src/app/platform_win32/win32_test_code.cpp +++ b/src/app/platform_win32/win32_test_code.cpp @@ -5,6 +5,7 @@ // #ifndef WIN32_TEST_CODE_CPP +#if 0 internal void Win32_TestCode_UART(gs_thread_context ThreadContext) { @@ -31,21 +32,45 @@ Win32_TestCode_UART(gs_thread_context ThreadContext) uart_footer* Footer = PushStructOnCursor(WriteCursor, uart_footer); UART_FillFooter(Footer, (u8*)Header); } +#endif -internal void -Win32_TestCode_SocketReading(gs_thread_context ThreadContext) +win32_socket ListenSocket; + +DWORD WINAPI +Win32_TestCode_ListenThreadProc(LPVOID ThreadData) { - win32_socket TestSocket = Win32Socket_ConnectToAddress("127.0.0.1", "20185"); - test_microphone_packet* Recv = 0; + gs_thread_context Ctx = Win32CreateThreadContext(); + + temp_job_req* Req = (temp_job_req*)ThreadData; + while (true) { - gs_data Data = Win32Socket_Receive(&TestSocket, ThreadContext.Transient); - if (Data.Size > 0) + Req->Proc(&Ctx, Req->Memory); + } +} + +internal void +Win32_TestCode_SocketReading(gs_thread_context ThreadContext, temp_job_req* Req) +{ + ListenSocket = Win32Socket_ConnectToAddress("127.0.0.1", "20185"); + u8* Arg = (u8*)Req; + HANDLE Handle = CreateThread(0, 0, &Win32_TestCode_ListenThreadProc, Arg, 0, 0); +} + +internal void +BlumenLumen_MicListenJob(gs_thread_context* Ctx, u8* UserData) +{ + packet_ringbuffer* MicPacketBuffer = (packet_ringbuffer*)UserData; + + gs_data Data = Win32Socket_Receive(&ListenSocket, Ctx->Transient); + if (Data.Size > 0) + { + OutputDebugStringA("Listened"); + MicPacketBuffer->Values[MicPacketBuffer->WriteHead++] = Data; + if (MicPacketBuffer->WriteHead >= PACKETS_MAX) { - OutputDebugStringA("Received\n"); - Recv = (test_microphone_packet*)Data.Memory; + MicPacketBuffer->WriteHead = 0; } - ClearArena(ThreadContext.Transient); } }