mirror of
https://github.com/meshtastic/firmware.git
synced 2025-10-04 06:07:25 +00:00
Merge branch 'meshtastic:master' into develop
This commit is contained in:
commit
d6d29a7959
@ -12,6 +12,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
|||||||
libssl-dev \
|
libssl-dev \
|
||||||
libulfius-dev \
|
libulfius-dev \
|
||||||
libyaml-cpp-dev \
|
libyaml-cpp-dev \
|
||||||
|
pipx \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
@ -21,4 +22,4 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
|||||||
zip \
|
zip \
|
||||||
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN pip3 install --no-cache-dir -U platformio==6.1.15
|
RUN pipx install platformio==6.1.15
|
@ -1,36 +1,36 @@
|
|||||||
version: 0.1
|
version: 0.1
|
||||||
cli:
|
cli:
|
||||||
version: 1.22.2
|
version: 1.22.3
|
||||||
plugins:
|
plugins:
|
||||||
sources:
|
sources:
|
||||||
- id: trunk
|
- id: trunk
|
||||||
ref: v1.5.0
|
ref: v1.6.2
|
||||||
uri: https://github.com/trunk-io/plugins
|
uri: https://github.com/trunk-io/plugins
|
||||||
lint:
|
lint:
|
||||||
enabled:
|
enabled:
|
||||||
- trufflehog@3.76.3
|
- trufflehog@3.81.9
|
||||||
- yamllint@1.35.1
|
- yamllint@1.35.1
|
||||||
- bandit@1.7.8
|
- bandit@1.7.9
|
||||||
- checkov@3.2.95
|
- checkov@3.2.238
|
||||||
- terrascan@1.19.1
|
- terrascan@1.19.1
|
||||||
- trivy@0.51.1
|
- trivy@0.54.1
|
||||||
#- trufflehog@3.63.2-rc0
|
#- trufflehog@3.63.2-rc0
|
||||||
- taplo@0.8.1
|
- taplo@0.9.3
|
||||||
- ruff@0.4.4
|
- ruff@0.6.2
|
||||||
- isort@5.13.2
|
- isort@5.13.2
|
||||||
- markdownlint@0.40.0
|
- markdownlint@0.41.0
|
||||||
- oxipng@9.1.1
|
- oxipng@9.1.2
|
||||||
- svgo@3.3.2
|
- svgo@3.3.2
|
||||||
- actionlint@1.7.0
|
- actionlint@1.7.1
|
||||||
- flake8@7.0.0
|
- flake8@7.1.1
|
||||||
- hadolint@2.12.0
|
- hadolint@2.12.0
|
||||||
- shfmt@3.6.0
|
- shfmt@3.6.0
|
||||||
- shellcheck@0.10.0
|
- shellcheck@0.10.0
|
||||||
- black@24.4.2
|
- black@24.8.0
|
||||||
- git-diff-check
|
- git-diff-check
|
||||||
- gitleaks@8.18.2
|
- gitleaks@8.18.4
|
||||||
- clang-format@16.0.3
|
- clang-format@16.0.3
|
||||||
- prettier@3.2.5
|
- prettier@3.3.3
|
||||||
ignore:
|
ignore:
|
||||||
- linters: [ALL]
|
- linters: [ALL]
|
||||||
paths:
|
paths:
|
||||||
|
7
.vscode/extensions.json
vendored
7
.vscode/extensions.json
vendored
@ -2,8 +2,9 @@
|
|||||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||||
// for the documentation about the extensions.json format
|
// for the documentation about the extensions.json format
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"ms-vscode.cpptools",
|
"platformio.platformio-ide"
|
||||||
"platformio.platformio-ide",
|
|
||||||
"trunk.io"
|
|
||||||
],
|
],
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
"ms-vscode.cpptools-extension-pack"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
@ -46,3 +46,8 @@ else
|
|||||||
cp bin/device-update.* $OUTDIR
|
cp bin/device-update.* $OUTDIR
|
||||||
cp bin/*.uf2 $OUTDIR
|
cp bin/*.uf2 $OUTDIR
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if (echo $1 | grep -q "rak4631"); then
|
||||||
|
echo "Copying hex file"
|
||||||
|
cp .pio/build/$1/firmware.hex $OUTDIR/$basename.hex
|
||||||
|
fi
|
58
boards/ms24sf1.json
Normal file
58
boards/ms24sf1.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "nrf52840_s140_v7.ld"
|
||||||
|
},
|
||||||
|
"core": "nRF5",
|
||||||
|
"cpu": "cortex-m4",
|
||||||
|
"extra_flags": "-DARDUINO_WIO_WM1110 -DNRF52840_XXAA",
|
||||||
|
"f_cpu": "64000000L",
|
||||||
|
"hwids": [
|
||||||
|
["0x239A", "0x8029"],
|
||||||
|
["0x239A", "0x0029"],
|
||||||
|
["0x239A", "0x002A"],
|
||||||
|
["0x239A", "0x802A"]
|
||||||
|
],
|
||||||
|
"usb_product": "MS24SF1-BOOT",
|
||||||
|
"mcu": "nrf52840",
|
||||||
|
"variant": "MINEWSEMI_MS24SF1_SX1262",
|
||||||
|
"bsp": {
|
||||||
|
"name": "adafruit"
|
||||||
|
},
|
||||||
|
"softdevice": {
|
||||||
|
"sd_flags": "-DS140",
|
||||||
|
"sd_name": "s140",
|
||||||
|
"sd_version": "7.3.0",
|
||||||
|
"sd_fwid": "0x0123"
|
||||||
|
},
|
||||||
|
"bootloader": {
|
||||||
|
"settings_addr": "0xFF000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"connectivity": ["bluetooth"],
|
||||||
|
"debug": {
|
||||||
|
"jlink_device": "nRF52840_xxAA",
|
||||||
|
"svd_path": "nrf52840.svd"
|
||||||
|
},
|
||||||
|
"frameworks": ["arduino"],
|
||||||
|
"name": "MINEWSEMI_MS24SF1_SX1262",
|
||||||
|
"upload": {
|
||||||
|
"maximum_ram_size": 248832,
|
||||||
|
"maximum_size": 815104,
|
||||||
|
"speed": 115200,
|
||||||
|
"protocol": "nrfutil",
|
||||||
|
"protocols": [
|
||||||
|
"jlink",
|
||||||
|
"nrfjprog",
|
||||||
|
"nrfutil",
|
||||||
|
"stlink",
|
||||||
|
"cmsis-dap",
|
||||||
|
"blackmagic"
|
||||||
|
],
|
||||||
|
"use_1200bps_touch": true,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"wait_for_upload_port": true
|
||||||
|
},
|
||||||
|
"url": "https://en.minewsemi.com/lora-module/nrf52840-sx1262-ms24sf1",
|
||||||
|
"vendor": "Minesemi"
|
||||||
|
}
|
@ -82,6 +82,7 @@ build_flags = -Wno-missing-field-initializers
|
|||||||
-DRADIOLIB_EXCLUDE_APRS
|
-DRADIOLIB_EXCLUDE_APRS
|
||||||
-DRADIOLIB_EXCLUDE_LORAWAN
|
-DRADIOLIB_EXCLUDE_LORAWAN
|
||||||
-DMESHTASTIC_EXCLUDE_DROPZONE=1
|
-DMESHTASTIC_EXCLUDE_DROPZONE=1
|
||||||
|
;-D OLED_PL
|
||||||
|
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
monitor_filters = direct
|
monitor_filters = direct
|
||||||
@ -158,4 +159,4 @@ lib_deps =
|
|||||||
mprograms/QMC5883LCompass@^1.2.0
|
mprograms/QMC5883LCompass@^1.2.0
|
||||||
|
|
||||||
|
|
||||||
https://github.com/meshtastic/DFRobot_LarkWeatherStation#dee914270dc7cb3e43fbf034edd85a63a16a12ee
|
https://github.com/meshtastic/DFRobot_LarkWeatherStation#dee914270dc7cb3e43fbf034edd85a63a16a12ee
|
@ -126,7 +126,7 @@ static bool heartbeat = false;
|
|||||||
/// Check if the display can render a string (detect special chars; emoji)
|
/// Check if the display can render a string (detect special chars; emoji)
|
||||||
static bool haveGlyphs(const char *str)
|
static bool haveGlyphs(const char *str)
|
||||||
{
|
{
|
||||||
#if defined(OLED_UA) || defined(OLED_RU)
|
#if defined(OLED_PL) || defined(OLED_UA) || defined(OLED_RU)
|
||||||
// Don't want to make any assumptions about custom language support
|
// Don't want to make any assumptions about custom language support
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
@ -1128,7 +1128,8 @@ static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, const NodeStat
|
|||||||
{
|
{
|
||||||
char usersString[20];
|
char usersString[20];
|
||||||
snprintf(usersString, sizeof(usersString), "%d/%d", nodeStatus->getNumOnline(), nodeStatus->getNumTotal());
|
snprintf(usersString, sizeof(usersString), "%d/%d", nodeStatus->getNumOnline(), nodeStatus->getNumTotal());
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(HX8357_CS)) && \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
|
||||||
|
defined(HX8357_CS)) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
display->drawFastImage(x, y + 3, 8, 8, imgUser);
|
display->drawFastImage(x, y + 3, 8, 8, imgUser);
|
||||||
#else
|
#else
|
||||||
@ -2481,7 +2482,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
#ifdef ARCH_ESP32
|
#ifdef ARCH_ESP32
|
||||||
if (millis() - storeForwardModule->lastHeartbeat >
|
if (millis() - storeForwardModule->lastHeartbeat >
|
||||||
(storeForwardModule->heartbeatInterval * 1200)) { // no heartbeat, overlap a bit
|
(storeForwardModule->heartbeatInterval * 1200)) { // no heartbeat, overlap a bit
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(HX8357_CS)) && \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
|
||||||
|
defined(HX8357_CS)) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
||||||
imgQuestionL1);
|
imgQuestionL1);
|
||||||
@ -2492,7 +2494,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
imgQuestion);
|
imgQuestion);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(HX8357_CS)) && \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
|
||||||
|
defined(HX8357_CS)) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8,
|
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8,
|
||||||
imgSFL1);
|
imgSFL1);
|
||||||
@ -2506,8 +2509,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// TODO: Raspberry Pi supports more than just the one screen size
|
// TODO: Raspberry Pi supports more than just the one screen size
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(HX8357_CS) || \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
|
||||||
ARCH_PORTDUINO) && \
|
defined(HX8357_CS) || ARCH_PORTDUINO) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
||||||
imgInfoL1);
|
imgInfoL1);
|
||||||
|
@ -322,6 +322,49 @@ class Screen : public concurrency::OSThread
|
|||||||
uint8_t last = LASTCHAR; // get last char
|
uint8_t last = LASTCHAR; // get last char
|
||||||
LASTCHAR = ch;
|
LASTCHAR = ch;
|
||||||
|
|
||||||
|
#if defined(OLED_PL)
|
||||||
|
|
||||||
|
switch (last) { // conversion depending on first UTF8-character
|
||||||
|
case 0xC2: {
|
||||||
|
SKIPREST = false;
|
||||||
|
return (uint8_t)ch;
|
||||||
|
}
|
||||||
|
case 0xC3: {
|
||||||
|
|
||||||
|
if (ch == 147)
|
||||||
|
return (uint8_t)(ch); // Ó
|
||||||
|
else if (ch == 179)
|
||||||
|
return (uint8_t)(148); // ó
|
||||||
|
else
|
||||||
|
return (uint8_t)(ch | 0xC0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 0xC4: {
|
||||||
|
SKIPREST = false;
|
||||||
|
return (uint8_t)(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
case 0xC5: {
|
||||||
|
SKIPREST = false;
|
||||||
|
if (ch == 132)
|
||||||
|
return (uint8_t)(136); // ń
|
||||||
|
else if (ch == 186)
|
||||||
|
return (uint8_t)(137); // ź
|
||||||
|
else
|
||||||
|
return (uint8_t)(ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We want to strip out prefix chars for two-byte char formats
|
||||||
|
if (ch == 0xC2 || ch == 0xC3 || ch == 0xC4 || ch == 0xC5)
|
||||||
|
return (uint8_t)0;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(OLED_UA) || defined(OLED_RU)
|
||||||
|
|
||||||
switch (last) { // conversion depending on first UTF8-character
|
switch (last) { // conversion depending on first UTF8-character
|
||||||
case 0xC2: {
|
case 0xC2: {
|
||||||
SKIPREST = false;
|
SKIPREST = false;
|
||||||
@ -376,6 +419,8 @@ class Screen : public concurrency::OSThread
|
|||||||
if (ch == 0xC2 || ch == 0xC3 || ch == 0x82 || ch == 0xD0 || ch == 0xD1)
|
if (ch == 0xC2 || ch == 0xC3 || ch == 0x82 || ch == 0xD0 || ch == 0xD1)
|
||||||
return (uint8_t)0;
|
return (uint8_t)0;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// If we already returned an unconvertable-character symbol for this unconvertable-character sequence, return NULs for the
|
// If we already returned an unconvertable-character symbol for this unconvertable-character sequence, return NULs for the
|
||||||
// rest of it
|
// rest of it
|
||||||
if (SKIPREST)
|
if (SKIPREST)
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef OLED_PL
|
||||||
|
#include "graphics/fonts/OLEDDisplayFontsPL.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef OLED_RU
|
#ifdef OLED_RU
|
||||||
#include "graphics/fonts/OLEDDisplayFontsRU.h"
|
#include "graphics/fonts/OLEDDisplayFontsRU.h"
|
||||||
#endif
|
#endif
|
||||||
@ -8,13 +12,17 @@
|
|||||||
#include "graphics/fonts/OLEDDisplayFontsUA.h"
|
#include "graphics/fonts/OLEDDisplayFontsUA.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(HX8357_CS)) && \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
|
||||||
|
defined(HX8357_CS)) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
// The screen is bigger so use bigger fonts
|
// The screen is bigger so use bigger fonts
|
||||||
#define FONT_SMALL ArialMT_Plain_16 // Height: 19
|
#define FONT_SMALL ArialMT_Plain_16 // Height: 19
|
||||||
#define FONT_MEDIUM ArialMT_Plain_24 // Height: 28
|
#define FONT_MEDIUM ArialMT_Plain_24 // Height: 28
|
||||||
#define FONT_LARGE ArialMT_Plain_24 // Height: 28
|
#define FONT_LARGE ArialMT_Plain_24 // Height: 28
|
||||||
#else
|
#else
|
||||||
|
#ifdef OLED_PL
|
||||||
|
#define FONT_SMALL ArialMT_Plain_10_PL
|
||||||
|
#else
|
||||||
#ifdef OLED_RU
|
#ifdef OLED_RU
|
||||||
#define FONT_SMALL ArialMT_Plain_10_RU
|
#define FONT_SMALL ArialMT_Plain_10_RU
|
||||||
#else
|
#else
|
||||||
@ -24,6 +32,7 @@
|
|||||||
#define FONT_SMALL ArialMT_Plain_10 // Height: 13
|
#define FONT_SMALL ArialMT_Plain_10 // Height: 13
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#define FONT_MEDIUM ArialMT_Plain_16 // Height: 19
|
#define FONT_MEDIUM ArialMT_Plain_16 // Height: 19
|
||||||
#define FONT_LARGE ArialMT_Plain_24 // Height: 28
|
#define FONT_LARGE ArialMT_Plain_24 // Height: 28
|
||||||
#endif
|
#endif
|
||||||
|
440
src/graphics/fonts/OLEDDisplayFontsPL.cpp
Normal file
440
src/graphics/fonts/OLEDDisplayFontsPL.cpp
Normal file
@ -0,0 +1,440 @@
|
|||||||
|
#include "OLEDDisplayFontsPL.h"
|
||||||
|
|
||||||
|
// Font generated or edited with the glyphEditor
|
||||||
|
const uint8_t ArialMT_Plain_10_PL[] PROGMEM = {
|
||||||
|
0x0A, // Width: 10
|
||||||
|
0x0D, // Height: 13
|
||||||
|
0x20, // First char: 32
|
||||||
|
0xE0, // Number of chars: 224
|
||||||
|
|
||||||
|
// Jump Table:
|
||||||
|
0xFF, 0xFF, 0x00, 0x03, // 32:65535
|
||||||
|
0x00, 0x00, 0x04, 0x03, // 33
|
||||||
|
0x00, 0x04, 0x05, 0x04, // 34
|
||||||
|
0x00, 0x09, 0x09, 0x06, // 35
|
||||||
|
0x00, 0x12, 0x0A, 0x06, // 36
|
||||||
|
0x00, 0x1C, 0x10, 0x09, // 37
|
||||||
|
0x00, 0x2C, 0x0E, 0x08, // 38
|
||||||
|
0x00, 0x3A, 0x01, 0x02, // 39
|
||||||
|
0x00, 0x3B, 0x06, 0x04, // 40
|
||||||
|
0x00, 0x41, 0x06, 0x04, // 41
|
||||||
|
0x00, 0x47, 0x05, 0x04, // 42
|
||||||
|
0x00, 0x4C, 0x09, 0x06, // 43
|
||||||
|
0x00, 0x55, 0x04, 0x03, // 44
|
||||||
|
0x00, 0x59, 0x03, 0x03, // 45
|
||||||
|
0x00, 0x5C, 0x04, 0x03, // 46
|
||||||
|
0x00, 0x60, 0x05, 0x04, // 47
|
||||||
|
0x00, 0x65, 0x0A, 0x06, // 48
|
||||||
|
0x00, 0x6F, 0x08, 0x05, // 49
|
||||||
|
0x00, 0x77, 0x0A, 0x06, // 50
|
||||||
|
0x00, 0x81, 0x0A, 0x06, // 51
|
||||||
|
0x00, 0x8B, 0x0B, 0x07, // 52
|
||||||
|
0x00, 0x96, 0x0A, 0x06, // 53
|
||||||
|
0x00, 0xA0, 0x0A, 0x06, // 54
|
||||||
|
0x00, 0xAA, 0x09, 0x06, // 55
|
||||||
|
0x00, 0xB3, 0x0A, 0x06, // 56
|
||||||
|
0x00, 0xBD, 0x0A, 0x06, // 57
|
||||||
|
0x00, 0xC7, 0x04, 0x03, // 58
|
||||||
|
0x00, 0xCB, 0x04, 0x03, // 59
|
||||||
|
0x00, 0xCF, 0x0A, 0x06, // 60
|
||||||
|
0x00, 0xD9, 0x09, 0x06, // 61
|
||||||
|
0x00, 0xE2, 0x09, 0x06, // 62
|
||||||
|
0x00, 0xEB, 0x0B, 0x07, // 63
|
||||||
|
0x00, 0xF6, 0x14, 0x0B, // 64
|
||||||
|
0x01, 0x0A, 0x0E, 0x08, // 65
|
||||||
|
0x01, 0x18, 0x0C, 0x07, // 66
|
||||||
|
0x01, 0x24, 0x0C, 0x07, // 67
|
||||||
|
0x01, 0x30, 0x0B, 0x07, // 68
|
||||||
|
0x01, 0x3B, 0x0C, 0x07, // 69
|
||||||
|
0x01, 0x47, 0x09, 0x06, // 70
|
||||||
|
0x01, 0x50, 0x0D, 0x08, // 71
|
||||||
|
0x01, 0x5D, 0x0C, 0x07, // 72
|
||||||
|
0x01, 0x69, 0x04, 0x03, // 73
|
||||||
|
0x01, 0x6D, 0x08, 0x05, // 74
|
||||||
|
0x01, 0x75, 0x0E, 0x08, // 75
|
||||||
|
0x01, 0x83, 0x0C, 0x07, // 76
|
||||||
|
0x01, 0x8F, 0x10, 0x09, // 77
|
||||||
|
0x01, 0x9F, 0x0C, 0x07, // 78
|
||||||
|
0x01, 0xAB, 0x0E, 0x08, // 79
|
||||||
|
0x01, 0xB9, 0x0B, 0x07, // 80
|
||||||
|
0x01, 0xC4, 0x0E, 0x08, // 81
|
||||||
|
0x01, 0xD2, 0x0C, 0x07, // 82
|
||||||
|
0x01, 0xDE, 0x0C, 0x07, // 83
|
||||||
|
0x01, 0xEA, 0x0B, 0x07, // 84
|
||||||
|
0x01, 0xF5, 0x0C, 0x07, // 85
|
||||||
|
0x02, 0x01, 0x0D, 0x08, // 86
|
||||||
|
0x02, 0x0E, 0x11, 0x0A, // 87
|
||||||
|
0x02, 0x1F, 0x0E, 0x08, // 88
|
||||||
|
0x02, 0x2D, 0x0D, 0x08, // 89
|
||||||
|
0x02, 0x3A, 0x0C, 0x07, // 90
|
||||||
|
0x02, 0x46, 0x06, 0x04, // 91
|
||||||
|
0x02, 0x4C, 0x06, 0x04, // 92
|
||||||
|
0x02, 0x52, 0x04, 0x03, // 93
|
||||||
|
0x02, 0x56, 0x09, 0x06, // 94
|
||||||
|
0x02, 0x5F, 0x0C, 0x07, // 95
|
||||||
|
0x02, 0x6B, 0x03, 0x03, // 96
|
||||||
|
0x02, 0x6E, 0x0A, 0x06, // 97
|
||||||
|
0x02, 0x78, 0x0A, 0x06, // 98
|
||||||
|
0x02, 0x82, 0x0A, 0x06, // 99
|
||||||
|
0x02, 0x8C, 0x0A, 0x06, // 100
|
||||||
|
0x02, 0x96, 0x0A, 0x06, // 101
|
||||||
|
0x02, 0xA0, 0x05, 0x04, // 102
|
||||||
|
0x02, 0xA5, 0x0A, 0x06, // 103
|
||||||
|
0x02, 0xAF, 0x0A, 0x06, // 104
|
||||||
|
0x02, 0xB9, 0x04, 0x03, // 105
|
||||||
|
0x02, 0xBD, 0x04, 0x03, // 106
|
||||||
|
0x02, 0xC1, 0x08, 0x05, // 107
|
||||||
|
0x02, 0xC9, 0x04, 0x03, // 108
|
||||||
|
0x02, 0xCD, 0x10, 0x09, // 109
|
||||||
|
0x02, 0xDD, 0x0A, 0x06, // 110
|
||||||
|
0x02, 0xE7, 0x0A, 0x06, // 111
|
||||||
|
0x02, 0xF1, 0x0A, 0x06, // 112
|
||||||
|
0x02, 0xFB, 0x0A, 0x06, // 113
|
||||||
|
0x03, 0x05, 0x05, 0x04, // 114
|
||||||
|
0x03, 0x0A, 0x08, 0x05, // 115
|
||||||
|
0x03, 0x12, 0x06, 0x04, // 116
|
||||||
|
0x03, 0x18, 0x0A, 0x06, // 117
|
||||||
|
0x03, 0x22, 0x09, 0x06, // 118
|
||||||
|
0x03, 0x2B, 0x0E, 0x08, // 119
|
||||||
|
0x03, 0x39, 0x0A, 0x06, // 120
|
||||||
|
0x03, 0x43, 0x09, 0x06, // 121
|
||||||
|
0x03, 0x4C, 0x0A, 0x06, // 122
|
||||||
|
0x03, 0x56, 0x06, 0x04, // 123
|
||||||
|
0x03, 0x5C, 0x04, 0x03, // 124
|
||||||
|
0x03, 0x60, 0x05, 0x04, // 125
|
||||||
|
0x03, 0x65, 0x09, 0x06, // 126
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 127
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 128
|
||||||
|
0x03, 0x6E, 0x0C, 0x07, // 129
|
||||||
|
0x03, 0x7A, 0x05, 0x04, // 130
|
||||||
|
0x03, 0x7F, 0x0C, 0x07, // 131
|
||||||
|
0x03, 0x8B, 0x0E, 0x08, // 132
|
||||||
|
0x03, 0x99, 0x0C, 0x07, // 133
|
||||||
|
0x03, 0xA5, 0x0C, 0x07, // 134
|
||||||
|
0x03, 0xB1, 0x0A, 0x06, // 135
|
||||||
|
0x03, 0xBB, 0x0A, 0x06, // 136
|
||||||
|
0x03, 0xC5, 0x0A, 0x06, // 137
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 138
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 139
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 140
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 141
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 142
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 143
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 144
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 145
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 146
|
||||||
|
0x03, 0xCF, 0x0E, 0x08, // 147
|
||||||
|
0x03, 0xDD, 0x0A, 0x06, // 148
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 149
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 150
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 151
|
||||||
|
0x03, 0xE7, 0x0C, 0x07, // 152
|
||||||
|
0x03, 0xF3, 0x0C, 0x07, // 153
|
||||||
|
0x03, 0xFF, 0x0C, 0x07, // 154
|
||||||
|
0x04, 0x0B, 0x08, 0x05, // 155
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 156
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 157
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 158
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 159
|
||||||
|
0xFF, 0xFF, 0x00, 0x0A, // 160
|
||||||
|
0x04, 0x13, 0x04, 0x03, // 161
|
||||||
|
0x04, 0x17, 0x0A, 0x06, // 162
|
||||||
|
0x04, 0x21, 0x0C, 0x07, // 163
|
||||||
|
0x04, 0x2D, 0x0A, 0x06, // 164
|
||||||
|
0x04, 0x37, 0x0A, 0x06, // 165
|
||||||
|
0x04, 0x41, 0x04, 0x03, // 166
|
||||||
|
0x04, 0x45, 0x0A, 0x06, // 167
|
||||||
|
0x04, 0x4F, 0x05, 0x04, // 168
|
||||||
|
0x04, 0x54, 0x0D, 0x08, // 169
|
||||||
|
0x04, 0x61, 0x07, 0x05, // 170
|
||||||
|
0x04, 0x68, 0x0A, 0x06, // 171
|
||||||
|
0x04, 0x72, 0x09, 0x06, // 172
|
||||||
|
0x04, 0x7B, 0x03, 0x03, // 173
|
||||||
|
0x04, 0x7E, 0x0D, 0x08, // 174
|
||||||
|
0x04, 0x8B, 0x0B, 0x07, // 175
|
||||||
|
0x04, 0x96, 0x07, 0x05, // 176
|
||||||
|
0x04, 0x9D, 0x0A, 0x06, // 177
|
||||||
|
0x04, 0xA7, 0x05, 0x04, // 178
|
||||||
|
0x04, 0xAC, 0x05, 0x04, // 179
|
||||||
|
0x04, 0xB1, 0x05, 0x04, // 180
|
||||||
|
0x04, 0xB6, 0x0A, 0x06, // 181
|
||||||
|
0x04, 0xC0, 0x09, 0x06, // 182
|
||||||
|
0x04, 0xC9, 0x03, 0x03, // 183
|
||||||
|
0x04, 0xCC, 0x06, 0x04, // 184
|
||||||
|
0x04, 0xD2, 0x0C, 0x07, // 185
|
||||||
|
0x04, 0xDE, 0x07, 0x05, // 186
|
||||||
|
0x04, 0xE5, 0x0C, 0x07, // 187
|
||||||
|
0x04, 0xF1, 0x0A, 0x06, // 188
|
||||||
|
0x04, 0xFB, 0x10, 0x09, // 189
|
||||||
|
0x05, 0x0B, 0x10, 0x09, // 190
|
||||||
|
0x05, 0x1B, 0x0A, 0x06, // 191
|
||||||
|
0x05, 0x25, 0x0E, 0x08, // 192
|
||||||
|
0x05, 0x33, 0x0E, 0x08, // 193
|
||||||
|
0x05, 0x41, 0x0E, 0x08, // 194
|
||||||
|
0x05, 0x4F, 0x0E, 0x08, // 195
|
||||||
|
0x05, 0x5D, 0x0E, 0x08, // 196
|
||||||
|
0x05, 0x6B, 0x0E, 0x08, // 197
|
||||||
|
0x05, 0x79, 0x12, 0x0A, // 198
|
||||||
|
0x05, 0x8B, 0x0C, 0x07, // 199
|
||||||
|
0x05, 0x97, 0x0C, 0x07, // 200
|
||||||
|
0x05, 0xA3, 0x0C, 0x07, // 201
|
||||||
|
0x05, 0xAF, 0x0C, 0x07, // 202
|
||||||
|
0x05, 0xBB, 0x0C, 0x07, // 203
|
||||||
|
0x05, 0xC7, 0x05, 0x04, // 204
|
||||||
|
0x05, 0xCC, 0x04, 0x03, // 205
|
||||||
|
0x05, 0xD0, 0x04, 0x03, // 206
|
||||||
|
0x05, 0xD4, 0x05, 0x04, // 207
|
||||||
|
0x05, 0xD9, 0x0B, 0x07, // 208
|
||||||
|
0x05, 0xE4, 0x0C, 0x07, // 209
|
||||||
|
0x05, 0xF0, 0x0E, 0x08, // 210
|
||||||
|
0x05, 0xFE, 0x0E, 0x08, // 211
|
||||||
|
0x06, 0x0C, 0x0E, 0x08, // 212
|
||||||
|
0x06, 0x1A, 0x0E, 0x08, // 213
|
||||||
|
0x06, 0x28, 0x0E, 0x08, // 214
|
||||||
|
0x06, 0x36, 0x0A, 0x06, // 215
|
||||||
|
0x06, 0x40, 0x0D, 0x08, // 216
|
||||||
|
0x06, 0x4D, 0x0C, 0x07, // 217
|
||||||
|
0x06, 0x59, 0x0C, 0x07, // 218
|
||||||
|
0x06, 0x65, 0x0C, 0x07, // 219
|
||||||
|
0x06, 0x71, 0x0C, 0x07, // 220
|
||||||
|
0x06, 0x7D, 0x0D, 0x08, // 221
|
||||||
|
0x06, 0x8A, 0x0B, 0x07, // 222
|
||||||
|
0x06, 0x95, 0x0C, 0x07, // 223
|
||||||
|
0x06, 0xA1, 0x0A, 0x06, // 224
|
||||||
|
0x06, 0xAB, 0x0A, 0x06, // 225
|
||||||
|
0x06, 0xB5, 0x0A, 0x06, // 226
|
||||||
|
0x06, 0xBF, 0x0A, 0x06, // 227
|
||||||
|
0x06, 0xC9, 0x0A, 0x06, // 228
|
||||||
|
0x06, 0xD3, 0x0A, 0x06, // 229
|
||||||
|
0x06, 0xDD, 0x10, 0x09, // 230
|
||||||
|
0x06, 0xED, 0x0A, 0x06, // 231
|
||||||
|
0x06, 0xF7, 0x0A, 0x06, // 232
|
||||||
|
0x07, 0x01, 0x0A, 0x06, // 233
|
||||||
|
0x07, 0x0B, 0x0A, 0x06, // 234
|
||||||
|
0x07, 0x15, 0x0A, 0x06, // 235
|
||||||
|
0x07, 0x1F, 0x05, 0x04, // 236
|
||||||
|
0x07, 0x24, 0x04, 0x03, // 237
|
||||||
|
0x07, 0x28, 0x05, 0x04, // 238
|
||||||
|
0x07, 0x2D, 0x05, 0x04, // 239
|
||||||
|
0x07, 0x32, 0x0A, 0x06, // 240
|
||||||
|
0x07, 0x3C, 0x0A, 0x06, // 241
|
||||||
|
0x07, 0x46, 0x0A, 0x06, // 242
|
||||||
|
0x07, 0x50, 0x0A, 0x06, // 243
|
||||||
|
0x07, 0x5A, 0x0A, 0x06, // 244
|
||||||
|
0x07, 0x64, 0x0A, 0x06, // 245
|
||||||
|
0x07, 0x6E, 0x0A, 0x06, // 246
|
||||||
|
0x07, 0x78, 0x09, 0x06, // 247
|
||||||
|
0x07, 0x81, 0x0A, 0x06, // 248
|
||||||
|
0x07, 0x8B, 0x0A, 0x06, // 249
|
||||||
|
0x07, 0x95, 0x0A, 0x06, // 250
|
||||||
|
0x07, 0x9F, 0x0A, 0x06, // 251
|
||||||
|
0x07, 0xA9, 0x0A, 0x06, // 252
|
||||||
|
0x07, 0xB3, 0x09, 0x06, // 253
|
||||||
|
0x07, 0xBC, 0x0A, 0x06, // 254
|
||||||
|
0x07, 0xC6, 0x09, 0x06, // 255
|
||||||
|
// Font Data:
|
||||||
|
0x00, 0x00, 0xF8, 0x02, // 33
|
||||||
|
0x38, 0x00, 0x00, 0x00, 0x38, // 34
|
||||||
|
0xA0, 0x03, 0xE0, 0x00, 0xB8, 0x03, 0xE0, 0x00, 0xB8, // 35
|
||||||
|
0x30, 0x01, 0x28, 0x02, 0xF8, 0x07, 0x48, 0x02, 0x90, 0x01, // 36
|
||||||
|
0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x30, 0x03, 0xC0, 0x00, 0xB0, 0x01, 0x48, 0x02, 0x80, 0x01, // 37
|
||||||
|
0x80, 0x01, 0x50, 0x02, 0x68, 0x02, 0xA8, 0x02, 0x18, 0x01, 0x80, 0x03, 0x80, 0x02, // 38
|
||||||
|
0x38, // 39
|
||||||
|
0xE0, 0x03, 0x10, 0x04, 0x08, 0x08, // 40
|
||||||
|
0x08, 0x08, 0x10, 0x04, 0xE0, 0x03, // 41
|
||||||
|
0x28, 0x00, 0x18, 0x00, 0x28, // 42
|
||||||
|
0x40, 0x00, 0x40, 0x00, 0xF0, 0x01, 0x40, 0x00, 0x40, // 43
|
||||||
|
0x00, 0x00, 0x00, 0x06, // 44
|
||||||
|
0x80, 0x00, 0x80, // 45
|
||||||
|
0x00, 0x00, 0x00, 0x02, // 46
|
||||||
|
0x00, 0x03, 0xE0, 0x00, 0x18, // 47
|
||||||
|
0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0xF0, 0x01, // 48
|
||||||
|
0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0xF8, 0x03, // 49
|
||||||
|
0x10, 0x02, 0x08, 0x03, 0x88, 0x02, 0x48, 0x02, 0x30, 0x02, // 50
|
||||||
|
0x10, 0x01, 0x08, 0x02, 0x48, 0x02, 0x48, 0x02, 0xB0, 0x01, // 51
|
||||||
|
0xC0, 0x00, 0xA0, 0x00, 0x90, 0x00, 0x88, 0x00, 0xF8, 0x03, 0x80, // 52
|
||||||
|
0x60, 0x01, 0x38, 0x02, 0x28, 0x02, 0x28, 0x02, 0xC8, 0x01, // 53
|
||||||
|
0xF0, 0x01, 0x28, 0x02, 0x28, 0x02, 0x28, 0x02, 0xD0, 0x01, // 54
|
||||||
|
0x08, 0x00, 0x08, 0x03, 0xC8, 0x00, 0x38, 0x00, 0x08, // 55
|
||||||
|
0xB0, 0x01, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0xB0, 0x01, // 56
|
||||||
|
0x70, 0x01, 0x88, 0x02, 0x88, 0x02, 0x88, 0x02, 0xF0, 0x01, // 57
|
||||||
|
0x00, 0x00, 0x20, 0x02, // 58
|
||||||
|
0x00, 0x00, 0x20, 0x06, // 59
|
||||||
|
0x00, 0x00, 0x40, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x10, 0x01, // 60
|
||||||
|
0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA0, // 61
|
||||||
|
0x00, 0x00, 0x10, 0x01, 0xA0, 0x00, 0xA0, 0x00, 0x40, // 62
|
||||||
|
0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0xC8, 0x02, 0x48, 0x00, 0x30, // 63
|
||||||
|
0x00, 0x00, 0xC0, 0x03, 0x30, 0x04, 0xD0, 0x09, 0x28, 0x0A, 0x28, 0x0A, 0xC8, 0x0B, 0x68, 0x0A, 0x10, 0x05, 0xE0, 0x04, // 64
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x88, 0x00, 0xB0, 0x00, 0xC0, 0x01, 0x00, 0x02, // 65
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0xF0, 0x01, // 66
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x10, 0x01, // 67
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x08, 0x02, 0x08, 0x02, 0x10, 0x01, 0xE0, // 68
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, // 69
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x00, 0x48, 0x00, 0x08, // 70
|
||||||
|
0x00, 0x00, 0xE0, 0x00, 0x10, 0x01, 0x08, 0x02, 0x48, 0x02, 0x50, 0x01, 0xC0, // 71
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xF8, 0x03, // 72
|
||||||
|
0x00, 0x00, 0xF8, 0x03, // 73
|
||||||
|
0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0xF8, 0x01, // 74
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x80, 0x00, 0x60, 0x00, 0x90, 0x00, 0x08, 0x01, 0x00, 0x02, // 75
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, // 76
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x30, 0x00, 0xC0, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x30, 0x00, 0xF8, 0x03, // 77
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x30, 0x00, 0x40, 0x00, 0x80, 0x01, 0xF8, 0x03, // 78
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0xF0, 0x01, // 79
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, // 80
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x03, 0x08, 0x03, 0xF0, 0x02, // 81
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x00, 0x48, 0x00, 0xC8, 0x00, 0x30, 0x03, // 82
|
||||||
|
0x00, 0x00, 0x30, 0x01, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0x90, 0x01, // 83
|
||||||
|
0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x03, 0x08, 0x00, 0x08, // 84
|
||||||
|
0x00, 0x00, 0xF8, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0xF8, 0x01, // 85
|
||||||
|
0x08, 0x00, 0x70, 0x00, 0x80, 0x01, 0x00, 0x02, 0x80, 0x01, 0x70, 0x00, 0x08, // 86
|
||||||
|
0x18, 0x00, 0xE0, 0x01, 0x00, 0x02, 0xF0, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x18, // 87
|
||||||
|
0x00, 0x02, 0x08, 0x01, 0x90, 0x00, 0x60, 0x00, 0x90, 0x00, 0x08, 0x01, 0x00, 0x02, // 88
|
||||||
|
0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x20, 0x00, 0x10, 0x00, 0x08, // 89
|
||||||
|
0x08, 0x03, 0x88, 0x02, 0xC8, 0x02, 0x68, 0x02, 0x38, 0x02, 0x18, 0x02, // 90
|
||||||
|
0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, // 91
|
||||||
|
0x18, 0x00, 0xE0, 0x00, 0x00, 0x03, // 92
|
||||||
|
0x08, 0x08, 0xF8, 0x0F, // 93
|
||||||
|
0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, // 94
|
||||||
|
0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, // 95
|
||||||
|
0x08, 0x00, 0x10, // 96
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xA0, 0x02, 0xA0, 0x02, 0xE0, 0x03, // 97
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 98
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0x40, 0x01, // 99
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xF8, 0x03, // 100
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x02, // 101
|
||||||
|
0x20, 0x00, 0xF0, 0x03, 0x28, // 102
|
||||||
|
0x00, 0x00, 0xC0, 0x05, 0x20, 0x0A, 0x20, 0x0A, 0xE0, 0x07, // 103
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x03, // 104
|
||||||
|
0x00, 0x00, 0xE8, 0x03, // 105
|
||||||
|
0x00, 0x08, 0xE8, 0x07, // 106
|
||||||
|
0xF8, 0x03, 0x80, 0x00, 0xC0, 0x01, 0x20, 0x02, // 107
|
||||||
|
0x00, 0x00, 0xF8, 0x03, // 108
|
||||||
|
0x00, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x03, // 109
|
||||||
|
0x00, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x03, // 110
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 111
|
||||||
|
0x00, 0x00, 0xE0, 0x0F, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 112
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xE0, 0x0F, // 113
|
||||||
|
0x00, 0x00, 0xE0, 0x03, 0x20, // 114
|
||||||
|
0x40, 0x02, 0xA0, 0x02, 0xA0, 0x02, 0x20, 0x01, // 115
|
||||||
|
0x20, 0x00, 0xF8, 0x03, 0x20, 0x02, // 116
|
||||||
|
0x00, 0x00, 0xE0, 0x01, 0x00, 0x02, 0x00, 0x02, 0xE0, 0x03, // 117
|
||||||
|
0x20, 0x00, 0xC0, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x20, // 118
|
||||||
|
0xE0, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x20, 0x00, 0xC0, 0x01, 0x00, 0x02, 0xE0, 0x01, // 119
|
||||||
|
0x20, 0x02, 0x40, 0x01, 0x80, 0x00, 0x40, 0x01, 0x20, 0x02, // 120
|
||||||
|
0x20, 0x00, 0xC0, 0x09, 0x00, 0x06, 0xC0, 0x01, 0x20, // 121
|
||||||
|
0x20, 0x02, 0x20, 0x03, 0xA0, 0x02, 0x60, 0x02, 0x20, 0x02, // 122
|
||||||
|
0x80, 0x00, 0x78, 0x0F, 0x08, 0x08, // 123
|
||||||
|
0x00, 0x00, 0xF8, 0x0F, // 124
|
||||||
|
0x08, 0x08, 0x78, 0x0F, 0x80, // 125
|
||||||
|
0xC0, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x80, 0x00, 0xC0, // 126
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x40, 0x02, 0x20, 0x02, 0x00, 0x02, 0x00, 0x02, // 129
|
||||||
|
0x40, 0x00, 0xF8, 0x03, 0x20, // 130
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x30, 0x00, 0x44, 0x00, 0x82, 0x01, 0xF8, 0x03, // 131
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x88, 0x00, 0xB0, 0x00, 0xC0, 0x05, 0x00, 0x0A, // 132
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xA0, 0x02, 0xA0, 0x02, 0xE0, 0x07, 0x00, 0x08, // 133
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x0A, 0x02, 0x09, 0x02, 0x10, 0x01, // 134
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x28, 0x02, 0x44, 0x01, // 135
|
||||||
|
0x00, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x28, 0x00, 0xC4, 0x03, // 136
|
||||||
|
0x20, 0x02, 0x20, 0x03, 0xA8, 0x02, 0x64, 0x02, 0x20, 0x02, // 137
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x0A, 0x02, 0x09, 0x02, 0xF0, 0x01, // 147
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x28, 0x02, 0xC4, 0x01, // 148
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x06, 0x48, 0x0A, // 152
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x06, 0x00, 0x08, // 153
|
||||||
|
0x00, 0x00, 0x30, 0x01, 0x48, 0x02, 0x4A, 0x02, 0x49, 0x02, 0x90, 0x01, // 154
|
||||||
|
0x40, 0x02, 0xA0, 0x02, 0xA8, 0x02, 0x24, 0x01, // 155
|
||||||
|
0x00, 0x00, 0xA0, 0x0F, // 161
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA0, 0x0F, 0x78, 0x02, 0x40, 0x01, // 162
|
||||||
|
0x40, 0x02, 0x70, 0x03, 0xC8, 0x02, 0x48, 0x02, 0x08, 0x02, 0x10, 0x02, // 163
|
||||||
|
0x00, 0x00, 0xE0, 0x01, 0x20, 0x01, 0x20, 0x01, 0xE0, 0x01, // 164
|
||||||
|
0x48, 0x01, 0x70, 0x01, 0xC0, 0x03, 0x70, 0x01, 0x48, 0x01, // 165
|
||||||
|
0x00, 0x00, 0x38, 0x0F, // 166
|
||||||
|
0xD0, 0x04, 0x28, 0x09, 0x48, 0x09, 0x48, 0x0A, 0x90, 0x05, // 167
|
||||||
|
0x08, 0x00, 0x00, 0x00, 0x08, // 168
|
||||||
|
0xE0, 0x00, 0x10, 0x01, 0x48, 0x02, 0xA8, 0x02, 0xA8, 0x02, 0x10, 0x01, 0xE0, // 169
|
||||||
|
0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x78, // 170
|
||||||
|
0x00, 0x00, 0x80, 0x01, 0x40, 0x02, 0x80, 0x01, 0x40, 0x02, // 171
|
||||||
|
0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, // 172
|
||||||
|
0x80, 0x00, 0x80, // 173
|
||||||
|
0xE0, 0x00, 0x10, 0x01, 0xE8, 0x02, 0x68, 0x02, 0xC8, 0x02, 0x10, 0x01, 0xE0, // 174
|
||||||
|
0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, // 175
|
||||||
|
0x00, 0x00, 0x38, 0x00, 0x28, 0x00, 0x38, // 176
|
||||||
|
0x40, 0x02, 0x40, 0x02, 0xF0, 0x03, 0x40, 0x02, 0x40, 0x02, // 177
|
||||||
|
0x48, 0x00, 0x68, 0x00, 0x58, // 178
|
||||||
|
0x48, 0x00, 0x58, 0x00, 0x68, // 179
|
||||||
|
0x00, 0x00, 0x10, 0x00, 0x08, // 180
|
||||||
|
0x00, 0x00, 0xE0, 0x0F, 0x00, 0x02, 0x00, 0x02, 0xE0, 0x03, // 181
|
||||||
|
0x70, 0x00, 0xF8, 0x0F, 0x08, 0x00, 0xF8, 0x0F, 0x08, // 182
|
||||||
|
0x00, 0x00, 0x40, // 183
|
||||||
|
0x00, 0x00, 0x00, 0x14, 0x00, 0x18, // 184
|
||||||
|
0x08, 0x03, 0x88, 0x02, 0xCA, 0x02, 0x69, 0x02, 0x38, 0x02, 0x18, 0x02, // 185
|
||||||
|
0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, // 186
|
||||||
|
0x08, 0x03, 0x88, 0x02, 0xC8, 0x02, 0x6A, 0x02, 0x38, 0x02, 0x18, 0x02, // 187
|
||||||
|
0x20, 0x02, 0x20, 0x03, 0xA8, 0x02, 0x60, 0x02, 0x20, 0x02, // 188
|
||||||
|
0x00, 0x00, 0x10, 0x02, 0x78, 0x01, 0x80, 0x00, 0x60, 0x00, 0x50, 0x02, 0x48, 0x03, 0xC0, 0x02, // 189
|
||||||
|
0x48, 0x00, 0x58, 0x00, 0x68, 0x03, 0x80, 0x00, 0x60, 0x01, 0x90, 0x01, 0xC8, 0x03, 0x00, 0x01, // 190
|
||||||
|
0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0xA0, 0x09, 0x00, 0x04, // 191
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x89, 0x00, 0xB2, 0x00, 0xC0, 0x01, 0x00, 0x02, // 192
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x8A, 0x00, 0xB1, 0x00, 0xC0, 0x01, 0x00, 0x02, // 193
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xB2, 0x00, 0x89, 0x00, 0xB2, 0x00, 0xC0, 0x01, 0x00, 0x02, // 194
|
||||||
|
0x00, 0x02, 0xC2, 0x01, 0xB1, 0x00, 0x8A, 0x00, 0xB1, 0x00, 0xC0, 0x01, 0x00, 0x02, // 195
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xB2, 0x00, 0x88, 0x00, 0xB2, 0x00, 0xC0, 0x01, 0x00, 0x02, // 196
|
||||||
|
0x00, 0x02, 0xC0, 0x01, 0xBE, 0x00, 0x8A, 0x00, 0xBE, 0x00, 0xC0, 0x01, 0x00, 0x02, // 197
|
||||||
|
0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x98, 0x00, 0x88, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, // 198
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x16, 0x08, 0x1A, 0x10, 0x01, // 199
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x49, 0x02, 0x4A, 0x02, 0x48, 0x02, 0x48, 0x02, // 200
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x4A, 0x02, 0x49, 0x02, 0x48, 0x02, // 201
|
||||||
|
0x00, 0x00, 0xFA, 0x03, 0x49, 0x02, 0x4A, 0x02, 0x48, 0x02, 0x48, 0x02, // 202
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x4A, 0x02, 0x48, 0x02, 0x4A, 0x02, 0x48, 0x02, // 203
|
||||||
|
0x00, 0x00, 0xF9, 0x03, 0x02, // 204
|
||||||
|
0x02, 0x00, 0xF9, 0x03, // 205
|
||||||
|
0x01, 0x00, 0xFA, 0x03, // 206
|
||||||
|
0x02, 0x00, 0xF8, 0x03, 0x02, // 207
|
||||||
|
0x40, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x10, 0x01, 0xE0, // 208
|
||||||
|
0x00, 0x00, 0xFA, 0x03, 0x31, 0x00, 0x42, 0x00, 0x81, 0x01, 0xF8, 0x03, // 209
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x08, 0x02, 0xF0, 0x01, // 210
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x0A, 0x02, 0x09, 0x02, 0x08, 0x02, 0xF0, 0x01, // 211
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x0A, 0x02, 0x09, 0x02, 0x0A, 0x02, 0xF0, 0x01, // 212
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x0A, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x09, 0x02, 0xF0, 0x01, // 213
|
||||||
|
0x00, 0x00, 0xF0, 0x01, 0x0A, 0x02, 0x08, 0x02, 0x0A, 0x02, 0x08, 0x02, 0xF0, 0x01, // 214
|
||||||
|
0x10, 0x01, 0xA0, 0x00, 0xE0, 0x00, 0xA0, 0x00, 0x10, 0x01, // 215
|
||||||
|
0x00, 0x00, 0xF0, 0x02, 0x08, 0x03, 0xC8, 0x02, 0x28, 0x02, 0x18, 0x03, 0xE8, // 216
|
||||||
|
0x00, 0x00, 0xF8, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x02, 0xF8, 0x01, // 217
|
||||||
|
0x00, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x01, 0x02, 0x00, 0x02, 0xF8, 0x01, // 218
|
||||||
|
0x00, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0xF8, 0x01, // 219
|
||||||
|
0x00, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0xF8, 0x01, // 220
|
||||||
|
0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0xC2, 0x03, 0x21, 0x00, 0x10, 0x00, 0x08, // 221
|
||||||
|
0x00, 0x00, 0xF8, 0x03, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xE0, // 222
|
||||||
|
0x00, 0x00, 0xF0, 0x03, 0x08, 0x01, 0x48, 0x02, 0xB0, 0x02, 0x80, 0x01, // 223
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xA4, 0x02, 0xA8, 0x02, 0xE0, 0x03, // 224
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xA8, 0x02, 0xA4, 0x02, 0xE0, 0x03, // 225
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xA8, 0x02, 0xA4, 0x02, 0xE8, 0x03, // 226
|
||||||
|
0x00, 0x00, 0x08, 0x03, 0xA4, 0x02, 0xA8, 0x02, 0xE4, 0x03, // 227
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xA8, 0x02, 0xA0, 0x02, 0xE8, 0x03, // 228
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xAE, 0x02, 0xAA, 0x02, 0xEE, 0x03, // 229
|
||||||
|
0x00, 0x00, 0x40, 0x03, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x02, // 230
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x20, 0x16, 0x20, 0x1A, 0x40, 0x01, // 231
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA4, 0x02, 0xA8, 0x02, 0xC0, 0x02, // 232
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA8, 0x02, 0xA4, 0x02, 0xC0, 0x02, // 233
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA8, 0x02, 0xA4, 0x02, 0xC8, 0x02, // 234
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0xA8, 0x02, 0xA0, 0x02, 0xC8, 0x02, // 235
|
||||||
|
0x00, 0x00, 0xE4, 0x03, 0x08, // 236
|
||||||
|
0x08, 0x00, 0xE4, 0x03, // 237
|
||||||
|
0x08, 0x00, 0xE4, 0x03, 0x08, // 238
|
||||||
|
0x08, 0x00, 0xE0, 0x03, 0x08, // 239
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x38, 0x02, 0xE0, 0x01, // 240
|
||||||
|
0x00, 0x00, 0xE8, 0x03, 0x24, 0x00, 0x28, 0x00, 0xC4, 0x03, // 241
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x24, 0x02, 0x28, 0x02, 0xC0, 0x01, // 242
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x24, 0x02, 0xC0, 0x01, // 243
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x24, 0x02, 0xC8, 0x01, // 244
|
||||||
|
0x00, 0x00, 0xC8, 0x01, 0x24, 0x02, 0x28, 0x02, 0xC4, 0x01, // 245
|
||||||
|
0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x20, 0x02, 0xC8, 0x01, // 246
|
||||||
|
0x40, 0x00, 0x40, 0x00, 0x50, 0x01, 0x40, 0x00, 0x40, // 247
|
||||||
|
0x00, 0x00, 0xC0, 0x02, 0xA0, 0x03, 0x60, 0x02, 0xA0, 0x01, // 248
|
||||||
|
0x00, 0x00, 0xE0, 0x01, 0x04, 0x02, 0x08, 0x02, 0xE0, 0x03, // 249
|
||||||
|
0x00, 0x00, 0xE0, 0x01, 0x08, 0x02, 0x04, 0x02, 0xE0, 0x03, // 250
|
||||||
|
0x00, 0x00, 0xE8, 0x01, 0x04, 0x02, 0x08, 0x02, 0xE0, 0x03, // 251
|
||||||
|
0x00, 0x00, 0xE0, 0x01, 0x08, 0x02, 0x00, 0x02, 0xE8, 0x03, // 252
|
||||||
|
0x20, 0x00, 0xC0, 0x09, 0x08, 0x06, 0xC4, 0x01, 0x20, // 253
|
||||||
|
0x00, 0x00, 0xF8, 0x0F, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 254
|
||||||
|
0x20, 0x00, 0xC8, 0x09, 0x00, 0x06, 0xC8, 0x01, 0x20, // 255
|
||||||
|
};
|
11
src/graphics/fonts/OLEDDisplayFontsPL.h
Normal file
11
src/graphics/fonts/OLEDDisplayFontsPL.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef OLEDDISPLAYFONTSPL_h
|
||||||
|
#define OLEDDISPLAYFONTSPL_h
|
||||||
|
|
||||||
|
#ifdef ARDUINO
|
||||||
|
#include <Arduino.h>
|
||||||
|
#elif __MBED__
|
||||||
|
#define PROGMEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern const uint8_t ArialMT_Plain_10_PL[] PROGMEM;
|
||||||
|
#endif
|
@ -20,8 +20,8 @@ const uint8_t bluetoothConnectedIcon[36] PROGMEM = {0xfe, 0x01, 0xff, 0x03, 0x03
|
|||||||
0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f};
|
0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(HX8357_CS) || \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) || defined(ST7789_CS) || defined(USE_ST7789) || \
|
||||||
ARCH_PORTDUINO) && \
|
defined(HX8357_CS) || ARCH_PORTDUINO) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff};
|
const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff};
|
||||||
const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f};
|
const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f};
|
||||||
|
@ -260,6 +260,12 @@ void setup()
|
|||||||
|
|
||||||
#ifdef DEBUG_PORT
|
#ifdef DEBUG_PORT
|
||||||
consoleInit(); // Set serial baud rate and init our mesh console
|
consoleInit(); // Set serial baud rate and init our mesh console
|
||||||
|
#endif
|
||||||
|
#if ARCH_PORTDUINO
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_sec = time(NULL);
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
perhapsSetRTC(RTCQualityNTP, &tv);
|
||||||
#endif
|
#endif
|
||||||
powerMonInit();
|
powerMonInit();
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <Curve25519.h>
|
#include <Curve25519.h>
|
||||||
#include <SHA256.h>
|
#include <SHA256.h>
|
||||||
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN)
|
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a public/private key pair with Curve25519.
|
* Create a public/private key pair with Curve25519.
|
||||||
*
|
*
|
||||||
@ -24,6 +25,30 @@ void CryptoEngine::generateKeyPair(uint8_t *pubKey, uint8_t *privKey)
|
|||||||
memcpy(pubKey, public_key, sizeof(public_key));
|
memcpy(pubKey, public_key, sizeof(public_key));
|
||||||
memcpy(privKey, private_key, sizeof(private_key));
|
memcpy(privKey, private_key, sizeof(private_key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* regenerate a public key with Curve25519.
|
||||||
|
*
|
||||||
|
* @param pubKey The destination for the public key.
|
||||||
|
* @param privKey The source for the private key.
|
||||||
|
*/
|
||||||
|
bool CryptoEngine::regeneratePublicKey(uint8_t *pubKey, uint8_t *privKey)
|
||||||
|
{
|
||||||
|
if (!memfll(privKey, 0, sizeof(private_key))) {
|
||||||
|
Curve25519::eval(pubKey, privKey, 0);
|
||||||
|
if (Curve25519::isWeakPoint(pubKey)) {
|
||||||
|
LOG_ERROR("PKI key generation failed. Specified private key results in a weak\n");
|
||||||
|
memset(pubKey, 0, 32);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
memcpy(private_key, privKey, sizeof(private_key));
|
||||||
|
memcpy(public_key, pubKey, sizeof(public_key));
|
||||||
|
} else {
|
||||||
|
LOG_WARN("X25519 key generation failed due to blank private key\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
void CryptoEngine::clearKeys()
|
void CryptoEngine::clearKeys()
|
||||||
{
|
{
|
||||||
|
@ -21,6 +21,7 @@ struct CryptoKey {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define MAX_BLOCKSIZE 256
|
#define MAX_BLOCKSIZE 256
|
||||||
|
#define TEST_CURVE25519_FIELD_OPS // Exposes Curve25519::isWeakPoint() for testing keys
|
||||||
|
|
||||||
class CryptoEngine
|
class CryptoEngine
|
||||||
{
|
{
|
||||||
@ -33,6 +34,8 @@ class CryptoEngine
|
|||||||
#if !(MESHTASTIC_EXCLUDE_PKI)
|
#if !(MESHTASTIC_EXCLUDE_PKI)
|
||||||
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN)
|
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN)
|
||||||
virtual void generateKeyPair(uint8_t *pubKey, uint8_t *privKey);
|
virtual void generateKeyPair(uint8_t *pubKey, uint8_t *privKey);
|
||||||
|
virtual bool regeneratePublicKey(uint8_t *pubKey, uint8_t *privKey);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
void clearKeys();
|
void clearKeys();
|
||||||
void setDHPrivateKey(uint8_t *_private_key);
|
void setDHPrivateKey(uint8_t *_private_key);
|
||||||
|
@ -139,14 +139,24 @@ NodeDB::NodeDB()
|
|||||||
crypto->setDHPrivateKey(config.security.private_key.bytes);
|
crypto->setDHPrivateKey(config.security.private_key.bytes);
|
||||||
} else {
|
} else {
|
||||||
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN)
|
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN)
|
||||||
LOG_INFO("Generating new PKI keys\n");
|
bool keygenSuccess = false;
|
||||||
crypto->generateKeyPair(config.security.public_key.bytes, config.security.private_key.bytes);
|
if (config.security.private_key.size == 32) {
|
||||||
config.security.public_key.size = 32;
|
LOG_INFO("Calculating PKI Public Key\n");
|
||||||
config.security.private_key.size = 32;
|
if (crypto->regeneratePublicKey(config.security.public_key.bytes, config.security.private_key.bytes)) {
|
||||||
|
keygenSuccess = true;
|
||||||
printBytes("New Pubkey", config.security.public_key.bytes, 32);
|
}
|
||||||
owner.public_key.size = 32;
|
} else {
|
||||||
memcpy(owner.public_key.bytes, config.security.public_key.bytes, 32);
|
LOG_INFO("Generating new PKI keys\n");
|
||||||
|
crypto->generateKeyPair(config.security.public_key.bytes, config.security.private_key.bytes);
|
||||||
|
keygenSuccess = true;
|
||||||
|
}
|
||||||
|
if (keygenSuccess) {
|
||||||
|
config.security.public_key.size = 32;
|
||||||
|
config.security.private_key.size = 32;
|
||||||
|
printBytes("New Pubkey", config.security.public_key.bytes, 32);
|
||||||
|
owner.public_key.size = 32;
|
||||||
|
memcpy(owner.public_key.bytes, config.security.public_key.bytes, 32);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
LOG_INFO("No PKI keys set, and generation disabled!\n");
|
LOG_INFO("No PKI keys set, and generation disabled!\n");
|
||||||
#endif
|
#endif
|
||||||
@ -395,6 +405,13 @@ void NodeDB::installDefaultModuleConfig()
|
|||||||
moduleConfig.has_store_forward = true;
|
moduleConfig.has_store_forward = true;
|
||||||
moduleConfig.has_telemetry = true;
|
moduleConfig.has_telemetry = true;
|
||||||
moduleConfig.has_external_notification = true;
|
moduleConfig.has_external_notification = true;
|
||||||
|
#if defined(PIN_BUZZER)
|
||||||
|
moduleConfig.external_notification.enabled = true;
|
||||||
|
moduleConfig.external_notification.output_buzzer = PIN_BUZZER;
|
||||||
|
moduleConfig.external_notification.use_pwm = true;
|
||||||
|
moduleConfig.external_notification.alert_message_buzzer = true;
|
||||||
|
moduleConfig.external_notification.nag_timeout = 60;
|
||||||
|
#endif
|
||||||
#if defined(RAK4630) || defined(RAK11310)
|
#if defined(RAK4630) || defined(RAK11310)
|
||||||
// Default to RAK led pin 2 (blue)
|
// Default to RAK led pin 2 (blue)
|
||||||
moduleConfig.external_notification.enabled = true;
|
moduleConfig.external_notification.enabled = true;
|
||||||
@ -404,6 +421,7 @@ void NodeDB::installDefaultModuleConfig()
|
|||||||
moduleConfig.external_notification.output_ms = 1000;
|
moduleConfig.external_notification.output_ms = 1000;
|
||||||
moduleConfig.external_notification.nag_timeout = 60;
|
moduleConfig.external_notification.nag_timeout = 60;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_I2S
|
#ifdef HAS_I2S
|
||||||
// Don't worry about the other settings for T-Watch, we'll also use the DRV2056 behavior for notifications
|
// Don't worry about the other settings for T-Watch, we'll also use the DRV2056 behavior for notifications
|
||||||
moduleConfig.external_notification.enabled = true;
|
moduleConfig.external_notification.enabled = true;
|
||||||
@ -620,7 +638,7 @@ void NodeDB::pickNewNodeNum()
|
|||||||
|
|
||||||
meshtastic_NodeInfoLite *found;
|
meshtastic_NodeInfoLite *found;
|
||||||
while ((nodeNum == NODENUM_BROADCAST || nodeNum < NUM_RESERVED) ||
|
while ((nodeNum == NODENUM_BROADCAST || nodeNum < NUM_RESERVED) ||
|
||||||
((found = getMeshNode(nodeNum)) && memcmp(found->user.macaddr, owner.macaddr, sizeof(owner.macaddr)) != 0)) {
|
((found = getMeshNode(nodeNum)) && memcmp(found->user.macaddr, ourMacAddr, sizeof(ourMacAddr)) != 0)) {
|
||||||
NodeNum candidate = random(NUM_RESERVED, LONG_MAX); // try a new random choice
|
NodeNum candidate = random(NUM_RESERVED, LONG_MAX); // try a new random choice
|
||||||
LOG_WARN("NOTE! Our desired nodenum 0x%x is invalid or in use, so trying for 0x%x\n", nodeNum, candidate);
|
LOG_WARN("NOTE! Our desired nodenum 0x%x is invalid or in use, so trying for 0x%x\n", nodeNum, candidate);
|
||||||
nodeNum = candidate;
|
nodeNum = candidate;
|
||||||
|
@ -112,7 +112,7 @@ void ReliableRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtas
|
|||||||
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel, p->hop_start, p->hop_limit);
|
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel, p->hop_start, p->hop_limit);
|
||||||
} else if (p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag && p->channel == 0 &&
|
} else if (p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag && p->channel == 0 &&
|
||||||
(nodeDB->getMeshNode(p->from) == nullptr || nodeDB->getMeshNode(p->from)->user.public_key.size == 0)) {
|
(nodeDB->getMeshNode(p->from) == nullptr || nodeDB->getMeshNode(p->from)->user.public_key.size == 0)) {
|
||||||
// This looks like it might be a PKI packet from an unknown node, so send PKI_UNKNOWN_PUBKEY
|
LOG_INFO("This looks like it might be a PKI packet from an unknown node, so send PKI_UNKNOWN_PUBKEY\n");
|
||||||
sendAckNak(meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY, getFrom(p), p->id, channels.getPrimaryIndex(),
|
sendAckNak(meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY, getFrom(p), p->id, channels.getPrimaryIndex(),
|
||||||
p->hop_start, p->hop_limit);
|
p->hop_start, p->hop_limit);
|
||||||
} else {
|
} else {
|
||||||
|
@ -537,6 +537,15 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c)
|
|||||||
case meshtastic_Config_security_tag:
|
case meshtastic_Config_security_tag:
|
||||||
LOG_INFO("Setting config: Security\n");
|
LOG_INFO("Setting config: Security\n");
|
||||||
config.security = c.payload_variant.security;
|
config.security = c.payload_variant.security;
|
||||||
|
#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN) && !(MESHTASTIC_EXCLUDE_PKI)
|
||||||
|
// We check for a potentially valid private key, and a blank public key, and regen the public key if needed.
|
||||||
|
if (config.security.private_key.size == 32 && !memfll(config.security.private_key.bytes, 0, 32) &&
|
||||||
|
(config.security.public_key.size == 0 || memfll(config.security.public_key.bytes, 0, 32))) {
|
||||||
|
if (crypto->regeneratePublicKey(config.security.public_key.bytes, config.security.private_key.bytes)) {
|
||||||
|
config.security.public_key.size = 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
owner.public_key.size = config.security.public_key.size;
|
owner.public_key.size = config.security.public_key.size;
|
||||||
memcpy(owner.public_key.bytes, config.security.public_key.bytes, config.security.public_key.size);
|
memcpy(owner.public_key.bytes, config.security.public_key.bytes, config.security.public_key.size);
|
||||||
#if !MESHTASTIC_EXCLUDE_PKI
|
#if !MESHTASTIC_EXCLUDE_PKI
|
||||||
|
@ -167,9 +167,9 @@ void MQTT::onReceive(char *topic, byte *payload, size_t length)
|
|||||||
strcmp(e.channel_id, "PKI") == 0) {
|
strcmp(e.channel_id, "PKI") == 0) {
|
||||||
meshtastic_NodeInfoLite *tx = nodeDB->getMeshNode(getFrom(p));
|
meshtastic_NodeInfoLite *tx = nodeDB->getMeshNode(getFrom(p));
|
||||||
meshtastic_NodeInfoLite *rx = nodeDB->getMeshNode(p->to);
|
meshtastic_NodeInfoLite *rx = nodeDB->getMeshNode(p->to);
|
||||||
// Only accept PKI messages if we have both the sender and receiver in our nodeDB, as then it's likely
|
// Only accept PKI messages to us, or if we have both the sender and receiver in our nodeDB, as then it's
|
||||||
// they discovered each other via a channel we have downlink enabled for
|
// likely they discovered each other via a channel we have downlink enabled for
|
||||||
if (tx && tx->has_user && rx && rx->has_user)
|
if (p->to == nodeDB->getNodeNum() || (tx && tx->has_user && rx && rx->has_user))
|
||||||
router->enqueueReceivedMessage(p);
|
router->enqueueReceivedMessage(p);
|
||||||
} else if (router && perhapsDecode(p)) // ignore messages if we don't have the channel key
|
} else if (router && perhapsDecode(p)) // ignore messages if we don't have the channel key
|
||||||
router->enqueueReceivedMessage(p);
|
router->enqueueReceivedMessage(p);
|
||||||
@ -527,7 +527,7 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp, const meshtastic_MeshPacket &
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ch.settings.uplink_enabled || mp.pki_encrypted) {
|
if (ch.settings.uplink_enabled || mp.pki_encrypted) {
|
||||||
const char *channelId = channels.getGlobalId(chIndex); // FIXME, for now we just use the human name for the channel
|
const char *channelId = mp.pki_encrypted ? "PKI" : channels.getGlobalId(chIndex);
|
||||||
|
|
||||||
meshtastic_ServiceEnvelope *env = mqttPool.allocZeroed();
|
meshtastic_ServiceEnvelope *env = mqttPool.allocZeroed();
|
||||||
env->channel_id = (char *)channelId;
|
env->channel_id = (char *)channelId;
|
||||||
@ -546,12 +546,7 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp, const meshtastic_MeshPacket &
|
|||||||
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
|
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
|
||||||
static uint8_t bytes[meshtastic_MeshPacket_size + 64];
|
static uint8_t bytes[meshtastic_MeshPacket_size + 64];
|
||||||
size_t numBytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_ServiceEnvelope_msg, env);
|
size_t numBytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_ServiceEnvelope_msg, env);
|
||||||
std::string topic;
|
std::string topic = cryptTopic + channelId + "/" + owner.id;
|
||||||
if (mp.pki_encrypted) {
|
|
||||||
topic = cryptTopic + "PKI/" + owner.id;
|
|
||||||
} else {
|
|
||||||
topic = cryptTopic + channelId + "/" + owner.id;
|
|
||||||
}
|
|
||||||
LOG_DEBUG("MQTT Publish %s, %u bytes\n", topic.c_str(), numBytes);
|
LOG_DEBUG("MQTT Publish %s, %u bytes\n", topic.c_str(), numBytes);
|
||||||
|
|
||||||
publish(topic.c_str(), bytes, numBytes, false);
|
publish(topic.c_str(), bytes, numBytes, false);
|
||||||
@ -561,12 +556,7 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp, const meshtastic_MeshPacket &
|
|||||||
// handle json topic
|
// handle json topic
|
||||||
auto jsonString = MeshPacketSerializer::JsonSerialize((meshtastic_MeshPacket *)&mp_decoded);
|
auto jsonString = MeshPacketSerializer::JsonSerialize((meshtastic_MeshPacket *)&mp_decoded);
|
||||||
if (jsonString.length() != 0) {
|
if (jsonString.length() != 0) {
|
||||||
std::string topicJson;
|
std::string topicJson = jsonTopic + channelId + "/" + owner.id;
|
||||||
if (mp.pki_encrypted) {
|
|
||||||
topicJson = jsonTopic + "PKI/" + owner.id;
|
|
||||||
} else {
|
|
||||||
topicJson = jsonTopic + channelId + "/" + owner.id;
|
|
||||||
}
|
|
||||||
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(),
|
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(),
|
||||||
jsonString.c_str());
|
jsonString.c_str());
|
||||||
publish(topicJson.c_str(), jsonString.c_str(), false);
|
publish(topicJson.c_str(), jsonString.c_str(), false);
|
||||||
|
@ -67,6 +67,8 @@
|
|||||||
#define HW_VENDOR meshtastic_HardwareModel_TRACKER_T1000_E
|
#define HW_VENDOR meshtastic_HardwareModel_TRACKER_T1000_E
|
||||||
#elif defined(ME25LS01_4Y10TD)
|
#elif defined(ME25LS01_4Y10TD)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_ME25LS01_4Y10TD
|
#define HW_VENDOR meshtastic_HardwareModel_ME25LS01_4Y10TD
|
||||||
|
#elif defined(MS24SF1)
|
||||||
|
#define HW_VENDOR meshtastic_HardwareModel_MS24SF1
|
||||||
#elif defined(PRIVATE_HW) || defined(FEATHER_DIY)
|
#elif defined(PRIVATE_HW) || defined(FEATHER_DIY)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_PRIVATE_HW
|
#define HW_VENDOR meshtastic_HardwareModel_PRIVATE_HW
|
||||||
#else
|
#else
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include <Utility.h>
|
#include <Utility.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "PortduinoGlue.h"
|
#include "PortduinoGlue.h"
|
||||||
#include "linux/gpio/LinuxGPIOPin.h"
|
#include "linux/gpio/LinuxGPIOPin.h"
|
||||||
@ -370,6 +369,7 @@ void portduinoSetup()
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,6 +76,13 @@ std::string MeshPacketSerializer::JsonSerialize(const meshtastic_MeshPacket *mp,
|
|||||||
msgPayload["wind_direction"] = new JSONValue((uint)decoded->variant.environment_metrics.wind_direction);
|
msgPayload["wind_direction"] = new JSONValue((uint)decoded->variant.environment_metrics.wind_direction);
|
||||||
msgPayload["wind_gust"] = new JSONValue(decoded->variant.environment_metrics.wind_gust);
|
msgPayload["wind_gust"] = new JSONValue(decoded->variant.environment_metrics.wind_gust);
|
||||||
msgPayload["wind_lull"] = new JSONValue(decoded->variant.environment_metrics.wind_lull);
|
msgPayload["wind_lull"] = new JSONValue(decoded->variant.environment_metrics.wind_lull);
|
||||||
|
} else if (decoded->which_variant == meshtastic_Telemetry_air_quality_metrics_tag) {
|
||||||
|
msgPayload["pm10"] = new JSONValue((unsigned int)decoded->variant.air_quality_metrics.pm10_standard);
|
||||||
|
msgPayload["pm25"] = new JSONValue((unsigned int)decoded->variant.air_quality_metrics.pm25_standard);
|
||||||
|
msgPayload["pm100"] = new JSONValue((unsigned int)decoded->variant.air_quality_metrics.pm100_standard);
|
||||||
|
msgPayload["pm10_e"] = new JSONValue((unsigned int)decoded->variant.air_quality_metrics.pm10_environmental);
|
||||||
|
msgPayload["pm25_e"] = new JSONValue((unsigned int)decoded->variant.air_quality_metrics.pm25_environmental);
|
||||||
|
msgPayload["pm100_e"] = new JSONValue((unsigned int)decoded->variant.air_quality_metrics.pm100_environmental);
|
||||||
} else if (decoded->which_variant == meshtastic_Telemetry_power_metrics_tag) {
|
} else if (decoded->which_variant == meshtastic_Telemetry_power_metrics_tag) {
|
||||||
msgPayload["voltage_ch1"] = new JSONValue(decoded->variant.power_metrics.ch1_voltage);
|
msgPayload["voltage_ch1"] = new JSONValue(decoded->variant.power_metrics.ch1_voltage);
|
||||||
msgPayload["current_ch1"] = new JSONValue(decoded->variant.power_metrics.ch1_current);
|
msgPayload["current_ch1"] = new JSONValue(decoded->variant.power_metrics.ch1_current);
|
||||||
|
15
variants/MS24SF1/platformio.ini
Normal file
15
variants/MS24SF1/platformio.ini
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[env:ms24sf1]
|
||||||
|
extends = nrf52840_base
|
||||||
|
board = ms24sf1
|
||||||
|
board_level = extra
|
||||||
|
; platform = https://github.com/maxgerhardt/platform-nordicnrf52#cac6fcf943a41accd2aeb4f3659ae297a73f422e
|
||||||
|
build_flags = ${nrf52840_base.build_flags} -Ivariants/MS24SF1 -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52
|
||||||
|
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
|
||||||
|
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
|
||||||
|
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
|
||||||
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/MS24SF1>
|
||||||
|
lib_deps =
|
||||||
|
${nrf52840_base.lib_deps}
|
||||||
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
|
upload_protocol = nrfutil
|
||||||
|
upload_port = /dev/ttyACM1
|
30
variants/MS24SF1/variant.cpp
Normal file
30
variants/MS24SF1/variant.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Lesser General Public License for more details.
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "variant.h"
|
||||||
|
#include "nrf.h"
|
||||||
|
#include "wiring_constants.h"
|
||||||
|
#include "wiring_digital.h"
|
||||||
|
|
||||||
|
const uint32_t g_ADigitalPinMap[] = {
|
||||||
|
// P0
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||||
|
|
||||||
|
// P1
|
||||||
|
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
|
||||||
|
|
||||||
|
void initVariant() {}
|
139
variants/MS24SF1/variant.h
Normal file
139
variants/MS24SF1/variant.h
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Lesser General Public License for more details.
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _VARIANT_MINEWSEMI_MS24SF1_
|
||||||
|
#define _VARIANT_MINEWSEMI_MS24SF1_
|
||||||
|
|
||||||
|
#define ME25LS01
|
||||||
|
|
||||||
|
/** Master clock frequency */
|
||||||
|
#define VARIANT_MCK (64000000ul)
|
||||||
|
|
||||||
|
#define USE_LFXO // Board uses 32khz crystal for LF
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Headers
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "WVariant.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// Number of pins defined in PinDescription array
|
||||||
|
#define PINS_COUNT (48)
|
||||||
|
#define NUM_DIGITAL_PINS (48)
|
||||||
|
#define NUM_ANALOG_INPUTS (6)
|
||||||
|
#define NUM_ANALOG_OUTPUTS (0)
|
||||||
|
|
||||||
|
// Use the native nrf52 usb power detection
|
||||||
|
#define NRF_APM
|
||||||
|
|
||||||
|
#define PIN_3V3_EN (32 + 5) //-1
|
||||||
|
#define PIN_3V3_ACC_EN -1
|
||||||
|
|
||||||
|
#define PIN_LED1 (-1)
|
||||||
|
|
||||||
|
#define LED_PIN PIN_LED1
|
||||||
|
#define LED_BUILTIN -1
|
||||||
|
|
||||||
|
#define LED_BLUE -1
|
||||||
|
#define LED_STATE_ON 1 // State when LED is lit
|
||||||
|
|
||||||
|
#define BUTTON_PIN (-1)
|
||||||
|
#define BUTTON_NEED_PULLUP
|
||||||
|
|
||||||
|
#define HAS_WIRE 1
|
||||||
|
|
||||||
|
#define WIRE_INTERFACES_COUNT 1
|
||||||
|
|
||||||
|
#define PIN_WIRE_SDA (0 + 29) // P0.15
|
||||||
|
#define PIN_WIRE_SCL (0 + 30) // P0.17
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial interfaces
|
||||||
|
*/
|
||||||
|
#define PIN_SERIAL1_RX (-1) // P0.14
|
||||||
|
#define PIN_SERIAL1_TX (-1) // P0.13
|
||||||
|
|
||||||
|
#define PIN_SERIAL2_RX (-1) // P0.17
|
||||||
|
#define PIN_SERIAL2_TX (-1) // P0.16
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPI Interfaces
|
||||||
|
*/
|
||||||
|
#define SPI_INTERFACES_COUNT 1 // 2
|
||||||
|
|
||||||
|
#define PIN_SPI_MISO (0 + 17) // MISO P0.17
|
||||||
|
#define PIN_SPI_MOSI (0 + 20) // MOSI P0.20
|
||||||
|
#define PIN_SPI_SCK (0 + 21) // SCK P0.21
|
||||||
|
|
||||||
|
// #define PIN_SPI1_MISO (-1) //
|
||||||
|
// #define PIN_SPI1_MOSI (10) // EPD_MOSI P0.10
|
||||||
|
// #define PIN_SPI1_SCK (9) // EPD_SCLK P0.09
|
||||||
|
|
||||||
|
static const uint8_t SS = (0 + 22); // LORA_CS P0.22
|
||||||
|
static const uint8_t MOSI = PIN_SPI_MOSI;
|
||||||
|
static const uint8_t MISO = PIN_SPI_MISO;
|
||||||
|
static const uint8_t SCK = PIN_SPI_SCK;
|
||||||
|
|
||||||
|
// MINEWSEMI nRF52840+SX1262 MS24SF1 (NRF82540 with integrated SX1262)
|
||||||
|
#define USE_SX1262
|
||||||
|
#define SX126X_CS (0 + 22) // LORA_CS P0.22
|
||||||
|
#define SX126X_DIO1 (0 + 16) // DIO1 P0.16
|
||||||
|
#define SX126X_BUSY (0 + 19) // LORA_BUSY P0.19
|
||||||
|
#define SX126X_RESET (0 + 12) // LORA_RESET P0.12
|
||||||
|
#define SX126X_TXEN (32 + 4) // TXEN P1.04
|
||||||
|
#define SX126X_RXEN (32 + 2) // RXEN P1.02
|
||||||
|
|
||||||
|
// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
|
||||||
|
#define SX126X_DIO2_AS_RF_SWITCH
|
||||||
|
|
||||||
|
#define HAS_GPS 0
|
||||||
|
|
||||||
|
#define PIN_GPS_EN -1
|
||||||
|
#define GPS_EN_ACTIVE HIGH
|
||||||
|
#define PIN_GPS_RESET -1
|
||||||
|
#define GPS_VRTC_EN -1
|
||||||
|
#define GPS_SLEEP_INT -1
|
||||||
|
#define GPS_RTC_INT -1
|
||||||
|
#define GPS_RESETB_OUT -1
|
||||||
|
|
||||||
|
#define BATTERY_PIN -1
|
||||||
|
#define ADC_MULTIPLIER (2.0F)
|
||||||
|
|
||||||
|
#define ADC_RESOLUTION 14
|
||||||
|
#define BATTERY_SENSE_RESOLUTION_BITS 12
|
||||||
|
|
||||||
|
#undef AREF_VOLTAGE
|
||||||
|
#define AREF_VOLTAGE 3.0
|
||||||
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
||||||
|
|
||||||
|
// Buzzer
|
||||||
|
// #define PIN_BUZZER (0 + 25)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Arduino objects - C++ only
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif // _VARIANT_MINEWSEMI_MS24SF1_
|
@ -12,4 +12,4 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_node
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
lewisxhe/PCF8563_Library@^1.0.1
|
lewisxhe/PCF8563_Library@^1.0.1
|
||||||
https://github.com/Bei-Ji-Quan/st7789#b8e7e076714b670764139289d3829b0beff67edb
|
https://github.com/meshtastic/st7789#7181320e7ed05c7fb5fd2d32f14723bce6088b7b
|
@ -9,5 +9,5 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
lewisxhe/PCF8563_Library@^1.0.1
|
lewisxhe/PCF8563_Library@^1.0.1
|
||||||
https://github.com/Bei-Ji-Quan/st7789#b8e7e076714b670764139289d3829b0beff67edb
|
https://github.com/meshtastic/st7789#7181320e7ed05c7fb5fd2d32f14723bce6088b7b
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
@ -1,4 +1,6 @@
|
|||||||
#define BUTTON_PIN 0
|
#define BUTTON_PIN 0
|
||||||
|
#define BUTTON_PIN_SECONDARY 21 // Second built-in button
|
||||||
|
#define BUTTON_SECONDARY_CANNEDMESSAGES // By default, use the secondary button as canned message input
|
||||||
|
|
||||||
// I2C
|
// I2C
|
||||||
#define I2C_SDA SDA
|
#define I2C_SDA SDA
|
||||||
|
Loading…
Reference in New Issue
Block a user