diff --git a/src/FSCommon.cpp b/src/FSCommon.cpp index 73d5d92b3..1bf355056 100644 --- a/src/FSCommon.cpp +++ b/src/FSCommon.cpp @@ -170,7 +170,7 @@ void fsInit() #ifdef FSCom if (!FSBegin()) { - LOG_ERROR("Filesystem mount Failed. Formatting...\n"); + LOG_ERROR("Filesystem mount Failed.\n"); assert(0); // FIXME - report failure to phone } #ifdef ARCH_ESP32 diff --git a/src/FSCommon.h b/src/FSCommon.h index e304a455b..f4c1372a1 100644 --- a/src/FSCommon.h +++ b/src/FSCommon.h @@ -17,7 +17,7 @@ // RP2040 #include "LittleFS.h" #define FSCom LittleFS -#define FSBegin() FSCom.begin() +#define FSBegin() FSCom.begin() // set autoformat #define FILE_O_WRITE "w" #define FILE_O_READ "r" #endif @@ -26,7 +26,7 @@ // ESP32 version #include "LittleFS.h" #define FSCom LittleFS -#define FSBegin() FSCom.begin(true) +#define FSBegin() FSCom.begin(true) // format on failure #define FILE_O_WRITE "w" #define FILE_O_READ "r" #endif @@ -35,7 +35,7 @@ // NRF52 version #include "InternalFileSystem.h" #define FSCom InternalFS -#define FSBegin() FSCom.begin() +#define FSBegin() FSCom.begin() // InternalFS formats on failure using namespace Adafruit_LittleFS_Namespace; #endif diff --git a/src/Observer.h b/src/Observer.h index ccc7f37b6..4c09101fb 100644 --- a/src/Observer.h +++ b/src/Observer.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include template class Observable; diff --git a/src/concurrency/NotifiedWorkerThread.cpp b/src/concurrency/NotifiedWorkerThread.cpp index ac6428f07..ccdc8fa2b 100644 --- a/src/concurrency/NotifiedWorkerThread.cpp +++ b/src/concurrency/NotifiedWorkerThread.cpp @@ -1,7 +1,6 @@ #include "configuration.h" #include "NotifiedWorkerThread.h" #include "main.h" -#include namespace concurrency { diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index 7eec13228..e5791223d 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -3,7 +3,6 @@ #include "RTC.h" #include "configuration.h" #include "sleep.h" -#include // If we have a serial GPS port it will not be null #ifdef GPS_SERIAL_NUM diff --git a/src/memtest.cpp b/src/memtest.cpp deleted file mode 100644 index 20a4bfa53..000000000 --- a/src/memtest.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* - * mtest - Perform a memory test - * - * (C) Copyright 2000 - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ -#include "configuration.h" - -/* - * Perform a memory test. A more complete alternative test can be - * configured using CONFIG_CMD_MTEST_ALTERNATIVE. The complete test - * loops until interrupted by ctrl-c or by a failure of one of the - * sub-tests. - */ -#ifdef CONFIG_CMD_MTEST_ALTERNATIVE -static int mem_test(uint32_t _start, uint32_t _end, uint32_t pattern_unused) -{ - volatile uint32_t *start = (volatile uint32_t *)_start; - volatile uint32_t *end = (volatile uint32_t *)_end; - volatile uint32_t *addr; - uint32_t val; - uint32_t readback; - vu_long addr_mask; - vu_long offset; - vu_long test_offset; - vu_long pattern; - vu_long temp; - vu_long anti_pattern; - vu_long num_words; -#ifdef CFG_MEMTEST_SCRATCH - volatile uint32_t *dummy = (vu_long *)CFG_MEMTEST_SCRATCH; -#else - volatile uint32_t *dummy = start; -#endif - int j; - int iterations = 1; - static const uint32_t bitpattern[] = { - 0x00000001, /* single bit */ - 0x00000003, /* two adjacent bits */ - 0x00000007, /* three adjacent bits */ - 0x0000000F, /* four adjacent bits */ - 0x00000005, /* two non-adjacent bits */ - 0x00000015, /* three non-adjacent bits */ - 0x00000055, /* four non-adjacent bits */ - 0xaaaaaaaa, /* alternating 1/0 */ - }; - /* XXX: enforce alignment of start and end? */ - for (;;) { - if (ctrlc()) { - putchar('\n'); - return 1; - } - printf("Iteration: %6d\r", iterations); - iterations++; - /* - * Data line test: write a pattern to the first - * location, write the 1's complement to a 'parking' - * address (changes the state of the data bus so a - * floating bus doen't give a false OK), and then - * read the value back. Note that we read it back - * into a variable because the next time we read it, - * it might be right (been there, tough to explain to - * the quality guys why it prints a failure when the - * "is" and "should be" are obviously the same in the - * error message). - * - * Rather than exhaustively testing, we test some - * patterns by shifting '1' bits through a field of - * '0's and '0' bits through a field of '1's (i.e. - * pattern and ~pattern). - */ - addr = start; - /* XXX */ - if (addr == dummy) - ++addr; - for (j = 0; j < sizeof(bitpattern) / sizeof(bitpattern[0]); j++) { - val = bitpattern[j]; - for (; val != 0; val <<= 1) { - *addr = val; - *dummy = ~val; /* clear the test data off of the bus */ - readback = *addr; - if (readback != val) { - printf("FAILURE (data line): " - "expected 0x%08lx, actual 0x%08lx at address 0x%p\n", - val, readback, addr); - } - *addr = ~val; - *dummy = val; - readback = *addr; - if (readback != ~val) { - printf("FAILURE (data line): " - "Is 0x%08lx, should be 0x%08lx at address 0x%p\n", - readback, ~val, addr); - } - } - } - /* - * Based on code whose Original Author and Copyright - * information follows: Copyright (c) 1998 by Michael - * Barr. This software is placed into the public - * domain and may be used for any purpose. However, - * this notice must not be changed or removed and no - * warranty is either expressed or implied by its - * publication or distribution. - */ - /* - * Address line test - * - * Description: Test the address bus wiring in a - * memory region by performing a walking - * 1's test on the relevant bits of the - * address and checking for aliasing. - * This test will find single-bit - * address failures such as stuck -high, - * stuck-low, and shorted pins. The base - * address and size of the region are - * selected by the caller. - * - * Notes: For best results, the selected base - * address should have enough LSB 0's to - * guarantee single address bit changes. - * For example, to test a 64-Kbyte - * region, select a base address on a - * 64-Kbyte boundary. Also, select the - * region size as a power-of-two if at - * all possible. - * - * Returns: 0 if the test succeeds, 1 if the test fails. - * - * ## NOTE ## Be sure to specify start and end - * addresses such that addr_mask has - * lots of bits set. For example an - * address range of 01000000 02000000 is - * bad while a range of 01000000 - * 01ffffff is perfect. - */ - addr_mask = ((uint32_t)end - (uint32_t)start) / sizeof(vu_long); - pattern = (vu_long)0xaaaaaaaa; - anti_pattern = (vu_long)0x55555555; - debug("%s:%d: addr mask = 0x%.8lx\n", __FUNCTION__, __LINE__, addr_mask); - /* - * Write the default pattern at each of the - * power-of-two offsets. - */ - for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) - start[offset] = pattern; - /* - * Check for address bits stuck high. - */ - test_offset = 0; - start[test_offset] = anti_pattern; - for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) { - temp = start[offset]; - if (temp != pattern) { - printf("\nFAILURE: Address bit stuck high @ 0x%.8lx:" - " expected 0x%.8lx, actual 0x%.8lx\n", - (uint32_t)&start[offset], pattern, temp); - return 1; - } - } - start[test_offset] = pattern; - /* - * Check for addr bits stuck low or shorted. - */ - for (test_offset = 1; (test_offset & addr_mask) != 0; test_offset <<= 1) { - start[test_offset] = anti_pattern; - for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) { - temp = start[offset]; - if ((temp != pattern) && (offset != test_offset)) { - printf("\nFAILURE: Address bit stuck low or shorted @" - " 0x%.8lx: expected 0x%.8lx, actual 0x%.8lx\n", - (uint32_t)&start[offset], pattern, temp); - return 1; - } - } - start[test_offset] = pattern; - } - /* - * Description: Test the integrity of a physical - * memory device by performing an - * increment/decrement test over the - * entire region. In the process every - * storage bit in the device is tested - * as a zero and a one. The base address - * and the size of the region are - * selected by the caller. - * - * Returns: 0 if the test succeeds, 1 if the test fails. - */ - num_words = ((uint32_t)end - (uint32_t)start) / sizeof(vu_long) + 1; - /* - * Fill memory with a known pattern. - */ - for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { - start[offset] = pattern; - } - /* - * Check each location and invert it for the second pass. - */ - for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { - temp = start[offset]; - if (temp != pattern) { - printf("\nFAILURE (read/write) @ 0x%.8lx:" - " expected 0x%.8lx, actual 0x%.8lx)\n", - (uint32_t)&start[offset], pattern, temp); - return 1; - } - anti_pattern = ~pattern; - start[offset] = anti_pattern; - } - /* - * Check each location for the inverted pattern and zero it. - */ - for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { - anti_pattern = ~pattern; - temp = start[offset]; - if (temp != anti_pattern) { - printf("\nFAILURE (read/write): @ 0x%.8lx:" - " expected 0x%.8lx, actual 0x%.8lx)\n", - (uint32_t)&start[offset], anti_pattern, temp); - return 1; - } - start[offset] = 0; - } - } -} -#else -static int mem_test(uint32_t *_start, size_t len, bool doRead = true, bool doWrite = true) -{ - volatile uint32_t *addr; - volatile uint32_t *start = (volatile uint32_t *)_start; - const volatile uint32_t *end = start + len / sizeof(uint32_t); - uint32_t pattern = 0; - uint32_t val; - uint32_t readback; - uint32_t incr; - int rcode = 0; - incr = 1; - - //LOG_DEBUG("memtest read=%d, write=%d\n", doRead, doWrite); - - if (doWrite) { - //LOG_DEBUG("writing\n"); - for (addr = start, val = pattern; addr < end; addr++) { - *addr = val; - val += incr; - } - } - - if (doRead) { - //LOG_DEBUG("reading\n"); - for (addr = start, val = pattern; addr < end; addr++) { - readback = *addr; - if (readback != val) { - LOG_ERROR("Mem error @ 0x%08X: " - "found 0x%08lX, expected 0x%08lX\n", - addr, readback, val); - rcode++; - } - val += incr; - } - } - -#if 0 - /* - * Flip the pattern each time to make lots of zeros and - * then, the next time, lots of ones. We decrement - * the "negative" patterns and increment the "positive" - * patterns to preserve this feature. - */ - if(pattern & 0x80000000) { - pattern = -pattern; /* complement & increment */ - } - else { - pattern = ~pattern; - } -#endif - - return rcode; -} -#endif - -#define TESTBUF_LEN 16384 - -#include - -void doMemTest() -{ - static uint32_t *testBuf; - static int iter; - - if (!testBuf) - testBuf = (uint32_t *)malloc(TESTBUF_LEN); - - assert(testBuf); - if (mem_test(testBuf, TESTBUF_LEN, iter % 2 == 1, iter % 2 == 0) > 0) - assert(0); // FIXME report error better - - iter++; -} diff --git a/src/mesh/Channels.cpp b/src/mesh/Channels.cpp index 97f2c1448..3d88bb49a 100644 --- a/src/mesh/Channels.cpp +++ b/src/mesh/Channels.cpp @@ -191,9 +191,20 @@ void Channels::onConfigChanged() Channel &Channels::getByIndex(ChannelIndex chIndex) { - assert(chIndex < channelFile.channels_count); // This should be equal to MAX_NUM_CHANNELS - Channel *ch = channelFile.channels + chIndex; - return *ch; + // remove this assert cause malformed packets can make our firmware reboot here. + if (chIndex < channelFile.channels_count) { // This should be equal to MAX_NUM_CHANNELS + Channel *ch = channelFile.channels + chIndex; + return *ch; + } else { + LOG_ERROR("Invalid channel index %d > %d, malformed packet received?\n", chIndex , channelFile.channels_count); + + Channel *ch = (Channel *)malloc(sizeof(Channel)); + memset(ch, 0, sizeof(Channel)); + // ch.index -1 means we don't know the channel locally and need to look it up by settings.name + // not sure this is handled right everywhere + ch->index = -1; + return *ch; + } } Channel &Channels::getByName(const char* chName) diff --git a/src/mesh/MeshPacketQueue.cpp b/src/mesh/MeshPacketQueue.cpp index 51af89df8..9af381a0e 100644 --- a/src/mesh/MeshPacketQueue.cpp +++ b/src/mesh/MeshPacketQueue.cpp @@ -1,5 +1,6 @@ #include "configuration.h" #include "MeshPacketQueue.h" +#include #include diff --git a/src/mesh/MeshPacketQueue.h b/src/mesh/MeshPacketQueue.h index ee6c6954a..51dc34cb5 100644 --- a/src/mesh/MeshPacketQueue.h +++ b/src/mesh/MeshPacketQueue.h @@ -2,7 +2,6 @@ #include "MeshTypes.h" -#include #include diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index 208b1b9ea..f881f4d40 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -3,7 +3,6 @@ #include #include "GPS.h" -//#include "MeshBluetoothService.h" #include "../concurrency/Periodic.h" #include "BluetoothCommon.h" // needed for updateBatteryLevel, FIXME, eventually when we pull mesh out into a lib we shouldn't be whacking bluetooth from here #include "MeshService.h" @@ -61,7 +60,6 @@ Allocator &queueStatusPool = staticQueueStatusPool; MeshService::MeshService() : toPhoneQueue(MAX_RX_TOPHONE), toPhoneQueueStatusQueue(MAX_RX_TOPHONE) { lastQueueStatus = { 0, 0, 16, 0 }; - // assert(MAX_RX_TOPHONE == 32); // FIXME, delete this, just checking my clever macro } void MeshService::init() @@ -261,7 +259,7 @@ void MeshService::sendToPhone(MeshPacket *p) MeshPacket *copied = packetPool.allocCopy(*p); perhapsDecode(copied); - assert(toPhoneQueue.enqueue(copied, 0)); // FIXME, instead of failing for full queue, delete the oldest mssages + assert(toPhoneQueue.enqueue(copied, 0)); fromNum++; } diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index e995e0b22..c19beadca 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -1,5 +1,4 @@ #include "configuration.h" -#include #include "Channels.h" #include "CryptoEngine.h" diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index c1d56b7ec..3f74e672d 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -6,7 +6,6 @@ #include "PowerFSM.h" #include "RadioInterface.h" #include "configuration.h" -#include #if FromRadio_size > MAX_TO_FROM_RADIO_SIZE #error FromRadio is too big @@ -209,6 +208,8 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) fromRadioScratch.config.which_payload_variant = Config_bluetooth_tag; fromRadioScratch.config.payload_variant.bluetooth = config.bluetooth; break; + default: + LOG_ERROR("Unknown config type %d\n", config_state); } // NOTE: The phone app needs to know the ls_secs value so it can properly expect sleep behavior. // So even if we internally use 0 to represent 'use default' we still need to send the value we are @@ -262,6 +263,8 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_remote_hardware_tag; fromRadioScratch.moduleConfig.payload_variant.remote_hardware = moduleConfig.remote_hardware; break; + default: + LOG_ERROR("Unknown module config type %d\n", config_state); } config_state++; @@ -299,7 +302,7 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) break; default: - assert(0); // unexpected state - FIXME, make an error code and reboot + LOG_ERROR("getFromRadio unexpected state %d\n", state); } // Do we have a message from the mesh? @@ -369,7 +372,7 @@ bool PhoneAPI::available() return hasPacket; } default: - assert(0); // unexpected state - FIXME, make an error code and reboot + LOG_ERROR("PhoneAPI::available unexpected state %d\n", state); } return false; diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 7c0f238a0..4b31b319a 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -4,7 +4,6 @@ #include "MeshService.h" #include "NodeDB.h" #include "Router.h" -#include "assert.h" #include "configuration.h" #include "main.h" #include "sleep.h" diff --git a/src/modules/SerialModule.cpp b/src/modules/SerialModule.cpp index c02b7219b..5d02e3ba8 100644 --- a/src/modules/SerialModule.cpp +++ b/src/modules/SerialModule.cpp @@ -7,8 +7,6 @@ #include "configuration.h" #include -#include - /* SerialModule A simple interface to send messages over the mesh network by sending strings diff --git a/src/modules/esp32/AudioModule.cpp b/src/modules/esp32/AudioModule.cpp index b38644340..bdef12e08 100644 --- a/src/modules/esp32/AudioModule.cpp +++ b/src/modules/esp32/AudioModule.cpp @@ -8,8 +8,6 @@ #include "Router.h" #include "FSCommon.h" -#include - #ifdef OLED_RU #include "graphics/fonts/OLEDDisplayFontsRU.h" #endif diff --git a/src/modules/esp32/RangeTestModule.cpp b/src/modules/esp32/RangeTestModule.cpp index 398af9071..1624a972b 100644 --- a/src/modules/esp32/RangeTestModule.cpp +++ b/src/modules/esp32/RangeTestModule.cpp @@ -9,7 +9,6 @@ #include "gps/GeoCoord.h" #include #include -//#include /* As a sender, I can send packets every n seconds. These packets include an incremented PacketID.