From ba2a97562ae31b869d4eaa7f9a9c983d91988eb4 Mon Sep 17 00:00:00 2001 From: Arjan van Vught Date: Tue, 1 Oct 2024 16:57:30 +0200 Subject: [PATCH 1/6] Fixed issue that ip configuration is unknown at start --- lib-artnet/.settings/language.settings.xml | 4 ++-- lib-artnet/Makefile.H3 | 2 +- lib-artnet/include/artnetcontroller.h | 2 -- lib-artnet/src/controller/artnetcontroller.cpp | 15 ++++++--------- lib-artnet/src/controller/artnetpolltable.cpp | 4 ++-- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/lib-artnet/.settings/language.settings.xml b/lib-artnet/.settings/language.settings.xml index db163d342..30e669b07 100644 --- a/lib-artnet/.settings/language.settings.xml +++ b/lib-artnet/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -17,7 +17,7 @@ - + diff --git a/lib-artnet/Makefile.H3 b/lib-artnet/Makefile.H3 index 886e31480..3582ff3a2 100644 --- a/lib-artnet/Makefile.H3 +++ b/lib-artnet/Makefile.H3 @@ -1,4 +1,4 @@ -#DEFINES=NDEBUG +DEFINES=NDEBUG EXTRA_INCLUDES= diff --git a/lib-artnet/include/artnetcontroller.h b/lib-artnet/include/artnetcontroller.h index 689bc292f..6df7b7a9a 100644 --- a/lib-artnet/include/artnetcontroller.h +++ b/lib-artnet/include/artnetcontroller.h @@ -51,8 +51,6 @@ struct State { }; struct TArtNetController { - uint32_t nIPAddressLocal; - uint32_t nIPAddressBroadcast; uint8_t Oem[2]; }; diff --git a/lib-artnet/src/controller/artnetcontroller.cpp b/lib-artnet/src/controller/artnetcontroller.cpp index 9c8f56bd8..ec2ea1a79 100644 --- a/lib-artnet/src/controller/artnetcontroller.cpp +++ b/lib-artnet/src/controller/artnetcontroller.cpp @@ -5,7 +5,7 @@ /** * Art-Net Designed by and Copyright Artistic Licence Holdings Ltd. */ -/* Copyright (C) 2017-2024 by Arjan van Vught mailto:info@orangepi-dmx.nl +/* Copyright (C) 2017-2024 by Arjan van Vught mailto:info@gd32-dmx.org * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -230,14 +230,11 @@ void ArtNetController::SetLongName(const char *pLongName) { void ArtNetController::Start() { DEBUG_ENTRY - m_ArtNetController.nIPAddressLocal = Network::Get()->GetIp(); - m_ArtNetController.nIPAddressBroadcast = Network::Get()->GetBroadcastIp(); - assert(m_nHandle == -1); m_nHandle = Network::Get()->Begin(artnet::UDP_PORT); assert(m_nHandle != -1); - Network::Get()->SendTo(m_nHandle, &m_ArtNetPoll, sizeof(struct ArtPoll), m_ArtNetController.nIPAddressBroadcast, artnet::UDP_PORT); + Network::Get()->SendTo(m_nHandle, &m_ArtNetPoll, sizeof(struct ArtPoll), Network::Get()->GetBroadcastIp(), artnet::UDP_PORT); m_State.status = artnet::Status::ON; @@ -315,7 +312,7 @@ void ArtNetController::HandleDmxOut(uint16_t nUniverse, const uint8_t *pDmxData, } if (!m_bUnicast || (nCount > 40) || !m_bForceBroadcast) { - Network::Get()->SendTo(m_nHandle, m_pArtDmx, sizeof(struct ArtDmx), m_ArtNetController.nIPAddressBroadcast, artnet::UDP_PORT); + Network::Get()->SendTo(m_nHandle, m_pArtDmx, sizeof(struct ArtDmx), Network::Get()->GetBroadcastIp(), artnet::UDP_PORT); m_bDmxHandled = true; } @@ -326,7 +323,7 @@ void ArtNetController::HandleDmxOut(uint16_t nUniverse, const uint8_t *pDmxData, void ArtNetController::HandleSync() { if (m_bSynchronization && m_bDmxHandled) { m_bDmxHandled = false; - Network::Get()->SendTo(m_nHandle, m_pArtSync, sizeof(struct ArtSync), m_ArtNetController.nIPAddressBroadcast, artnet::UDP_PORT); + Network::Get()->SendTo(m_nHandle, m_pArtSync, sizeof(struct ArtSync), Network::Get()->GetBroadcastIp(), artnet::UDP_PORT); } } @@ -375,7 +372,7 @@ void ArtNetController::HandleBlackout() { m_pArtDmx->Sequence = 1; } - Network::Get()->SendTo(m_nHandle, m_pArtDmx, sizeof(struct ArtDmx), m_ArtNetController.nIPAddressBroadcast, artnet::UDP_PORT); + Network::Get()->SendTo(m_nHandle, m_pArtDmx, sizeof(struct ArtDmx), Network::Get()->GetBroadcastIp(), artnet::UDP_PORT); } } @@ -401,7 +398,7 @@ void ArtNetController::ProcessPoll() { const auto nCurrentMillis = Hardware::Get()->Millis(); if (__builtin_expect((nCurrentMillis - m_nLastPollMillis > POLL_INTERVAL_MILLIS), 0)) { - Network::Get()->SendTo(m_nHandle, &m_ArtNetPoll, sizeof(struct ArtPoll), m_ArtNetController.nIPAddressBroadcast, artnet::UDP_PORT); + Network::Get()->SendTo(m_nHandle, &m_ArtNetPoll, sizeof(struct ArtPoll), Network::Get()->GetBroadcastIp(), artnet::UDP_PORT); m_nLastPollMillis= nCurrentMillis; #ifndef NDEBUG diff --git a/lib-artnet/src/controller/artnetpolltable.cpp b/lib-artnet/src/controller/artnetpolltable.cpp index 8b0251a19..2bcb665be 100644 --- a/lib-artnet/src/controller/artnetpolltable.cpp +++ b/lib-artnet/src/controller/artnetpolltable.cpp @@ -72,8 +72,8 @@ ArtNetPollTable::ArtNetPollTable() { m_PollTableClean.nUniverseIndex = 0; m_PollTableClean.bOffLine = true; - DEBUG_PRINTF("NodeEntry[%d] = %u bytes [%u Kb]", artnet::POLL_TABLE_SIZE_ENRIES, static_cast(sizeof(artnet::NodeEntry[artnet::POLL_TABLE_SIZE_ENRIES])), static_cast(sizeof(artnet::NodeEntry[artnet::POLL_TABLE_SIZE_ENRIES])) / 1024U); - DEBUG_PRINTF("PollTableUniverses[%d] = %u bytes [%u Kb]", artnet::POLL_TABLE_SIZE_UNIVERSES, static_cast(sizeof(artnet::PollTableUniverses[artnet::POLL_TABLE_SIZE_UNIVERSES])), static_cast(sizeof(artnet::PollTableUniverses[artnet::POLL_TABLE_SIZE_UNIVERSES])) / 1024U); + DEBUG_PRINTF("NodeEntry[%d] = %u bytes [%u Kb]", artnet::POLL_TABLE_SIZE_ENRIES, (sizeof(artnet::NodeEntry[artnet::POLL_TABLE_SIZE_ENRIES])), (sizeof(artnet::NodeEntry[artnet::POLL_TABLE_SIZE_ENRIES])) / 1024U); + DEBUG_PRINTF("PollTableUniverses[%d] = %u bytes [%u Kb]", artnet::POLL_TABLE_SIZE_UNIVERSES, (sizeof(artnet::PollTableUniverses[artnet::POLL_TABLE_SIZE_UNIVERSES])), (sizeof(artnet::PollTableUniverses[artnet::POLL_TABLE_SIZE_UNIVERSES])) / 1024U); DEBUG_EXIT } From b40135755e662bb5519494cf5ad96cf52ca78954 Mon Sep 17 00:00:00 2001 From: Arjan van Vught Date: Tue, 1 Oct 2024 16:58:21 +0200 Subject: [PATCH 2/6] Fixed issue with SPI_FLASH_MACRONIX --- lib-flash/.settings/language.settings.xml | 2 +- lib-flash/src/spi/spi_flash_internal.h | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib-flash/.settings/language.settings.xml b/lib-flash/.settings/language.settings.xml index f789c496c..b5de257f2 100755 --- a/lib-flash/.settings/language.settings.xml +++ b/lib-flash/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/lib-flash/src/spi/spi_flash_internal.h b/lib-flash/src/spi/spi_flash_internal.h index 019fff1a1..0acd9b93a 100644 --- a/lib-flash/src/spi/spi_flash_internal.h +++ b/lib-flash/src/spi/spi_flash_internal.h @@ -74,16 +74,17 @@ struct spi_flash { #define SPI_XFER_SPEED_HZ 6000000 ///< 6MHz -extern int spi_init(); -extern int spi_xfer(uint32_t bitlen, const uint8_t *dout, uint8_t *din, uint32_t flags); +int spi_init(); +int spi_xfer(uint32_t bitlen, const uint8_t *dout, uint8_t *din, uint32_t flags); -//#define CONFIG_SPI_FLASH_MACRONIX -//int spi_flash_probe_macronix(struct spi_flash *flash, uint8_t *idcode); +#if defined (H3) +# define CONFIG_SPI_FLASH_MACRONIX + int spi_flash_probe_macronix(struct spi_flash *flash, uint8_t *idcode); +# define CONFIG_SPI_FLASH_GIGADEVICE + int spi_flash_probe_gigadevice(struct spi_flash *spi, uint8_t *idcode); +#endif #define CONFIG_SPI_FLASH_WINBOND extern int spi_flash_probe_winbond(struct spi_flash *spi, uint8_t *idcode); -//#define CONFIG_SPI_FLASH_GIGADEVICE -//extern int spi_flash_probe_gigadevice(struct spi_flash *spi, uint8_t *idcode); - #endif /* SPI_FLASH_INTERNAL_H_ */ From 6c0c9373beab4e8eeda42998f41cfb99f7ca1fec Mon Sep 17 00:00:00 2001 From: Arjan van Vught Date: Tue, 1 Oct 2024 16:59:20 +0200 Subject: [PATCH 3/6] Fixed issue with PCF8563 and set/get time --- lib-hal/include/hwclock.h | 2 +- lib-hal/rtc/i2c/hwclockrtc.cpp | 222 +++++++++++++++++++-------------- lib-hal/rtc/json_rtc.cpp | 6 + 3 files changed, 138 insertions(+), 92 deletions(-) diff --git a/lib-hal/include/hwclock.h b/lib-hal/include/hwclock.h index 331d293ae..01b2f5cd6 100644 --- a/lib-hal/include/hwclock.h +++ b/lib-hal/include/hwclock.h @@ -3,7 +3,7 @@ * @file hwclock.h * */ -/* Copyright (C) 2020-2023 by Arjan van Vught mailto:info@orangepi-dmx.nl +/* Copyright (C) 2020-2023 by Arjan van Vught mailto:info@gd32-dmx.org * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/lib-hal/rtc/i2c/hwclockrtc.cpp b/lib-hal/rtc/i2c/hwclockrtc.cpp index 892d2c202..ec1e226f0 100644 --- a/lib-hal/rtc/i2c/hwclockrtc.cpp +++ b/lib-hal/rtc/i2c/hwclockrtc.cpp @@ -2,7 +2,7 @@ * @file hwclockrtc.cpp * */ -/* Copyright (C) 2020-2024 by Arjan van Vught mailto:info@orangepi-dmx.nl +/* Copyright (C) 2020-2024 by Arjan van Vught mailto:info@gd32-dmx.org * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -23,6 +23,19 @@ * THE SOFTWARE. */ +/** + * MCP7941X: It has specific control bits like the Start Timer (ST) and battery enable (VBATEN). + */ + +/** + * DS3231: Known for its accuracy. + */ + +/** + * PCF8563: The time integrity is checked using the SECONDS_VL bit. + * Alarm: Minute, Hour, Day, Weekday + */ + #include #include @@ -37,75 +50,71 @@ namespace rtc { namespace reg { -static constexpr uint8_t SECONDS = 0x00; -static constexpr uint8_t MINUTES = 0x01; -static constexpr uint8_t HOURS = 0x02; -static constexpr uint8_t DAY = 0x03; -static constexpr uint8_t DATE = 0x04; -static constexpr uint8_t MONTH = 0x05; -static constexpr uint8_t YEAR = 0x06; +static constexpr uint8_t SECONDS = 0x00; +static constexpr uint8_t MINUTES = 0x01; +static constexpr uint8_t HOURS = 0x02; +static constexpr uint8_t WDAY = 0x03; +static constexpr uint8_t MDAY = 0x04; +static constexpr uint8_t MONTH = 0x05; +static constexpr uint8_t YEAR = 0x06; } // namespace reg namespace mcp7941x { namespace reg { -static constexpr uint8_t CONTROL = 0x07; +static constexpr uint8_t CONTROL = 0x07; } // namespace reg namespace bit { -static constexpr uint8_t ST = 0x80; -static constexpr uint8_t VBATEN = 0x08; -static constexpr uint8_t ALM0_EN = 0x10; -static constexpr uint8_t ALMX_IF = (1U << 3); -static constexpr uint8_t ALMX_C0 = (1U << 4); -static constexpr uint8_t ALMX_C1 = (1U << 5); -static constexpr uint8_t ALMX_C2 = (1U << 6); +static constexpr uint8_t ST = 0x80; +static constexpr uint8_t VBATEN = 0x08; +static constexpr uint8_t ALM0_EN = 0x10; +static constexpr uint8_t ALMX_IF = (1U << 3); +static constexpr uint8_t ALMX_C0 = (1U << 4); +static constexpr uint8_t ALMX_C1 = (1U << 5); +static constexpr uint8_t ALMX_C2 = (1U << 6); #ifndef NDEBUG -static constexpr uint8_t ALMX_POL = (1U << 7); +static constexpr uint8_t ALMX_POL = (1U << 7); #endif -static constexpr uint8_t MSK_ALMX_MATCH = (ALMX_C0 | ALMX_C1 | ALMX_C2); +static constexpr uint8_t MSK_ALMX_MATCH = (ALMX_C0 | ALMX_C1 | ALMX_C2); } // namespace bit } // namespace mcp7941x namespace ds3231 { namespace reg { -static constexpr uint8_t ALARM1_SECONDS = 0x07; -static constexpr uint8_t CONTROL = 0x0e; -//static constexpr uint8_t STATUS = 0x0f; +static constexpr uint8_t ALARM1_SECONDS = 0x07; +static constexpr uint8_t CONTROL = 0x0e; } // namespace reg namespace bit { -static constexpr uint8_t A1IE = (1U << 0); -static constexpr uint8_t A2IE = (1U << 1); -static constexpr uint8_t A1F = (1U << 0); -static constexpr uint8_t A2F = (1U << 1); +static constexpr uint8_t A1IE = (1U << 0); +static constexpr uint8_t A2IE = (1U << 1); +static constexpr uint8_t A1F = (1U << 0); +static constexpr uint8_t A2F = (1U << 1); } // namespace bit } // namespace ds3231 namespace pcf8563 { namespace reg { -static constexpr uint8_t CONTROL_STATUS1 = 0x00; -static constexpr uint8_t CONTROL_STATUS2 = 0x01; -static constexpr uint8_t SECONDS = 0x02; -//static constexpr uint8_t MINUTES = 0x03; -//static constexpr uint8_t HOURS = 0x04; -//static constexpr uint8_t DAY = 0x05; -//static constexpr uint8_t WEEKDAY = 0x06; -//static constexpr uint8_t MONTH = 0x07; -static constexpr uint8_t YEAR = 0x08; -static constexpr uint8_t ALARM = 0x09; +static constexpr uint8_t CONTROL_STATUS1 = 0x00; +static constexpr uint8_t CONTROL_STATUS2 = 0x01; +static constexpr uint8_t SECONDS = 0x02; +//static constexpr uint8_t MINUTES = 0x03; +//static constexpr uint8_t HOURS = 0x04; +static constexpr uint8_t MDAY = 0x05; +static constexpr uint8_t WDAY = 0x06; +//static constexpr uint8_t MONTH = 0x07; +static constexpr uint8_t YEAR = 0x08; +static constexpr uint8_t ALARM = 0x09; } // namespace reg namespace bit { -static constexpr uint8_t SEC_VL = (1U << 7); -static constexpr uint8_t AIE = (1U << 1); -static constexpr uint8_t AF = (1U << 3); -static constexpr uint8_t ST2_N = (7U << 5); +static constexpr uint8_t SECONDS_VL = (1U << 7); +static constexpr uint8_t STATUS2_AIE = (1U << 1); ///< alarm interrupt enabled +static constexpr uint8_t STATUS2_AF = (1U << 3); ///< read: alarm flag active } // namespace bit } // namespace pcf8563 namespace i2caddress { -static constexpr uint8_t PCF8563 = 0x51; -static constexpr uint8_t MCP7941X = 0x6F; -static constexpr uint8_t DS3231 = 0x68; +static constexpr uint8_t PCF8563 = 0x51; +static constexpr uint8_t MCP7941X = 0x6F; +static constexpr uint8_t DS3231 = 0x68; } // namespace i2caddress } // namespace rtc -using namespace rtc; - -static void write_register(uint8_t nRegister, uint8_t nValue) { +static void i2c_write_register(const uint8_t nRegister, const uint8_t nValue) { char buffer[2]; buffer[0] = static_cast(nRegister); @@ -114,6 +123,19 @@ static void write_register(uint8_t nRegister, uint8_t nValue) { FUNC_PREFIX(i2c_write(buffer, 2)); } +static void i2c_read_register(const uint8_t nRegister, uint8_t& nValue) { + char buffer[1]; + + buffer[0] = static_cast(nRegister); + + FUNC_PREFIX(i2c_write(buffer, 1)); + FUNC_PREFIX(i2c_read(buffer, 1)); + + nValue = buffer[0]; +} + +using namespace rtc; + void HwClock::RtcProbe() { DEBUG_ENTRY @@ -121,17 +143,14 @@ void HwClock::RtcProbe() { FUNC_PREFIX(i2c_set_baudrate(hal::i2c::NORMAL_SPEED)); - char registers[1]; + uint8_t nValue; #if !defined (CONFIG_RTC_DISABLE_MCP7941X) FUNC_PREFIX(i2c_set_address(i2caddress::MCP7941X)); - registers[0] = reg::YEAR; - // The I2C bus is not stable at cold start? These dummy write/read helps. // This needs some more investigation for what is really happening here. - FUNC_PREFIX(i2c_write(registers, 1)); - FUNC_PREFIX(i2c_read(registers, sizeof(registers) / sizeof(registers[0]))); + i2c_read_register(reg::YEAR, nValue); if (FUNC_PREFIX(i2c_write(nullptr, 0)) == 0) { DEBUG_PUTS("MCP7941X"); @@ -140,12 +159,9 @@ void HwClock::RtcProbe() { m_Type = Type::MCP7941X; m_nAddress = i2caddress::MCP7941X; - registers[0] = reg::SECONDS; - - FUNC_PREFIX(i2c_write(registers, 1)); - FUNC_PREFIX(i2c_read(registers, sizeof(registers) / sizeof(registers[0]))); + i2c_read_register(reg::SECONDS, nValue); - if ((registers[0] & mcp7941x::bit::ST) == 0) { + if ((nValue & mcp7941x::bit::ST) == 0) { DEBUG_PUTS("Start the on-board oscillator"); struct tm RtcTime; @@ -168,10 +184,9 @@ void HwClock::RtcProbe() { #if !defined (CONFIG_RTC_DISABLE_DS3231) FUNC_PREFIX(i2c_set_address(i2caddress::DS3231)); - registers[0] = reg::YEAR; - - FUNC_PREFIX(i2c_write(registers, 1)); - FUNC_PREFIX(i2c_read(registers, sizeof(registers) / sizeof(registers[0]))); + // The I2C bus is not stable at cold start? These dummy write/read helps. + // This needs some more investigation for what is really happening here. + i2c_read_register(reg::YEAR, nValue); if (FUNC_PREFIX(i2c_write(nullptr, 0)) == 0) { DEBUG_PUTS("DS3231"); @@ -202,10 +217,9 @@ void HwClock::RtcProbe() { #if !defined (CONFIG_RTC_DISABLE_PCF8563) FUNC_PREFIX(i2c_set_address(i2caddress::PCF8563)); - registers[0] = pcf8563::reg::YEAR; - - FUNC_PREFIX(i2c_write(registers, 1)); - FUNC_PREFIX(i2c_read(registers, sizeof(registers) / sizeof(registers[0]))); + // The I2C bus is not stable at cold start? These dummy write/read helps. + // This needs some more investigation for what is really happening here. + i2c_read_register(pcf8563::reg::YEAR, nValue); if (FUNC_PREFIX(i2c_write(nullptr, 0)) == 0) { DEBUG_PUTS("PCF8563"); @@ -214,15 +228,15 @@ void HwClock::RtcProbe() { m_Type = Type::PCF8563; m_nAddress = i2caddress::PCF8563; - write_register(pcf8563::reg::CONTROL_STATUS1, 0); - write_register(pcf8563::reg::CONTROL_STATUS2, 0); + i2c_write_register(pcf8563::reg::CONTROL_STATUS1, 0); + i2c_write_register(pcf8563::reg::CONTROL_STATUS2, 0); - registers[0] = pcf8563::reg::SECONDS; - - FUNC_PREFIX(i2c_write(registers, 1)); - FUNC_PREFIX(i2c_read(registers,1)); + i2c_read_register(pcf8563::reg::SECONDS, nValue); - if (registers[0] & pcf8563::bit::SEC_VL) { + // Register seconds has the VL bit + // 0 - clock integrity is guaranteed + // 1 - integrity of the clock information is not guaranteed + if ((nValue & pcf8563::bit::SECONDS_VL) == pcf8563::bit::SECONDS_VL) { DEBUG_PUTS("Integrity of the clock information is not guaranteed"); struct tm RtcTime; @@ -237,12 +251,9 @@ void HwClock::RtcProbe() { RtcSet(&RtcTime); } - registers[0] = pcf8563::reg::SECONDS; - - FUNC_PREFIX(i2c_write(registers, 1)); - FUNC_PREFIX(i2c_read(registers,1)); + i2c_read_register(pcf8563::reg::SECONDS, nValue); - if (registers[0] & pcf8563::bit::SEC_VL) { + if ((nValue & pcf8563::bit::SECONDS_VL) == pcf8563::bit::SECONDS_VL) { DEBUG_PUTS("Clock is not running -> disconnected"); m_bIsConnected = false; } @@ -256,9 +267,11 @@ void HwClock::RtcProbe() { } bool HwClock::RtcSet(const struct tm *pTime) { + DEBUG_ENTRY assert(pTime != nullptr); if (!m_bIsConnected) { + DEBUG_EXIT return false; } @@ -277,14 +290,24 @@ bool HwClock::RtcSet(const struct tm *pTime) { registers[reg::SECONDS] = DEC2BCD(pTime->tm_sec & 0x7f); registers[reg::MINUTES] = DEC2BCD(pTime->tm_min & 0x7f); registers[reg::HOURS] = DEC2BCD(pTime->tm_hour & 0x1f); - registers[reg::DAY] = DEC2BCD(pTime->tm_wday & 0x07); - registers[reg::DATE] = DEC2BCD(pTime->tm_mday & 0x3f); + +#if !defined (CONFIG_RTC_DISABLE_PCF8563) + if (m_Type == Type::PCF8563) { + registers[pcf8563::reg::WDAY - pcf8563::reg::SECONDS] = DEC2BCD(pTime->tm_wday & 0x07); + registers[pcf8563::reg::MDAY - pcf8563::reg::SECONDS] = DEC2BCD(pTime->tm_mday & 0x3f); + } else +#endif + { + registers[reg::WDAY] = DEC2BCD(pTime->tm_wday & 0x07); + registers[reg::MDAY] = DEC2BCD(pTime->tm_mday & 0x3f); + } + registers[reg::MONTH] = DEC2BCD((pTime->tm_mon + 1) & 0x1f); registers[reg::YEAR] = DEC2BCD((pTime->tm_year - 100) & 0xff); if (m_Type == Type::MCP7941X) { registers[reg::SECONDS] |= mcp7941x::bit::ST; - registers[reg::DAY] |= mcp7941x::bit::VBATEN; + registers[reg::WDAY] |= mcp7941x::bit::VBATEN; } if (m_Type == Type::PCF8563) { @@ -297,13 +320,16 @@ bool HwClock::RtcSet(const struct tm *pTime) { FUNC_PREFIX(i2c_set_baudrate(hal::i2c::FULL_SPEED)); FUNC_PREFIX(i2c_write(data, sizeof(data) / sizeof(data[0]))); + DEBUG_EXIT return true; } bool HwClock::RtcGet(struct tm *pTime) { + DEBUG_ENTRY assert(pTime != nullptr); if (!m_bIsConnected) { + DEBUG_EXIT return false; } @@ -323,8 +349,18 @@ bool HwClock::RtcGet(struct tm *pTime) { pTime->tm_sec = BCD2DEC(registers[reg::SECONDS] & 0x7f); pTime->tm_min = BCD2DEC(registers[reg::MINUTES] & 0x7f); pTime->tm_hour = BCD2DEC(registers[reg::HOURS] & 0x3f); - pTime->tm_wday = BCD2DEC(registers[reg::DAY] & 0x07); - pTime->tm_mday = BCD2DEC(registers[reg::DATE] & 0x3f); + +#if !defined (CONFIG_RTC_DISABLE_PCF8563) + if (m_Type == Type::PCF8563) { + pTime->tm_wday = BCD2DEC(registers[pcf8563::reg::WDAY - pcf8563::reg::SECONDS] & 0x07); + pTime->tm_mday = BCD2DEC(registers[pcf8563::reg::MDAY - pcf8563::reg::SECONDS] & 0x3f); + } else +#endif + { + pTime->tm_wday = BCD2DEC(registers[reg::WDAY] & 0x07); + pTime->tm_mday = BCD2DEC(registers[reg::MDAY] & 0x3f); + } + pTime->tm_mon = BCD2DEC(registers[reg::MONTH] & 0x1f) - 1; pTime->tm_year = BCD2DEC(registers[reg::YEAR]) + 100; @@ -337,6 +373,7 @@ bool HwClock::RtcGet(struct tm *pTime) { pTime->tm_year, pTime->tm_wday); + DEBUG_EXIT return true; } @@ -425,6 +462,7 @@ bool HwClock::RtcSetAlarm(const struct tm *pTime) { FUNC_PREFIX(i2c_write(registers, sizeof(registers) / sizeof(registers[0]))); if (m_bRtcAlarmEnabled) { + DEBUG_PUTS("Alarm is enabled"); registers[0] = ds3231::reg::CONTROL; registers[1] |= ds3231::bit::A1IE; FUNC_PREFIX(i2c_write(registers, 2)); @@ -607,20 +645,20 @@ int HwClock::MCP794xxAlarmWeekday(struct tm *pTime) { } void HwClock::PCF8563GetAlarmMode() { + DEBUG_ENTRY assert(m_Type == rtc::Type::PCF8563); - char data[1]; - - data[0] = pcf8563::reg::CONTROL_STATUS2; + uint8_t nValue; + i2c_read_register(pcf8563::reg::CONTROL_STATUS2, nValue); - FUNC_PREFIX(i2c_write(data, 1)); - FUNC_PREFIX(i2c_read(data, sizeof(data) / sizeof(data[0]))); + m_bRtcAlarmEnabled = nValue & pcf8563::bit::STATUS2_AIE; + m_bRtcAlarmPending = nValue & pcf8563::bit::STATUS2_AF; - m_bRtcAlarmEnabled = data[0] & pcf8563::bit::AIE; - m_bRtcAlarmPending = data[0] & pcf8563::bit::AF; + DEBUG_EXIT } void HwClock::PCF8563SetAlarmMode() { + DEBUG_ENTRY assert(m_Type == rtc::Type::PCF8563); char data[2]; @@ -631,14 +669,16 @@ void HwClock::PCF8563SetAlarmMode() { FUNC_PREFIX(i2c_read(&data[1], 1)); if (m_bRtcAlarmEnabled) { - data[1] |= pcf8563::bit::AIE; + DEBUG_PUTS("Alarm is enabled"); + data[1] |= pcf8563::bit::STATUS2_AIE; } else { - data[1] &= static_cast(~pcf8563::bit::AIE); + data[1] &= static_cast(~pcf8563::bit::STATUS2_AIE); } - data[1] &= static_cast(~pcf8563::bit::AF | pcf8563::bit::ST2_N); - data[0] = pcf8563::reg::CONTROL_STATUS2; + data[1] &= static_cast(~pcf8563::bit::STATUS2_AF); FUNC_PREFIX(i2c_write(data, 2)); + + DEBUG_EXIT } diff --git a/lib-hal/rtc/json_rtc.cpp b/lib-hal/rtc/json_rtc.cpp index 443dd51af..938a6a52e 100755 --- a/lib-hal/rtc/json_rtc.cpp +++ b/lib-hal/rtc/json_rtc.cpp @@ -44,6 +44,8 @@ static void staticCallbackFunction([[maybe_unused]] void *p, const char *s) { assert(p == nullptr); assert(s != nullptr); + DEBUG_PUTS(s); + uint32_t nLength = iso8601FormatSize; if (Sscan::Char(s, "alarm" , iso8601Format, nLength) == Sscan::OK) { @@ -55,6 +57,8 @@ static void staticCallbackFunction([[maybe_unused]] void *p, const char *s) { nLength = sizeof(action) - 1; if (Sscan::Char(s, "action" , action, nLength) == Sscan::OK) { + DEBUG_PUTS("action"); + if (strncmp(action, "hctosys", nLength) == 0) { HwClock::Get()->HcToSys(); return; @@ -71,6 +75,8 @@ static void staticCallbackFunction([[maybe_unused]] void *p, const char *s) { uint8_t nValue8; if (Sscan::Uint8(s, "enable", nValue8) == Sscan::OK) { + DEBUG_PUTS("enable"); + HwClock::Get()->AlarmEnable(nValue8 != 0); return; } From 9779ebc91626c57cdfa2b6ecb822ef7d2f8c27ac Mon Sep 17 00:00:00 2001 From: Arjan van Vught Date: Tue, 1 Oct 2024 17:01:16 +0200 Subject: [PATCH 4/6] Improved HTTP Server - Removed limitation sending just one TCP segment size --- firmware-template-h3/Common.mk | 13 ++ firmware-template-h3/Rules.mk | 10 +- firmware-template-h3/lib/Rules.mk | 7 +- lib-network/.cproject | 10 ++ lib-network/.settings/language.settings.xml | 6 +- lib-network/Rules.mk | 2 + lib-network/src/net/datasegmentqueue.h | 98 +++++++++++++++ lib-network/src/net/tcp.cpp | 113 ++++++++++++------ lib-remoteconfig/.cproject | 3 + .../.settings/language.settings.xml | 4 +- lib-remoteconfig/Rules.mk | 2 + lib-remoteconfig/include/httpd/http.h | 1 - .../include/httpd/httpdhandlerequest.h | 12 +- .../src/httpd/get_file_content.cpp | 8 +- lib-remoteconfig/src/httpd/httpd.cpp | 6 +- .../src/httpd/httpdhandlerequest.cpp | 17 +-- 16 files changed, 245 insertions(+), 67 deletions(-) create mode 100755 firmware-template-h3/Common.mk create mode 100755 lib-network/src/net/datasegmentqueue.h diff --git a/firmware-template-h3/Common.mk b/firmware-template-h3/Common.mk new file mode 100755 index 000000000..25f48d3a0 --- /dev/null +++ b/firmware-template-h3/Common.mk @@ -0,0 +1,13 @@ +$(info "Common.mk") +$(info $$DEFINES [${DEFINES}]) + +DEFINES+=-DPHY_GENERIC=255 +DEFINES+=-DPHY_TYPE=PHY_GENERIC +DEFINES+=-DENABLE_TFTP_SERVER +DEFINES+=-DCONFIG_MDNS_DOMAIN_REVERSE +DEFINES+=-DISABLE_INTERNAL_RTC +DEFINES+=-D__FPU_PRESENT=1 -D__GIC_PRESENT=1 +#DEFINES+=-DTCP_TX_QUEUE_SIZE=2 +DEFINES+=-DHTTPD_CONTENT_SIZE=4096 + +$(info $$DEFINES [${DEFINES}]) \ No newline at end of file diff --git a/firmware-template-h3/Rules.mk b/firmware-template-h3/Rules.mk index 16f52f1b4..2b165ca5b 100644 --- a/firmware-template-h3/Rules.mk +++ b/firmware-template-h3/Rules.mk @@ -52,13 +52,7 @@ ifneq ($(findstring _TIME_STAMP_YEAR_,$(DEFINES)), _TIME_STAMP_YEAR_) DEFINES+=-D_TIME_STAMP_YEAR_=$(shell date +"%Y") -D_TIME_STAMP_MONTH_=$(shell date +"%-m") -D_TIME_STAMP_DAY_=$(shell date +"%-d") endif -DEFINES+=-DBARE_METAL -DH3 -DEFINES+=-DPHY_GENERIC=255 -DEFINES+=-DPHY_TYPE=PHY_GENERIC -DEFINES+=-DENABLE_TFTP_SERVER -DEFINES+=-DCONFIG_MDNS_DOMAIN_REVERSE -DEFINES+=-DISABLE_INTERNAL_RTC -DEFINES+=-D__FPU_PRESENT=1 -D__GIC_PRESENT=1 +include ../firmware-template-h3/Common.mk ifneq ($(findstring CONFIG_STORE_USE_SPI,$(DEFINES)), CONFIG_STORE_USE_SPI) DEFINES+=-DCONFIG_STORE_USE_SPI @@ -90,7 +84,7 @@ LIBDEP=$(addprefix ../lib-,$(LIBS)) $(info [${LIBDEP}]) -COPS=-D$(PLATFORM) $(DEFINES) +COPS=-DBARE_METAL -DH3 -D$(PLATFORM) $(DEFINES) COPS+=$(INCDIRS) $(LIBINCDIRS) $(addprefix -I,$(EXTRA_INCLUDES)) COPS+=-mfpu=neon-vfpv4 -mcpu=cortex-a7 -mfloat-abi=hard -mhard-float COPS+=-nostartfiles -ffreestanding -nostdlib -fprefetch-loop-arrays diff --git a/firmware-template-h3/lib/Rules.mk b/firmware-template-h3/lib/Rules.mk index 83b474de0..693748562 100644 --- a/firmware-template-h3/lib/Rules.mk +++ b/firmware-template-h3/lib/Rules.mk @@ -35,12 +35,7 @@ ifneq ($(findstring _TIME_STAMP_YEAR_,$(DEFINES)), _TIME_STAMP_YEAR_) DEFINES+=-D_TIME_STAMP_YEAR_=$(shell date +"%Y") -D_TIME_STAMP_MONTH_=$(shell date +"%-m") -D_TIME_STAMP_DAY_=$(shell date +"%-d") endif -DEFINES+=-DPHY_GENERIC=255 -DEFINES+=-DPHY_TYPE=PHY_GENERIC -DEFINES+=-DENABLE_TFTP_SERVER -DEFINES+=-DCONFIG_MDNS_DOMAIN_REVERSE -DEFINES+=-DISABLE_INTERNAL_RTC -DEFINES+=-D__FPU_PRESENT=1 -D__GIC_PRESENT=1 +include ../firmware-template-h3/Common.mk ifneq ($(findstring CONFIG_STORE_USE_SPI,$(DEFINES)), CONFIG_STORE_USE_SPI) DEFINES+=-DCONFIG_STORE_USE_SPI diff --git a/lib-network/.cproject b/lib-network/.cproject index d6c35f114..03c1fab6a 100644 --- a/lib-network/.cproject +++ b/lib-network/.cproject @@ -112,6 +112,7 @@ + @@ -143,6 +144,7 @@ + @@ -175,6 +177,8 @@ + + @@ -275,6 +279,8 @@ + + @@ -308,6 +314,7 @@ + @@ -459,6 +466,7 @@ +