Skip to content

Commit

Permalink
add support for Serum2 (#46)
Browse files Browse the repository at this point in the history
  • Loading branch information
mkalkbrenner authored Jul 2, 2024
1 parent fc29cd7 commit 0eb2052
Show file tree
Hide file tree
Showing 21 changed files with 748 additions and 400 deletions.
6 changes: 5 additions & 1 deletion .github/workflows/libdmdutil.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ jobs:
- os: macos-latest
platform: ios
arch: arm64
- os: macos-latest
platform: ios-simulator
arch: arm64
- os: macos-latest
platform: tvos
arch: arm64
Expand Down Expand Up @@ -145,7 +148,7 @@ jobs:
cp build/dmdserver_test tmp
cp build/dmdutil_test_s tmp
cp build/dmdutil_test tmp
elif [[ "${{ matrix.platform }}" == "ios" || "${{ matrix.platform }}" == "tvos" ]]; then
elif [[ "${{ matrix.platform }}" == "ios" || "${{ matrix.platform }}" == "ios-simulator" || "${{ matrix.platform }}" == "tvos" ]]; then
cp build/libdmdutil.a tmp
cp -a build/*.dylib tmp
elif [[ "${{ matrix.platform }}" == "android" ]]; then
Expand Down Expand Up @@ -223,5 +226,6 @@ jobs:
libdmdutil-${{ needs.version.outputs.tag }}-linux-x64/libdmdutil-${{ needs.version.outputs.tag }}-linux-x64.tar.gz
libdmdutil-${{ needs.version.outputs.tag }}-linux-aarch64/libdmdutil-${{ needs.version.outputs.tag }}-linux-aarch64.tar.gz
libdmdutil-${{ needs.version.outputs.tag }}-ios-arm64/libdmdutil-${{ needs.version.outputs.tag }}-ios-arm64.tar.gz
libdmdutil-${{ needs.version.outputs.tag }}-ios-simulator-arm64/libdmdutil-${{ needs.version.outputs.tag }}-ios-simulator-arm64.tar.gz
libdmdutil-${{ needs.version.outputs.tag }}-tvos-arm64/libdmdutil-${{ needs.version.outputs.tag }}-tvos-arm64.tar.gz
libdmdutil-${{ needs.version.outputs.tag }}-android-arm64-v8a/libdmdutil-${{ needs.version.outputs.tag }}-android-arm64-v8a.tar.gz
16 changes: 10 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,17 @@ message(STATUS "BUILD_SHARED: ${BUILD_SHARED}")
message(STATUS "BUILD_STATIC: ${BUILD_STATIC}")
message(STATUS "POST_BUILD_COPY_EXT_LIBS: ${POST_BUILD_COPY_EXT_LIBS}")

if(PLATFORM STREQUAL "ios")
if(PLATFORM STREQUAL "macos")
set(CMAKE_OSX_DEPLOYMENT_TARGET 14.0)
elseif(PLATFORM STREQUAL "ios" OR PLATFORM STREQUAL "ios-simulator")
set(CMAKE_SYSTEM_NAME iOS)
if (PLATFORM STREQUAL "ios-simulator")
set(CMAKE_OSX_SYSROOT iphonesimulator)
endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET 17.0)
elseif(PLATFORM STREQUAL "tvos")
set(CMAKE_SYSTEM_NAME tvOS)
set(CMAKE_OSX_DEPLOYMENT_TARGET 17.0)
elseif(PLATFORM STREQUAL "android")
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 30)
Expand All @@ -40,16 +47,14 @@ if(PLATFORM STREQUAL "win")
add_compile_definitions(WIN32)
endif()
elseif(PLATFORM STREQUAL "macos")
set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0)
if (ARCH STREQUAL "arm64")
set(CMAKE_OSX_ARCHITECTURES arm64)
elseif(ARCH STREQUAL "x64")
set(CMAKE_OSX_ARCHITECTURES x86_64)
endif()
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "@executable_path")
elseif(PLATFORM STREQUAL "ios" OR PLATFORM STREQUAL "tvos")
set(CMAKE_OSX_DEPLOYMENT_TARGET 16.0)
elseif(PLATFORM STREQUAL "ios" OR PLATFORM STREQUAL "ios-simulator" OR PLATFORM STREQUAL "tvos")
set(CMAKE_OSX_ARCHITECTURES arm64)
elseif(PLATFORM STREQUAL "linux" OR PLATFORM STREQUAL "android")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
Expand All @@ -70,7 +75,6 @@ set(DMDUTIL_SOURCES
src/ConsoleDMD.cpp
src/Logger.cpp
src/AlphaNumeric.cpp
src/Serum.cpp
)

if(PLATFORM STREQUAL "win" OR PLATFORM STREQUAL "macos" OR PLATFORM STREQUAL "linux")
Expand Down Expand Up @@ -109,7 +113,7 @@ if(BUILD_SHARED)
third-party/runtime-libs/${PLATFORM}/${ARCH}
)
target_link_libraries(dmdutil_shared PUBLIC cargs zedmd serum serialport sockpp pupdmd)
elseif(PLATFORM STREQUAL "ios" OR PLATFORM STREQUAL "tvos")
elseif(PLATFORM STREQUAL "ios" OR PLATFORM STREQUAL "ios-simulator" OR PLATFORM STREQUAL "tvos")
target_link_directories(dmdutil_shared PUBLIC
third-party/build-libs/${PLATFORM}/${ARCH}
)
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,13 @@ cmake -DPLATFORM=ios -DARCH=arm64 -DCMAKE_BUILD_TYPE=Release -B build
cmake --build build
```

#### iOS Simulator (arm64)
```shell
platforms/ios-simulator/arm64/external.sh
cmake -DPLATFORM=ios-simulator -DARCH=arm64 -DCMAKE_BUILD_TYPE=Release -B build
cmake --build build
```

#### tvOS (arm64)
```shell
platforms/tvos/arm64/external.sh
Expand Down
54 changes: 40 additions & 14 deletions include/DMDUtil/DMD.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
#define DMDUTILCALLBACK
#endif

#define DMDUTIL_FRAME_BUFFER_SIZE 16
#define DMDUTIL_FRAME_BUFFER_SIZE 32
#define DMDUTIL_MIN_FRAMES_BEHIND 4
#define DMDUTIL_MAX_FRAMES_BEHIND 16
#define DMDUTIL_MAX_NAME_SIZE 16
#define DMDUTIL_MAX_PATH_SIZE 256
#define DMDUTIL_MAX_TRANSITIONAL_FRAME_DURATION 25
Expand All @@ -29,6 +31,10 @@
#endif

class ZeDMD;

struct _Serum_Frame_Struc;
typedef _Serum_Frame_Struc SerumFrameStruct;

namespace PUPDMD
{
class DMD;
Expand Down Expand Up @@ -73,21 +79,38 @@ class DMDUTILAPI DMD

enum class Mode
{
Unknown, // int 0
Data, // int 1
RGB24, // int 2, RGB888
RGB16, // int 3, RGB565
AlphaNumeric // int 4
Unknown, // int 0
Data, // int 1
RGB24, // int 2, RGB888
RGB16, // int 3, RGB565
AlphaNumeric, // int 4
SerumV1, // int 5
SerumV2_32, // int 6
SerumV2_32_64, // int 7
SerumV2_64, // int 8
SerumV2_64_32, // int 9
};

bool IsSerumMode(Mode mode)
{
return (mode == Mode::SerumV1 || mode == Mode::SerumV2_32 || mode == Mode::SerumV2_32_64 ||
mode == Mode::SerumV2_64 || mode == Mode::SerumV2_64_32);
}

bool IsSerumV2Mode(Mode mode)
{
return (mode == Mode::SerumV2_32 || mode == Mode::SerumV2_32_64 || mode == Mode::SerumV2_64 ||
mode == Mode::SerumV2_64_32);
}

#pragma pack(push, 1) // Align to 1-byte boundaries, important for sending over socket.
struct Update
{
Mode mode;
AlphaNumericLayout layout;
int depth;
uint8_t data[256 * 64 * 3];
uint16_t segData[256 * 64]; // RGB16 or segment data
uint16_t segData[256 * 64]; // RGB16 or segment data or SerumV1 palette
uint16_t segData2[128];
bool hasData;
bool hasSegData;
Expand Down Expand Up @@ -143,19 +166,21 @@ class DMDUTILAPI DMD
void UpdateRGB16Data(const uint16_t* pData, uint16_t width, uint16_t height, bool buffered = false);
void UpdateAlphaNumericData(AlphaNumericLayout layout, const uint16_t* pData1, const uint16_t* pData2, uint8_t r,
uint8_t g, uint8_t b);
void QueueUpdate(Update dmdUpdate, bool buffered);
void QueueUpdate(const std::shared_ptr<Update> dmdUpdate, bool buffered);
bool QueueBuffer();

private:
Update* m_pUpdateBufferQueue[DMDUTIL_FRAME_BUFFER_SIZE];
Update m_updateBuffered;
std::shared_ptr<Update> m_updateBuffered;

uint8_t GetNextBufferQueuePosition(uint8_t bufferPosition, const uint8_t updateBufferQueuePosition);
bool ConnectDMDServer();
bool UpdatePalette(uint8_t* pPalette, uint8_t depth, uint8_t r, uint8_t g, uint8_t b);
void UpdateData(const uint8_t* pData, int depth, uint16_t width, uint16_t height, uint8_t r, uint8_t g, uint8_t b,
Mode mode, bool buffered = false);
void AdjustRGB24Depth(uint8_t* pData, uint8_t* pDstData, int length, uint8_t* palette, uint8_t depth);
void HandleTrigger(uint16_t id);
void QueueSerumFrames(Update* dmdUpdate, bool render32 = true, bool render64 = true);

void DmdFrameThread();
void LevelDMDThread();
Expand All @@ -165,13 +190,13 @@ class DMDUTILAPI DMD
void DumpDMDTxtThread();
void DumpDMDRawThread();
void PupDMDThread();
void SerumThread();

uint8_t m_updateBufferQueuePosition = 0;
char m_romName[DMDUTIL_MAX_NAME_SIZE] = {0};
char m_altColorPath[DMDUTIL_MAX_PATH_SIZE] = {0};
char m_pupVideosPath[DMDUTIL_MAX_PATH_SIZE] = {0};
AlphaNumeric* m_pAlphaNumeric;
Serum* m_pSerum;
SerumFrameStruct* m_pSerum;
ZeDMD* m_pZeDMD;
PUPDMD::DMD* m_pPUPDMD;
std::vector<LevelDMD*> m_levelDMDs;
Expand All @@ -188,11 +213,12 @@ class DMDUTILAPI DMD
std::thread* m_pDumpDMDTxtThread;
std::thread* m_pDumpDMDRawThread;
std::thread* m_pPupDMDThread;
std::thread* m_pSerumThread;
std::shared_mutex m_dmdSharedMutex;
std::condition_variable_any m_dmdCV;
std::mutex m_serumMutex;
std::atomic<bool> m_dmdFrameReady = false;
std::atomic<bool> m_stopFlag = false;
std::atomic<bool> m_dmdFrameReady;
std::atomic<bool> m_stopFlag;
std::atomic<uint8_t> m_updateBufferQueuePosition;

bool m_hasUpdateBuffered = false;
static bool m_finding;
Expand Down
4 changes: 2 additions & 2 deletions include/DMDUtil/DMDUtil.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#pragma once

#define DMDUTIL_VERSION_MAJOR 0 // X Digits
#define DMDUTIL_VERSION_MINOR 6 // Max 2 Digits
#define DMDUTIL_VERSION_PATCH 1 // Max 2 Digits
#define DMDUTIL_VERSION_MINOR 7 // Max 2 Digits
#define DMDUTIL_VERSION_PATCH 0 // Max 2 Digits

#define _DMDUTIL_STR(x) #x
#define DMDUTIL_STR(x) _DMDUTIL_STR(x)
Expand Down
7 changes: 4 additions & 3 deletions platforms/android/arm64-v8a/external.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
set -e

CARGS_SHA=5949a20a926e902931de4a32adaad9f19c76f251
LIBZEDMD_SHA=6395357ce400036432587b4f696a2fac14ddd21a
LIBSERUM_SHA=b69d2b436bc93570a2e7e78d0946cd3c43f7aed5
LIBZEDMD_SHA=927a519efcff79f9876fecb9d5a04c9ba5fc2348
LIBSERUM_SHA=cf31891c9106ae22b54e1e8354178c7b237e3b1a
SOCKPP_SHA=e6c4688a576d95f42dd7628cefe68092f6c5cd0f
LIBPUPDMD_SHA=c640ea2cec94097e8baefee9dab39266970e4405
LIBPUPDMD_SHA=124f45e5ddd59ceb339591de88fcca72f8c54612
LIBFRAMEUTIL_SHA=30048ca23d41ca0a8f7d5ab75d3f646a19a90182

if [[ $(uname) == "Linux" ]]; then
Expand Down Expand Up @@ -96,6 +96,7 @@ cmake \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-B build
cmake --build build -- -j${NUM_PROCS}
cp src/serum.h ../../third-party/include/
cp src/serum-decode.h ../../third-party/include/
cp build/libserum.so ../../third-party/runtime-libs/android/arm64-v8a/
cd ..
Expand Down
143 changes: 143 additions & 0 deletions platforms/ios-simulator/arm64/external.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#!/bin/bash

set -e

CARGS_SHA=5949a20a926e902931de4a32adaad9f19c76f251
LIBZEDMD_SHA=927a519efcff79f9876fecb9d5a04c9ba5fc2348
LIBSERUM_SHA=cf31891c9106ae22b54e1e8354178c7b237e3b1a
SOCKPP_SHA=e6c4688a576d95f42dd7628cefe68092f6c5cd0f
LIBPUPDMD_SHA=124f45e5ddd59ceb339591de88fcca72f8c54612
LIBFRAMEUTIL_SHA=30048ca23d41ca0a8f7d5ab75d3f646a19a90182

NUM_PROCS=$(sysctl -n hw.ncpu)

echo "Building libraries..."
echo " CARGS_SHA: ${CARGS_SHA}"
echo " LIBZEDMD_SHA: ${LIBZEDMD_SHA}"
echo " LIBSERUM_SHA: ${LIBSERUM_SHA}"
echo " SOCKPP_SHA: ${SOCKPP_SHA}"
echo " LIBPUPDMD_SHA: ${LIBPUPDMD_SHA}"
echo " LIBFRAMEUTIL_SHA: ${LIBFRAMEUTIL_SHA}"
echo ""

if [ -z "${BUILD_TYPE}" ]; then
BUILD_TYPE="Release"
fi

echo "Build type: ${BUILD_TYPE}"
echo "Procs: ${NUM_PROCS}"
echo ""

rm -rf external
mkdir external
cd external

#
# build cargs and copy to external
#

curl -sL https://github.com/likle/cargs/archive/${CARGS_SHA}.zip -o cargs.zip
unzip cargs.zip
cd cargs-${CARGS_SHA}
cmake \
-DCMAKE_SYSTEM_NAME=iOS \
-DCMAKE_OSX_SYSROOT=iphonesimulator \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=17.0 \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-B build
cmake --build build -- -j${NUM_PROCS}
cp include/cargs.h ../../third-party/include/
cp build/*.a ../../third-party/build-libs/ios-simulator/arm64/
cd ..

#
# build libzedmd and copy to external
#

curl -sL https://github.com/PPUC/libzedmd/archive/${LIBZEDMD_SHA}.zip -o libzedmd.zip
unzip libzedmd.zip
cd libzedmd-$LIBZEDMD_SHA
platforms/ios-simulator/arm64/external.sh
cmake \
-DPLATFORM=ios-simulator \
-DARCH=arm64 \
-DBUILD_SHARED=OFF \
-DBUILD_STATIC=ON \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-B build
cmake --build build -- -j${NUM_PROCS}
cp src/ZeDMD.h ../../third-party/include/
cp build/libzedmd.a ../../third-party/build-libs/ios-simulator/arm64/
cp -r test ../../
cd ..

#
# build libserum and copy to external
#

curl -sL https://github.com/zesinger/libserum/archive/${LIBSERUM_SHA}.zip -o libserum.zip
unzip libserum.zip
cd libserum-$LIBSERUM_SHA
cmake \
-DPLATFORM=ios-simulator \
-DARCH=arm64 \
-DBUILD_SHARED=OFF \
-DBUILD_STATIC=ON \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-B build
cmake --build build -- -j${NUM_PROCS}
cp src/serum.h ../../third-party/include/
cp src/serum-decode.h ../../third-party/include/
cp build/libserum.a ../../third-party/build-libs/ios-simulator/arm64/
cd ..

#
# build sockpp and copy to external
#

curl -sL https://github.com/fpagliughi/sockpp/archive/${SOCKPP_SHA}.zip -o sockpp.zip
unzip sockpp.zip
cd sockpp-$SOCKPP_SHA
cmake \
-DSOCKPP_BUILD_SHARED=OFF \
-DSOCKPP_BUILD_STATIC=ON \
-DCMAKE_SYSTEM_NAME=iOS \
-DCMAKE_OSX_SYSROOT=iphonesimulator \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=17.0 \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-B build
cmake --build build -- -j${NUM_PROCS}
cp -r include/sockpp ../../third-party/include/
cp build/libsockpp.a ../../third-party/build-libs/ios-simulator/arm64/
cd ..

#
# build libpupdmd and copy to external
#

curl -sL https://github.com/ppuc/libpupdmd/archive/${LIBPUPDMD_SHA}.zip -o libpupdmd.zip
unzip libpupdmd.zip
cd libpupdmd-$LIBPUPDMD_SHA
cmake \
-DPLATFORM=ios-simulator \
-DARCH=arm64 \
-DBUILD_SHARED=OFF \
-DBUILD_STATIC=ON \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-B build
cmake --build build -- -j${NUM_PROCS}
cp src/pupdmd.h ../../third-party/include/
cp build/libpupdmd.a ../../third-party/build-libs/ios-simulator/arm64/
cd ..

#
# copy libframeutil
#

curl -sL https://github.com/ppuc/libframeutil/archive/${LIBFRAMEUTIL_SHA}.zip -o libframeutil.zip
unzip libframeutil.zip
cd libframeutil-$LIBFRAMEUTIL_SHA
cp include/* ../../third-party/include
cd ..
Loading

0 comments on commit 0eb2052

Please sign in to comment.