├── .clang-format ├── .github └── workflows │ └── clang-format-check.yml ├── .gitignore ├── LICENSE ├── README.md ├── examples ├── DMX512Tools │ ├── .clang-format │ ├── .gitignore │ ├── CMakeLists.txt │ ├── DMX512Tools.ino │ ├── README.md │ ├── platformio.ini │ └── src │ │ ├── CMakeLists.txt │ │ ├── common.h │ │ ├── logo_sender.h │ │ ├── src.cpp │ │ ├── view_receiver.h │ │ └── view_sender.h └── PortSeparateSample │ ├── CMakeLists.txt │ ├── PortSeparateSample.ino │ └── src │ ├── CMakeLists.txt │ └── src.cpp └── images ├── disassembly.mp4 ├── image_1.jpg ├── switch_s1_s2.jpg └── switch_s3.jpg /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: Google 4 | AccessModifierOffset: -1 5 | AlignAfterOpenBracket: Align 6 | AlignConsecutiveMacros: true 7 | AlignConsecutiveAssignments: true 8 | AlignConsecutiveDeclarations: false 9 | AlignEscapedNewlines: Left 10 | AlignOperands: true 11 | AlignTrailingComments: true 12 | AllowAllArgumentsOnNextLine: true 13 | AllowAllConstructorInitializersOnNextLine: true 14 | AllowAllParametersOfDeclarationOnNextLine: true 15 | AllowShortBlocksOnASingleLine: Never 16 | AllowShortCaseLabelsOnASingleLine: false 17 | AllowShortFunctionsOnASingleLine: false 18 | AllowShortLambdasOnASingleLine: All 19 | AllowShortIfStatementsOnASingleLine: WithoutElse 20 | AllowShortLoopsOnASingleLine: true 21 | AlwaysBreakAfterDefinitionReturnType: None 22 | AlwaysBreakAfterReturnType: None 23 | AlwaysBreakBeforeMultilineStrings: true 24 | AlwaysBreakTemplateDeclarations: Yes 25 | BinPackArguments: true 26 | BinPackParameters: true 27 | BraceWrapping: 28 | AfterCaseLabel: false 29 | AfterClass: false 30 | AfterControlStatement: false 31 | AfterEnum: false 32 | AfterFunction: false 33 | AfterNamespace: false 34 | AfterObjCDeclaration: false 35 | AfterStruct: false 36 | AfterUnion: false 37 | AfterExternBlock: false 38 | BeforeCatch: false 39 | BeforeElse: false 40 | IndentBraces: false 41 | SplitEmptyFunction: true 42 | SplitEmptyRecord: true 43 | SplitEmptyNamespace: true 44 | BreakBeforeBinaryOperators: None 45 | BreakBeforeBraces: Attach 46 | BreakBeforeInheritanceComma: false 47 | BreakInheritanceList: BeforeColon 48 | BreakBeforeTernaryOperators: true 49 | BreakConstructorInitializersBeforeComma: false 50 | BreakConstructorInitializers: BeforeColon 51 | BreakAfterJavaFieldAnnotations: false 52 | BreakStringLiterals: true 53 | ColumnLimit: 80 54 | CommentPragmas: '^ IWYU pragma:' 55 | CompactNamespaces: false 56 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 57 | ConstructorInitializerIndentWidth: 4 58 | ContinuationIndentWidth: 4 59 | Cpp11BracedListStyle: true 60 | DeriveLineEnding: true 61 | DerivePointerAlignment: true 62 | DisableFormat: false 63 | ExperimentalAutoDetectBinPacking: false 64 | FixNamespaceComments: true 65 | ForEachMacros: 66 | - foreach 67 | - Q_FOREACH 68 | - BOOST_FOREACH 69 | IncludeBlocks: Regroup 70 | IncludeCategories: 71 | - Regex: '^' 72 | Priority: 2 73 | SortPriority: 0 74 | - Regex: '^<.*\.h>' 75 | Priority: 1 76 | SortPriority: 0 77 | - Regex: '^<.*' 78 | Priority: 2 79 | SortPriority: 0 80 | - Regex: '.*' 81 | Priority: 3 82 | SortPriority: 0 83 | IncludeIsMainRegex: '([-_](test|unittest))?$' 84 | IncludeIsMainSourceRegex: '' 85 | IndentCaseLabels: true 86 | IndentGotoLabels: true 87 | IndentPPDirectives: None 88 | IndentWidth: 4 89 | IndentWrappedFunctionNames: false 90 | JavaScriptQuotes: Leave 91 | JavaScriptWrapImports: true 92 | KeepEmptyLinesAtTheStartOfBlocks: false 93 | MacroBlockBegin: '' 94 | MacroBlockEnd: '' 95 | MaxEmptyLinesToKeep: 1 96 | NamespaceIndentation: None 97 | ObjCBinPackProtocolList: Never 98 | ObjCBlockIndentWidth: 2 99 | ObjCSpaceAfterProperty: false 100 | ObjCSpaceBeforeProtocolList: true 101 | PenaltyBreakAssignment: 2 102 | PenaltyBreakBeforeFirstCallParameter: 1 103 | PenaltyBreakComment: 300 104 | PenaltyBreakFirstLessLess: 120 105 | PenaltyBreakString: 1000 106 | PenaltyBreakTemplateDeclaration: 10 107 | PenaltyExcessCharacter: 1000000 108 | PenaltyReturnTypeOnItsOwnLine: 200 109 | PointerAlignment: Left 110 | RawStringFormats: 111 | - Language: Cpp 112 | Delimiters: 113 | - cc 114 | - CC 115 | - cpp 116 | - Cpp 117 | - CPP 118 | - 'c++' 119 | - 'C++' 120 | CanonicalDelimiter: '' 121 | BasedOnStyle: google 122 | - Language: TextProto 123 | Delimiters: 124 | - pb 125 | - PB 126 | - proto 127 | - PROTO 128 | EnclosingFunctions: 129 | - EqualsProto 130 | - EquivToProto 131 | - PARSE_PARTIAL_TEXT_PROTO 132 | - PARSE_TEST_PROTO 133 | - PARSE_TEXT_PROTO 134 | - ParseTextOrDie 135 | - ParseTextProtoOrDie 136 | CanonicalDelimiter: '' 137 | BasedOnStyle: google 138 | ReflowComments: true 139 | SortIncludes: false 140 | SortUsingDeclarations: true 141 | SpaceAfterCStyleCast: false 142 | SpaceAfterLogicalNot: false 143 | SpaceAfterTemplateKeyword: true 144 | SpaceBeforeAssignmentOperators: true 145 | SpaceBeforeCpp11BracedList: false 146 | SpaceBeforeCtorInitializerColon: true 147 | SpaceBeforeInheritanceColon: true 148 | SpaceBeforeParens: ControlStatements 149 | SpaceBeforeRangeBasedForLoopColon: true 150 | SpaceInEmptyBlock: false 151 | SpaceInEmptyParentheses: false 152 | SpacesBeforeTrailingComments: 2 153 | SpacesInAngles: false 154 | SpacesInConditionalStatement: false 155 | SpacesInContainerLiterals: true 156 | SpacesInCStyleCastParentheses: false 157 | SpacesInParentheses: false 158 | SpacesInSquareBrackets: false 159 | SpaceBeforeSquareBrackets: false 160 | Standard: Auto 161 | StatementMacros: 162 | - Q_UNUSED 163 | - QT_REQUIRE_VERSION 164 | TabWidth: 4 165 | UseCRLF: false 166 | UseTab: Never 167 | ... 168 | -------------------------------------------------------------------------------- /.github/workflows/clang-format-check.yml: -------------------------------------------------------------------------------- 1 | name: clang-format Check 2 | on: [push, pull_request] 3 | jobs: 4 | formatting-check: 5 | name: Formatting Check 6 | runs-on: ubuntu-latest 7 | strategy: 8 | matrix: 9 | path: 10 | - check: './' # path to include 11 | exclude: '' # path to exclude 12 | # - check: 'src' 13 | # exclude: '' 14 | # - check: 'examples' 15 | # exclude: '' 16 | steps: 17 | - uses: actions/checkout@v2 18 | - name: Run clang-format style check for C/C++/Protobuf programs. 19 | uses: jidicula/clang-format-action@v4.5.0 20 | with: 21 | clang-format-version: '13' 22 | check-path: ${{ matrix.path['check'] }} 23 | exclude-regex: ${{ matrix.path['exclude'] }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | /examples/DMX512Tools/.vscode 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 M5Stack 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Module DMX512 for M5Stack 2 | 3 | ### target devices 4 | - M5Stack BASIC / GRAY / GO / FIRE 5 | - M5Stack Core2 6 | - M5Stack CoreS3 7 | 8 | --- 9 | ### pin map 10 | 11 | | | Core1 | Core2 | CoreS3 | 12 | | :---: | :---: | :---: | :----: | 13 | | TX | 13 | 19 | 7 | 14 | | RX | 35 | 35 | 10 | 15 | | EN | 12 | 27 | 6 | 16 | 17 | ※ Core1 : BASIC / GRAY / GO / FIRE 18 | ※ Core2 : Core2 / Core2AWS / TOUGH 19 | 20 | --- 21 | ### Role of switches 22 | 23 | - S1 : BiasResistor ON (LEFT) / OFF (RIGHT) for OUT port 24 | - S2 : Pass-through (LEFT) or Separate(RIGHT) 25 | - S3 : TerminationResistor ON (UP) / OFF (DOWN) for IN port 26 | 27 | ![switch_s1_s2](images/switch_s1_s2.jpg) 28 | ![switch_s3](images/switch_s3.jpg) 29 | 30 | #### S1 : BiasResistor for OUT port 31 | - OUTポートにバイアス抵抗を接続するスイッチです。 32 | - スイッチ位置が左 = バイアス抵抗が接続されます。 33 | - スイッチ位置が右 = バイアス抵抗なし。 34 | - IN側に機器を繋がない場合や、スイッチS2を分離(Separate)にした際、バイアス抵抗を接続すると通信が安定します。 35 | 36 | #### S2 : Pass-through or Separate 37 | - IN-OUTポート間の配線を直結(Pass-through)するか、分離(Separate)するかを選択するスイッチです。 38 | - スイッチ位置が左 = INとOUTは直結され、IN側から入った信号はそのままOUT側に出力されます。 39 | - スイッチ位置が右 = INとOUTは分離され、別々の信号経路として動作します。 40 | 41 | #### 直結(Pass-through)構成時の注意点 42 | - IN側から信号入力中にDMXモジュールからも信号出力すると、OUTポートの信号が混信して誤動作します。 43 | 44 | #### 分離(Separate)構成時の注意点 45 | - INポートとOUTポートは別々の経路となるため、M5Stackのプログラムで信号を中継する必要があります。 46 | - RDM規格に対応した機器からの返信信号はOUTポートからINポートに中継されません。 47 | - RDM規格の返信信号を中継させたい場合は、直結(Pass-through)構成を選択してください。 48 | 49 | #### S3 : TerminationResistor for IN port 50 | - INポートに終端抵抗を接続するスイッチです。 51 | - スイッチ位置が上 = 終端抵抗が接続されます。 52 | - スイッチ位置が下 = 終端抵抗なし。 53 | - OUT側に機器を繋がない場合や、スイッチS2で分離(Separate)構成にしたときにONにします。 54 | 55 | 56 | ### board image 57 | ![image_1](images/image_1.jpg) 58 | 59 | ### disassembly method 60 |
61 | 62 | --- 63 | There is currently no official M5Stack library for the DMX512 module.
64 | We recommend using the [esp_dmx v2.0.2](https://github.com/someweisguy/esp_dmx/archive/refs/tags/v2.02.zip) library. 65 | 66 | [someweisguy/esp_dmx](https://github.com/someweisguy/esp_dmx/tree/v2.02) 67 | 68 | ### sample application. 69 | - [DMX512Tools](examples/DMX512Tools/) 70 | 71 | -------------------------------------------------------------------------------- /examples/DMX512Tools/.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: Google 4 | AccessModifierOffset: -1 5 | AlignAfterOpenBracket: Align 6 | AlignConsecutiveMacros: true 7 | AlignConsecutiveAssignments: true 8 | AlignConsecutiveDeclarations: false 9 | AlignEscapedNewlines: Left 10 | AlignOperands: true 11 | AlignTrailingComments: true 12 | AllowAllArgumentsOnNextLine: true 13 | AllowAllConstructorInitializersOnNextLine: true 14 | AllowAllParametersOfDeclarationOnNextLine: true 15 | AllowShortBlocksOnASingleLine: Never 16 | AllowShortCaseLabelsOnASingleLine: false 17 | AllowShortFunctionsOnASingleLine: false 18 | AllowShortLambdasOnASingleLine: All 19 | AllowShortIfStatementsOnASingleLine: WithoutElse 20 | AllowShortLoopsOnASingleLine: true 21 | AlwaysBreakAfterDefinitionReturnType: None 22 | AlwaysBreakAfterReturnType: None 23 | AlwaysBreakBeforeMultilineStrings: true 24 | AlwaysBreakTemplateDeclarations: Yes 25 | BinPackArguments: true 26 | BinPackParameters: true 27 | BraceWrapping: 28 | AfterCaseLabel: false 29 | AfterClass: false 30 | AfterControlStatement: false 31 | AfterEnum: false 32 | AfterFunction: false 33 | AfterNamespace: false 34 | AfterObjCDeclaration: false 35 | AfterStruct: false 36 | AfterUnion: false 37 | AfterExternBlock: false 38 | BeforeCatch: false 39 | BeforeElse: false 40 | IndentBraces: false 41 | SplitEmptyFunction: true 42 | SplitEmptyRecord: true 43 | SplitEmptyNamespace: true 44 | BreakBeforeBinaryOperators: None 45 | BreakBeforeBraces: Attach 46 | BreakBeforeInheritanceComma: false 47 | BreakInheritanceList: BeforeColon 48 | BreakBeforeTernaryOperators: true 49 | BreakConstructorInitializersBeforeComma: false 50 | BreakConstructorInitializers: BeforeColon 51 | BreakAfterJavaFieldAnnotations: false 52 | BreakStringLiterals: true 53 | ColumnLimit: 80 54 | CommentPragmas: '^ IWYU pragma:' 55 | CompactNamespaces: false 56 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 57 | ConstructorInitializerIndentWidth: 4 58 | ContinuationIndentWidth: 4 59 | Cpp11BracedListStyle: true 60 | DeriveLineEnding: true 61 | DerivePointerAlignment: true 62 | DisableFormat: false 63 | ExperimentalAutoDetectBinPacking: false 64 | FixNamespaceComments: true 65 | ForEachMacros: 66 | - foreach 67 | - Q_FOREACH 68 | - BOOST_FOREACH 69 | IncludeBlocks: Regroup 70 | IncludeCategories: 71 | - Regex: '^' 72 | Priority: 2 73 | SortPriority: 0 74 | - Regex: '^<.*\.h>' 75 | Priority: 1 76 | SortPriority: 0 77 | - Regex: '^<.*' 78 | Priority: 2 79 | SortPriority: 0 80 | - Regex: '.*' 81 | Priority: 3 82 | SortPriority: 0 83 | IncludeIsMainRegex: '([-_](test|unittest))?$' 84 | IncludeIsMainSourceRegex: '' 85 | IndentCaseLabels: true 86 | IndentGotoLabels: true 87 | IndentPPDirectives: None 88 | IndentWidth: 4 89 | IndentWrappedFunctionNames: false 90 | JavaScriptQuotes: Leave 91 | JavaScriptWrapImports: true 92 | KeepEmptyLinesAtTheStartOfBlocks: false 93 | MacroBlockBegin: '' 94 | MacroBlockEnd: '' 95 | MaxEmptyLinesToKeep: 1 96 | NamespaceIndentation: None 97 | ObjCBinPackProtocolList: Never 98 | ObjCBlockIndentWidth: 2 99 | ObjCSpaceAfterProperty: false 100 | ObjCSpaceBeforeProtocolList: true 101 | PenaltyBreakAssignment: 2 102 | PenaltyBreakBeforeFirstCallParameter: 1 103 | PenaltyBreakComment: 300 104 | PenaltyBreakFirstLessLess: 120 105 | PenaltyBreakString: 1000 106 | PenaltyBreakTemplateDeclaration: 10 107 | PenaltyExcessCharacter: 1000000 108 | PenaltyReturnTypeOnItsOwnLine: 200 109 | PointerAlignment: Left 110 | RawStringFormats: 111 | - Language: Cpp 112 | Delimiters: 113 | - cc 114 | - CC 115 | - cpp 116 | - Cpp 117 | - CPP 118 | - 'c++' 119 | - 'C++' 120 | CanonicalDelimiter: '' 121 | BasedOnStyle: google 122 | - Language: TextProto 123 | Delimiters: 124 | - pb 125 | - PB 126 | - proto 127 | - PROTO 128 | EnclosingFunctions: 129 | - EqualsProto 130 | - EquivToProto 131 | - PARSE_PARTIAL_TEXT_PROTO 132 | - PARSE_TEST_PROTO 133 | - PARSE_TEXT_PROTO 134 | - ParseTextOrDie 135 | - ParseTextProtoOrDie 136 | CanonicalDelimiter: '' 137 | BasedOnStyle: google 138 | ReflowComments: true 139 | SortIncludes: false 140 | SortUsingDeclarations: true 141 | SpaceAfterCStyleCast: false 142 | SpaceAfterLogicalNot: false 143 | SpaceAfterTemplateKeyword: true 144 | SpaceBeforeAssignmentOperators: true 145 | SpaceBeforeCpp11BracedList: false 146 | SpaceBeforeCtorInitializerColon: true 147 | SpaceBeforeInheritanceColon: true 148 | SpaceBeforeParens: ControlStatements 149 | SpaceBeforeRangeBasedForLoopColon: true 150 | SpaceInEmptyBlock: false 151 | SpaceInEmptyParentheses: false 152 | SpacesBeforeTrailingComments: 2 153 | SpacesInAngles: false 154 | SpacesInConditionalStatement: false 155 | SpacesInContainerLiterals: true 156 | SpacesInCStyleCastParentheses: false 157 | SpacesInParentheses: false 158 | SpacesInSquareBrackets: false 159 | SpaceBeforeSquareBrackets: false 160 | Standard: Auto 161 | StatementMacros: 162 | - Q_UNUSED 163 | - QT_REQUIRE_VERSION 164 | TabWidth: 4 165 | UseCRLF: false 166 | UseTab: Never 167 | ... 168 | -------------------------------------------------------------------------------- /examples/DMX512Tools/.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | -------------------------------------------------------------------------------- /examples/DMX512Tools/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.16.0) 2 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 3 | project(DMX512Tools) 4 | -------------------------------------------------------------------------------- /examples/DMX512Tools/DMX512Tools.ino: -------------------------------------------------------------------------------- 1 | /// This is an empty sketch for ArduinoIDE and PlatformIO compatibility. 2 | /// The source code is located in the src folder. 3 | -------------------------------------------------------------------------------- /examples/DMX512Tools/README.md: -------------------------------------------------------------------------------- 1 | # DMX512Tools 2 | 3 | ### target devices 4 | - M5Stack BASIC / GRAY / GO / FIRE 5 | - M5Stack Core2 6 | 7 | ### Required Libraries 8 | - [esp_dmx](https://github.com/someweisguy/esp_dmx/) 9 | - [M5Unified](https://github.com/M5Stack/M5Unified/) 10 | - [M5GFX](https://github.com/M5Stack/M5GFX/) 11 | 12 | -------------------------------------------------------------------------------- /examples/DMX512Tools/platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [env] 12 | platform = espressif32 13 | framework = arduino 14 | board = m5stack-core-esp32 15 | board_build.f_flash = 80000000L 16 | board_build.f_cpu = 240000000L 17 | monitor_speed = 115200 18 | upload_speed = 1500000 19 | monitor_filters = time, esp32_exception_decoder 20 | board_build.flash_mode = qio 21 | ; board_build.flash_mode = dio 22 | build_flags = -DCORE_DEBUG_LEVEL=5 23 | build_type = debug 24 | lib_deps = 25 | M5Stack/M5Unified 26 | M5Stack/M5GFX 27 | https://github.com/someweisguy/esp_dmx/archive/refs/tags/v2.02.zip 28 | 29 | [env:m5stack_arduino_1_0_6] 30 | platform = espressif32@3.4 31 | 32 | [env:m5stack_arduino_2_0_3] 33 | platform = espressif32@4.4.0 34 | 35 | -------------------------------------------------------------------------------- /examples/DMX512Tools/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # This file was automatically generated for projects 2 | # without default 'CMakeLists.txt' file. 3 | 4 | FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) 5 | 6 | idf_component_register(SRCS ${app_sources}) 7 | -------------------------------------------------------------------------------- /examples/DMX512Tools/src/common.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include // https://github.com/someweisguy/esp_dmx/ 4 | #include // https://github.com/M5Stack/M5Unified/ 5 | 6 | #if defined(DMX_PACKET_TIMEOUT_TICK) 7 | #define ESP_DMX_VERSION 2 8 | #else 9 | #define ESP_DMX_VERSION 1 10 | #endif 11 | 12 | /* lets decide which DMX port to use. The ESP32 has either 2 or 3 ports. 13 | Port 0 is typically used to transmit serial data back to your Serial Monitor, 14 | so we shouldn't use that port. Lets use port 1! */ 15 | static constexpr const dmx_port_t dmxPort = 1; 16 | static constexpr const int dmxInterruptPriority = 1; 17 | static constexpr const int dmxQueueSize = 1; 18 | extern QueueHandle_t queue; 19 | 20 | static constexpr uint32_t bar_color_table[] = { 21 | 0xED7F11u, 0xCDB001u, 0xA0D904u, 0x6EF51Au, 0x3FFF3Fu, 0x1AF56Eu, 22 | 0x04D9A0u, 0x01B0CDu, 0x117FEDu, 0x314EFDu, 0x5E25FAu, 0x9009E4u, 23 | 0xBF00BFu, 0xE40990u, 0xFA255Eu, 0xFD4E31u}; 24 | 25 | struct ui_rect_t { 26 | int x = 0; 27 | int y = 0; 28 | int w = 0; 29 | int h = 0; 30 | ui_rect_t(int src_x, int src_y, int src_w, int src_h) 31 | : x{src_x}, y{src_y}, w{src_w}, h{src_h} {}; 32 | bool contain(int src_x, int src_y) { 33 | return src_x >= x && src_x < x + w && src_y >= y && src_y < y + h; 34 | } 35 | }; 36 | 37 | struct ui_button_t : public ui_rect_t { 38 | ui_button_t(int src_x, int src_y, int src_w, int src_h, 39 | const char* src_caption) 40 | : ui_rect_t{src_x, src_y, src_w, src_h}, caption{src_caption} {}; 41 | 42 | const char* caption = nullptr; 43 | void draw(LovyanGFX* gfx, bool has_focus, bool is_pressed, 44 | bool invalidated = false) { 45 | auto rim_color = TFT_DARKGRAY; 46 | auto bg_color = TFT_BLACK; 47 | auto fg_color = TFT_WHITE; 48 | 49 | if (invalidated) { 50 | _prev_focus = !has_focus; 51 | _prev_pressed = !is_pressed; 52 | } 53 | 54 | if (has_focus) { 55 | rim_color = TFT_WHITE; 56 | } 57 | if (is_pressed) { 58 | std::swap(fg_color, bg_color); 59 | } 60 | gfx->setTextDatum(textdatum_t::middle_center); 61 | gfx->setTextColor(fg_color); 62 | 63 | if (_prev_pressed != is_pressed) { 64 | gfx->fillRoundRect(x, y, w, h, 3, bg_color); 65 | _prev_focus = !has_focus; 66 | } 67 | if (_prev_focus != has_focus) { 68 | gfx->drawRoundRect(x, y, w, h, 3, rim_color); 69 | } 70 | if (_prev_pressed != is_pressed) { 71 | if (caption) { 72 | gfx->drawString(caption, x + (w >> 1), y + (h >> 1)); 73 | } 74 | } 75 | _prev_focus = has_focus; 76 | _prev_pressed = is_pressed; 77 | } 78 | 79 | private: 80 | bool _prev_focus = false; 81 | bool _prev_pressed = false; 82 | }; 83 | 84 | class view_t { 85 | public: 86 | virtual void setup(void) = 0; 87 | virtual bool loop(void) = 0; 88 | virtual void close(void) = 0; 89 | }; 90 | -------------------------------------------------------------------------------- /examples/DMX512Tools/src/logo_sender.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | static constexpr const uint8_t logo_sender_width = 48; 4 | static constexpr const uint8_t logo_sender_height = 108; 5 | static constexpr const uint16_t logo_sender[] = { 6 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 7 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 8 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 9 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 10 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 11 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 12 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 13 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 14 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 15 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 16 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 17 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 18 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 19 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 20 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 21 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 22 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 23 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 24 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 25 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 26 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 27 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 28 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 29 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 30 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x6108u, 0x0421u, 0x0421u, 31 | 0xe318u, 0x6108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 32 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 33 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8631u, 34 | 0x2c63u, 0x8e73u, 0x6d6bu, 0x0842u, 0x6108u, 0x0000u, 0x0000u, 0x0000u, 35 | 0x0000u, 0x0000u, 0x0000u, 0x2000u, 0x4529u, 0x0842u, 0x0000u, 0x0000u, 36 | 0x0000u, 0x0000u, 0x0000u, 0x0421u, 0x8e73u, 0xd7bdu, 0xdbdeu, 0x3ce7u, 37 | 0xbad6u, 0xd7bdu, 0xef7bu, 0x494au, 0x8210u, 0x0000u, 0x0000u, 0x0000u, 38 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xeb5au, 0x3084u, 0x3084u, 39 | 0x3084u, 0x694au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0842u, 0xf39cu, 40 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0xcf7bu, 0xe318u, 0x0000u, 0x0000u, 41 | 0x0000u, 0x0000u, 0xe318u, 0x0c63u, 0xf39cu, 0x4d6bu, 0x0000u, 0x0000u, 42 | 0x0000u, 0x0000u, 0xe739u, 0x38c6u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 43 | 0xffffu, 0xffffu, 0xffffu, 0xbef7u, 0x18c6u, 0x0c63u, 0x8210u, 0x0000u, 44 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xb294u, 0xffffu, 0xffffu, 45 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0xa210u, 0x718cu, 0x55adu, 46 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x2000u, 0x0000u, 47 | 0x6108u, 0x8a52u, 0x718cu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 48 | 0x0000u, 0xe318u, 0x38c6u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 49 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xdfffu, 0x59ceu, 0xeb5au, 50 | 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xb294u, 0xffffu, 0xffffu, 51 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0xe739u, 0x34a5u, 0x55adu, 52 | 0x55adu, 0xf39cu, 0xd39cu, 0x55adu, 0x55adu, 0xb294u, 0xe318u, 0x0842u, 53 | 0x3084u, 0x34a5u, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 54 | 0x0000u, 0x6d6bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 55 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 56 | 0x59ceu, 0xaa52u, 0x8210u, 0x0000u, 0x0000u, 0xb294u, 0xffffu, 0xffffu, 57 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 58 | 0x2c63u, 0x4108u, 0x0000u, 0xe739u, 0xb294u, 0x55adu, 0x9294u, 0x55adu, 59 | 0x55adu, 0x55adu, 0x55adu, 0x34a5u, 0x1084u, 0x0842u, 0x0000u, 0x0000u, 60 | 0x4108u, 0xb6b5u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 61 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 62 | 0xffffu, 0xdfffu, 0x75adu, 0x494au, 0x4108u, 0xb294u, 0xffffu, 0xffffu, 63 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 64 | 0x0421u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 0x55adu, 65 | 0x55adu, 0xd39cu, 0x6d6bu, 0xc739u, 0x4108u, 0x0000u, 0x0000u, 0x0000u, 66 | 0xe318u, 0x9ad6u, 0xffffu, 0xffffu, 0xffffu, 0xdbdeu, 0xf7bdu, 0x59ceu, 67 | 0xbef7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 68 | 0xffffu, 0xffffu, 0xffffu, 0x9ef7u, 0xd39cu, 0xd7bdu, 0xffffu, 0xffffu, 69 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0xf39cu, 70 | 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x8631u, 0x34a5u, 0x55adu, 0xd39cu, 71 | 0x0c63u, 0x4529u, 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 72 | 0x0421u, 0xbad6u, 0xffffu, 0xffffu, 0x59ceu, 0x2421u, 0x6108u, 0xa210u, 73 | 0xa631u, 0x6d6bu, 0x38c6u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 74 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 75 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0xf39cu, 76 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4529u, 0xb294u, 0xeb5au, 0x0421u, 77 | 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 78 | 0x0421u, 0xbad6u, 0xffffu, 0xffffu, 0x18c6u, 0xc318u, 0x0000u, 0x0000u, 79 | 0x0000u, 0x2000u, 0xe739u, 0x718cu, 0x3ce7u, 0xffffu, 0xffffu, 0xffffu, 80 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 81 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0xf39cu, 82 | 0x6108u, 0x0000u, 0x0000u, 0x0000u, 0x0421u, 0x494au, 0x6108u, 0x0000u, 83 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 84 | 0x6108u, 0x18c6u, 0xffffu, 0xffffu, 0xdfffu, 0x9ad6u, 0x34a5u, 0x14a5u, 85 | 0x14a5u, 0xae73u, 0x0000u, 0x2000u, 0xa631u, 0xef7bu, 0x1ce7u, 0xffffu, 86 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 87 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 88 | 0x3084u, 0x1084u, 0x8e73u, 0x2c63u, 0xeb5au, 0xaa52u, 0x8a52u, 0x494au, 89 | 0x2842u, 0xc739u, 0xa631u, 0x4529u, 0x2421u, 0xa210u, 0x0000u, 0x0000u, 90 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 91 | 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 0x0000u, 0x2000u, 0x4529u, 0xef7bu, 92 | 0x7defu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 93 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 94 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 95 | 0x55adu, 0x14a5u, 0x14a5u, 0xf39cu, 0xf39cu, 0x0c63u, 0x0000u, 0x0000u, 96 | 0x0000u, 0x0421u, 0x38c6u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 97 | 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 98 | 0x0421u, 0xef7bu, 0x1ce7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 99 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 100 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 101 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 102 | 0x0000u, 0x0000u, 0x6529u, 0xb6b5u, 0xdfffu, 0xffffu, 0xffffu, 0xffffu, 103 | 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 104 | 0x0000u, 0x0000u, 0x2421u, 0xef7bu, 0x1ce7u, 0xffffu, 0xffffu, 0xffffu, 105 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x6529u, 0xaa52u, 0xaa52u, 106 | 0xcb5au, 0x0c63u, 0x2c63u, 0x4d6bu, 0x8e73u, 0xae73u, 0x3084u, 0x518cu, 107 | 0x718cu, 0xb294u, 0x14a5u, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 108 | 0x0000u, 0x0000u, 0x0000u, 0x8210u, 0x8a52u, 0x518cu, 0x75adu, 0xd7bdu, 109 | 0xd7bdu, 0x3084u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 110 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x6529u, 0xef7bu, 0xd7bdu, 0xd7bdu, 111 | 0xd7bdu, 0x0c63u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 112 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x6108u, 113 | 0xc318u, 0x0421u, 0x6529u, 0xe739u, 0x694au, 0x0842u, 0x0000u, 0x0000u, 114 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2000u, 0x6108u, 115 | 0x6108u, 0x6108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 116 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2000u, 0x6108u, 0x6108u, 117 | 0x6108u, 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 118 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 119 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 120 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 121 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 122 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 123 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 124 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 125 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 126 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 127 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 128 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 129 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4108u, 0x6108u, 0x0000u, 130 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 131 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 132 | 0x0000u, 0x8a52u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 133 | 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 134 | 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 135 | 0x3084u, 0x694au, 0x0000u, 0x0000u, 0x0000u, 0x2842u, 0x518cu, 0xef7bu, 136 | 0x0421u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 137 | 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x494au, 0x8631u, 0x0000u, 0x0000u, 138 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 139 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 140 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 141 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 142 | 0xe318u, 0x0000u, 0x0000u, 0x2000u, 0x694au, 0xcb5au, 0x494au, 0x2000u, 143 | 0x0000u, 0x0000u, 0x0000u, 0xf39cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 144 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 145 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 146 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 147 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 148 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0x1084u, 0x4108u, 149 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 150 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 151 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 152 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 153 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 154 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xef7bu, 0x4108u, 155 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 156 | 0x0000u, 0x8631u, 0x38c6u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 157 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 158 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 159 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 160 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xae73u, 0x2000u, 161 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 162 | 0x0000u, 0x0000u, 0x6529u, 0xdbdeu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 163 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 164 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 165 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 166 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xae73u, 0x2000u, 167 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 168 | 0x0000u, 0x0000u, 0x0000u, 0x0842u, 0x9ef7u, 0xffffu, 0xffffu, 0xffffu, 169 | 0x7defu, 0x55adu, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 170 | 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 0x3084u, 171 | 0x3084u, 0x694au, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 172 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xef7bu, 0x4108u, 173 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 174 | 0x0000u, 0x0000u, 0x0000u, 0x4108u, 0xb294u, 0xffffu, 0xffffu, 0xffffu, 175 | 0x6d6bu, 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 176 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 177 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 178 | 0x2421u, 0x4108u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0x1084u, 0x4108u, 179 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 180 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2842u, 0xbef7u, 0xffffu, 0xbef7u, 181 | 0x0842u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 182 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 183 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 184 | 0xd39cu, 0xd39cu, 0xb294u, 0xb294u, 0xf39cu, 0x55adu, 0xb294u, 0xcb5au, 185 | 0xaa52u, 0x2842u, 0x2842u, 0xd39cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 186 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xa210u, 0x38c6u, 0xffffu, 0xbef7u, 187 | 0xc739u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 188 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 189 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 190 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 191 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 192 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0c63u, 0x3084u, 0x1084u, 193 | 0x2421u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 194 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 195 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 196 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 197 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 198 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 199 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 200 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 201 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xa631u, 0x2c63u, 0x2c63u, 202 | 0x4d6bu, 0xae73u, 0xae73u, 0xcf7bu, 0xef7bu, 0x1084u, 0x518cu, 0x718cu, 203 | 0xd39cu, 0x34a5u, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 204 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 205 | 0x0000u, 0x0000u, 0x6529u, 0x4d6bu, 0x3084u, 0xf39cu, 0x14a5u, 0x14a5u, 206 | 0x14a5u, 0x14a5u, 0x14a5u, 0xf39cu, 0x718cu, 0xae73u, 0xe739u, 0x0000u, 207 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 208 | 0x0000u, 0x0000u, 0x0000u, 0x2000u, 0x4108u, 0x6108u, 0x8210u, 0xa210u, 209 | 0xe318u, 0x0421u, 0x4529u, 0xa631u, 0x2842u, 0xa631u, 0x0000u, 0x0000u, 210 | 0x0000u, 0xa631u, 0xcb5au, 0xcb5au, 0xcb5au, 0x6529u, 0x0000u, 0x0000u, 211 | 0xa210u, 0x9294u, 0xdfffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 212 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0x55adu, 213 | 0x2421u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 214 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 215 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 216 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x2c63u, 0x0000u, 0x2000u, 217 | 0xae73u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 218 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 219 | 0xd7bdu, 0xc318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 220 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 221 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 222 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x2c63u, 0x0000u, 0x8210u, 223 | 0x59ceu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 224 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 225 | 0xdfffu, 0xeb5au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 226 | 0x0000u, 0x0000u, 0x0000u, 0xe318u, 0x4529u, 0x2421u, 0xa210u, 0x0000u, 227 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 228 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x2c63u, 0x0000u, 0xe318u, 229 | 0xbef7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 230 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 231 | 0xffffu, 0x14a5u, 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 232 | 0xe318u, 0xeb5au, 0x3084u, 0xd39cu, 0xf39cu, 0xf39cu, 0xd39cu, 0x3084u, 233 | 0xeb5au, 0xe318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 234 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x2c63u, 0x0000u, 0xe318u, 235 | 0x9ef7u, 0xffffu, 0xffffu, 0xffffu, 0xdfffu, 0x7defu, 0x7defu, 0x7defu, 236 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0xbef7u, 0xffffu, 0xffffu, 237 | 0xffffu, 0x59ceu, 0xa210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2842u, 238 | 0xd39cu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 239 | 0x55adu, 0xf39cu, 0xaa52u, 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 240 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x2c63u, 0x0000u, 0x6108u, 241 | 0xb6b5u, 0xffffu, 0xffffu, 0xbad6u, 0x8a52u, 0xa631u, 0xa631u, 0xa631u, 242 | 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0x494au, 0xfbdeu, 0xffffu, 243 | 0xffffu, 0x9ad6u, 0xe318u, 0x0000u, 0x0000u, 0x0000u, 0xa631u, 0x14a5u, 244 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 245 | 0x55adu, 0x55adu, 0x55adu, 0x2c63u, 0x4108u, 0x0000u, 0x0000u, 0x0000u, 246 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x2c63u, 0x0000u, 0x0000u, 247 | 0x694au, 0x7defu, 0xffffu, 0x9ad6u, 0x2842u, 0x4529u, 0x0000u, 0x0000u, 248 | 0xe318u, 0xa631u, 0xa631u, 0xa631u, 0x0842u, 0xcb5au, 0x1ce7u, 0xffffu, 249 | 0xffffu, 0x9ad6u, 0xe318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 250 | 0x55adu, 0x55adu, 0x3084u, 0x4d6bu, 0xaa52u, 0xaa52u, 0x4d6bu, 0x518cu, 251 | 0x55adu, 0x55adu, 0x55adu, 0x34a5u, 0x2842u, 0x0000u, 0x0000u, 0x0000u, 252 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x18c6u, 0x14a5u, 0x14a5u, 253 | 0x14a5u, 0xfbdeu, 0xffffu, 0xffffu, 0x9ef7u, 0x55adu, 0x0000u, 0x0000u, 254 | 0x0c63u, 0x7defu, 0x7defu, 0x7defu, 0x9ef7u, 0xdfffu, 0xffffu, 0xffffu, 255 | 0xffffu, 0xf7bdu, 0x6108u, 0x0000u, 0x0000u, 0x6529u, 0xf39cu, 0x55adu, 256 | 0x14a5u, 0xaa52u, 0x8210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8210u, 257 | 0x2842u, 0xd39cu, 0x55adu, 0x55adu, 0x1084u, 0x6108u, 0x0000u, 0x0000u, 258 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 259 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 260 | 0x2c63u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 261 | 0xffffu, 0xef7bu, 0x0000u, 0x0000u, 0x0000u, 0x494au, 0x55adu, 0x55adu, 262 | 0xeb5au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 263 | 0x0000u, 0x4529u, 0x9294u, 0x55adu, 0x34a5u, 0xc739u, 0x0000u, 0x0000u, 264 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 265 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 266 | 0x2c63u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 267 | 0x7defu, 0xe739u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 268 | 0x6529u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 269 | 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 0x694au, 0x0000u, 0x0000u, 270 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 271 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 272 | 0x2c63u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 273 | 0x1084u, 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 274 | 0xe318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 275 | 0x0000u, 0x0000u, 0x2421u, 0x34a5u, 0x55adu, 0xcb5au, 0x0000u, 0x0000u, 276 | 0x0000u, 0xae73u, 0x7defu, 0xbef7u, 0xbef7u, 0xbef7u, 0xffffu, 0xffffu, 277 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xb6b5u, 0x0000u, 0x0000u, 278 | 0x2c63u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xdfffu, 0x1ce7u, 0x8e73u, 279 | 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 280 | 0xc318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 281 | 0x0000u, 0x0000u, 0x2000u, 0x34a5u, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 282 | 0x0000u, 0x0421u, 0xa631u, 0x494au, 0x494au, 0x694au, 0xeb5au, 0x0c63u, 283 | 0x0c63u, 0x6d6bu, 0x8e73u, 0x8e73u, 0x1084u, 0x4d6bu, 0x0000u, 0x0000u, 284 | 0x2842u, 0x3084u, 0x3084u, 0xef7bu, 0x6d6bu, 0x8a52u, 0xe318u, 0x0000u, 285 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 286 | 0xc318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 287 | 0x0000u, 0x0000u, 0x0000u, 0xb294u, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 288 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 289 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 290 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 291 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 292 | 0xc318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 293 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 294 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 295 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 296 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 297 | 0x4529u, 0x8631u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x34a5u, 298 | 0x8e73u, 0x2c63u, 0xeb5au, 0xaa52u, 0x2842u, 0xa631u, 0x4529u, 0xe318u, 299 | 0x2000u, 0x0000u, 0x0000u, 0xf39cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 300 | 0x0000u, 0x0421u, 0x2421u, 0xa210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 301 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 302 | 0x0000u, 0x0000u, 0x2000u, 0xc318u, 0xa631u, 0x0c63u, 0xb294u, 0xbad6u, 303 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 304 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 305 | 0x55adu, 0xf39cu, 0x718cu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 306 | 0x0000u, 0xcf7bu, 0x7defu, 0x18c6u, 0xd39cu, 0x4d6bu, 0x494au, 0x4529u, 307 | 0x6108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xc318u, 308 | 0xe739u, 0x2c63u, 0xf39cu, 0x79ceu, 0xdfffu, 0xffffu, 0xffffu, 0xffffu, 309 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 310 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 311 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 312 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xdfffu, 0xfbdeu, 313 | 0x38c6u, 0x718cu, 0x4d6bu, 0x2842u, 0x2842u, 0x6d6bu, 0xf39cu, 0x9ad6u, 314 | 0x9ef7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 315 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0xe739u, 0xae73u, 0xef7bu, 316 | 0xef7bu, 0x1084u, 0x518cu, 0x518cu, 0xb294u, 0xf39cu, 0x55adu, 0x55adu, 317 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 318 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 319 | 0xffffu, 0xffffu, 0xffffu, 0x9ef7u, 0x9ef7u, 0xffffu, 0xffffu, 0xffffu, 320 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 321 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2000u, 0x4108u, 322 | 0x4108u, 0x6108u, 0x8210u, 0x8210u, 0xc318u, 0xe318u, 0x0421u, 0x6529u, 323 | 0xa631u, 0x0842u, 0x8a52u, 0x4d6bu, 0x8e73u, 0x8a52u, 0x0000u, 0x0000u, 324 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 325 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 326 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 327 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 328 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 329 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 330 | 0x0000u, 0x8e73u, 0xdfffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 331 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 332 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xdfffu, 0xdbdeu, 333 | 0x75adu, 0x494au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 334 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 335 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 336 | 0x0000u, 0xe318u, 0x2842u, 0x2c63u, 0x518cu, 0xd7bdu, 0xdbdeu, 0xffffu, 337 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 338 | 0xffffu, 0xffffu, 0x1ce7u, 0x18c6u, 0xb294u, 0x4d6bu, 0x2842u, 0x2421u, 339 | 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 340 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 341 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 342 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4108u, 0xc739u, 0x6d6bu, 0x55adu, 343 | 0xbef7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 344 | 0x9ef7u, 0x75adu, 0x3084u, 0xeb5au, 0xa631u, 0x8210u, 0x0000u, 0x0000u, 345 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 346 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 347 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 348 | 0x0000u, 0x694au, 0x34a5u, 0x38c6u, 0xbef7u, 0xffffu, 0xffffu, 0xffffu, 349 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 350 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0x1ce7u, 0x18c6u, 351 | 0x55adu, 0x8a52u, 0x0000u, 0x0000u, 0x0000u, 0x494au, 0x9294u, 0x518cu, 352 | 0x3084u, 0xef7bu, 0xef7bu, 0xcf7bu, 0xae73u, 0xae73u, 0x4d6bu, 0x2c63u, 353 | 0x2c63u, 0xcb5au, 0xaa52u, 0xaa52u, 0xaa52u, 0xc739u, 0x0000u, 0x0000u, 354 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 355 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 356 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 357 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 358 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 359 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 360 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 361 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 362 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 363 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 364 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 365 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 366 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 367 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 368 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 369 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x2421u, 0x2842u, 0x2842u, 370 | 0x2842u, 0x2842u, 0xaa52u, 0xcb5au, 0xcb5au, 0xcb5au, 0xcb5au, 0x0c63u, 371 | 0x4d6bu, 0x518cu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 372 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 373 | 0x3ce7u, 0x79ceu, 0xf39cu, 0x6d6bu, 0x4d6bu, 0x1084u, 0x75adu, 0x9ad6u, 374 | 0x3ce7u, 0xdfffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 375 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 376 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4529u, 377 | 0x8e73u, 0x34a5u, 0x55adu, 0x55adu, 0x55adu, 0x0c63u, 0x0000u, 0x0000u, 378 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0x9ad6u, 0x75adu, 0xcf7bu, 0x8a52u, 379 | 0x8631u, 0xa210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xa210u, 380 | 0x8631u, 0x494au, 0x0c63u, 0x1084u, 0x96b5u, 0x79ceu, 0x9ef7u, 0xffffu, 381 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 382 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8210u, 0xcb5au, 0xd39cu, 383 | 0x55adu, 0x55adu, 0x55adu, 0xf39cu, 0x0c63u, 0xe318u, 0x0000u, 0x0000u, 384 | 0x0000u, 0x494au, 0xeb5au, 0xa631u, 0xe318u, 0x4108u, 0x0000u, 0x0000u, 385 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 386 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4108u, 0xc318u, 0x4529u, 0x2842u, 387 | 0x2c63u, 0x494au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 388 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xa631u, 0x1084u, 0x55adu, 0x55adu, 389 | 0x55adu, 0x55adu, 0x1084u, 0x8631u, 0x2000u, 0x0000u, 0x0000u, 0x0000u, 390 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 391 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 392 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 393 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 394 | 0x0000u, 0x0000u, 0xe318u, 0x2c63u, 0x34a5u, 0x55adu, 0x55adu, 0x55adu, 395 | 0xd39cu, 0xcb5au, 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 396 | 0x0000u, 0x0421u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 397 | 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 398 | 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 0xc739u, 399 | 0xc739u, 0x0421u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 400 | 0x4108u, 0x2842u, 0x718cu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0xcf7bu, 401 | 0x6529u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 402 | 0x0000u, 0xae73u, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 403 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 404 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 405 | 0x7defu, 0x8e73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4529u, 406 | 0x8e73u, 0x34a5u, 0x55adu, 0x55adu, 0x55adu, 0xb294u, 0x8a52u, 0x6108u, 407 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 408 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 409 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 410 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 411 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x6108u, 0xcb5au, 0xf39cu, 412 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x8e73u, 0x2421u, 0x0000u, 0x0000u, 413 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 414 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 415 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 416 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 417 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 418 | 0x55adu, 0x55adu, 0x518cu, 0x0842u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 419 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 420 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 421 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 422 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 423 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 424 | 0x55adu, 0xf39cu, 0x4d6bu, 0x0c63u, 0xaa52u, 0xaa52u, 0xaa52u, 0xaa52u, 425 | 0xaa52u, 0x694au, 0x2842u, 0x2842u, 0x2842u, 0x8631u, 0x0000u, 0x0000u, 426 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 427 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 428 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 429 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 430 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 431 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 432 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 433 | 0xffffu, 0xbef7u, 0x59ceu, 0x55adu, 0x1084u, 0x2c63u, 0x8a52u, 0x2842u, 434 | 0x2842u, 0x2842u, 0x2842u, 0x2842u, 0x2842u, 0x2842u, 0x2842u, 0x2842u, 435 | 0x2842u, 0x4529u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 436 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 437 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 438 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 439 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0x3ce7u, 0x59ceu, 0x96b5u, 0xb294u, 440 | 0x8e73u, 0xcb5au, 0x0842u, 0x6529u, 0xe318u, 0x2000u, 0x0000u, 0x0000u, 441 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2842u, 0x3084u, 0x3084u, 442 | 0x3084u, 0x3084u, 0x518cu, 0x718cu, 0x718cu, 0x9294u, 0xb294u, 0xb294u, 443 | 0xd39cu, 0xf39cu, 0xf39cu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 444 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 445 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 446 | 0xffffu, 0xffffu, 0xdfffu, 0x1ce7u, 0x9ad6u, 0xf7bdu, 0xb294u, 0xcf7bu, 447 | 0x2c63u, 0x8631u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 448 | 0x0000u, 0x2000u, 0x8210u, 0x8210u, 0x8210u, 0xe318u, 0xe318u, 0xe318u, 449 | 0x2421u, 0x4529u, 0x4529u, 0xc739u, 0xe739u, 0x6529u, 0x0000u, 0x0000u, 450 | 0x0000u, 0x6529u, 0x0c63u, 0xef7bu, 0x14a5u, 0xf7bdu, 0x3ce7u, 0xffffu, 451 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 452 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 453 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 454 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 455 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 456 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xe318u, 457 | 0xe739u, 0x0c63u, 0x1084u, 0x75adu, 0x7defu, 0xffffu, 0xffffu, 0xffffu, 458 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 459 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 460 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 461 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 462 | 0x0000u, 0x0000u, 0x4108u, 0x0421u, 0xa631u, 0x494au, 0xeb5au, 0xae73u, 463 | 0xd39cu, 0xd7bdu, 0x9ad6u, 0x9ef7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 464 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 465 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0xa210u, 0x2421u, 0xe318u, 466 | 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 467 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 468 | 0x0000u, 0x0c63u, 0x59ceu, 0xdbdeu, 0x5defu, 0xffffu, 0xffffu, 0xffffu, 469 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 470 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0x9ef7u, 471 | 0x9ad6u, 0x0c63u, 0x0000u, 0x0000u, 0x0000u, 0x694au, 0xd39cu, 0x718cu, 472 | 0x0421u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 473 | 0x0000u, 0x0000u, 0x0000u, 0x4d6bu, 0x0c63u, 0x2842u, 0x0000u, 0x0000u, 474 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 475 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 476 | 0xffffu, 0xfbdeu, 0xb6b5u, 0xd39cu, 0xcf7bu, 0xcb5au, 0x0842u, 0x4529u, 477 | 0xe318u, 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 478 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0x0c63u, 0x8e73u, 0xeb5au, 0x4108u, 479 | 0x0000u, 0x0000u, 0x0000u, 0xd39cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 480 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 481 | 0xffffu, 0xffffu, 0x9ef7u, 0x38c6u, 0x34a5u, 0x518cu, 0x4d6bu, 0x494au, 482 | 0x6529u, 0x0421u, 0x0421u, 0x0421u, 0x0421u, 0x0421u, 0x0421u, 0x0421u, 483 | 0x0421u, 0xa210u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 484 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0x1084u, 0x4108u, 485 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 486 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 487 | 0xffffu, 0xffffu, 0x5defu, 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 488 | 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 0x3ce7u, 489 | 0x3ce7u, 0x6d6bu, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 490 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xcf7bu, 0x2000u, 491 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 492 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 493 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 494 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 495 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 496 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xae73u, 0x2000u, 497 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 498 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 499 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 500 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 501 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 502 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xae73u, 0x2000u, 503 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 504 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 505 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 506 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 507 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 508 | 0xc318u, 0x0000u, 0x0000u, 0x4108u, 0xcf7bu, 0x55adu, 0xef7bu, 0x4108u, 509 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 510 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 511 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 512 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 513 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x14a5u, 514 | 0xa631u, 0x0421u, 0xe318u, 0x0421u, 0xef7bu, 0x55adu, 0x1084u, 0x4108u, 515 | 0x0000u, 0x0000u, 0x0000u, 0x718cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 516 | 0x0000u, 0xc739u, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 517 | 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 518 | 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 0xeb5au, 519 | 0xeb5au, 0xa631u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 520 | 0xf39cu, 0xb294u, 0xb294u, 0xb294u, 0x14a5u, 0x55adu, 0xb294u, 0x2c63u, 521 | 0x0c63u, 0xaa52u, 0xaa52u, 0xd39cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 522 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 523 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 524 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 525 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 526 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 527 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 528 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 529 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 530 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 531 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8a52u, 0x55adu, 0x55adu, 532 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 533 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 534 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x8210u, 0x0421u, 0xa631u, 535 | 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 536 | 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0x8631u, 0xe318u, 0x4108u, 0x0000u, 537 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2421u, 0x2842u, 0x2842u, 538 | 0x494au, 0xaa52u, 0xaa52u, 0xcb5au, 0x2c63u, 0x4d6bu, 0xae73u, 0xcf7bu, 539 | 0xef7bu, 0x3084u, 0x718cu, 0xd39cu, 0x55adu, 0x4d6bu, 0x0000u, 0x0000u, 540 | 0x0000u, 0x0000u, 0x0000u, 0x6529u, 0xf39cu, 0xfbdeu, 0x3ce7u, 0x7defu, 541 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 542 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x3ce7u, 0x9ad6u, 0xae73u, 543 | 0x6108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 544 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2000u, 545 | 0x4108u, 0x8210u, 0xa210u, 0xe318u, 0x2421u, 0x0421u, 0x0000u, 0x0000u, 546 | 0x0000u, 0x0000u, 0xe739u, 0x3ce7u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 547 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 548 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 549 | 0x9294u, 0x2000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 550 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 551 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 552 | 0x0000u, 0x4108u, 0xb6b5u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 553 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 554 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 555 | 0x5defu, 0xa631u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 556 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 557 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 558 | 0x0000u, 0xa631u, 0x5defu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 559 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 560 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 561 | 0xffffu, 0xeb5au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x2000u, 562 | 0x4108u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4108u, 563 | 0x0842u, 0xaa52u, 0x494au, 0xa210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 564 | 0x0000u, 0xaa52u, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 565 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 566 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 567 | 0xffffu, 0x6d6bu, 0x0000u, 0x0000u, 0x0000u, 0xe739u, 0x3084u, 0xb294u, 568 | 0x2842u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xa210u, 0xae73u, 569 | 0x34a5u, 0x55adu, 0x55adu, 0x718cu, 0xa631u, 0x0000u, 0x0000u, 0x0000u, 570 | 0x0000u, 0x4d6bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xbef7u, 0x7defu, 571 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 572 | 0x7defu, 0x7defu, 0x7defu, 0x9ef7u, 0xdfffu, 0xffffu, 0xffffu, 0xffffu, 573 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0xcb5au, 0x55adu, 0x14a5u, 574 | 0x0421u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xa210u, 0xef7bu, 0x55adu, 575 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0x718cu, 0xe318u, 0x0000u, 0x0000u, 576 | 0x0000u, 0x6d6bu, 0xffffu, 0xffffu, 0xffffu, 0x9ad6u, 0x694au, 0xa631u, 577 | 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 578 | 0xa631u, 0xa631u, 0xa631u, 0xe739u, 0xeb5au, 0xdbdeu, 0xffffu, 0xffffu, 579 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x4d6bu, 0x55adu, 0x9294u, 580 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4108u, 0x4d6bu, 0x55adu, 0x55adu, 581 | 0x55adu, 0x14a5u, 0x55adu, 0x55adu, 0x55adu, 0xaa52u, 0x0000u, 0x0000u, 582 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0x34a5u, 0xa631u, 0xa631u, 583 | 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 584 | 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0xa631u, 0x75adu, 0xffffu, 0xffffu, 585 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x6d6bu, 0x55adu, 0x3084u, 586 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x694au, 0x34a5u, 0x55adu, 0x55adu, 587 | 0x4d6bu, 0x8631u, 0xeb5au, 0x55adu, 0x55adu, 0xae73u, 0x2000u, 0x0000u, 588 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xdfffu, 0x7defu, 0x7defu, 589 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 590 | 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0x7defu, 0xdfffu, 0xffffu, 0xffffu, 591 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x6d6bu, 0x55adu, 0xd39cu, 592 | 0x6108u, 0x0000u, 0x0000u, 0x6529u, 0xf39cu, 0x55adu, 0x55adu, 0x8e73u, 593 | 0x6108u, 0x0000u, 0x2000u, 0x518cu, 0x55adu, 0x1084u, 0x6108u, 0x0000u, 594 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 595 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 596 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 597 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x4d6bu, 0x55adu, 0x55adu, 598 | 0xaa52u, 0x6108u, 0x4529u, 0x718cu, 0x55adu, 0x55adu, 0x1084u, 0x8210u, 599 | 0x0000u, 0x0000u, 0x0000u, 0x6d6bu, 0x55adu, 0x1084u, 0x6108u, 0x0000u, 600 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 601 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 602 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 603 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x694au, 0x55adu, 0x55adu, 604 | 0x14a5u, 0x1084u, 0xf39cu, 0x55adu, 0x55adu, 0x718cu, 0x2421u, 0x0000u, 605 | 0x0000u, 0x0000u, 0x0000u, 0x8e73u, 0x55adu, 0x1084u, 0x6108u, 0x0000u, 606 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 607 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 608 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 609 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x2421u, 0xb294u, 0x55adu, 610 | 0x55adu, 0x55adu, 0x55adu, 0x55adu, 0xb294u, 0xa631u, 0x0000u, 0x0000u, 611 | 0x0000u, 0x0000u, 0x0000u, 0xef7bu, 0x55adu, 0xcf7bu, 0x2000u, 0x0000u, 612 | 0x0000u, 0xcf7bu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 613 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 614 | 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 0xffffu, 615 | 0xffffu, 0xae73u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x694au, 0x55adu, 616 | 0x55adu, 0x55adu, 0x55adu, 0xf39cu, 0x0842u, 0x0000u, 0x0000u, 0x0000u, 617 | 0x0000u, 0x0000u, 0x8210u, 0x14a5u, 0x55adu, 0x0c63u, 0x0000u, 0x0000u, 618 | 0x0000u, 0x8e73u, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 619 | 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 620 | 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 0xfbdeu, 621 | 0xfbdeu, 0x6d6bu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x4529u, 622 | 0x0c63u, 0x8e73u, 0xeb5au, 0xe318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 623 | 0x0000u, 0x0000u, 0x494au, 0xb294u, 0x718cu, 0x0842u, 0x0000u, 0x0000u, 624 | 0x0000u, 0xc318u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 625 | 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 626 | 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 0x4529u, 627 | 0x4529u, 0xc318u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 628 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 629 | 0x0000u, 0x0000u, 0xe318u, 0xe318u, 0x8210u, 0x4108u, 0x0000u, 0x0000u, 630 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 631 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 632 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 633 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 634 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 635 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 636 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 637 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 638 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 639 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 640 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 641 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 642 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 643 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 644 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 645 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 646 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 647 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 648 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 649 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 650 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 651 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 652 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 653 | 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 654 | }; -------------------------------------------------------------------------------- /examples/DMX512Tools/src/src.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "common.h" 3 | #include "view_receiver.h" 4 | #include "view_sender.h" 5 | 6 | QueueHandle_t queue; 7 | 8 | enum scene_mode_t { 9 | mode_select, 10 | mode_receiver, 11 | mode_sender, 12 | }; 13 | 14 | static scene_mode_t scene_mode = mode_select; 15 | static ui_button_t btns[2] = {{0, 200, 120, 40, "Receiver"}, 16 | {200, 200, 120, 40, "Sender"}}; 17 | static view_receiver_t view_receiver; 18 | static view_sender_t view_sender; 19 | 20 | void drawSelectSetup(void) { 21 | scene_mode = mode_select; 22 | M5.Display.fillScreen(TFT_BLACK); 23 | M5.Display.setTextDatum(textdatum_t::baseline_center); 24 | M5.Display.setFont(&fonts::Font4); 25 | M5.Display.drawString("DMX512Tools", M5.Display.width() >> 1, 26 | M5.Display.height() >> 2); 27 | 28 | M5.Display.setFont(&fonts::AsciiFont8x16); 29 | M5.Display.drawString("Select mode", M5.Display.width() >> 1, 30 | M5.Display.height() * 12 >> 4); 31 | for (size_t i = 0; i < 2; ++i) { 32 | btns[i].draw(&M5.Display, false, false, true); 33 | } 34 | } 35 | 36 | void setup(void) { 37 | M5.begin(); 38 | 39 | /* Configure the DMX hardware to the default DMX settings and tell the DMX 40 | driver which hardware pins we are using. */ 41 | dmx_config_t dmxConfig = DMX_DEFAULT_CONFIG; 42 | dmx_param_config(dmxPort, &dmxConfig); 43 | 44 | /// For M5Stack Core2/Tough pin setting: TX:19 RX:35 EN:27 45 | gpio_num_t transmitPin = GPIO_NUM_19; 46 | gpio_num_t receivePin = GPIO_NUM_35; 47 | gpio_num_t enablePin = GPIO_NUM_27; 48 | 49 | /// M5Unifiedの実行環境チェックを利用し、CoreS3,旧Coreでの動作の場合はピン設定を変更する。 50 | if (M5.getBoard() == m5::board_t::board_M5StackCoreS3 51 | || M5.getBoard() == m5::board_t::board_M5StackCoreS3SE) { 52 | /// M5Stack CoreS3 pin setting: TX:7 RX:10 EN:6 53 | transmitPin = GPIO_NUM_7; 54 | receivePin = GPIO_NUM_10; 55 | enablePin = GPIO_NUM_6; 56 | } 57 | else if (M5.getBoard() == m5::board_t::board_M5Stack) { 58 | /// M5Stack(BASIC/GRAY/GO/FIRE) pin setting: TX:13 RX:35 EN:12 59 | transmitPin = GPIO_NUM_13; 60 | receivePin = GPIO_NUM_35; 61 | enablePin = GPIO_NUM_12; 62 | } 63 | dmx_set_pin(dmxPort, transmitPin, receivePin, enablePin); 64 | 65 | dmx_driver_install(dmxPort, DMX_MAX_PACKET_SIZE, dmxQueueSize, &queue, 66 | dmxInterruptPriority); 67 | 68 | drawSelectSetup(); 69 | } 70 | 71 | int getBtnIndex(int x, int y) { 72 | for (int i = 0; i < 2; ++i) { 73 | if (btns[i].contain(x, y)) { 74 | return i; 75 | } 76 | } 77 | return -1; 78 | } 79 | 80 | int focus_idx = -1; 81 | 82 | void loop(void) { 83 | M5.update(); 84 | switch (scene_mode) { 85 | case mode_receiver: 86 | if (!view_receiver.loop()) { 87 | view_receiver.close(); 88 | drawSelectSetup(); 89 | } 90 | return; 91 | 92 | case mode_sender: 93 | if (!view_sender.loop()) { 94 | view_sender.close(); 95 | drawSelectSetup(); 96 | } 97 | return; 98 | 99 | default: 100 | break; 101 | } 102 | 103 | int clicked_idx = -1; 104 | 105 | auto tp = M5.Touch.getDetail(); 106 | if (tp.wasPressed()) { 107 | focus_idx = getBtnIndex(tp.base_x, tp.base_y); 108 | } 109 | if (tp.wasClicked()) { 110 | clicked_idx = getBtnIndex(tp.base_x, tp.base_y); 111 | } 112 | 113 | if (M5.BtnA.wasPressed()) { 114 | focus_idx = 0; 115 | } else if (M5.BtnA.wasReleased() && focus_idx == 0) { 116 | focus_idx = -1; 117 | } 118 | if (M5.BtnC.wasPressed()) { 119 | focus_idx = 1; 120 | } else if (M5.BtnC.wasReleased() && focus_idx == 1) { 121 | focus_idx = -1; 122 | } 123 | if (M5.BtnA.wasClicked()) { 124 | clicked_idx = 0; 125 | } 126 | if (M5.BtnC.wasClicked()) { 127 | clicked_idx = 1; 128 | } 129 | for (size_t i = 0; i < 2; ++i) { 130 | btns[i].draw(&M5.Display, i == focus_idx, i == clicked_idx); 131 | } 132 | delay(10); 133 | 134 | if (clicked_idx >= 0) { 135 | scene_mode = (clicked_idx == 0) ? mode_receiver : mode_sender; 136 | switch (scene_mode) { 137 | case mode_receiver: 138 | view_receiver.setup(); 139 | break; 140 | 141 | case mode_sender: 142 | view_sender.setup(); 143 | break; 144 | 145 | default: 146 | break; 147 | } 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /examples/DMX512Tools/src/view_receiver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "common.h" 4 | 5 | class view_receiver_t : public view_t { 6 | public: 7 | void setup(void) override { 8 | #if ESP_DMX_VERSION == 1 9 | dmx_set_mode(dmxPort, DMX_MODE_RX); 10 | #else 11 | dmx_set_mode(dmxPort, DMX_MODE_READ); 12 | #endif 13 | memset(data, 0, sizeof(data)); 14 | 15 | M5.Display.setFont(&fonts::Font0); 16 | M5.Display.setTextDatum(textdatum_t::top_left); 17 | M5.Display.setTextWrap(false); 18 | M5.Display.fillScreen(TFT_BLACK); 19 | M5.Display.drawFastHLine(0, CONSOLE_Y - 3, M5.Display.width(), 20 | TFT_DARKGRAY); 21 | 22 | canvas.setColorDepth(8); 23 | canvas.createSprite(M5.Display.width(), 24 | M5.Display.height() - CONSOLE_Y); 25 | canvas.setTextScroll(true); 26 | 27 | fillBar(&M5.Display, 0, 0, M5.Display.width(), BAR_HEIGHT); 28 | } 29 | 30 | bool loop(void) override { 31 | bool change_view = M5.BtnB.wasClicked(); 32 | if (!change_view) { 33 | auto td = M5.Touch.getDetail(); 34 | change_view = (td.wasClicked() && td.y > CONSOLE_Y && 35 | td.y < M5.Display.height()); 36 | } 37 | if (change_view) { 38 | graph_view = !graph_view; 39 | } 40 | 41 | dmx_event_t packet; 42 | 43 | if (xQueueReceive(queue, &packet, DMX_RX_PACKET_TOUT_TICK)) { 44 | if (packet.status == DMX_OK) { 45 | if (!dmxIsConnected) { 46 | dmxIsConnected = true; 47 | canvas.println("DMX connected!"); 48 | canvas.pushSprite(&M5.Display, 0, CONSOLE_Y); 49 | } 50 | if (ESP_OK == 51 | dmx_read_packet(dmxPort, data[data_idx], packet.size)) { 52 | updateDisplay(packet.duration); 53 | data_idx = !data_idx; 54 | } 55 | } else { 56 | canvas.println("\nDMX error!"); 57 | canvas.pushSprite(&M5.Display, 0, CONSOLE_Y); 58 | } 59 | } 60 | return true; 61 | } 62 | 63 | void close(void) override { 64 | canvas.deleteSprite(); 65 | } 66 | 67 | private: 68 | static constexpr int BAR_HEIGHT = 128; 69 | static constexpr int CONSOLE_Y = 152; 70 | 71 | uint32_t timer; 72 | size_t data_idx = 0; 73 | M5Canvas canvas; 74 | bool graph_view = false; 75 | uint8_t visible[DMX_MAX_PACKET_SIZE]; 76 | uint8_t data[2][DMX_MAX_PACKET_SIZE]; 77 | bool dmxIsConnected = false; 78 | 79 | uint32_t getBarColor(int32_t y) { 80 | int32_t v = 63 - (y >> 1); 81 | int32_t v2 = 63 - ((y + 1) >> 1); 82 | if ((v >> 4) != (v2 >> 4)) { 83 | return 0x887766u; 84 | } 85 | return m5gfx::color888(v + 2, v, v + 6); 86 | } 87 | 88 | void fillBar(LovyanGFX* gfx, int32_t x, int32_t y, int32_t w, int32_t h, 89 | size_t ch = 0) { 90 | uint32_t color_add = 0; 91 | if (h < 0) { 92 | y += h; 93 | h = -h; 94 | color_add = (bar_color_table[ch & 15] >> 1) & 0x7F7F7Fu; 95 | } 96 | 97 | gfx->setAddrWindow(x, y, w, h); 98 | uint32_t prev_color = (color_add + getBarColor(y)) & 0xF8FCF8u; 99 | uint32_t py = y; 100 | while (h--) { 101 | uint32_t color = (color_add + getBarColor(++y)) & 0xF8FCF8u; 102 | if (prev_color != color || h == 0) { 103 | gfx->pushBlock(prev_color, w * (y - py)); 104 | prev_color = color; 105 | py = y; 106 | } 107 | } 108 | } 109 | 110 | void updateDisplay(int32_t duration) { 111 | timer += duration; 112 | int idx = 0; 113 | bool full_redraw = false; 114 | bool drawed = false; 115 | 116 | size_t drawcount = 0; 117 | for (int ch = 1; ch < DMX_MAX_PACKET_SIZE; ++ch) { 118 | if (!visible[ch]) { 119 | if (data[0][ch] == data[1][ch]) { 120 | continue; 121 | } 122 | visible[ch] = true; 123 | full_redraw = true; 124 | } 125 | ++drawcount; 126 | } 127 | 128 | M5.Display.startWrite(); 129 | for (int ch = 1; ch < DMX_MAX_PACKET_SIZE; ++ch) { 130 | if (!visible[ch]) { 131 | if (data[0][ch] == data[1][ch]) { 132 | continue; 133 | } 134 | visible[ch] = true; 135 | full_redraw = true; 136 | } 137 | uint32_t current_data = data[data_idx][ch]; 138 | uint32_t prev_data = data[!data_idx][ch]; 139 | if (full_redraw || current_data != prev_data) { 140 | int x = (idx * M5.Display.width()) / drawcount; 141 | int w = (((idx + 1) * M5.Display.width()) / drawcount) - x; 142 | if (full_redraw) { 143 | M5.Display.fillRect(x, BAR_HEIGHT, w, 20, TFT_BLACK); 144 | M5.Display.setTextColor(bar_color_table[ch & 15]); 145 | M5.Display.setCursor(x - 3, BAR_HEIGHT + 12); 146 | M5.Display.printf("% 3d", ch); 147 | } 148 | M5.Display.setTextColor(TFT_WHITE, TFT_BLACK); 149 | M5.Display.setCursor(x + 2, BAR_HEIGHT + 2); 150 | M5.Display.printf("%02x", current_data); 151 | 152 | int y = BAR_HEIGHT - ((current_data + 1) >> 1); 153 | int py = 154 | BAR_HEIGHT - (full_redraw ? 0 : ((prev_data + 1) >> 1)); 155 | if (full_redraw) { 156 | fillBar(&M5.Display, x, 0, w, BAR_HEIGHT, ch); 157 | } 158 | if (w > 2) { 159 | --w; 160 | } 161 | if (w > 2) { 162 | ++x; 163 | --w; 164 | } 165 | fillBar(&M5.Display, x, py, w, y - py, ch); 166 | } 167 | 168 | if (graph_view) { 169 | if (!drawed) { 170 | drawed = true; 171 | } 172 | int32_t x1 = current_data; 173 | int32_t x2 = prev_data; 174 | if (x1 > x2) { 175 | std::swap(x1, x2); 176 | } 177 | canvas.fillRectAlpha(32 + x1, canvas.height() - 1, x2 - x1 + 1, 178 | 1, 128, bar_color_table[ch & 15]); 179 | } else { 180 | if (prev_data != current_data) { 181 | if (!drawed) { 182 | drawed = true; 183 | canvas.setTextColor(TFT_SKYBLUE); 184 | int msec = timer / 1000; 185 | int second = msec / 1000; 186 | int minute = second / 60; 187 | msec -= second * 1000; 188 | second -= minute * 60; 189 | canvas.printf("%2d:%02d.%03d", minute, second, msec); 190 | } 191 | if (canvas.getCursorX() > 280) { 192 | canvas.println(); 193 | canvas.setCursor(9 * canvas.fontWidth(), 194 | canvas.getCursorY()); 195 | } 196 | canvas.setTextColor(TFT_DARKGRAY); 197 | canvas.printf(" [", timer / 1000); 198 | canvas.setTextColor(bar_color_table[ch & 15]); 199 | canvas.printf("%3d", ch); 200 | canvas.setTextColor((uint8_t)0x29u); 201 | canvas.print("]"); 202 | canvas.setTextColor(TFT_WHITE); 203 | canvas.printf("%02x", current_data); 204 | } 205 | } 206 | ++idx; 207 | } 208 | if (drawed) { 209 | canvas.pushSprite(&M5.Display, 0, CONSOLE_Y); 210 | if (graph_view) { 211 | canvas.scroll(0, -1); 212 | } else { 213 | canvas.println(); 214 | } 215 | } 216 | M5.Display.endWrite(); 217 | } 218 | }; 219 | -------------------------------------------------------------------------------- /examples/DMX512Tools/src/view_sender.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "common.h" 4 | #include "logo_sender.h" 5 | 6 | class view_sender_t : public view_t { 7 | public: 8 | void setup(void) override { 9 | #if ESP_DMX_VERSION == 1 10 | dmx_set_mode(dmxPort, DMX_MODE_TX); 11 | #else 12 | dmx_set_mode(dmxPort, DMX_MODE_WRITE); 13 | #endif 14 | memset(data, 0, sizeof(data)); 15 | dmx_write_packet(dmxPort, data[0], DMX_MAX_PACKET_SIZE); 16 | 17 | M5.Display.setFont(&fonts::Font0); 18 | M5.Display.setTextDatum(textdatum_t::top_left); 19 | M5.Display.setTextWrap(false); 20 | M5.Display.fillScreen(TFT_BLACK); 21 | 22 | enable_channel_count = 512; 23 | for (int i = 0; i < enable_channel_count; ++i) { 24 | int ch = i + 1; 25 | enable_channels[i] = ch; 26 | visible[ch] = 1; 27 | // data[0][ch] = rand(); 28 | // data[1][ch] = data[0][ch]; 29 | } 30 | target_channel = enable_channels[target_channel_index]; 31 | 32 | updateDisplay(true); 33 | hideUIValueSet(); 34 | } 35 | 36 | bool loop(void) override { 37 | #if ESP_DMX_VERSION == 1 38 | if (ESP_ERR_TIMEOUT != dmx_wait_tx_done(dmxPort, 0)) { 39 | dmx_tx_packet(dmxPort); 40 | } 41 | #else 42 | if (ESP_ERR_TIMEOUT != dmx_wait_send_done(dmxPort, 0)) { 43 | dmx_send_packet(dmxPort, DMX_MAX_PACKET_SIZE); 44 | } 45 | #endif 46 | 47 | bool modified = false; 48 | bool btnB_Clicked = M5.BtnB.wasClicked(); 49 | 50 | auto tp = M5.Touch.getDetail(); 51 | if (tp.state) { 52 | if (tp.base_y < scroll_height && 53 | tp.base_x < 54 | scroll_width) { /// スクロールエリア内でのタッチ操作の処理; 55 | auto dy = tp.deltaY(); 56 | scroll_y_add = -dy; 57 | if (dy && ui_mode == ui_mode_t::mode_value_setting) { 58 | setUIMode(ui_mode_t::mode_channel_select); 59 | } 60 | 61 | if (tp.wasClicked()) { /// タップ操作でチャンネル選択; 62 | int new_channel_index = 63 | (tp.x / channel_item_width) + 64 | ((tp.y + scroll_y) / channel_item_height) * 65 | channel_item_cols; 66 | 67 | if (new_channel_index < 0) { 68 | new_channel_index = 0; 69 | } else if (new_channel_index >= enable_channel_count) { 70 | new_channel_index = enable_channel_count - 1; 71 | } else if (target_channel_index != new_channel_index) { 72 | target_channel_index = new_channel_index; 73 | target_channel = enable_channels[new_channel_index]; 74 | target_value = data[data_idx][target_channel]; 75 | modified = true; 76 | ui_mode = ui_mode_t::mode_channel_select; 77 | setUIMode(ui_mode_t::mode_value_setting); 78 | } else { 79 | setUIMode(ui_mode == ui_mode_t::mode_channel_select 80 | ? ui_mode_t::mode_value_setting 81 | : ui_mode_t::mode_channel_select); 82 | } 83 | updateDisplay(true); 84 | } 85 | } else if (tp.base_x >= scroll_width && 86 | tp.base_y < M5.Display.height()) { 87 | if (ui_mode == ui_mode_t::mode_value_setting) { 88 | int new_value = target_value; 89 | if (tp.base_y >= slider_y && tp.base_y - 128 < slider_y) { 90 | new_value = 255 - ((tp.y - slider_y) << 1); 91 | } else if (tp.wasPressed() || tp.isHolding()) { 92 | new_value += (tp.base_y < slider_y) ? 1 : -1; 93 | } 94 | 95 | if (new_value < 0) { 96 | new_value = 0; 97 | } else if (new_value > 255) { 98 | new_value = 255; 99 | } 100 | if (target_value != new_value) { 101 | drawUIValueSet(new_value); 102 | } 103 | } 104 | } 105 | } 106 | 107 | switch (ui_mode) { 108 | case mode_channel_select: { 109 | int new_channel_index = target_channel_index; 110 | if (M5.BtnA.wasPressed() || M5.BtnA.isHolding()) { 111 | --new_channel_index; 112 | } 113 | if (M5.BtnC.wasPressed() || M5.BtnC.isHolding()) { 114 | ++new_channel_index; 115 | } 116 | if (new_channel_index != target_channel_index) { 117 | if (new_channel_index < 0) { 118 | new_channel_index = 0; 119 | } else if (new_channel_index >= enable_channel_count) { 120 | new_channel_index = enable_channel_count - 1; 121 | } 122 | 123 | target_channel_index = new_channel_index; 124 | int new_channel = enable_channels[new_channel_index]; 125 | if (target_channel != new_channel) { 126 | target_channel = new_channel; 127 | target_value = data[data_idx][new_channel]; 128 | if (!scrollToTargetItem()) { 129 | updateDisplay(true); 130 | } 131 | } 132 | modified = true; 133 | } 134 | if (btnB_Clicked) { 135 | setUIMode(ui_mode_t::mode_value_setting); 136 | modified = true; 137 | } 138 | } break; 139 | 140 | case mode_value_setting: 141 | 142 | { 143 | int new_value = target_value; 144 | if (M5.BtnA.wasPressed() || M5.BtnA.isHolding()) { 145 | --new_value; 146 | } 147 | if (M5.BtnC.wasPressed() || M5.BtnC.isHolding()) { 148 | ++new_value; 149 | } 150 | if (new_value != target_value) { 151 | if (new_value <= 0) { 152 | new_value = 0; 153 | } else if (new_value > 255) { 154 | new_value = 255; 155 | } 156 | drawUIValueSet(new_value); 157 | } 158 | if (btnB_Clicked) { 159 | setUIMode(ui_mode_t::mode_channel_select); 160 | } 161 | } 162 | } 163 | 164 | if (target_value != data[data_idx][target_channel]) { 165 | data_idx = 1 - data_idx; 166 | data[data_idx][target_channel] = target_value; 167 | dmx_write_packet(dmxPort, data[data_idx], DMX_MAX_PACKET_SIZE); 168 | updateDisplay(); 169 | modified = true; 170 | data[1 - data_idx][target_channel] = target_value; 171 | } 172 | 173 | if (scroll_y_add) { 174 | int new_y = scroll_y + scroll_y_add; 175 | scroll_y_add += (scroll_y_add < 0) ? 1 : -1; 176 | if (new_y < 0) { 177 | new_y = 0; 178 | } 179 | static constexpr int scroll_liimt = 180 | channel_item_height * 181 | ((511 + channel_item_cols) / channel_item_cols) - 182 | scroll_height; 183 | if (new_y > scroll_liimt) { 184 | new_y = scroll_liimt; 185 | } 186 | if (scroll_y != new_y) { 187 | scroll_y = new_y; 188 | updateDisplay(true); 189 | } 190 | } 191 | 192 | if (!modified) { 193 | delay(1); 194 | } 195 | 196 | return true; 197 | } 198 | 199 | void close(void) override { 200 | for (auto& tmp : canvas) { 201 | tmp.deleteSprite(); 202 | } 203 | } 204 | 205 | private: 206 | static constexpr int BAR_HEIGHT = 64; 207 | static constexpr int CONSOLE_Y = 88; 208 | 209 | size_t data_idx = 0; 210 | M5Canvas canvas[2]; 211 | bool canvas_flip; 212 | 213 | uint16_t enable_channels[DMX_MAX_PACKET_SIZE]; 214 | uint16_t enable_channel_count; 215 | 216 | uint8_t visible[DMX_MAX_PACKET_SIZE]; 217 | uint8_t data[2][DMX_MAX_PACKET_SIZE]; 218 | uint16_t target_channel_index = 0; 219 | uint16_t target_channel; 220 | int16_t target_value = 0; 221 | int16_t scroll_y = 0; 222 | int16_t scroll_y_add = 0; 223 | static constexpr uint16_t scroll_width = 250; 224 | static constexpr uint8_t scroll_height = 240; 225 | static constexpr uint8_t channel_item_cols = 5; 226 | static constexpr uint8_t channel_item_width = 227 | scroll_width / channel_item_cols; 228 | static constexpr uint8_t channel_item_height = 54; 229 | static constexpr uint16_t slider_x = scroll_width + 28; 230 | static constexpr uint8_t slider_w = 16; 231 | static constexpr uint8_t slider_y = 72; // 40; 232 | static constexpr uint8_t slider_btn_height = 32; 233 | 234 | int16_t circle_ui_x = 160; 235 | int16_t circle_ui_y = 160; 236 | int16_t circle_ui_r0 = 40; 237 | int16_t circle_ui_r1 = 72; 238 | 239 | enum ui_mode_t { 240 | mode_channel_select, 241 | mode_value_setting, 242 | }; 243 | 244 | ui_mode_t ui_mode = mode_channel_select; 245 | 246 | void setUIMode(ui_mode_t new_mode) { 247 | if (ui_mode == new_mode) { 248 | return; 249 | } 250 | ui_mode = new_mode; 251 | switch (new_mode) { 252 | case ui_mode_t::mode_channel_select: 253 | // M5.Speaker.tone(660, 80); 254 | hideUIValueSet(); 255 | break; 256 | 257 | case ui_mode_t::mode_value_setting: 258 | // M5.Speaker.tone(880, 80); 259 | target_value = data[data_idx][target_channel]; 260 | drawUIValueSet(target_value, true); 261 | scrollToTargetItem(); 262 | break; 263 | 264 | default: 265 | break; 266 | } 267 | updateDisplay(true); 268 | } 269 | 270 | bool scrollToTargetItem(void) { 271 | int new_y = 272 | (target_channel_index / channel_item_cols) * channel_item_height; 273 | if (scroll_y > new_y) { 274 | scroll_y_add = 0; 275 | int target = scroll_y - new_y; 276 | while (0 < (target += --scroll_y_add)) 277 | ; 278 | return true; 279 | } else if (scroll_y + scroll_height - channel_item_height < new_y) { 280 | scroll_y_add = 0; 281 | int target = 282 | new_y - (scroll_y + scroll_height - channel_item_height); 283 | while (0 < (target -= ++scroll_y_add)) 284 | ; 285 | return true; 286 | } 287 | return false; 288 | } 289 | 290 | void drawFocusBox(LovyanGFX* gfx, int x, int y, int w, int h, int fw) { 291 | int horizon = w >> 2; 292 | int vertical = h >> 3; 293 | gfx->fillRect(x, y, horizon, fw); 294 | gfx->fillRect(x + w - horizon, y, horizon, fw); 295 | gfx->fillRect(x, y + h - fw, horizon, fw); 296 | gfx->fillRect(x + w - horizon, y + h - fw, horizon, fw); 297 | gfx->fillRect(x, y + fw, fw, vertical); 298 | gfx->fillRect(x + w - fw, y + fw, fw, vertical); 299 | gfx->fillRect(x, y + h - fw - vertical, fw, vertical); 300 | gfx->fillRect(x + w - fw, y + h - fw - vertical, fw, vertical); 301 | } 302 | 303 | void hideUIValueSet(void) { 304 | M5.Display.fillRect(scroll_width, 0, 320 - scroll_width, 305 | M5.Display.height(), TFT_BLACK); 306 | M5.Display.fillRect(scroll_width, scroll_height, 1, 307 | M5.Display.height() - (scroll_height << 1), 308 | TFT_DARKGRAY); 309 | M5.Display.pushImage(scroll_width + 8, 120, logo_sender_width, 310 | logo_sender_height, 311 | (const m5gfx::swap565_t*)logo_sender); 312 | } 313 | 314 | void drawUIValueUpDown(int sign = 0) { 315 | int x = scroll_width + 10; 316 | int w = 320 - scroll_width - 20; 317 | // M5.Display.drawRoundRect(x, 2, w, slider_btn_height - 4, 318 | // 4, sign > 0 ? TFT_WHITE : TFT_DARKGRAY); 319 | M5.Display.drawRoundRect(x, slider_y - 10 - (slider_btn_height - 4), w, 320 | slider_btn_height - 4, 4, 321 | sign > 0 ? TFT_WHITE : TFT_DARKGRAY); 322 | M5.Display.drawRoundRect(x, slider_y + 128 + 10, w, 323 | slider_btn_height - 4, 4, 324 | sign < 0 ? TFT_WHITE : TFT_DARKGRAY); 325 | } 326 | 327 | void drawUIValueSet(uint16_t new_value, bool force_redraw = false) { 328 | M5.Display.setTextDatum(textdatum_t::middle_center); 329 | M5.Display.setTextColor(TFT_WHITE, TFT_BLACK); 330 | M5.Display.setFont(&fonts::AsciiFont8x16); 331 | char str[8]; 332 | uint32_t color = bar_color_table[target_channel & 15]; 333 | 334 | int y = ((256 - new_value) >> 1) + slider_y; 335 | int py = ((256 - target_value) >> 1) + slider_y; 336 | 337 | int text_x = (scroll_width + M5.Display.width()) >> 1; 338 | // int text_y = ((slider_y * 2 + 128)+M5.Display.height()) >> 1; 339 | int text_y = 16; 340 | if (force_redraw) { 341 | M5.Display.fillRect(scroll_width + 1, 0, 320 - scroll_width, 342 | M5.Display.height(), TFT_BLACK); 343 | py = 128 + slider_y; 344 | 345 | M5.Display.setColor(TFT_WHITE); 346 | drawFocusBox(&M5.Display, slider_x - 8, slider_y - 5, slider_w + 16, 347 | 128 + 10, 2); 348 | 349 | fillBar(&M5.Display, slider_x, slider_y, slider_w, y - slider_y, 350 | target_channel); 351 | 352 | int text_x = (scroll_width + M5.Display.width()) >> 1; 353 | M5.Display.drawString("+", text_x, 354 | slider_y - 8 - (slider_btn_height >> 1)); 355 | M5.Display.drawString( 356 | "-", text_x, slider_y + 128 + 8 + (slider_btn_height >> 1)); 357 | snprintf(str, sizeof(str), "%3dch", target_channel); 358 | M5.Display.drawString(str, text_x, text_y - 8); 359 | drawUIValueUpDown(); 360 | } 361 | if (force_redraw || target_value != new_value) { 362 | snprintf(str, sizeof(str), "%3d", new_value); 363 | M5.Display.drawString(str, text_x, text_y + 8); 364 | target_value = new_value; 365 | } 366 | 367 | fillBar(&M5.Display, slider_x, py, slider_w, y - py, target_channel); 368 | } 369 | 370 | uint32_t getBarColor(int32_t y) { 371 | int32_t v = 63 - (y >> 1); 372 | int32_t v2 = 63 - ((y + 1) >> 1); 373 | if ((v >> 4) != (v2 >> 4)) { 374 | return 0x887766u; 375 | } 376 | return m5gfx::color888(v + 2, v, v + 6); 377 | } 378 | 379 | void fillBar(LovyanGFX* gfx, int32_t x, int32_t y, int32_t w, int32_t h, 380 | size_t ch = 0) { 381 | uint32_t color_add = 0; 382 | if (h < 0) { 383 | y += h; 384 | h = -h; 385 | color_add = (bar_color_table[ch & 15] >> 1) & 0x7F7F7Fu; 386 | } 387 | 388 | gfx->setAddrWindow(x, y, w, h); 389 | uint32_t prev_color = 390 | (color_add + getBarColor(y - slider_y)) & 0xF8FCF8u; 391 | uint32_t py = y; 392 | while (h--) { 393 | uint32_t color = 394 | (color_add + getBarColor(++y - slider_y)) & 0xF8FCF8u; 395 | if (prev_color != color || h == 0) { 396 | gfx->pushBlock(prev_color, w * (y - py)); 397 | prev_color = color; 398 | py = y; 399 | } 400 | } 401 | } 402 | 403 | void updateDisplay(bool full_redraw = false) { 404 | int idx = 0; 405 | bool drawed = false; 406 | 407 | size_t drawcount = 0; 408 | for (int ch = 1; ch < DMX_MAX_PACKET_SIZE; ++ch) { 409 | if (!visible[ch]) { 410 | if (data[0][ch] == data[1][ch]) { 411 | continue; 412 | } 413 | visible[ch] = true; 414 | full_redraw = true; 415 | } 416 | ++drawcount; 417 | } 418 | 419 | M5.Display.setClipRect(0, 0, 320, scroll_height); 420 | M5.Display.startWrite(); 421 | 422 | static constexpr int circle_x = channel_item_width >> 1; 423 | static constexpr int circle_y = (channel_item_height - 8) >> 1; 424 | 425 | for (int ch = 1; ch < 512 + channel_item_cols; ++ch) { 426 | uint32_t current_data = 0; 427 | uint32_t prev_data = 0; 428 | if (ch < DMX_MAX_PACKET_SIZE) { 429 | current_data = data[data_idx][ch]; 430 | prev_data = data[!data_idx][ch]; 431 | } 432 | if (full_redraw || current_data != prev_data) { 433 | int y = (idx / channel_item_cols) * channel_item_height; 434 | y -= scroll_y; 435 | if (y >= scroll_height) { 436 | break; 437 | } 438 | if (y + channel_item_height > 0) { 439 | int x = (idx % channel_item_cols) * channel_item_width; 440 | 441 | auto& c = canvas[canvas_flip]; 442 | canvas_flip = !canvas_flip; 443 | c.createSprite(channel_item_width, channel_item_height); 444 | 445 | if (ch < DMX_MAX_PACKET_SIZE) { 446 | if (ch == target_channel) { 447 | int fw = (ui_mode == ui_mode_t::mode_channel_select) 448 | ? 2 449 | : 1; 450 | c.setColor(0xFFFFFFu); 451 | drawFocusBox(&c, 0, 0, channel_item_width, 452 | channel_item_height, fw); 453 | } 454 | bool dimmer = 455 | (ui_mode != ui_mode_t::mode_channel_select) && 456 | (ch != target_channel); 457 | 458 | c.setTextDatum(textdatum_t::middle_center); 459 | c.setTextColor(dimmer ? TFT_DARKGRAY : TFT_WHITE); 460 | c.setFont(&fonts::Font2); 461 | c.drawNumber(ch, circle_x + 1, circle_y); 462 | c.setFont(&fonts::Font0); 463 | c.setTextDatum(textdatum_t::top_center); 464 | c.drawNumber(current_data, circle_x + 1, circle_y + 20); 465 | float angle = current_data * 360.0f / 255; 466 | 467 | c.fillArc(circle_x, circle_y, 17, 15, 270 + angle, 269, 468 | dimmer ? 0x131313u : 0x333333u); 469 | uint32_t color = bar_color_table[ch & 15]; 470 | if (dimmer) { 471 | color = (0x3F3F3F & (color >> 2)) + 0x2F2F2Fu; 472 | } 473 | c.fillArc(circle_x, circle_y, 19, 13, 270, 270 + angle, 474 | color); 475 | } 476 | c.pushSprite(&M5.Display, x, y); 477 | } 478 | } 479 | ++idx; 480 | } 481 | M5.Display.clearClipRect(); 482 | M5.Display.endWrite(); 483 | } 484 | }; 485 | -------------------------------------------------------------------------------- /examples/PortSeparateSample/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.16.0) 2 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 3 | project(DMX512Tools) 4 | -------------------------------------------------------------------------------- /examples/PortSeparateSample/PortSeparateSample.ino: -------------------------------------------------------------------------------- 1 | /// This is an empty sketch for ArduinoIDE and PlatformIO compatibility. 2 | /// The source code is located in the src folder. 3 | -------------------------------------------------------------------------------- /examples/PortSeparateSample/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # This file was automatically generated for projects 2 | # without default 'CMakeLists.txt' file. 3 | 4 | FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) 5 | 6 | idf_component_register(SRCS ${app_sources}) 7 | -------------------------------------------------------------------------------- /examples/PortSeparateSample/src/src.cpp: -------------------------------------------------------------------------------- 1 | 2 | 3 | /// M5ライブラリは M5Stack.hやM5Core2.hを使用しても良いが、 4 | /// この例では 旧CoreとCore2のどちらにも対応可能なM5Unifiedを使用する。 5 | 6 | #include // https://github.com/M5Stack/M5Unified/ 7 | #include // https://github.com/someweisguy/esp_dmx/ 8 | 9 | /// ESP_DMXライブラリはメジャーバージョンアップ時に色々な名称変更があったため、 10 | /// バージョン1.x, 2.x, 3.1.x に対応できるようにdefine値に基づいたチェックを行う。 11 | #if defined(ESP_DMX_VERSION_MAJOR) 12 | #define ESP_DMX_VERSION 3 13 | #elif defined(DMX_PACKET_TIMEOUT_TICK) 14 | #define ESP_DMX_VERSION 2 15 | #else 16 | #define ESP_DMX_VERSION 1 17 | #endif 18 | 19 | // パススルー構成の時は送受信をひとつのシリアルポートで行うが、 20 | // セパレート構成の時は送信と受信を別々のシリアルポートで行う。 21 | 22 | /// 送信に使用するUARTのポート番号 23 | static constexpr const dmx_port_t dmxTxPort = 1; 24 | 25 | /// 受信に使用するUARTのポート番号 26 | static constexpr const dmx_port_t dmxRxPort = 2; 27 | 28 | static constexpr const int dmxInterruptPriority = 1; 29 | static constexpr const int dmxQueueSize = 1; 30 | 31 | QueueHandle_t dmxTxQueue; 32 | QueueHandle_t dmxRxQueue; 33 | 34 | /// 送受信データ 35 | #if ESP_DMX_VERSION == 3 36 | uint8_t in_data[DMX_PACKET_SIZE]; 37 | uint8_t out_data[DMX_PACKET_SIZE]; 38 | #else 39 | uint8_t in_data[DMX_MAX_PACKET_SIZE]; 40 | uint8_t out_data[DMX_MAX_PACKET_SIZE]; 41 | #endif 42 | 43 | /// デバッグ用 44 | unsigned long lastUpdate = millis(); 45 | 46 | void setup(void) { 47 | M5.begin(); 48 | /// デバッグ用 49 | Serial.begin(115200); 50 | 51 | /// Core2用のピン設定を用意。 52 | /// For M5Stack Core2/Tough pin setting: TX:19 RX:35 EN:27 53 | gpio_num_t transmitPin = GPIO_NUM_19; 54 | gpio_num_t receivePin = GPIO_NUM_35; 55 | gpio_num_t enablePin = GPIO_NUM_27; 56 | 57 | /// M5Unifiedの実行環境チェックを利用し、CoreS3,旧Coreでの動作の場合はピン設定を変更する。 58 | if (M5.getBoard() == m5::board_t::board_M5StackCoreS3 59 | || M5.getBoard() == m5::board_t::board_M5StackCoreS3SE) { 60 | /// M5Stack CoreS3 pin setting: TX:7 RX:10 EN:6 61 | transmitPin = GPIO_NUM_7; 62 | receivePin = GPIO_NUM_10; 63 | enablePin = GPIO_NUM_6; 64 | } 65 | else if (M5.getBoard() == m5::board_t::board_M5Stack) { 66 | /// M5Stack(BASIC/GRAY/GO/FIRE) pin setting: TX:13 RX:35 EN:12 67 | transmitPin = GPIO_NUM_13; 68 | receivePin = GPIO_NUM_35; 69 | enablePin = GPIO_NUM_12; 70 | } 71 | 72 | /// 送信用と受信用の両方のシリアルポートを準備する。 73 | #if ESP_DMX_VERSION == 3 74 | dmx_config_t dmxConfig = DMX_CONFIG_DEFAULT; 75 | #else 76 | dmx_config_t dmxConfig = DMX_DEFAULT_CONFIG; 77 | dmx_param_config(dmxTxPort, &dmxConfig); 78 | dmx_param_config(dmxRxPort, &dmxConfig); 79 | #endif 80 | 81 | ///Ver2まではこのタイミングでdmx_set_pin 82 | #if ESP_DMX_VERSION < 3 83 | /// 送信側ポートは Tx と En のみ使用する。Rx は使用しない。 84 | dmx_set_pin(dmxTxPort, transmitPin, -1, enablePin); 85 | 86 | /// 受信側ポートは Rx のみを使用する。Tx と En は使用しない。 87 | dmx_set_pin(dmxRxPort, -1, receivePin, -1); 88 | #endif 89 | 90 | /// esp_dmxドライバを準備する。 91 | #if ESP_DMX_VERSION == 3 92 | dmx_driver_install(dmxTxPort, &dmxConfig, DMX_INTR_FLAGS_DEFAULT); 93 | dmx_driver_install(dmxRxPort, &dmxConfig, DMX_INTR_FLAGS_DEFAULT); 94 | #else 95 | dmx_driver_install(dmxTxPort, DMX_MAX_PACKET_SIZE, dmxQueueSize, 96 | &dmxTxQueue, dmxInterruptPriority); 97 | dmx_driver_install(dmxRxPort, DMX_MAX_PACKET_SIZE, dmxQueueSize, 98 | &dmxRxQueue, dmxInterruptPriority); 99 | #endif 100 | 101 | #if ESP_DMX_VERSION == 1 102 | dmx_set_mode(dmxRxPort, DMX_MODE_RX); 103 | dmx_set_mode(dmxTxPort, DMX_MODE_TX); 104 | #elif ESP_DMX_VERSION == 2 105 | dmx_set_mode(dmxRxPort, DMX_MODE_READ); 106 | dmx_set_mode(dmxTxPort, DMX_MODE_WRITE); 107 | #elif ESP_DMX_VERSION == 3 108 | dmx_set_pin(dmxTxPort, transmitPin, -1, enablePin); 109 | dmx_set_pin(dmxRxPort, -1, receivePin, -1); 110 | #endif 111 | } 112 | 113 | void loop(void) { 114 | 115 | #if ESP_DMX_VERSION == 3 116 | dmx_packet_t packet; 117 | #else 118 | dmx_event_t packet; 119 | #endif 120 | 121 | /// RX側からDMXデータを受信する。 122 | #if ESP_DMX_VERSION == 3 123 | if (dmx_receive(dmxRxPort, &packet, DMX_TIMEOUT_TICK)) { 124 | unsigned long now = millis(); //デバッグ用 125 | if (!packet.err) { 126 | dmx_read(dmxRxPort, in_data, packet.size); 127 | // このサンプルでは memcpyを使って、入力内容をそのまま出力内容にコピーする。 128 | memcpy(out_data, in_data, DMX_PACKET_SIZE); 129 | // ※ ここで値を変更したり、MIDI等から信号をミックスすることができる。 130 | if (now - lastUpdate > 1000) { 131 | Serial.printf("Start code: %d Slot 1: %d Number of Slot: %d\n", in_data[0], in_data[1], packet.size); 132 | lastUpdate = now; 133 | } 134 | } 135 | } 136 | #else 137 | if (xQueueReceive(dmxRxQueue, &packet, DMX_RX_PACKET_TOUT_TICK)) { 138 | unsigned long now = millis(); //デバッグ用 139 | if (packet.status == DMX_OK) { 140 | if (ESP_OK == 141 | dmx_read_packet(dmxRxPort, in_data, packet.size)) { 142 | 143 | // このサンプルでは memcpyを使って、入力内容をそのまま出力内容にコピーする。 144 | memcpy(out_data, in_data, DMX_MAX_PACKET_SIZE); 145 | // ※ ここで値を変更したり、MIDI等から信号をミックスすることができる。 146 | if (now - lastUpdate > 1000) { 147 | Serial.printf("Start code: %d Slot 1: %d Number of Slot: %d\n", in_data[0], in_data[1], packet.size); 148 | lastupdate = now; 149 | } 150 | } 151 | } 152 | } 153 | #endif 154 | 155 | // TX側からDMXデータを送信する。 156 | #if ESP_DMX_VERSION == 3 157 | dmx_write(dmxTxPort, out_data, DMX_PACKET_SIZE); 158 | #else 159 | dmx_write_packet(dmxTxPort, out_data, DMX_MAX_PACKET_SIZE); 160 | #endif 161 | 162 | #if ESP_DMX_VERSION == 1 163 | if (ESP_ERR_TIMEOUT != dmx_wait_tx_done(dmxTxPort, DMX_TX_PACKET_TOUT_TICK)) { 164 | dmx_tx_packet(dmxTxPort); 165 | } 166 | #elif ESP_DMX_VERSION == 2 167 | if (ESP_ERR_TIMEOUT != dmx_wait_send_done(dmxTxPort, DMX_TX_PACKET_TOUT_TICK)) { 168 | dmx_send_packet(dmxTxPort, DMX_MAX_PACKET_SIZE); 169 | } 170 | #elif ESP_DMX_VERSION == 3 171 | if (ESP_ERR_TIMEOUT != dmx_wait_sent(dmxTxPort, DMX_TIMEOUT_TICK)) { 172 | dmx_send(dmxTxPort, DMX_PACKET_SIZE); 173 | } 174 | #endif 175 | } 176 | -------------------------------------------------------------------------------- /images/disassembly.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m5stack/M5Module-DMX512/8a3c0bcc7d83eceebe7acff932871444313207b1/images/disassembly.mp4 -------------------------------------------------------------------------------- /images/image_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m5stack/M5Module-DMX512/8a3c0bcc7d83eceebe7acff932871444313207b1/images/image_1.jpg -------------------------------------------------------------------------------- /images/switch_s1_s2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m5stack/M5Module-DMX512/8a3c0bcc7d83eceebe7acff932871444313207b1/images/switch_s1_s2.jpg -------------------------------------------------------------------------------- /images/switch_s3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m5stack/M5Module-DMX512/8a3c0bcc7d83eceebe7acff932871444313207b1/images/switch_s3.jpg --------------------------------------------------------------------------------