From 4a60aed70c3a04dafba471893922467c35276dc0 Mon Sep 17 00:00:00 2001 From: Andrew Dunai Date: Fri, 12 Apr 2024 15:55:33 +0300 Subject: [PATCH] keira: liltracker: add reserved bytes, change signature to LILT --- firmware/keira/src/apps/liltracker/note.h | 4 +-- .../keira/src/apps/liltracker/pattern.cpp | 11 ++++++++ firmware/keira/src/apps/liltracker/pattern.h | 9 ++++--- firmware/keira/src/apps/liltracker/track.cpp | 25 ++++++++++++++++--- firmware/keira/src/apps/liltracker/track.h | 1 + 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/firmware/keira/src/apps/liltracker/note.h b/firmware/keira/src/apps/liltracker/note.h index 98a8e0d1..43c0edf5 100644 --- a/firmware/keira/src/apps/liltracker/note.h +++ b/firmware/keira/src/apps/liltracker/note.h @@ -4,8 +4,8 @@ #include typedef struct noteinfo_t { - int index; // [0;11] - int octave; + uint8_t index; // [0;11] + uint8_t octave; char* toStr(); void add(int16_t semitoneCount); void fromFrequency(float frequency); diff --git a/firmware/keira/src/apps/liltracker/pattern.cpp b/firmware/keira/src/apps/liltracker/pattern.cpp index 2a51625b..ddba5f62 100644 --- a/firmware/keira/src/apps/liltracker/pattern.cpp +++ b/firmware/keira/src/apps/liltracker/pattern.cpp @@ -64,6 +64,9 @@ int Pattern::calculateWriteBufferSize() { Acquire acquire(xMutex); int32_t bufferSize = 0; + // Count 32 reserved bytes + bufferSize += 32; + // Calculate all channels for (int32_t channelIndex = 0; channelIndex < CHANNEL_COUNT; channelIndex++) { // Calculate channel settings @@ -84,6 +87,11 @@ int Pattern::writeToBuffer(uint8_t* buffer) { Acquire acquire(xMutex); int32_t offset = 0; + // Write 32 reserved bytes + while (offset < 32) { + buffer[offset++] = 0; + } + // Write all channels for (int32_t channelIndex = 0; channelIndex < CHANNEL_COUNT; channelIndex++) { // Write channel settings @@ -108,6 +116,9 @@ int Pattern::readFromBuffer(const uint8_t* buffer) { Acquire acquire(xMutex); int32_t offset = 0; + // Skip 32 reserved bytes + offset = 32; + // Read all channels for (int32_t channelIndex = 0; channelIndex < CHANNEL_COUNT; channelIndex++) { // Read channel settings diff --git a/firmware/keira/src/apps/liltracker/pattern.h b/firmware/keira/src/apps/liltracker/pattern.h index 67a1f072..b7af5ffe 100644 --- a/firmware/keira/src/apps/liltracker/pattern.h +++ b/firmware/keira/src/apps/liltracker/pattern.h @@ -16,10 +16,11 @@ typedef enum { } event_type_t; typedef struct event_t { - noteinfo_t note; - uint8_t volume; - event_type_t type; - effect_t effect; + noteinfo_t note; // 2 bytes + uint8_t volume; // 1 byte + event_type_t type; // 1 byte + effect_t effect; // 2 bytes + uint8_t reserved[10]; // 10 bytes } event_t; typedef struct { diff --git a/firmware/keira/src/apps/liltracker/track.cpp b/firmware/keira/src/apps/liltracker/track.cpp index bb2d4252..8d0c6da6 100644 --- a/firmware/keira/src/apps/liltracker/track.cpp +++ b/firmware/keira/src/apps/liltracker/track.cpp @@ -73,9 +73,17 @@ void Track::setBPM(int16_t bpm) { this->bpm = CLAMP(bpm, 30, 900); } +void Track::reset() { + Acquire acquire(xMutex, true); + pages.resize(0); + patterns.resize(0); + pages.resize(4); + patterns.resize(4); +} + int32_t Track::calculateWriteBufferSize() { Acquire acquire(xMutex, true); - int32_t size = 3 * sizeof(int16_t); // Header, BPM, pattern count, page count + int32_t size = 32 * sizeof(int16_t); // Header (signature + reserved), BPM, pattern count, page count for (int16_t i = 0; i < getPatternCount(); i++) { size += getPattern(i)->calculateWriteBufferSize(); } @@ -87,10 +95,16 @@ int32_t Track::writeToBuffer(uint8_t* data) { Acquire acquire(xMutex, true); int32_t offset = 0; - // Write header ("LIL") + // Write header signature ("LILT") data[offset++] = 'L'; data[offset++] = 'I'; data[offset++] = 'L'; + data[offset++] = 'T'; + + // Write header reserved bytes until offset 32 + while (offset < 32) { + data[offset++] = 0; + } // Write BPM WRITE_TO_BUFFER(data, bpm); @@ -118,11 +132,14 @@ int32_t Track::readFromBuffer(const uint8_t* data) { Acquire acquire(xMutex, true); int32_t offset = 0; - // Read header ("LIL") - if (data[offset++] != 'L' || data[offset++] != 'I' || data[offset++] != 'L') { + // Read header signature ("LIL") + if (data[offset++] != 'L' || data[offset++] != 'I' || data[offset++] != 'L' || data[offset++] != 'T') { return -1; } + // Skip header reserved bytes until offset 32 + offset = 32; + // Read BPM READ_FROM_BUFFER(bpm, data); diff --git a/firmware/keira/src/apps/liltracker/track.h b/firmware/keira/src/apps/liltracker/track.h index 43935012..037aa42e 100644 --- a/firmware/keira/src/apps/liltracker/track.h +++ b/firmware/keira/src/apps/liltracker/track.h @@ -24,6 +24,7 @@ class Track { page_t* getPage(int16_t index); int16_t getBPM(); void setBPM(int16_t bpm); + void reset(); int32_t calculateWriteBufferSize(); int32_t writeToBuffer(uint8_t* data);