Compare commits
13 Commits
master
...
r20250120a
Author | SHA1 | Date |
---|---|---|
|
b728d6d643 | |
|
10d1046c82 | |
|
66d88a8486 | |
|
2be67f1659 | |
|
75e360a19d | |
|
b56c43767d | |
|
9af781318f | |
|
081a73d8f8 | |
|
ff867beb9d | |
|
2fd11c72b6 | |
|
235cfd1c9c | |
|
16e7b80230 | |
|
5f5c520714 |
|
@ -10,7 +10,7 @@
|
|||
"-DBOARD_HAS_PSRAM",
|
||||
"-DARDUINO_ESP32S3_DEV",
|
||||
"-DARDUINO_USB_MODE=1",
|
||||
"-DARDUINO_USB_CDC_ON_BOOT=1",
|
||||
"-DARDUINO_USB_CDC_ON_BOOT=0",
|
||||
"-DARDUINO_RUNNING_CORE=1",
|
||||
"-DARDUINO_EVENT_RUNNING_CORE=1"
|
||||
],
|
||||
|
|
|
@ -10,7 +10,7 @@ from datetime import datetime
|
|||
import re
|
||||
import pprint
|
||||
from platformio.project.config import ProjectConfig
|
||||
|
||||
from platformio.project.exception import InvalidProjectConfError
|
||||
|
||||
Import("env")
|
||||
#print(env.Dump())
|
||||
|
@ -104,13 +104,22 @@ def writeFileIfChanged(fileName,data):
|
|||
return True
|
||||
|
||||
def mergeConfig(base,other):
|
||||
try:
|
||||
customconfig = env.GetProjectOption("custom_config")
|
||||
except InvalidProjectConfError:
|
||||
customconfig = None
|
||||
for bdir in other:
|
||||
if customconfig and os.path.exists(os.path.join(bdir,customconfig)):
|
||||
cname=os.path.join(bdir,customconfig)
|
||||
print("merge custom config {}".format(cname))
|
||||
with open(cname,'rb') as ah:
|
||||
base += json.load(ah)
|
||||
continue
|
||||
cname=os.path.join(bdir,"config.json")
|
||||
if os.path.exists(cname):
|
||||
print("merge config %s"%cname)
|
||||
print("merge config {}".format(cname))
|
||||
with open(cname,'rb') as ah:
|
||||
merge=json.load(ah)
|
||||
base=base+merge
|
||||
base += json.load(ah)
|
||||
return base
|
||||
|
||||
def replaceTexts(data,replacements):
|
||||
|
@ -274,9 +283,9 @@ class Grove:
|
|||
def _ss(self,z=False):
|
||||
if z:
|
||||
return self.name
|
||||
return self.name if self.name is not 'Z' else ''
|
||||
return self.name if self.name != 'Z' else ''
|
||||
def _suffix(self):
|
||||
return '_'+self.name if self.name is not 'Z' else ''
|
||||
return '_'+self.name if self.name != 'Z' else ''
|
||||
def replace(self,line):
|
||||
if line is None:
|
||||
return line
|
||||
|
|
|
@ -326,12 +326,14 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||
usbRxOld = commonData.status.usbRx;
|
||||
usbTxOld = commonData.status.usbTx;
|
||||
|
||||
#ifdef HARDWARE_V21
|
||||
// Display key lock status
|
||||
if (commonData.keylock) {
|
||||
getdisplay().drawXBitmap(170, 1, lock_bits, icon_width, icon_height, commonData.fgcolor);
|
||||
} else {
|
||||
getdisplay().drawXBitmap(166, 1, swipe_bits, swipe_width, swipe_height, commonData.fgcolor);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Heartbeat as dot
|
||||
getdisplay().setTextColor(commonData.fgcolor);
|
||||
|
@ -376,6 +378,7 @@ void displayFooter(CommonData &commonData) {
|
|||
getdisplay().setFont(&Atari16px);
|
||||
getdisplay().setTextColor(commonData.fgcolor);
|
||||
|
||||
#ifdef HARDWARE_V21
|
||||
// Frame around key icon area
|
||||
if (! commonData.keylock) {
|
||||
// horizontal elements
|
||||
|
@ -422,6 +425,21 @@ void displayFooter(CommonData &commonData) {
|
|||
getdisplay().setCursor(65, 295);
|
||||
getdisplay().print("Press 1 and 6 fast to unlock keys");
|
||||
}
|
||||
#endif
|
||||
#ifdef HARDWARE_LIGHT
|
||||
// grapical page indicator
|
||||
static const uint16_t r = 5;
|
||||
static const uint16_t space = 4;
|
||||
uint16_t w = commonData.data.maxpage * r * 2 + (commonData.data.maxpage - 1) * space;
|
||||
uint16_t x0 = (GxEPD_WIDTH - w) / 2 + r * 2;
|
||||
for (int i = 0; i < commonData.data.maxpage; i++) {
|
||||
if (i == (commonData.data.actpage - 1)) {
|
||||
getdisplay().fillCircle(x0 + i * (r * 2 + space), 290, r, commonData.fgcolor);
|
||||
} else {
|
||||
getdisplay().drawCircle(x0 + i * (r * 2 + space), 290, r, commonData.fgcolor);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Sunset und sunrise calculation
|
||||
|
|
|
@ -220,7 +220,7 @@ void initKeys(CommonData &commonData) {
|
|||
|
||||
#ifdef HARDWARE_LIGHT
|
||||
int readSensorpads(){
|
||||
// Read key code
|
||||
// Read key code
|
||||
if(digitalRead(UP) == LOW){
|
||||
keycode = 10; // Left swipe
|
||||
}
|
||||
|
@ -250,7 +250,7 @@ void initKeys(CommonData &commonData) {
|
|||
pinMode(MENUE, INPUT);
|
||||
pinMode(EXIT, INPUT);
|
||||
|
||||
// Raed pad values
|
||||
// Read pad values
|
||||
readSensorpads();
|
||||
|
||||
// Detect key
|
||||
|
@ -264,7 +264,7 @@ void initKeys(CommonData &commonData) {
|
|||
keystatus = keycode;
|
||||
// Copy keycode
|
||||
keycodeold = keycode;
|
||||
while(readSensorpads() > 0){} // Wait for pad lesease
|
||||
while(readSensorpads() > 0){} // Wait for pad release
|
||||
delay(keydelay);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
OBP40
|
||||
=====
|
||||
|
||||
Important information:
|
||||
|
||||
***************************************************
|
||||
THIS BRANCH IS NOT INTENDED TO MERGE INTO "master"!
|
||||
***************************************************
|
||||
|
||||
platformio.ini adapted to compile directly. For compile use matching
|
||||
environent:
|
||||
pio run -e obp40
|
||||
|
||||
for upload to device:
|
||||
pio run -e obp40 -t upload
|
||||
|
||||
Differences to OBP60
|
||||
--------------------
|
||||
|
||||
- no GPS
|
||||
- no RTC
|
||||
- no LEDs
|
||||
- no environment sensor
|
||||
- no key lock
|
||||
- no swipe
|
||||
- only 5 keys
|
||||
|
||||
+ SD card interface
|
||||
|
||||
|
||||
GPIO assignments
|
||||
----------------
|
||||
|
||||
NMEA0183
|
||||
IO9 - RS485 TX
|
||||
IO14 - RS485 RX
|
||||
|
||||
NMEA2000/CAN
|
||||
IO15 - CAN TX
|
||||
IO16 - CAN RX
|
||||
|
||||
|
||||
Keyboard
|
||||
--------
|
||||
|
||||
Keycode Key Function
|
||||
-------- ---------------- -------------------------
|
||||
1 Menu key Key 1 of OBP60 (left)
|
||||
2 Exit key Key 2 of OBP60
|
||||
3 Jog-Dial press
|
||||
9 Jog-Dial down Next page
|
||||
10 Jog-Dial up Previous page
|
|
@ -297,7 +297,7 @@
|
|||
"name": "useRTC",
|
||||
"label": "RTC Modul",
|
||||
"type": "list",
|
||||
"default": "DS1388",
|
||||
"default": "off",
|
||||
"description": "Use internal RTC module type [off|DS1388]",
|
||||
"list": [
|
||||
"off",
|
||||
|
@ -312,7 +312,7 @@
|
|||
"name": "useGPS",
|
||||
"label": "GPS Sensor",
|
||||
"type": "list",
|
||||
"default": "ATGM336H",
|
||||
"default": "off",
|
||||
"description": "Use internal GPS module type [off|NEO-6M|NEO-M8N|ATGM336H]",
|
||||
"list": [
|
||||
"off",
|
||||
|
@ -343,7 +343,7 @@
|
|||
"name": "useEnvSensor",
|
||||
"label": "Env. Sensor",
|
||||
"type": "list",
|
||||
"default": "BMP280",
|
||||
"default": "off",
|
||||
"description": "Use internal or external environment sensor via I2C bus [off|BME280|BMP280|BMP180|BMP085|HTU21|SHT21]",
|
||||
"list": [
|
||||
"off",
|
||||
|
@ -573,6 +573,21 @@
|
|||
"obp60":"true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "useSDCard",
|
||||
"label": "SD Card",
|
||||
"type": "boolean",
|
||||
"default": "off",
|
||||
"description": "Use internal SD card interface [off|on]",
|
||||
"list": [
|
||||
"off",
|
||||
"on"
|
||||
],
|
||||
"category": "OBP60 Hardware",
|
||||
"capabilities": {
|
||||
"obp60":"true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "powerMode",
|
||||
"label": "Power Mode",
|
||||
|
@ -918,7 +933,7 @@
|
|||
"name": "page1type",
|
||||
"label": "Type",
|
||||
"type": "list",
|
||||
"default": "Voltage",
|
||||
"default": "Clock",
|
||||
"description": "Type of page for page 1",
|
||||
"list": [
|
||||
"BME280",
|
||||
|
@ -1178,7 +1193,7 @@
|
|||
"name": "page2type",
|
||||
"label": "Type",
|
||||
"type": "list",
|
||||
"default": "WindRose",
|
||||
"default": "Wind",
|
||||
"description": "Type of page for page 2",
|
||||
"list": [
|
||||
"BME280",
|
||||
|
@ -2676,7 +2691,7 @@
|
|||
"name": "page8type",
|
||||
"label": "Type",
|
||||
"type": "list",
|
||||
"default": "Clock",
|
||||
"default": "Fluid",
|
||||
"description": "Type of page for page 8",
|
||||
"list": [
|
||||
"BME280",
|
||||
|
|
|
@ -13,6 +13,10 @@
|
|||
#include "OBP60Extensions.h" // Functions lib for extension board
|
||||
#include "OBP60Keypad.h" // Functions for keypad
|
||||
|
||||
#include <FS.h> // SD-Card access
|
||||
#include <SD.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// True type character sets includes
|
||||
// See OBP60ExtensionPort.cpp
|
||||
|
||||
|
@ -23,8 +27,6 @@
|
|||
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
||||
#include "OBPSensorTask.h" // Functions lib for sensor data
|
||||
|
||||
#include "LedSpiTask.h"
|
||||
|
||||
// Global vars
|
||||
bool initComplete = false; // Initialization complete
|
||||
int taskRunCounter = 0; // Task couter for loop section
|
||||
|
@ -33,6 +35,9 @@ int taskRunCounter = 0; // Task couter for loop section
|
|||
//####################################################################################
|
||||
void OBP60Init(GwApi *api){
|
||||
|
||||
GwLog *logger = api->getLogger();
|
||||
GwConfigHandler *config = api->getConfig();
|
||||
|
||||
// Set a new device name and hidden the original name in the main config
|
||||
String devicename = api->getConfig()->getConfigItem(api->getConfig()->deviceName,true)->asString();
|
||||
api->getConfig()->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
||||
|
@ -45,6 +50,31 @@ void OBP60Init(GwApi *api){
|
|||
// Init hardware
|
||||
hardwareInit(api);
|
||||
|
||||
String sdcard = config->getConfigItem(config->useSDCard, true)->asString();
|
||||
if (sdcard == "on") {
|
||||
setPortPin(OBP_POWER_SD, true); // Power on SD
|
||||
delay(10);
|
||||
SPIClass SD_SPI = SPIClass(HSPI);
|
||||
SD_SPI.begin(SD_SPI_CLK, SD_SPI_MISO, SD_SPI_MOSI);
|
||||
if (SD.begin(SD_SPI_CS, SD_SPI, 80000000)) {
|
||||
String sdtype = "unknown";
|
||||
uint8_t cardType = SD.cardType();
|
||||
switch (cardType) {
|
||||
case CARD_MMC:
|
||||
sdtype = "MMC";
|
||||
break;
|
||||
case CARD_SD:
|
||||
sdtype = "SDSC";
|
||||
break;
|
||||
case CARD_SDHC:
|
||||
sdtype = "SDHC";
|
||||
break;
|
||||
}
|
||||
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
|
||||
LOG_DEBUG(GwLog::LOG,"SD card type %s of size %d MB detected", sdtype, cardSize);
|
||||
}
|
||||
}
|
||||
|
||||
// Init power rail 5.0V
|
||||
String powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
||||
api->getLogger()->logDebug(GwLog::DEBUG,"Power Mode is: %s", powermode.c_str());
|
||||
|
@ -288,15 +318,19 @@ void OBP60Task(GwApi *api){
|
|||
// return;
|
||||
GwLog *logger=api->getLogger();
|
||||
GwConfigHandler *config=api->getConfig();
|
||||
#ifdef HARDWARE_V21
|
||||
startLedTask(api);
|
||||
#endif
|
||||
PageList allPages;
|
||||
registerAllPages(allPages);
|
||||
CommonData commonData;
|
||||
commonData.logger=logger;
|
||||
commonData.config=config;
|
||||
|
||||
#ifdef HARDWARE_V21
|
||||
// Keyboard coordinates for page footer
|
||||
initKeys(commonData);
|
||||
#endif
|
||||
|
||||
tN2kMsg N2kMsg;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#define ESP32_CAN_TX_PIN 15
|
||||
#define ESP32_CAN_RX_PIN 16
|
||||
// Bus load in 50mA steps
|
||||
#define N2K_LOAD_LEVEL 2 // 5x50mA = 100mA max bus load with back light on
|
||||
#define N2K_LOAD_LEVEL 2 // 2x50mA = 100mA max bus load
|
||||
// RS485 NMEA0183
|
||||
#define GWSERIAL_TX 9
|
||||
#define GWSERIAL_RX 14
|
||||
|
@ -35,6 +35,11 @@
|
|||
// OBP60 Task
|
||||
void OBP60Task(GwApi *param);
|
||||
DECLARE_USERTASK_PARAM(OBP60Task, 35000); // Need 35k RAM as stack size
|
||||
#ifdef HARDWARE_V21
|
||||
DECLARE_CAPABILITY(obp60,true);
|
||||
#endif
|
||||
#ifdef HARDWARE_LIGHT
|
||||
DECLARE_CAPABILITY(obp40,true)
|
||||
#endif
|
||||
DECLARE_STRING_CAPABILITY(HELP_URL, "https://obp60-v2-docu.readthedocs.io/de/latest/"); // Link to help pages
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -9,15 +9,16 @@ board_build.variants_dir = variants
|
|||
#board = obp60_s3_n8 #ESP32-S3 N8, 8MB flash, no PSRAM
|
||||
#board = obp60_s3_n16 #ESP32-S3 N16,16MB flash, no PSRAM, zero series
|
||||
#board = obp60_s3_n8r8 #ESP32-S3 N8R8, 8MB flash, 8MB PSRAM
|
||||
board = obp60_s3_n16r8 #ESP32-S3 N16R8, 16MB flash, 8MB PSRAM, production series
|
||||
#board = obp60_s3_light_n8r8 #ESP32-S3 N8R8, 8MB flash, 8MB PSRAM, OBP60 clone
|
||||
#board_build.partitions = default_8MB.csv #ESP32-S3 N8, 8MB flash
|
||||
board_build.partitions = default_16MB.csv #ESP32-S3 N16, 16MB flash
|
||||
#board = obp60_s3_n16r8 #ESP32-S3 N16R8, 16MB flash, 8MB PSRAM, production series
|
||||
board = obp60_s3_light_n8r8 #ESP32-S3 N8R8, 8MB flash, 8MB PSRAM, OBP60 clone
|
||||
board_build.partitions = default_8MB.csv #ESP32-S3 N8, 8MB flash
|
||||
#board_build.partitions = default_16MB.csv #ESP32-S3 N16, 16MB flash
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
lib_deps =
|
||||
${basedeps.lib_deps}
|
||||
Wire
|
||||
SPI
|
||||
SD
|
||||
esphome/AsyncTCP-esphome@2.0.1
|
||||
robtillaart/PCF8574@0.3.9
|
||||
adafruit/Adafruit Unified Sensor @ 1.1.13
|
||||
|
@ -40,22 +41,65 @@ lib_deps =
|
|||
build_flags=
|
||||
#https://thingpulse.com/usb-settings-for-logging-with-the-esp32-s3-in-platformio/?srsltid=AfmBOopGskbkr4GoeVkNlFaZXe_zXkLceKF6Rn-tmoXABCeAR2vWsdHL
|
||||
# -D ARDUINO_USB_MODE=1 #0=OTG (to implement other external devices), 1=CDC (is a serial device)
|
||||
# -D ARDUINO_USB_CDC_ON_BOOT=1 #0=JTAG, 1=CDC (serial device)
|
||||
# -D ARDUINO_USB_CDC_ON_BOOT=0 #0=JTAG, 1=CDC (serial device)
|
||||
# -D CORE_DEBUG_LEVEL=1 #Debug level for CPU core via CDC (seral device)
|
||||
# -D TIME=$UNIX_TIME #Set PC time for RTC (only settable via VSC)
|
||||
-D DISABLE_DIAGNOSTIC_OUTPUT #Disable diagnostic output for GxEPD2 lib
|
||||
-D BOARD_OBP60S3 #Board OBP60 V2.1 with ESP32S3
|
||||
# -D HARDWARE_V20 #OBP60 hardware revision V2.0
|
||||
-D HARDWARE_V21 #OBP60 hardware revision V2.1
|
||||
# -D HARDWARE_LIGHT #OBP60 hardware clone
|
||||
# -D HARDWARE_V21 #OBP60 hardware revision V2.1
|
||||
-D HARDWARE_LIGHT #OBP60 hardware clone
|
||||
# -D DISPLAY_GDEW042T2 #old E-Ink display from Waveshare, R10 0.47 ohm
|
||||
-D DISPLAY_GDEY042T81 #new E-Ink display from Waveshare, R10 2.2 ohm
|
||||
# -D DISPLAY_GYE042A87 #alternativ E-Ink display from Genyo Optical, R10 2.2 ohm
|
||||
# -D DISPLAY_SE0420NQ04 #alternativ E-Ink display from SID Technology, R10 2.2 ohm
|
||||
${env.build_flags}
|
||||
#CONFIG_ESP_TASK_WDT_TIMEOUT_S = 10 #Task Watchdog timeout period (seconds) [1...60] 5 default
|
||||
upload_port = /dev/ttyACM0 #OBP60 original
|
||||
#upload_port = /dev/ttyUSB0 #OBP60 clone
|
||||
#upload_port = /dev/ttyACM0 #OBP60 original
|
||||
upload_port = /dev/ttyUSB0 #OBP60 clone
|
||||
upload_protocol = esptool #firmware upload via USB OTG seriell, by first upload need to set the ESP32-S3 in the upload mode with shortcut GND to Pin27
|
||||
upload_speed = 230400
|
||||
monitor_speed = 115200
|
||||
|
||||
[env:obp40]
|
||||
platform = espressif32@6.8.1
|
||||
board_build.variants_dir = variants
|
||||
board = obp60_s3_light_n8r8 #ESP32-S3 N8R8, 8MB flash, 8MB PSRAM, OBP60 clone
|
||||
board_build.partitions = default_8MB.csv #ESP32-S3 N8, 8MB flash
|
||||
custom_config = config_obp40.json
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
${basedeps.lib_deps}
|
||||
Wire
|
||||
SPI
|
||||
SD
|
||||
esphome/AsyncTCP-esphome@2.0.1
|
||||
robtillaart/PCF8574@0.3.9
|
||||
adafruit/Adafruit Unified Sensor @ 1.1.13
|
||||
blemasle/MCP23017@2.0.0
|
||||
adafruit/Adafruit BusIO@1.5.0
|
||||
adafruit/Adafruit GFX Library@1.11.9
|
||||
#zinggjm/GxEPD2@1.5.8
|
||||
#https://github.com/ZinggJM/GxEPD2
|
||||
https://github.com/thooge/GxEPD2
|
||||
sstaub/Ticker@4.4.0
|
||||
adafruit/Adafruit BMP280 Library@2.6.2
|
||||
adafruit/Adafruit BME280 Library@2.2.2
|
||||
adafruit/Adafruit BMP085 Library@1.2.1
|
||||
enjoyneering/HTU21D@1.2.1
|
||||
robtillaart/INA226@0.2.0
|
||||
paulstoffregen/OneWire@2.3.8
|
||||
milesburton/DallasTemperature@3.11.0
|
||||
signetica/SunRise@2.0.2
|
||||
adafruit/Adafruit FRAM I2C@^2.0.3
|
||||
build_flags=
|
||||
#https://thingpulse.com/usb-settings-for-logging-with-the-esp32-s3-in-platformio/?srsltid=AfmBOopGskbkr4GoeVkNlFaZXe_zXkLceKF6Rn-tmoXABCeAR2vWsdHL
|
||||
-D DISABLE_DIAGNOSTIC_OUTPUT #Disable diagnostic output for GxEPD2 lib
|
||||
-D BOARD_OBP60S3 #Board OBP60 V2.1 with ESP32S3
|
||||
-D HARDWARE_LIGHT #OBP60 hardware clone (OBP40)
|
||||
-D DISPLAY_GDEY042T81 #new E-Ink display from Waveshare, R10 2.2 ohm
|
||||
${env.build_flags}
|
||||
upload_port = /dev/ttyUSB0 #OBP60 clone
|
||||
upload_protocol = esptool #firmware upload via USB OTG seriell, by first upload need to set the ESP32-S3 in the upload mode with shortcut GND to Pin27
|
||||
upload_speed = 230400
|
||||
monitor_speed = 115200
|
||||
|
|
Loading…
Reference in New Issue