diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..21e7f50 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitmodules b/.gitmodules index 6ab444e..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "components/u8g2"] - path = components/u8g2 - url = https://github.com/olikraus/u8g2 diff --git a/Makefile b/Makefile index f267549..77c2528 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ $(projects): @mk/make-project.sh $@ clean: - rm -fr project + rm -rf project %: @echo Please specify one of these projects: $(projects) diff --git a/README.md b/README.md index d05253f..3c60778 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,18 @@ -# GNARL is Not A RileyLink +# PICKLE is BETTER than RileyLink -![TTGO LoRa OLED v1](images/ttgo.png) - -## Warning - -This repository contains **very preliminary** code, intended for -collaboration among developers. It **is not ready** for end users -and may be subject to rebasing without notice. ## Hardware This project has been developed and tested on a TTGO ESP32 868/915 MHz LoRa OLED module *(version 1 only, see below!),* -which contains an ESP32 SoC, an RFM95 LoRa radio, -a 128x64 pixel SSD1306 OLED display, and a LiPo battery charger. +which contains an ESP32 SoC, an RFM95 LoRa radio, and a LiPo battery charger. The module has two push-buttons. One is hard-wired to reset the board; the other is available as an input or interrupt source. -They are available from [AliExpress,](https://www.aliexpress.com/item/2pcs-TTGO-LORA32-Lora-868Mhz-ESP32-LoRa-OLED-0-96-Inch-Blue-Display-Bluetooth-WIFI-ESP/32839249834.html) -[Banggood,](https://www.banggood.com/2Pcs-Wemos-TTGO-LORA32-868915Mhz-ESP32-LoRa-OLED-0_96-Inch-Blue-Display-p-1239769.html) -and numerous others. - -### *TTGO version 2 module is not supported* - -The current code does not work on the TTGO version 2 module due to -different pin assignments. - -## Radios +Now my idea is to convert code to **very** low energy and minimalistic thing to use with clear ESP32 and module like RFM69 -The ESP32 SoC contains both WiFi and Bluetooth radios. -This project currently uses only the Bluetooth LE support. - -The radio chip ([HopeRF RFM95](https://www.hoperf.com/modules/lora/RFM95.html) / -[Semtech SX1276](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1276)) -is marketed for LoRa applications, but also supports OOK and FSK modulation. -The OOK capability is used by this project to communicate with Medtronic insulin pumps. -It may also be possible to use the FSK support and a 433 MHz version -of the module to communicate with OmniPod insulin pumps: -if anyone pursues that, please let me know. ## Hardware Setup @@ -48,31 +21,25 @@ if anyone pursues that, please let me know. Attach an appropriate antenna to the U.FL connector on the module before using this software. +I highly recommend buying 2-3 other antennas for testing. Some of the modules have very bad antenna configurations. Feel free to test another. The best solution for me is the piece of wire length of 75 millimeters (-66 dBi (+-2 dBi) at 5 meters). + ### Power The module can be powered via the micro-USB connector or with a 3.7V LiPo battery. The battery connects to a 2-pin female JST 1.25mm connector. -Note that this is smaller than the 2.0mm connectors used on Adafruit and -SparkFun LiPo batteries. -## Software Setup +WARNING! + +The module has not contained battery protection from discharging. It 100% drain your battery - which can be dangerous. Please use a protection board like TP4056 (with 4 pins output) or be careful. + +### Display -### Initialize git submodules +In my version, I have removed display (you can also buy hardware without a display at Aliexpress) and removed any display-specific commands from the code. -This repository contains git submodules (in the `components` subdirectory). -Unless you cloned this repository with the `--recursive` option, -those submodules won't be initialized yet. -Use this command to initialize them: -``` -git submodule update --init --recursive -``` -and this command to check their status: -``` -git submodule status --recursive -``` +## Software Setup ### Set up the ESP32 environment @@ -80,9 +47,9 @@ git submodule status --recursive 1. Build and flash one of the example applications to make sure you have a working setup. -## Building GNARL +## Building -1. Type `make` in the top level of this repository +1. Type `make` at the top level of this repository 1. Change to the `project` subdirectory @@ -90,101 +57,19 @@ git submodule status --recursive 1. Flash the project to your ESP32 module by running `make flash` -## Running GNARL - -Run [Loop](https://loopkit.github.io/loopdocs/) on your iPhone -or run the [dev branch of AndroidAPS](https://github.com/MilosKozak/AndroidAPS) on your Android phone. -GNARL should show up when you scan for a RileyLink. - -GNARL will show messages on the OLED display when your phone -connects and disconnects. Pushing the button will display the current -status. GNARL may not respond to the button press immediately if it is -communicating with the pump, due to scheduling priorities. - -## Building the other applications - -This repository contains a few applications ("projects" in ESP-IDF terminology) besides GNARL: - -* `blink` blinks the onboard LED - -* `sleep` uses the ESP32 "lightweight sleep" mode and wakes up when a - timer goes off or the button is pressed - -* `oledtest` draws text in various sizes on the OLED display - -* `regtest` reads the RFM69 registers and prints them on the serial console - -* `sniffer` receives Medtronic packets and prints them on the serial console +## Running -* `pumpstat` displays the status of a Medtronic insulin pump when you press the button +Run [Loop](https://loopkit.github.io/loopdocs/) on your iPhone. +Pickle should show up when you scan for a RileyLink with name "PICKL". -* `bletest` is a simple BLE server that can be queried with a tool like - [nRF Connect](https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Connect-for-mobile) - -* `mmtune` finds the frequency at which the pump responds - with the strongest signal and displays the results graphically - -* `pumpclock` retrieves the time from a Medtronic insulin pump and - uses it to display a digital clock - -* `wifi` connects to a WiFi network, obtains an IP address, and prints - it on the serial console - -* `nightscout` retrieves recent entries from a Nightscout server and - prints them on the serial console - -To build the `blink` application, for example: - -1. In the top level of this repository, type `make blink` - -1. Change to the `project` directory and follow the same steps as above - for building and flashing (`make -j` and `make flash`) - -After flashing applications that print information on the serial console, -run `make monitor` to see the output. ### Pump-specific configuration -Some of the applications require the pump serial number or frequency -to be defined in the `include/pump.h` file. +If you using American pump, you should set a frequency in the `src/gnarl/main.c` file. It should look like this: - #define PUMP_ID "123456" // pump serial number (note that this is a string constant) - #define PUMP_FREQUENCY 916500000 // pump frequency - #define MMTUNE_START 916300000 // starting frequency for mmtune scans - -### WiFi configuration - -The WiFi configuration is hard-coded in the `include/wifi_config.h` file as follows: - - #define WIFI_SSID "network name" - #define WIFI_PASSWORD "network password" - -### Nightscout configuration - -Nightscout server information is defined in`include/nightscout_config.h` as follows: - - // DNS hostname, not a URL - #define NIGHTSCOUT_HOST "your.nightscout.hostname" - - // 40-character SHA-1 hash of your Nightscout API secret - #define NIGHTSCOUT_API_SECRET "0123456789abcdef0123456789abcdef01234567" - -The SSL layer requires the root certificate used by the Nightscout -server to be available at compile time in the file `include/root_cert.pem`. -You can extract it from the output of this command: - - openssl s_client -showcerts -connect NIGHTSCOUT_HOST:443 -#include - #include "medtronic.h" #include "4b6b.h" #include "commands.h" @@ -330,10 +327,10 @@ uint8_t *download_page(command_t cmd, int page_num, int *len) { return 0; } -int pump_wakeup() { +bool pump_wakeup(void) { int m = pump_model(); if (m != -1) { - return 1; + return true; } encode_short_packet(CMD_WAKEUP); int n; diff --git a/lib/medtronic/commands.h b/lib/medtronic/commands.h index 3ac457b..e2941d1 100644 --- a/lib/medtronic/commands.h +++ b/lib/medtronic/commands.h @@ -1,3 +1,10 @@ +#ifndef _COMMANDS_H +#define _COMMANDS_H + +#include +#include +#include + #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG #define TAG "medtronic" #include @@ -51,3 +58,5 @@ static inline time_t half_hours(int n) { } void print_bytes(const char *msg, const uint8_t *data, int len); + +#endif // _COMMANDS_H diff --git a/lib/medtronic/history.c b/lib/medtronic/history.c index 2435073..e24d35c 100644 --- a/lib/medtronic/history.c +++ b/lib/medtronic/history.c @@ -1,6 +1,4 @@ -#include #include -#include #include "medtronic.h" #include "commands.h" @@ -21,263 +19,322 @@ time_t decode_time(uint8_t *data) { return mktime(&tm); } -char *time_string(time_t t) { - static char buf[20]; - struct tm *tm = localtime(&t); - strftime(buf, sizeof(buf), "%F %T", tm); - return buf; -} +#define UNKNOWN_RECORD_ERR (-1) +#define RECORD_SIZE_ERR (-2) -time_t since_midnight(time_t t) { - struct tm *tm = localtime(&t); - return tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec; -} +#define REQUIRE_BYTES(n) \ + do { \ + r->length = (n); \ + if (r->length > len) return RECORD_SIZE_ERR; \ + } while (0) -// Return 1 for insulin-related events, 0 for events to skip, -1 on error. +// Return 1 for insulin-related records, 0 for records to skip, negative values for errors. +// Insulin-related records: +// BasalProfileStart (x23 and newer models only) +// TempBasalRate and TempBasalDuration +// SuspendPump and ResumePump +// Bolus (normal and square wave) +// Rewind and Prime +// Alarm and ClearAlarm static int decode_history_record(uint8_t *data, int len, int family, history_record_t *r) { - memset(r, 0, sizeof(*r)); + memset(r, 0, sizeof(history_record_t)); r->type = data[0]; - r->length = 7; switch (r->type) { case Bolus: if (family <= 22) { - r->length = 9; + REQUIRE_BYTES(9); r->time = decode_time(&data[4]); r->insulin = int_to_insulin(data[2], family); r->duration = half_hours(data[3]); } else { - r->length = 13; + REQUIRE_BYTES(13); r->time = decode_time(&data[8]); r->insulin = int_to_insulin(two_byte_be_int(&data[3]), family); r->duration = half_hours(data[7]); } return 1; case Prime: - r->length = 10; - return 0; + REQUIRE_BYTES(10); + r->time = decode_time(&data[5]); + return 1; case Alarm: - r->length = 9; - return 0; + REQUIRE_BYTES(9); + r->time = decode_time(&data[4]); + // Use insulin field to store alarm code. + r->insulin = data[1]; + return 1; case DailyTotal: - r->length = family <= 22 ? 7 : 10; + REQUIRE_BYTES(family <= 22 ? 7 : 10); return 0; case BasalProfileBefore: - r->length = 152; + REQUIRE_BYTES(152); return 0; case BasalProfileAfter: - r->length = 152; + REQUIRE_BYTES(152); return 0; case BGCapture: + REQUIRE_BYTES(7); return 0; case SensorAlarm: - r->length = 8; + REQUIRE_BYTES(8); return 0; case ClearAlarm: - return 0; + REQUIRE_BYTES(7); + r->time = decode_time(&data[2]); + return 1; case ChangeBasalPattern: + REQUIRE_BYTES(7); return 0; case TempBasalDuration: + REQUIRE_BYTES(7); r->time = decode_time(&data[2]); r->duration = half_hours(data[1]); return 1; case ChangeTime: + REQUIRE_BYTES(7); return 0; case NewTime: + REQUIRE_BYTES(7); return 0; case LowBattery: + REQUIRE_BYTES(7); return 0; case BatteryChange: + REQUIRE_BYTES(7); return 0; case SetAutoOff: + REQUIRE_BYTES(7); return 0; case PrepareInsulinChange: + REQUIRE_BYTES(7); return 0; case SuspendPump: + REQUIRE_BYTES(7); r->time = decode_time(&data[2]); return 1; case ResumePump: + REQUIRE_BYTES(7); r->time = decode_time(&data[2]); return 1; case SelfTest: + REQUIRE_BYTES(7); return 0; case Rewind: - return 0; + REQUIRE_BYTES(7); + r->time = decode_time(&data[2]); + return 1; case ClearSettings: + REQUIRE_BYTES(7); return 0; case EnableChildBlock: + REQUIRE_BYTES(7); return 0; case MaxBolus: + REQUIRE_BYTES(7); return 0; case EnableRemote: - r->length = 21; + REQUIRE_BYTES(21); return 0; case MaxBasal: + REQUIRE_BYTES(7); return 0; case EnableBolusWizard: + REQUIRE_BYTES(7); return 0; case Unknown2E: - r->length = 107; + REQUIRE_BYTES(107); return 0; case BolusWizard512: - r->length = 19; + REQUIRE_BYTES(19); return 0; case UnabsorbedInsulin512: - r->length = data[1]; + REQUIRE_BYTES(data[1]); return 0; case ChangeBGReminder: + REQUIRE_BYTES(7); return 0; case SetAlarmClockTime: + REQUIRE_BYTES(7); return 0; case TempBasalRate: - r->length = 8; + REQUIRE_BYTES(8); r->time = decode_time(&data[2]); switch (data[7] >> 3) { // temp basal type case ABSOLUTE: r->insulin = int_to_insulin(((data[7] & 0x7) << 8) | data[1], 23); return 1; default: - ESP_LOGE(TAG, "ignoring %3d percent temp basal in pump history at %s", data[1], time_string(r->time)); + if (data[1] == 0) { + r->insulin = 0; + return 1; + } + char ts[TIME_STRING_SIZE]; + ESP_LOGE(TAG, "%3d percent temp basal in pump history at %s", + data[1], time_string(r->time, ts)); return 0; } case LowReservoir: + REQUIRE_BYTES(7); return 0; case AlarmClock: + REQUIRE_BYTES(7); return 0; case ChangeMeterID: - r->length = 21; + REQUIRE_BYTES(21); return 0; case BGReceived512: - r->length = 10; + REQUIRE_BYTES(10); return 0; case ConfirmInsulinChange: + REQUIRE_BYTES(7); return 0; case SensorStatus: + REQUIRE_BYTES(7); return 0; case EnableMeter: - r->length = 21; + REQUIRE_BYTES(21); return 0; case BGReceived: - r->length = 10; + REQUIRE_BYTES(10); return 0; case MealMarker: - r->length = 9; + REQUIRE_BYTES(9); return 0; case ExerciseMarker: - r->length = 8; + REQUIRE_BYTES(8); return 0; case InsulinMarker: - r->length = 8; + REQUIRE_BYTES(8); return 0; case OtherMarker: + REQUIRE_BYTES(7); return 0; case EnableSensorAutoCal: + REQUIRE_BYTES(7); return 0; case ChangeBolusWizardSetup: - r->length = 39; + REQUIRE_BYTES(39); return 0; case SensorSetup: - r->length = family >= 51 ? 41 : 37; + REQUIRE_BYTES(family >= 51 ? 41 : 37); return 0; case Sensor51: + REQUIRE_BYTES(7); return 0; case Sensor52: + REQUIRE_BYTES(7); return 0; case ChangeSensorAlarm: - r->length = 8; + REQUIRE_BYTES(8); return 0; case Sensor54: - r->length = 64; + REQUIRE_BYTES(64); return 0; case Sensor55: - r->length = 55; + REQUIRE_BYTES(55); return 0; case ChangeSensorAlert: - r->length = 12; + REQUIRE_BYTES(12); return 0; case ChangeBolusStep: + REQUIRE_BYTES(7); return 0; case BolusWizardSetup: - r->length = family <= 22 ? 124 : 144; + REQUIRE_BYTES(family <= 22 ? 124 : 144); return 0; case BolusWizard: - r->length = family <= 22 ? 20 : 22; + REQUIRE_BYTES(family <= 22 ? 20 : 22); return 0; case UnabsorbedInsulin: - r->length = data[1]; + REQUIRE_BYTES(data[1]); return 0; case SaveSettings: + REQUIRE_BYTES(7); return 0; case EnableVariableBolus: + REQUIRE_BYTES(7); return 0; case ChangeEasyBolus: + REQUIRE_BYTES(7); return 0; case EnableBGReminder: + REQUIRE_BYTES(7); return 0; case EnableAlarmClock: + REQUIRE_BYTES(7); return 0; case ChangeTempBasalType: + REQUIRE_BYTES(7); return 0; case ChangeAlarmType: + REQUIRE_BYTES(7); return 0; case ChangeTimeFormat: + REQUIRE_BYTES(7); return 0; case ChangeReservoirWarning: + REQUIRE_BYTES(7); return 0; case EnableBolusReminder: + REQUIRE_BYTES(7); return 0; case SetBolusReminderTime: - r->length = 9; + REQUIRE_BYTES(9); return 0; case DeleteBolusReminderTime: - r->length = 9; + REQUIRE_BYTES(9); return 0; case BolusReminder: - r->length = 9; + REQUIRE_BYTES(9); return 0; case DeleteAlarmClockTime: + REQUIRE_BYTES(7); return 0; case DailyTotal515: - r->length = 38; + REQUIRE_BYTES(38); return 0; case DailyTotal522: - r->length = 44; + REQUIRE_BYTES(44); return 0; case DailyTotal523: - r->length = 52; + REQUIRE_BYTES(52); return 0; case ChangeCarbUnits: + REQUIRE_BYTES(7); return 0; case BasalProfileStart: - r->length = 10; + REQUIRE_BYTES(10); r->time = decode_time(&data[2]); // data[7] = starting half-hour r->insulin = int_to_insulin(two_byte_le_int(&data[8]), 23); return 1; case ConnectOtherDevices: + REQUIRE_BYTES(7); return 0; case ChangeOtherDevice: - r->length = 37; + REQUIRE_BYTES(37); return 0; case ChangeMarriage: - r->length = 12; + REQUIRE_BYTES(12); return 0; case DeleteOtherDevice: - r->length = 12; + REQUIRE_BYTES(12); return 0; case EnableCaptureEvent: + REQUIRE_BYTES(7); return 0; default: - return -1; + return UNKNOWN_RECORD_ERR; } } -static int all_zero(uint8_t *data, int len) { +static bool all_zero(uint8_t *data, int len) { for (int i = 0; i < len; i++) { if (data[i] != 0) { - return 0; + return false; } } - return 1; + return true; } void print_bytes(const char *msg, const uint8_t *data, int len) { @@ -288,41 +345,34 @@ void print_bytes(const char *msg, const uint8_t *data, int len) { printf("\n"); } -int decode_history(uint8_t *page, int family, history_record_t *r, int max) { +void decode_history(uint8_t *page, int len, int family, history_record_fn_t decode_fn) { uint8_t *data = page; - int len = HISTORY_PAGE_SIZE; - int count = 0; - while (count < max) { + history_record_t rec; + while (len > 0) { if (all_zero(data, len)) { - break; + return; } - int e = decode_history_record(data, len, family, r); - if (e == -1) { - ESP_LOGE(TAG, "unknown history record type %02X", data[0]); + int e = decode_history_record(data, len, family, &rec); + switch (e) { + case UNKNOWN_RECORD_ERR: + ESP_LOGE(TAG, "unknown history record type %02X", rec.type); + print_bytes("history data", data, len); + return; + case RECORD_SIZE_ERR: + ESP_LOGE(TAG, "history record type %02X would require %d bytes", rec.type, rec.length); print_bytes("history data", data, len); + return; + default: + if (e < 0) { + ESP_LOGE(TAG, "history record type %02X: unknown error %d", rec.type, e); + return; + } break; } - data += r->length; - len -= r->length; - if (e == 1) { - count++; - r++; + if (e == 1 && decode_fn(&rec) != 0) { + return; } + data += rec.length; + len -= rec.length; } - return count; } - -#define DEFINE_SCHEDULE_LOOKUP(type) \ - DECLARE_SCHEDULE_LOOKUP(type) { \ - time_t d = since_midnight(t); \ - for (int i = 0; i < len; i++, r++) { \ - if (r->start > d) \ - break; \ - } \ - return r - 1; \ - } - -DEFINE_SCHEDULE_LOOKUP(basal_rate); -DEFINE_SCHEDULE_LOOKUP(carb_ratio); -DEFINE_SCHEDULE_LOOKUP(sensitivity); -DEFINE_SCHEDULE_LOOKUP(target); diff --git a/lib/medtronic/medtronic.h b/lib/medtronic/medtronic.h index 6cbb960..e103418 100644 --- a/lib/medtronic/medtronic.h +++ b/lib/medtronic/medtronic.h @@ -1,3 +1,9 @@ +#ifndef _MEDTRONIC_H +#define _MEDTRONIC_H + +#include +#include +#include #include #define HISTORY_PAGE_SIZE 1022 @@ -14,9 +20,12 @@ typedef enum PACKED { MMOL_PER_L = 2, } glucose_units_t; -// Glucose represents a glucose value as either mg/dL or μmol/L, +// Glucose is represented in mg/dL. typedef uint32_t glucose_t; +// The time of day is represented as seconds since midnight. +typedef uint32_t time_of_day_t; + typedef enum PACKED { ABSOLUTE = 0, PERCENT = 1, @@ -40,24 +49,24 @@ typedef struct { #define STATUS_NORMAL 0x03 typedef struct { - time_t start; // seconds since midnight + time_of_day_t start; insulin_t rate; } basal_rate_t; typedef struct { - time_t start; // seconds since midnight + time_of_day_t start; carb_units_t units; int ratio; // 10x grams/unit or 1000x units/exchange } carb_ratio_t; typedef struct { - time_t start; // seconds since midnight + time_of_day_t start; glucose_units_t units; glucose_t sensitivity; } sensitivity_t; typedef struct { - time_t start; // seconds since midnight + time_of_day_t start; glucose_units_t units; glucose_t low; glucose_t high; @@ -65,9 +74,9 @@ typedef struct { void pump_set_id(const char *id); -int pump_basal_rates(basal_rate_t *r, int max); +int pump_basal_rates(basal_rate_t *r, int len); int pump_battery(void); -int pump_carb_ratios(carb_ratio_t *r, int max); +int pump_carb_ratios(carb_ratio_t *r, int len); carb_units_t pump_carb_units(void); time_t pump_clock(void); int pump_family(void); @@ -75,16 +84,33 @@ glucose_units_t pump_glucose_units(void); uint8_t *pump_history_page(int page_num); int pump_model(void); int pump_reservoir(void); -int pump_sensitivities(sensitivity_t *r, int max); +int pump_sensitivities(sensitivity_t *r, int len); int pump_settings(settings_t *r); int pump_status(status_t *r); -int pump_targets(target_t *r, int max); +int pump_targets(target_t *r, int len); int pump_temp_basal(int *minutes); -int pump_wakeup(void); +bool pump_wakeup(void); -#define DECLARE_SCHEDULE_LOOKUP(type) type##_t *type##_at(type##_t *r, int len, time_t t) +time_of_day_t since_midnight(time_t t); +time_t next_change(basal_rate_t *schedule, int len, time_t t); + +#define DECLARE_SCHEDULE_LOOKUP(type) int type##_at(type##_t *r, int len, time_t t) DECLARE_SCHEDULE_LOOKUP(basal_rate); DECLARE_SCHEDULE_LOOKUP(carb_ratio); DECLARE_SCHEDULE_LOOKUP(sensitivity); DECLARE_SCHEDULE_LOOKUP(target); + +#define TIME_STRING_SIZE 20 +char *time_string(time_t t, char *buf); + +#define SHORT_TIME_SIZE 10 +char *short_time(time_t t, char *buf); + +#define DURATION_STRING_SIZE 20 +char *duration_string(int seconds, char *buf); + +#define INSULIN_STRING_SIZE 16 +char *insulin_string(insulin_t ins, char *buf); + +#endif // _MEDTRONIC_H diff --git a/lib/medtronic/pump.c b/lib/medtronic/pump.c index 1b654cb..7a53e7f 100644 --- a/lib/medtronic/pump.c +++ b/lib/medtronic/pump.c @@ -1,6 +1,3 @@ -#include -#include - #include "medtronic.h" #include "commands.h" @@ -19,18 +16,18 @@ static inline glucose_t int_to_glucose(int n, glucose_units_t units) { static int cached_pump_family; -int pump_family() { +int pump_family(void) { if (cached_pump_family == 0) { pump_model(); } return cached_pump_family; } -int pump_basal_rates(basal_rate_t *r, int max) { +int pump_basal_rates(basal_rate_t *r, int len) { int n; uint8_t *data = extended_response(CMD_BASAL_RATES, &n); int count = 0; - for (int i = 0; i < n - 2 && count < max; i += 3, count++, r++) { + for (int i = 0; i < n - 2 && count < len; i += 3, count++, r++) { int rate = int_to_insulin(two_byte_le_int(&data[i]), 23); int t = data[i + 2]; // Don't stop if the 00:00 rate happens to be zero. @@ -43,7 +40,7 @@ int pump_basal_rates(basal_rate_t *r, int max) { return count; } -int pump_battery() { +int pump_battery(void) { int n; uint8_t *data = short_command(CMD_BATTERY, &n); if (!data || n < 4 || data[0] != 3) { @@ -52,7 +49,7 @@ int pump_battery() { return two_byte_be_int(&data[2]) * 10; } -int pump_carb_ratios(carb_ratio_t *r, int max) { +int pump_carb_ratios(carb_ratio_t *r, int len) { // Call this before the main command so the response buffer isn't overwritten. int fam = pump_family(); int n; @@ -74,7 +71,7 @@ int pump_carb_ratios(carb_ratio_t *r, int max) { carb_units_t units = data[1]; data += step; int count = 0; - for (int i = 0; i <= num - step && count < max; i += step, count++, r++) { + for (int i = 0; i <= num - step && count < len; i += step, count++, r++) { int t = data[i]; if (t == 0 && count != 0) { break; @@ -101,7 +98,7 @@ int pump_carb_ratios(carb_ratio_t *r, int max) { return count; } -carb_units_t pump_carb_units() { +carb_units_t pump_carb_units(void) { int n; uint8_t *data = short_command(CMD_CARB_UNITS, &n); if (!data || n < 2 || data[0] != 1) { @@ -110,7 +107,7 @@ carb_units_t pump_carb_units() { return data[1]; } -time_t pump_clock() { +time_t pump_clock(void) { int n; uint8_t *data = short_command(CMD_CLOCK, &n); if (!data || n < 8 || data[0] != 7) { @@ -128,7 +125,7 @@ time_t pump_clock() { return mktime(&tm); } -glucose_units_t pump_glucose_units() { +glucose_units_t pump_glucose_units(void) { int n; uint8_t *data = short_command(CMD_GLUCOSE_UNITS, &n); if (!data || n < 2 || data[0] != 1) { @@ -147,7 +144,7 @@ uint8_t *pump_history_page(int page_num) { return data; } -int pump_model() { +int pump_model(void) { int n; uint8_t *data = short_command(CMD_MODEL, &n); if (!data || n < 2) { @@ -165,7 +162,7 @@ int pump_model() { return model; } -int pump_reservoir() { +int pump_reservoir(void) { // Call this before the main command so the response buffer isn't overwritten. int fam = pump_family(); int n; @@ -185,7 +182,7 @@ int pump_reservoir() { return two_byte_be_int(&data[3]) * 25; } -int pump_sensitivities(sensitivity_t *r, int max) { +int pump_sensitivities(sensitivity_t *r, int len) { int n; uint8_t *data = short_command(CMD_SENSITIVITIES, &n); if (!data || n < 2) { @@ -204,7 +201,7 @@ int pump_sensitivities(sensitivity_t *r, int max) { glucose_units_t units = data[1]; data += 2; int count = 0; - for (int i = 0; i < num - 1 && count < max; i += 2, count++, r++) { + for (int i = 0; i < num - 1 && count < len; i += 2, count++, r++) { int v = data[i]; int t = v & 0x3F; if (t == 0 && count != 0) { @@ -263,7 +260,7 @@ int pump_status(status_t *r) { return 0; } -int pump_targets(target_t *r, int max) { +int pump_targets(target_t *r, int len) { // Call this before the main command so the response buffer isn't overwritten. int fam = pump_family(); command_t cmd = fam <= 12 ? CMD_TARGETS_512 : CMD_TARGETS; @@ -286,7 +283,7 @@ int pump_targets(target_t *r, int max) { glucose_units_t units = data[1]; data += 2; int count = 0; - for (int i = 0; i <= num - step && count < max; i += step, count++, r++) { + for (int i = 0; i <= num - step && count < len; i += step, count++, r++) { int t = data[i]; if (t == 0 && count != 0) { break; diff --git a/lib/medtronic/pump_history.h b/lib/medtronic/pump_history.h index 9ef6553..a6e1d59 100644 --- a/lib/medtronic/pump_history.h +++ b/lib/medtronic/pump_history.h @@ -1,3 +1,6 @@ +#ifndef _PUMP_HISTORY_H +#define _PUMP_HISTORY_H + // These definitions track github.com/ecc1/medtronic/historyrecord.go typedef enum PACKED { Bolus = 0x01, @@ -89,10 +92,26 @@ typedef struct { uint8_t length; time_t time; insulin_t insulin; - time_t duration; + int duration; // seconds } history_record_t; -int decode_history(uint8_t *page, int family, history_record_t *r, int max); +typedef enum PACKED { + BatteryOutLimitExceeded = 0x03, + NoDelivery = 0x04, + BatteryDepleted = 0x05, + AutoOff = 0x06, + DeviceReset = 0x10, + ReprogramError = 0x3D, + EmptyReservoir = 0x3E, +} alarm_code_t; + time_t decode_time(uint8_t *data); -char *time_string(time_t t); -time_t since_midnight(time_t t); + +// Signature of function to be applied to history records during decoding. +typedef int (*history_record_fn_t)(history_record_t *); + +// Decode the given history page and apply f to each insulin-related record. +// If f returns a non-zero value, the decoding loop terminates. +void decode_history(uint8_t *page, int len, int family, history_record_fn_t decode_fn); + +#endif // _PUMP_HISTORY_H diff --git a/lib/medtronic/schedule.c b/lib/medtronic/schedule.c new file mode 100644 index 0000000..3868454 --- /dev/null +++ b/lib/medtronic/schedule.c @@ -0,0 +1,28 @@ +#include "medtronic.h" + +#define DEFINE_SCHEDULE_LOOKUP(type) \ + DECLARE_SCHEDULE_LOOKUP(type) { \ + time_t d = since_midnight(t); \ + int last = -1; \ + for (int i = 0; i < len; i++, r++) { \ + if (r->start > d) { \ + break; \ + } \ + last = i; \ + } \ + return last; \ + } + +DEFINE_SCHEDULE_LOOKUP(basal_rate) +DEFINE_SCHEDULE_LOOKUP(carb_ratio) +DEFINE_SCHEDULE_LOOKUP(sensitivity) +DEFINE_SCHEDULE_LOOKUP(target) + +// next_change returns the time when the next scheduled rate will take effect (strictly after t). +time_t next_change(basal_rate_t *sched, int len, time_t t) { + int i = basal_rate_at(sched, len, t); + assert(i >= 0); + time_of_day_t next = i + 1 < len ? sched[i+1].start : 24 * 3600; + time_of_day_t delta = next - since_midnight(t); + return t + delta; +} diff --git a/lib/medtronic/test/Makefile b/lib/medtronic/test/Makefile index 32d3594..4dfbd35 100644 --- a/lib/medtronic/test/Makefile +++ b/lib/medtronic/test/Makefile @@ -1,32 +1,9 @@ -programs = decode_time time_test read_history history_test schedule_test -test_programs = $(filter %_test,$(programs)) +test_programs = history_test schedule_test time_test +other_programs = decode_time read_history -all: $(programs) +programs = $(test_programs) $(other_programs) -.PHONY: all clean test +include ../../../mk/testing.mk -headers = testing.h ../medtronic.h ../pump_history.h - -CFLAGS += -Wall -isystem . -I .. -g -LDFLAGS += -ljansson - -$(programs): %: %.o common.o history.o json.o stringer.o +$(programs): %: %.c common.c json.c stringer.c ../history.c ../schedule.c ../utility.c $(COMMON_CODE) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) - -%.o: %.c $(headers) - $(CC) $(CFLAGS) -c -o $@ $< - -history.o: ../history.c $(headers) - $(CC) $(CFLAGS) -c -o $@ $< - -test: $(test_programs) - @for prog in $(test_programs) ; do \ - if ./$$prog; then \ - echo $$prog: OK ; \ - else \ - echo $$prog: FAILED ; \ - fi \ - done - -clean: - rm -f *.o $(programs) diff --git a/lib/medtronic/test/common.c b/lib/medtronic/test/common.c index 0da8bc5..a2887ca 100644 --- a/lib/medtronic/test/common.c +++ b/lib/medtronic/test/common.c @@ -1,42 +1,14 @@ -// This is needed for the declaration of fmemopen() and strptime() -#define _XOPEN_SOURCE 700 +#include "medtronic_test.h" -#include -#include +history_record_t history[MAX_HISTORY]; +int history_length; -#include "testing.h" - -static uint8_t page[HISTORY_PAGE_SIZE + 2]; - -int read_bytes(FILE *f) { - int n = 0; - for (;;) { - int c; - for (;;) { - c = fgetc(f); - if (c == EOF) { - fclose(f); - return n; - } - if (!isspace(c)) { - break; - } - } - char buf[3]; - buf[0] = c; - buf[1] = fgetc(f); - buf[2] = 0; - uint8_t b = strtol(buf, 0, 16); - page[n] = b; - n++; +static int store_record(history_record_t *r) { + if (history_length == MAX_HISTORY) { + return 1; } - fclose(f); - return n; -} - -uint8_t *parse_bytes(char *str) { - read_bytes(fmemopen(str, strlen(str), "r")); - return page; + history[history_length++] = *r; + return 0; } void parse_data(char *filename, int family) { @@ -46,76 +18,9 @@ void parse_data(char *filename, int family) { perror(filename); exit(1); } - int nbytes = read_bytes(f); - history_length = decode_history(page, family, history, nbytes); -} - -time_t parse_json_time(const char *str) { - struct tm tm = { .tm_isdst = -1 }; - if (strptime(str, "%FT%T%z", &tm) == 0) { - fprintf(stderr, "malformed JSON time \"%s\"\n", str); - exit(1); - } - return mktime(&tm); -} - -static void malformed(const char *str) { - fprintf(stderr, "malformed duration string \"%s\"\n", str); - exit(1); -} - -// Parse a duration of the form [[Xh]Ym]Zs. -time_t parse_duration(const char *str) { - int n = strlen(str); - if (n < 2 || str[n - 1] != 's') { - malformed(str); - } - time_t t = 0; - char *s = strchr(str, 'h'); - if (s != 0) { - int h; - if (sscanf(str, "%dh", &h) != 1) { - malformed(str); - } - t += 3600 * h; - str = s + 1; - } - s = strchr(str, 'm'); - if (s != 0) { - int m; - if (sscanf(str, "%dm", &m) != 1) { - malformed(str); - } - t += 60 * m; - str = s + 1; - } - s = strchr(str, 's'); - if (s != 0) { - int secs; - if (sscanf(str, "%ds", &secs) != 1) { - malformed(str); - } - t += secs; - return t; - } - if (s == 0 || s[1] != 0) { - malformed(str); - } - return t; -} - -static int test_failures = 0; - -void test_failed(const char *format, ...) { - test_failures++; - va_list ap; - va_start(ap, format); - fprintf(stderr, "FAIL "); - vfprintf(stderr, format, ap); - fprintf(stderr, "\n"); - va_end(ap); -} - -void exit_test() { - exit(test_failures); + static uint8_t page[HISTORY_PAGE_SIZE]; + int nbytes = read_bytes(f, page, sizeof(page)); + history_length = 0; + decode_history(page, nbytes, family, store_record); + assert(history_length < LEN(history)); } diff --git a/lib/medtronic/test/decode_time.c b/lib/medtronic/test/decode_time.c index 286d0b5..8398115 100644 --- a/lib/medtronic/test/decode_time.c +++ b/lib/medtronic/test/decode_time.c @@ -1,4 +1,3 @@ -#include #include #include @@ -14,5 +13,6 @@ int main(int argc, char **argv) { for (int i = 0; i < 5; i++) { data[i] = strtol(argv[i + 1], 0, 16); } - printf("%s\n", time_string(decode_time(data))); + char ts[TIME_STRING_SIZE]; + printf("%s\n", time_string(decode_time(data), ts)); } diff --git a/lib/medtronic/test/esp_log.h b/lib/medtronic/test/esp_log.h deleted file mode 100644 index 59e4272..0000000 --- a/lib/medtronic/test/esp_log.h +++ /dev/null @@ -1,3 +0,0 @@ -// Dummy header file for compiling test programs. - -#define ESP_LOGE(tag, fmt, ...) printf(fmt "\n", ##__VA_ARGS__) diff --git a/lib/medtronic/test/history_test.c b/lib/medtronic/test/history_test.c index a943a60..bdbf14e 100644 --- a/lib/medtronic/test/history_test.c +++ b/lib/medtronic/test/history_test.c @@ -1,8 +1,8 @@ -#include "testing.h" +#include "medtronic_test.h" -char *test_dir = "./testdata"; +static char *test_data_dir = "testdata"; -char *test_files[] = { +static char *test_files[] = { "model-512-1", "model-512-2", "model-515", @@ -29,7 +29,7 @@ char *test_files[] = { }; #define NUM_TEST_FILES (sizeof(test_files)/sizeof(test_files[0])) -char *get_test_file(char *name, int *familyp) { +static char *get_data_file(char *name, int *familyp) { static char buf[50]; strcpy(buf, strchr(name, '-') + 1); char *t = strchr(buf, '-'); @@ -37,16 +37,21 @@ char *get_test_file(char *name, int *familyp) { *t = 0; } *familyp = atoi(buf) % 100; - sprintf(buf, "%s/%s.data", test_dir, name); + sprintf(buf, "%s/%s.data", test_data_dir, name); return buf; } -void run_test(char *name) { +static char *get_json_file(char *name) { + static char buf[50]; + sprintf(buf, "%s/%s.json", test_data_dir, name); + return buf; +} + +static void run_test(char *name) { int family; - char *filename = get_test_file(name, &family); - parse_data(filename, family); - static char json_file[50]; - sprintf(json_file, "%s/%s.json", test_dir, name); + char *data_file = get_data_file(name, &family); + char *json_file = get_json_file(name); + parse_data(data_file, family); compare_with_json(json_file); } diff --git a/lib/medtronic/test/json.c b/lib/medtronic/test/json.c index b801656..d791d28 100644 --- a/lib/medtronic/test/json.c +++ b/lib/medtronic/test/json.c @@ -1,28 +1,28 @@ -#include +#include -#include "testing.h" +#include "medtronic_test.h" -static json_t *json_object_path(json_t *obj, const char *path) { +static cJSON *object_path(cJSON *obj, const char *path) { char buf[20]; for (;;) { char *p = strchr(path, '.'); if (p == 0) { - return json_object_get(obj, path); + return cJSON_GetObjectItem(obj, path); } int n = p - path; strncpy(buf, path, n); buf[n] = 0; - obj = json_object_get(obj, buf); + obj = cJSON_GetObjectItem(obj, buf); path = p + 1; } } -static time_t json_time_value(json_t *t) { - return parse_json_time(json_string_value(t)); +static time_t json_time_value(cJSON *t) { + return parse_json_time(t->valuestring); } -static time_t json_duration_value(json_t *t) { - return parse_duration(json_string_value(t)); +static time_t json_duration_value(cJSON *t) { + return parse_duration(t->valuestring); } static const uint8_t decode_table[256] = { @@ -45,21 +45,21 @@ static const uint8_t decode_table[256] = { }; // Decode the first byte of a base64-encoded string. -static uint8_t json_data0_value(json_t *d) { - const char *s = json_string_value(d); +static uint8_t json_data0_value(cJSON *d) { + const char *s = d->valuestring; uint8_t a = s[0], b = s[1]; return (decode_table[a] << 2) | (decode_table[b] >> 4); } // Find record with matching timestamp and type. -static history_record_t *find_object(json_t *obj) { - json_t *jt = json_object_get(obj, "Time"); - if (jt == 0) { +static history_record_t *find_object(cJSON *obj) { + cJSON *jt = cJSON_GetObjectItem(obj, "Time"); + if (!jt) { // All records of interest have time stamps. return 0; } time_t t = json_time_value(jt); - history_record_type_t type = json_data0_value(json_object_get(obj, "Data")); + history_record_type_t type = json_data0_value(cJSON_GetObjectItem(obj, "Data")); for (int i = 0; i < history_length; i++) { history_record_t *r = &history[i]; if (r->time == t && r->type == type) { @@ -69,48 +69,60 @@ static history_record_t *find_object(json_t *obj) { return 0; } -static void check_insulin(history_record_t *r, json_t *obj) { - double v = json_number_value(obj); - if (r->insulin != (int)(1000 * v)) { - double u = r->insulin / 1000.0; - test_failed("[%s] %s insulin = %g, JSON value = %g", time_string(r->time), type_string(r->type), u, v); +static void check_insulin(history_record_t *r, cJSON *obj) { + double v = obj->valuedouble; + if (r->insulin != (insulin_t)(1000 * v)) { + double u = (double)r->insulin / 1000; + char ts[TIME_STRING_SIZE]; + test_failed("[%s] %s insulin = %g, JSON value = %g", time_string(r->time, ts), type_string(r->type), u, v); } } -static void check_duration(history_record_t *r, json_t *obj) { +static void check_duration(history_record_t *r, cJSON *obj) { time_t d = json_duration_value(obj); if (r->duration != d) { - test_failed("[%s] %s duration = %d, JSON value = %d", time_string(r->time), type_string(r->type), r->duration / 60, d / 60); + char ts[TIME_STRING_SIZE]; + test_failed("[%s] %s duration = %d, JSON value = %d", time_string(r->time, ts), type_string(r->type), r->duration / 60, d / 60); } } static int records_matched; -static void check_object(json_t *obj) { +// This check must cover all record types for which decode_history_record can return 1. +static void check_object(cJSON *obj) { + char ts[TIME_STRING_SIZE]; history_record_t *r = find_object(obj); if (r == 0) { return; } switch (r->type) { case Bolus: - check_insulin(r, json_object_path(obj, "Info.Amount")); - check_duration(r, json_object_path(obj, "Info.Duration")); + check_insulin(r, object_path(obj, "Info.Amount")); + check_duration(r, object_path(obj, "Info.Duration")); + break; + case Prime: + break; + case Alarm: + break; + case ClearAlarm: break; case TempBasalDuration: - check_duration(r, json_object_get(obj, "Info")); + check_duration(r, cJSON_GetObjectItem(obj, "Info")); break; case SuspendPump: break; case ResumePump: break; + case Rewind: + break; case TempBasalRate: - check_insulin(r, json_object_path(obj, "Info.Value")); + check_insulin(r, object_path(obj, "Info.Value")); break; case BasalProfileStart: - check_insulin(r, json_object_path(obj, "Info.BasalRate.Rate")); + check_insulin(r, object_path(obj, "Info.BasalRate.Rate")); break; default: - fprintf(stderr, "unexpected %s record at %s\n", type_string(r->type), time_string(r->time)); + fprintf(stderr, "unexpected %s record at %s\n", type_string(r->type), time_string(r->time, ts)); exit(1); } // Zero out record so it is not considered again. @@ -119,32 +131,16 @@ static void check_object(json_t *obj) { } void compare_with_json(char *filename) { - FILE *f = fopen(filename, "r"); - if (f == 0) { - perror(filename); - exit(1); - } - json_error_t error; - json_t *root = json_loadf(f, 0, &error); - fclose(f); - if (root == 0) { - fprintf(stderr, "%s:%d: %s\n", filename, error.line, error.text); - exit(1); - } - if (!json_is_array(root)) { - fprintf(stderr, "%s: root is not a JSON array\n", filename); - exit(1); - } + char *json_string = read_file(filename); + cJSON *root = cJSON_Parse(json_string); + assert(root != 0); + assert(cJSON_IsArray(root)); + int n = cJSON_GetArraySize(root); records_matched = 0; - for (int i = 0; i < json_array_size(root); i++) { - json_t *obj = json_array_get(root, i); - if (!json_is_object(obj)) { - fprintf(stderr, "%s: element %d is not a JSON object\n", filename, i); - exit(1); - } - check_object(obj); + for (int i = 0; i < n; i++) { + check_object(cJSON_GetArrayItem(root, i)); } - json_decref(root); + cJSON_Delete(root); if (records_matched != history_length) { test_failed("[%s] matched %d JSON records out of %d", filename, records_matched, history_length); } diff --git a/lib/medtronic/test/medtronic_test.h b/lib/medtronic/test/medtronic_test.h new file mode 100644 index 0000000..de1c6ea --- /dev/null +++ b/lib/medtronic/test/medtronic_test.h @@ -0,0 +1,11 @@ +#include "testing.h" +#include "medtronic.h" +#include "pump_history.h" + +#define MAX_HISTORY 150 +history_record_t history[MAX_HISTORY]; +int history_length; + +void parse_data(char *filename, int family); +const char *type_string(history_record_type_t t); +void compare_with_json(char *filename); diff --git a/lib/medtronic/test/read_history.c b/lib/medtronic/test/read_history.c index 846528f..0ef655f 100644 --- a/lib/medtronic/test/read_history.c +++ b/lib/medtronic/test/read_history.c @@ -1,19 +1,17 @@ -#include -#include +#include "medtronic_test.h" -#include "testing.h" - -void usage() { +void usage(void) { fprintf(stderr, "Usage: read_history [-m model] data-file\n"); exit(1); } static void print_record(history_record_t *r) { int minutes = r->duration / 60; - printf(" %s %-18s %5d %4d\n", time_string(r->time), type_string(r->type), r->insulin, minutes); + char ts[TIME_STRING_SIZE]; + printf(" %s %-18s %5d %4d\n", time_string(r->time, ts), type_string(r->type), r->insulin, minutes); } -static void print_history() { +static void print_history(void) { printf("%d history records:\n", history_length); for (int i = 0; i < history_length; i++) { print_record(&history[i]); diff --git a/lib/medtronic/test/schedule_test.c b/lib/medtronic/test/schedule_test.c index d13d5d1..729be2b 100644 --- a/lib/medtronic/test/schedule_test.c +++ b/lib/medtronic/test/schedule_test.c @@ -1,40 +1,75 @@ -#include "testing.h" +#include "medtronic_test.h" typedef struct { char *ts; - insulin_t result; + int index; } basal_rate_at_case_t; basal_rate_at_case_t basal_rate_at_cases[] = { - { "2019-06-13T00:00:00Z", 1000 }, - { "2019-06-13T00:59:59Z", 1000 }, - { "2019-06-13T01:00:00Z", 2000 }, - { "2019-06-13T23:00:00Z", 24000 }, - { "2019-06-13T23:59:59Z", 24000 }, + { "2019-06-13T00:00:00Z", 0 }, + { "2019-06-13T00:59:59Z", 0 }, + { "2019-06-13T01:00:00Z", 1 }, + { "2019-06-13T23:00:00Z", 23 }, + { "2019-06-13T23:59:59Z", 23 }, }; #define NUM_BASAL_RATE_AT_CASES (sizeof(basal_rate_at_cases)/sizeof(basal_rate_at_cases[0])) basal_rate_t basal_rate_sched[24]; -void test_basal_rate_at() { +void test_basal_rate_at(void) { for (int h = 0; h < 24; h++) { basal_rate_sched[h] = (basal_rate_t){ .start = h * 3600, - .rate = (h + 1) * 1000, + .rate = 1000, }; } for (int i = 0; i < NUM_BASAL_RATE_AT_CASES; i++) { basal_rate_at_case_t *c = &basal_rate_at_cases[i]; time_t at = parse_json_time(c->ts); - basal_rate_t *r = basal_rate_at(basal_rate_sched, 24, at); - if (r->rate != c->result) { - test_failed("[%d] basal_rate_at(%s) = %d, want %d", i, c->ts, r->rate, c->result); + int n = basal_rate_at(basal_rate_sched, 24, at); + if (n != c->index) { + test_failed("[%d] basal_rate_at(%s) = %d, want %d", i, c->ts, n, c->index); + } + } +} + +typedef struct { + time_t cur; + time_t next; +} next_change_case_t; + +basal_rate_t test_profile[] = { + { TOD( 0, 0), 1000 }, + { TOD( 4, 0), 2000 }, + { TOD( 8, 0), 3000 }, + { TOD(12, 0), 4000 }, + { TOD(16, 0), 5000 }, + { TOD(20, 0), 6000 }, +}; + +next_change_case_t next_change_cases[] = { + { TEST_TIME( 0, 0), TEST_TIME( 4, 0) }, + { TEST_TIME( 3, 59), TEST_TIME( 4, 0) }, + { TEST_TIME( 4, 0), TEST_TIME( 8, 0) }, + { TEST_TIME(23, 59), TEST_TIME(24, 0) }, +}; +#define NUM_NEXT_CHANGE_CASES (sizeof(next_change_cases)/sizeof(next_change_cases[0])) + +void test_next_change(void) { + for (int i = 0; i < NUM_NEXT_CHANGE_CASES; i++) { + next_change_case_t *c = &next_change_cases[i]; + time_t next = next_change(test_profile, LEN(test_profile), c->cur); + if (next != c->next) { + char t1[TIME_STRING_SIZE], t2[TIME_STRING_SIZE], t3[TIME_STRING_SIZE]; + test_failed("[%d] next_change(%s) = %s, want %s", i, + time_string(c->cur, t1), time_string(next, t2), time_string(c->next, t3)); } } } int main(int argc, char **argv) { test_basal_rate_at(); + test_next_change(); exit_test(); } diff --git a/lib/medtronic/test/stringer.c b/lib/medtronic/test/stringer.c index cf5c8d4..55ae27c 100644 --- a/lib/medtronic/test/stringer.c +++ b/lib/medtronic/test/stringer.c @@ -1,4 +1,4 @@ -#include "testing.h" +#include "medtronic_test.h" const char *type_string(history_record_type_t t) { static char buf[20]; diff --git a/lib/medtronic/test/testing.h b/lib/medtronic/test/testing.h deleted file mode 100644 index aad4559..0000000 --- a/lib/medtronic/test/testing.h +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include -#include - -#include "medtronic.h" -#include "pump_history.h" - -#define MAX_HISTORY 150 -history_record_t history[MAX_HISTORY]; -int history_length; - -const char *type_string(history_record_type_t t); - -void parse_data(char *filename, int family); - -int read_bytes(FILE *f); -uint8_t *parse_bytes(char *str); -time_t parse_json_time(const char *str); -time_t parse_duration(const char *str); -void compare_with_json(char *filename); - -void test_failed(const char *format, ...); -void exit_test(void); diff --git a/lib/medtronic/test/time_test.c b/lib/medtronic/test/time_test.c index 5d0d48c..5efa615 100644 --- a/lib/medtronic/test/time_test.c +++ b/lib/medtronic/test/time_test.c @@ -1,4 +1,4 @@ -#include "testing.h" +#include "medtronic_test.h" typedef struct { char *byte_str; @@ -17,14 +17,15 @@ decode_time_case_t decode_time_cases[] = { }; #define NUM_DECODE_TIME_CASES (sizeof(decode_time_cases)/sizeof(decode_time_cases[0])) -void test_decode_time() { +void test_decode_time(void) { for (int i = 0; i < NUM_DECODE_TIME_CASES; i++) { decode_time_case_t *c = &decode_time_cases[i]; uint8_t *bytes = parse_bytes(c->byte_str); time_t t = decode_time(bytes); - char *s = time_string(t); - if (strcmp(s, c->time_str) != 0) { - test_failed("[%d] decode_time(%s) = %s, want %s", i, c->byte_str, s, c->time_str); + char ts[TIME_STRING_SIZE]; + time_string(t, ts); + if (strcmp(ts, c->time_str) != 0) { + test_failed("[%d] decode_time(%s) = %s, want %s", i, c->byte_str, ts, c->time_str); } } } @@ -46,13 +47,14 @@ parse_json_time_case_t parse_json_time_cases[] = { }; #define NUM_PARSE_JSON_TIME_CASES (sizeof(parse_json_time_cases)/sizeof(parse_json_time_cases[0])) -void test_parse_json_time() { +void test_parse_json_time(void) { for (int i = 0; i < NUM_PARSE_JSON_TIME_CASES; i++) { parse_json_time_case_t *c = &parse_json_time_cases[i]; time_t t = parse_json_time(c->json_str); - char *s = time_string(t); - if (strcmp(s, c->time_str) != 0) { - test_failed("[%d] parse_json_time(%s) = %s, want %s", i, c->json_str, s, c->time_str); + char ts[TIME_STRING_SIZE]; + time_string(t, ts); + if (strcmp(ts, c->time_str) != 0) { + test_failed("[%d] parse_json_time(%s) = %s, want %s", i, c->json_str, ts, c->time_str); } } } @@ -71,7 +73,7 @@ parse_duration_case_t parse_duration_cases[] = { }; #define NUM_PARSE_DURATION_CASES (sizeof(parse_duration_cases)/sizeof(parse_duration_cases[0])) -void test_parse_duration() { +void test_parse_duration(void) { for (int i = 0; i < NUM_PARSE_DURATION_CASES; i++) { parse_duration_case_t *c = &parse_duration_cases[i]; time_t t = parse_duration(c->s); @@ -83,7 +85,7 @@ void test_parse_duration() { typedef struct { char *ts; - time_t s; + time_of_day_t s; } since_midnight_case_t; since_midnight_case_t since_midnight_cases[] = { @@ -93,7 +95,7 @@ since_midnight_case_t since_midnight_cases[] = { }; #define NUM_SINCE_MIDNIGHT_CASES (sizeof(since_midnight_cases)/sizeof(since_midnight_cases[0])) -void test_since_midnight() { +void test_since_midnight(void) { for (int i = 0; i < NUM_SINCE_MIDNIGHT_CASES; i++) { since_midnight_case_t *c = &since_midnight_cases[i]; time_t t = parse_json_time(c->ts); diff --git a/lib/medtronic/utility.c b/lib/medtronic/utility.c new file mode 100644 index 0000000..280ced3 --- /dev/null +++ b/lib/medtronic/utility.c @@ -0,0 +1,41 @@ +#include + +#include "medtronic.h" + +time_of_day_t since_midnight(time_t t) { + struct tm *tm = localtime(&t); + return tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec; +} + +char *time_string(time_t t, char *buf) { + struct tm *tm = localtime(&t); + strftime(buf, TIME_STRING_SIZE, "%F %T", tm); + return buf; +} + +char *short_time(time_t t, char *buf) { + struct tm *tm = localtime(&t); + strftime(buf, SHORT_TIME_SIZE, "%T", tm); + return buf; +} + +char *duration_string(int seconds, char *buf) { + int s = seconds; + int h = s / 3600; + s %= 3600; + int m = s / 60; + s %= 60; + if (h != 0) { + sprintf(buf, "%dh%dm%ds", h, m, s); + } else if (m != 0) { + sprintf(buf, "%dm%ds", m, s); + } else { + sprintf(buf, "%ds", s); + } + return buf; +} + +char *insulin_string(insulin_t ins, char *buf) { + sprintf(buf, "%d.%03d U", ins / 1000, ins % 1000); + return buf; +} diff --git a/lib/oled/CMakeLists.txt b/lib/oled/CMakeLists.txt deleted file mode 100644 index 1dcc816..0000000 --- a/lib/oled/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -idf_component_register( - INCLUDE_DIRS . - SRC_DIRS . - PRIV_REQUIRES u8g2 -) diff --git a/lib/oled/callbacks.c b/lib/oled/callbacks.c deleted file mode 100644 index e401f5e..0000000 --- a/lib/oled/callbacks.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include - -#include "module.h" - -static i2c_cmd_handle_t handle_i2c; - -#define I2C_MASTER_NUM I2C_NUM_1 -#define I2C_MASTER_FREQ_HZ 400000 -#define I2C_TIMEOUT_MS 1000 - -static void oled_i2c_init() { - i2c_config_t conf = { - .mode = I2C_MODE_MASTER, - .sda_io_num = OLED_SDA, - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_io_num = OLED_SCL, - .scl_pullup_en = GPIO_PULLUP_ENABLE, - .master.clk_speed = I2C_MASTER_FREQ_HZ, - }; - ESP_ERROR_CHECK(i2c_param_config(I2C_MASTER_NUM, &conf)); - ESP_ERROR_CHECK(i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0)); -} - -uint8_t i2c_callback(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { - switch(msg) { - case U8X8_MSG_BYTE_INIT: - oled_i2c_init(); - break; - case U8X8_MSG_BYTE_SEND: { - uint8_t *p = (uint8_t *)arg_ptr; - // Note: attempts to replace this loop with a single call to i2c_master_write - // did not work (no error, but nothing displayed) even at lower I2C frequencies. - while (arg_int > 0) { - ESP_ERROR_CHECK(i2c_master_write_byte(handle_i2c, *p, true)); - p++; - arg_int--; - } - break; - } - case U8X8_MSG_BYTE_START_TRANSFER: - handle_i2c = i2c_cmd_link_create(); - ESP_ERROR_CHECK(i2c_master_start(handle_i2c)); - ESP_ERROR_CHECK(i2c_master_write_byte(handle_i2c, u8x8_GetI2CAddress(u8x8) | I2C_MASTER_WRITE, true)); - break; - case U8X8_MSG_BYTE_END_TRANSFER: - ESP_ERROR_CHECK(i2c_master_stop(handle_i2c)); - ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_MASTER_NUM, handle_i2c, I2C_TIMEOUT_MS / portTICK_RATE_MS)); - i2c_cmd_link_delete(handle_i2c); - break; - default: - return 0; - } - return 1; -} - -static void oled_gpio_init() { - gpio_config_t conf = { - .pin_bit_mask = 1 << OLED_RST, - .mode = GPIO_MODE_OUTPUT, - .pull_up_en = GPIO_PULLUP_DISABLE, - .pull_down_en = GPIO_PULLDOWN_ENABLE, - .intr_type = GPIO_INTR_DISABLE, - }; - ESP_ERROR_CHECK(gpio_config(&conf)); -} - -uint8_t gpio_and_delay_callback(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { - switch (msg) { - case U8X8_MSG_GPIO_AND_DELAY_INIT: - oled_gpio_init(); - break; - case U8X8_MSG_GPIO_RESET: - gpio_set_level(OLED_RST, arg_int); - break; - case U8X8_MSG_GPIO_CS: - break; - case U8X8_MSG_GPIO_I2C_CLOCK: - gpio_set_level(OLED_SCL, arg_int); - break; - case U8X8_MSG_GPIO_I2C_DATA: - gpio_set_level(OLED_SDA, arg_int); - break; - case U8X8_MSG_DELAY_MILLI: - vTaskDelay(arg_int / portTICK_PERIOD_MS); - break; - } - return 1; -} diff --git a/lib/oled/component.mk b/lib/oled/component.mk deleted file mode 100644 index 004b18e..0000000 --- a/lib/oled/component.mk +++ /dev/null @@ -1 +0,0 @@ -COMPONENT_ADD_INCLUDEDIRS = . diff --git a/lib/oled/oled.c b/lib/oled/oled.c deleted file mode 100644 index 62686d5..0000000 --- a/lib/oled/oled.c +++ /dev/null @@ -1,142 +0,0 @@ -#include - -static u8g2_t u8g2; - -static enum { - SANS_SERIF, - SERIF, - MONOSPACE, -} font_style = SANS_SERIF; -#define NUM_STYLES (MONOSPACE + 1) - -void oled_font_sans_serif() { - font_style = SANS_SERIF; -} - -void oled_font_serif() { - font_style = SERIF; -} - -void oled_font_monospace() { - font_style = MONOSPACE; -} - -static enum { - SMALL, - MEDIUM, - LARGE, -} font_size = MEDIUM; -#define NUM_SIZES (LARGE + 1) - -void oled_font_small() { - font_size = SMALL; -} - -void oled_font_medium() { - font_size = MEDIUM; -} - -void oled_font_large() { - font_size = LARGE; -} - -static const uint8_t *font[NUM_STYLES][NUM_SIZES] = { - // sans-serif - { u8g2_font_helvR08_tr, - u8g2_font_helvR12_tr, - u8g2_font_helvR24_tr }, - // serif - { u8g2_font_timR08_tr, - u8g2_font_timR12_tr, - u8g2_font_timR24_tr }, - // monospace - { u8g2_font_courR08_tr, - u8g2_font_courR12_tr, - u8g2_font_courR24_tr }, -}; - -static void set_font() { - u8g2_SetFont(&u8g2, font[font_style][font_size]); -} - -void oled_on() { - u8g2_SetPowerSave(&u8g2, 0); -} - -void oled_off() { - u8g2_SetPowerSave(&u8g2, 1); -} - -void oled_clear() { - u8g2_ClearBuffer(&u8g2); -} - -void oled_update() { - u8g2_SendBuffer(&u8g2); -} - -int oled_font_width() { - set_font(); - return u8g2_GetMaxCharWidth(&u8g2); -} - -int oled_font_ascent() { - set_font(); - return u8g2_GetAscent(&u8g2); -} - -int oled_font_descent() { - set_font(); - return -u8g2_GetDescent(&u8g2); -} - -static enum { - LEFT, - RIGHT, - CENTER, -} align_mode = LEFT; - -void oled_align_left() { - align_mode = LEFT; -} - -void oled_align_right() { - align_mode = RIGHT; -} - -void oled_align_center() { - align_mode = CENTER; -} - -int oled_string_width(const char *s) { - set_font(); - return u8g2_GetStrWidth(&u8g2, s); -} - -void oled_draw_string(int x, int y, const char *s) { - set_font(); - if (align_mode != LEFT) { - int w = u8g2_GetStrWidth(&u8g2, s); - if (align_mode == CENTER) { - w /= 2; - } - x -= w; - } - u8g2_DrawStr(&u8g2, x, y, s); -} - -void oled_draw_box(int x, int y, int w, int h) { - u8g2_DrawBox(&u8g2, x, y, w, h); -} - -extern uint8_t i2c_callback(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); -extern uint8_t gpio_and_delay_callback(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); - -void oled_init() { - u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, i2c_callback, gpio_and_delay_callback); - u8x8_SetI2CAddress(&u8g2.u8x8, 0x3C << 1); - u8g2_InitDisplay(&u8g2); - - oled_on(); - oled_clear(); -} diff --git a/lib/oled/oled.h b/lib/oled/oled.h deleted file mode 100644 index fec6aa5..0000000 --- a/lib/oled/oled.h +++ /dev/null @@ -1,32 +0,0 @@ -#define OLED_WIDTH 128 -#define OLED_HEIGHT 64 - -extern void oled_init(); - -extern void oled_on(); -extern void oled_off(); - -extern void oled_clear(); -extern void oled_update(); - -extern int oled_font_width(); -extern int oled_font_ascent(); -extern int oled_font_descent(); - -extern void oled_font_small(); -extern void oled_font_medium(); -extern void oled_font_large(); - -extern void oled_font_sans_serif(); -extern void oled_font_serif(); -extern void oled_font_monospace(); - -extern void oled_align_left(); -extern void oled_align_right(); -extern void oled_align_center(); -extern void oled_align_center_both(); - -extern int oled_string_width(const char *s); -extern void oled_draw_string(int x, int y, const char *s); - -extern void oled_draw_box(int x, int y, int w, int h); diff --git a/lib/radio/rfm95.c b/lib/radio/rfm95.c index 1c48434..1ec9ab1 100644 --- a/lib/radio/rfm95.c +++ b/lib/radio/rfm95.c @@ -1,6 +1,7 @@ #include -#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#define TAG "rfm95" + #include #include #include @@ -11,70 +12,92 @@ #include "rfm95.h" #include "spi.h" -#define MILLISECONDS 1000 +#define MILLISECOND 1000 -void rfm95_reset() { - gpio_set_direction(LORA_RST, GPIO_MODE_OUTPUT); - gpio_set_level(LORA_RST, 0); - usleep(10*MILLISECONDS); - gpio_set_level(LORA_RST, 1); - usleep(10*MILLISECONDS); -} +// The FIFO_THRESHOLD value should allow a maximum-sized packet to be +// written in two bursts, but be large enough to avoid fifo underflow. +#define FIFO_THRESHOLD 20 -static inline uint8_t read_mode() { +static inline uint8_t read_mode(void) { return read_register(REG_OP_MODE) & OP_MODE_MASK; } #define MAX_WAIT 1000 static void set_mode(uint8_t mode) { + uint8_t cur_mode = read_mode(); + if (mode == cur_mode) { + return; + } write_register(REG_OP_MODE, FSK_OOK_MODE | MODULATION_OOK | mode); + ESP_LOGD(TAG, "set_mode %d -> %d", cur_mode, mode); + if (cur_mode == MODE_SLEEP) { + usleep(100); + } for (int w = 0; w < MAX_WAIT; w++) { - if (read_mode() == mode) { + cur_mode = read_mode(); + if (cur_mode == mode) { return; } } - printf("set_mode(%d) timeout in mode %d\n", mode, read_mode()); + ESP_LOGI(TAG, "set_mode(%d) timeout in mode %d", mode, cur_mode); } -static inline void set_mode_sleep() { +static inline void set_mode_sleep(void) { set_mode(MODE_SLEEP); } -static inline void set_mode_standby() { +static inline void set_mode_standby(void) { set_mode(MODE_STDBY); } -static inline void set_mode_receive() { +static inline void set_mode_receive(void) { set_mode(MODE_RX); } -static inline void set_mode_transmit() { +static inline void set_mode_transmit(void) { set_mode(MODE_TX); } +static inline void sequencer_stop(void) { + write_register(REG_SEQ_CONFIG_1, SEQUENCER_STOP); +} + +// Reset the radio device. See section 7.2.2 of data sheet. +// NOTE: the RFM95 requires the reset pin to be in input mode +// except while resetting the chip, unlike the RFM69 for example. + +void rfm95_reset(void) { + ESP_LOGD(TAG, "reset"); + gpio_set_direction(LORA_RST, GPIO_MODE_OUTPUT); + gpio_set_level(LORA_RST, 0); + usleep(100); + gpio_set_direction(LORA_RST, GPIO_MODE_INPUT); + usleep(5*MILLISECOND); +} + static volatile int rx_packets; -int rx_packet_count() { +int rx_packet_count(void) { return rx_packets; } static volatile int tx_packets; -int tx_packet_count() { +int tx_packet_count(void) { return tx_packets; } static volatile TaskHandle_t rx_waiting_task; -static void IRAM_ATTR rx_interrupt() { +static void IRAM_ATTR rx_interrupt(void *unused) { rx_packets++; if (rx_waiting_task != 0) { vTaskNotifyGiveFromISR(rx_waiting_task, 0); } } -void rfm95_init() { +void rfm95_init(void) { spi_init(); rfm95_reset(); @@ -115,21 +138,30 @@ void rfm95_init() { write_register(REG_SYNC_VALUE_2, 0x00); write_register(REG_SYNC_VALUE_3, 0xFF); write_register(REG_SYNC_VALUE_4, 0x00); + + // Use unlimited length packet format (data sheet section 4.2.13.2). + write_register(REG_PACKET_CONFIG_1, PACKET_FORMAT_FIXED); + write_register(REG_PAYLOAD_LENGTH, 0); + write_register(REG_PACKET_CONFIG_2, PACKET_MODE| 0); } -static inline bool fifo_empty() { +static inline bool fifo_empty(void) { return (read_register(REG_IRQ_FLAGS_2) & FIFO_EMPTY) != 0; } -static inline bool fifo_full() { +static inline bool fifo_full(void) { return (read_register(REG_IRQ_FLAGS_2) & FIFO_FULL) != 0; } -static inline void clear_fifo() { +static inline bool fifo_threshold_exceeded(void) { + return (read_register(REG_IRQ_FLAGS_2) & FIFO_LEVEL) != 0; +} + +static inline void clear_fifo(void) { write_register(REG_IRQ_FLAGS_2, FIFO_OVERRUN); } -static inline uint8_t read_fifo_flags() { +static inline uint8_t read_fifo_flags(void) { return read_register(REG_IRQ_FLAGS_2); } @@ -141,68 +173,87 @@ static inline void xmit(uint8_t* data, int len) { write_burst(REG_FIFO, data, len); } -static bool wait_for_fifo_non_empty() { +static bool wait_for_fifo_room(void) { for (int w = 0; w < MAX_WAIT; w++) { if (!fifo_full()) { return true; } } - write_register(REG_SEQ_CONFIG_1, SEQUENCER_STOP); + sequencer_stop(); set_mode_sleep(); - printf("FIFO still full; flags = %02X\n", read_fifo_flags()); + ESP_LOGI(TAG, "FIFO still full; flags = %02X", read_fifo_flags()); return false; } -static void wait_for_transmit_done() { +static void wait_for_transmit_done(void) { uint8_t mode; for (int w = 0; w < MAX_WAIT; w++) { mode = read_mode(); if (mode == MODE_STDBY) { + ESP_LOGD(TAG, "transmit done; waits = %d", w); return; } + usleep(1*MILLISECOND); } - write_register(REG_SEQ_CONFIG_1, SEQUENCER_STOP); + sequencer_stop(); set_mode_sleep(); - printf("transmit still not done; mode = %d\n", mode); + ESP_LOGI(TAG, "transmit still not done; mode = %d", mode); } void transmit(uint8_t *buf, int count) { - // Change to Standby mode in case an earlier receive timeout left the radio in Receive mode. - set_mode_standby(); + ESP_LOGD(TAG, "transmit %d-byte packet", count); clear_fifo(); + set_mode_standby(); // Automatically enter Transmit state on FifoLevel interrupt. - write_register(REG_FIFO_THRESH, TX_START_CONDITION); - write_register(REG_SEQ_CONFIG_1, SEQUENCER_START | IDLE_MODE_SLEEP | FROM_START_TX_ON_FIFO_LEVEL); - // Specify fixed length packet format (including final zero byte) - // so PacketSent interrupt will terminate Transmit state. - write_register(REG_PACKET_CONFIG_1, ((count + 1) >> 8) & PAYLOAD_LENGTH_MSB_MASK); - write_register(REG_PAYLOAD_LENGTH, (count + 1) & 0xFF); - int n = count < FIFO_SIZE ? count : FIFO_SIZE; - xmit(buf, n); - while (n < count) { - if (!wait_for_fifo_non_empty()) return; - xmit_byte(buf[n]); - n++; + write_register(REG_FIFO_THRESH, TX_START_CONDITION | FIFO_THRESHOLD); + write_register(REG_SEQ_CONFIG_1, SEQUENCER_START | IDLE_MODE_STANDBY | FROM_START_TO_TX); + int avail = FIFO_SIZE; + for (;;) { + if (avail > count) { + avail = count; + } + ESP_LOGD(TAG, "writing %d bytes to TX FIFO", avail); + xmit(buf, avail); + ESP_LOGD(TAG, "after xmit: mode = %d", read_mode()); + buf += avail; + count -= avail; + if (count == 0) { + break; + } + // Wait until there is room for at least fifoSize - fifoThreshold bytes in the FIFO. + // Err on the short side here to avoid TXFIFO underflow. + usleep(FIFO_SIZE / 4 * MILLISECOND); + for (;;) { + if (!fifo_threshold_exceeded()) { + avail = FIFO_SIZE - FIFO_THRESHOLD; + break; + } + } + } + if (!wait_for_fifo_room()) { + return; } - if (!wait_for_fifo_non_empty()) return; xmit_byte(0); - // Rely on the sequencer to end Transmit mode after PacketSent is triggered. wait_for_transmit_done(); - set_mode_sleep(); + set_mode_standby(); tx_packets++; } -static inline bool packet_seen() { - return (read_register(REG_IRQ_FLAGS_1) & SYNC_ADDRESS_MATCH) != 0; +static bool packet_seen(void) { + bool seen = (read_register(REG_IRQ_FLAGS_1) & SYNC_ADDRESS_MATCH) != 0; + if (seen) { + ESP_LOGD(TAG, "incoming packet seen"); + } + return seen; } -static inline uint8_t recv_byte() { +static inline uint8_t recv_byte(void) { return read_register(REG_FIFO); } static uint8_t last_rssi = 0xFF; -int read_rssi() { +int read_rssi(void) { return -(int)last_rssi / 2; } @@ -210,16 +261,19 @@ typedef void wait_fn_t(int); static int rx_common(wait_fn_t wait_fn, uint8_t *buf, int count, int timeout) { // Use unlimited length packet format (data sheet section 4.2.13.2). - write_register(REG_PACKET_CONFIG_1, 0); + write_register(REG_PACKET_CONFIG_1, PACKET_FORMAT_FIXED); write_register(REG_PAYLOAD_LENGTH, 0); + write_register(REG_PACKET_CONFIG_2, PACKET_MODE| 0); gpio_intr_enable(DIO2); + ESP_LOGD(TAG, "starting receive"); set_mode_receive(); if (!packet_seen()) { // Stay in RX mode. wait_fn(timeout); if (!packet_seen()) { set_mode_sleep(); - return 0; // timeout + ESP_LOGD(TAG, "receive timeout"); + return 0; } } last_rssi = read_register(REG_RSSI); @@ -230,7 +284,7 @@ static int rx_common(wait_fn_t wait_fn, uint8_t *buf, int count, int timeout) { usleep(500); w++; if (w >= MAX_WAIT) { - ESP_LOGD("rfm95", "max RX FIFO wait reached"); + ESP_LOGD(TAG, "max RX FIFO wait reached"); break; } continue; @@ -249,7 +303,7 @@ static int rx_common(wait_fn_t wait_fn, uint8_t *buf, int count, int timeout) { // Remove spurious final byte consisting of just one or two high bits. uint8_t b = buf[n-1]; if (b == 0x80 || b == 0xC0) { - ESP_LOGD("rfm95", "end-of-packet glitch %X with RSSI %d", b >> 6, read_rssi()); + ESP_LOGD(TAG, "end-of-packet glitch %X with RSSI %d", b >> 6, read_rssi()); n--; } } @@ -258,7 +312,7 @@ static int rx_common(wait_fn_t wait_fn, uint8_t *buf, int count, int timeout) { static void sleep_until_interrupt(int timeout) { uart_tx_wait_idle(0); - uint64_t us = (uint64_t)timeout * MILLISECONDS; + uint64_t us = (uint64_t)timeout * MILLISECOND; esp_sleep_enable_timer_wakeup(us); esp_light_sleep_start(); esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER); @@ -275,7 +329,7 @@ int sleep_receive(uint8_t *buf, int count, int timeout) { static void wait_until_interrupt(int timeout) { while (!packet_seen() && timeout > 0) { int t = timeout < POLL_INTERVAL ? timeout : POLL_INTERVAL; - usleep(t * MILLISECONDS); + usleep(t * MILLISECOND); timeout -= t; } } @@ -283,9 +337,11 @@ static void wait_until_interrupt(int timeout) { #else static void wait_until_interrupt(int timeout) { + ESP_LOGD(TAG, "waiting until interrupt"); rx_waiting_task = xTaskGetCurrentTaskHandle(); xTaskNotifyWait(0, 0, 0, pdMS_TO_TICKS(timeout)); rx_waiting_task = 0; + ESP_LOGD(TAG, "finished waiting"); } #endif @@ -294,7 +350,7 @@ int receive(uint8_t *buf, int count, int timeout) { return rx_common(wait_until_interrupt, buf, count, timeout); } -uint32_t read_frequency() { +uint32_t read_frequency(void) { uint8_t frf[3]; read_burst(REG_FRF_MSB, frf, sizeof(frf)); uint32_t f = (frf[0] << 16) | (frf[1] << 8) | frf[2]; @@ -310,7 +366,7 @@ void set_frequency(uint32_t freq_hz) { write_burst(REG_FRF_MSB, frf, sizeof(frf)); } -int read_version() { +int read_version(void) { return read_register(REG_VERSION); } diff --git a/lib/radio/rfm95.h b/lib/radio/rfm95.h index af5e84e..7eff0ba 100644 --- a/lib/radio/rfm95.h +++ b/lib/radio/rfm95.h @@ -1,3 +1,8 @@ +#ifndef _RFM95_H +#define _RFM95_H + +#include + // Pin mappings on TTGO ESP32 LoRa OLED v1 module #define DIO0 GPIO_NUM_26 @@ -45,6 +50,7 @@ // REG_OP_MODE #define FSK_OOK_MODE (0 << 7) +#define MODULATION_FSK (0 << 5) #define MODULATION_OOK (1 << 5) #define OP_MODE_MASK 0x7 @@ -85,17 +91,32 @@ // REG_SYNC_CONFIG #define SYNC_ON (1 << 4) -// REG_PAYLOAD_LENGTH +// REG_PACKET_CONFIG_1 +#define PACKET_FORMAT_FIXED (0 << 7) +#define PACKET_FORMAT_VARIABLE (1 << 7) + +// REG_PACKET_CONFIG_2 +#define PACKET_MODE (1 << 6) #define PAYLOAD_LENGTH_MSB_MASK 0x7 // REG_FIFO_THRESH #define TX_START_CONDITION (1 << 7) -// REG_SEQ_CONFIG +// REG_SEQ_CONFIG_1 #define SEQUENCER_START (1 << 7) #define SEQUENCER_STOP (1 << 6) +#define IDLE_MODE_STANDBY (0 << 5) #define IDLE_MODE_SLEEP (1 << 5) -#define FROM_START_TX_ON_FIFO_LEVEL (3 << 3) +#define FROM_START_TO_LOW_POWER (0 << 3) +#define FROM_START_TO_RX (1 << 3) +#define FROM_START_TO_TX (2 << 3) +#define FROM_START_TO_TX_ON_FIFO_LEVEL (3 << 3) +#define LOW_POWER_SELECT_OFF (0 << 2) +#define LOW_POWER_SELECT_IDLE (1 << 2) +#define FROM_IDLE_TO_TX (0 << 1) +#define FROM_IDLE_TO_RX (1 << 1) +#define FROM_TX_TO_LOW_POWER (0 << 0) +#define FROM_TX_TO_RX (1 << 0) // REG_IRQ_FLAGS_1 #define MODE_READY (1 << 7) @@ -114,6 +135,7 @@ #define DIO1_MAPPING_SHIFT 4 #define DIO2_MAPPING_SHIFT 2 +void rfm95_reset(void); void rfm95_init(void); @@ -138,3 +160,5 @@ int sleep_receive(uint8_t *buf, int count, int timeout); int read_rssi(void); int rx_packet_count(void); + +#endif // _RFM95_H diff --git a/lib/radio/spi.c b/lib/radio/spi.c index 07fb4f0..bccf49e 100644 --- a/lib/radio/spi.c +++ b/lib/radio/spi.c @@ -8,8 +8,8 @@ static spi_device_handle_t spi_dev; -void spi_init() { - //Initialize the SPI bus. +void spi_init(void) { + // Initialize the SPI bus. spi_bus_config_t buscfg = { .mosi_io_num = LORA_MOSI, .miso_io_num = LORA_MISO, @@ -27,7 +27,7 @@ void spi_init() { .command_bits = 8, .address_bits = 0, .mode = 0, - .clock_speed_hz = 1*MEGAHERTZ, + .clock_speed_hz = 5*MEGAHERTZ, .spics_io_num = LORA_CS, .queue_size = 1, }; @@ -42,7 +42,7 @@ uint8_t read_register(uint8_t addr) { .cmd = addr, .length = 8, // bits }; - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_dev, &t)); + ESP_ERROR_CHECK(spi_device_transmit(spi_dev, &t)); return t.rx_data[0]; } @@ -53,7 +53,7 @@ void read_burst(uint8_t addr, uint8_t *buf, int count) { .tx_buffer = buf, .rx_buffer = buf, }; - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_dev, &t)); + ESP_ERROR_CHECK(spi_device_transmit(spi_dev, &t)); } // Write register by sending the address with the write bit set, @@ -65,7 +65,7 @@ void write_register(uint8_t addr, uint8_t value) { .length = 8, // bits }; t.tx_data[0] = value; - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_dev, &t)); + ESP_ERROR_CHECK(spi_device_transmit(spi_dev, &t)); } void write_burst(uint8_t addr, uint8_t *buf, int count) { @@ -76,5 +76,5 @@ void write_burst(uint8_t addr, uint8_t *buf, int count) { .rxlength = 8, // bits .tx_buffer = buf, }; - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_dev, &t)); + ESP_ERROR_CHECK(spi_device_transmit(spi_dev, &t)); } diff --git a/lib/radio/spi.h b/lib/radio/spi.h index 70d2a62..bbb191d 100644 --- a/lib/radio/spi.h +++ b/lib/radio/spi.h @@ -1,3 +1,8 @@ +#ifndef _SPI_H +#define _SPI_H + +#include + #define MEGAHERTZ 1000000 #define SPI_WRITE (1 << 7) @@ -11,3 +16,5 @@ void read_burst(uint8_t addr, uint8_t *buf, int count); void write_register(uint8_t addr, uint8_t value); void write_burst(uint8_t addr, uint8_t *buf, int count); + +#endif // _SPI_H diff --git a/lib/wifi/CMakeLists.txt b/lib/wifi/CMakeLists.txt deleted file mode 100644 index c065b3a..0000000 --- a/lib/wifi/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -idf_component_register( - INCLUDE_DIRS . - SRC_DIRS . -) diff --git a/lib/wifi/component.mk b/lib/wifi/component.mk deleted file mode 100644 index 004b18e..0000000 --- a/lib/wifi/component.mk +++ /dev/null @@ -1 +0,0 @@ -COMPONENT_ADD_INCLUDEDIRS = . diff --git a/lib/wifi/wifi.c b/lib/wifi/wifi.c deleted file mode 100644 index 6c5257f..0000000 --- a/lib/wifi/wifi.c +++ /dev/null @@ -1,95 +0,0 @@ -#define TAG "WiFi" -#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG -#include -#include -#include -#include -#include - -#include "wifi.h" - -#define MAX_RETRIES 5 -#define RETRY_INTERVAL 100000 // microseconds -#define IP_TIMEOUT 10000 // milliseconds - -static int retry_num; - -static volatile TaskHandle_t waiting_task; - -static char *ip_address; - -char *wifi_ip_address() { - return ip_address; -} - -static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { - if (event_base == WIFI_EVENT) { - switch (event_id) { - case WIFI_EVENT_STA_START: - ESP_LOGD(TAG, "WIFI_EVENT STA_START"); - esp_wifi_connect(); - return; - case WIFI_EVENT_STA_CONNECTED: - ESP_LOGD(TAG, "WIFI_EVENT STA_CONNECTED"); - return; - case WIFI_EVENT_STA_DISCONNECTED: - ESP_LOGD(TAG, "WIFI_EVENT STA_DISCONNECTED"); - if (arg != 0) { - wifi_event_sta_disconnected_t *d = arg; - ESP_LOGD(TAG, "reason = %d", d->reason); - } - if (retry_num == MAX_RETRIES) { - ESP_LOGI(TAG, "failed to connect to %s after %d attempts", WIFI_SSID, MAX_RETRIES); - return; - } - retry_num++; - usleep(RETRY_INTERVAL); - esp_wifi_connect(); - return; - default: - ESP_LOGD(TAG, "unexpected WIFI_EVENT %d", event_id); - return; - } - } - if (event_base == IP_EVENT) { - ESP_LOGD(TAG, "IP_EVENT"); - switch (event_id) { - case IP_EVENT_STA_GOT_IP: - ESP_LOGD(TAG, "STA_GOT_IP"); - retry_num = 0; - ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data; - ip_address = ip4addr_ntoa(&event->ip_info.ip); - xTaskNotify(waiting_task, 0, 0); - return; - default: - ESP_LOGD(TAG, "unexpected event_id = %d", event_id); - return; - } - } - ESP_LOGD(TAG, "unexpected event_base = %p", event_base); -} - -void wifi_init(void) { - tcpip_adapter_init(); - - ESP_ERROR_CHECK(esp_event_loop_create_default()); - wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); - ESP_ERROR_CHECK(esp_wifi_init(&cfg)); - ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); - ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL)); - wifi_config_t wifi_config = { - .sta = { - .ssid = WIFI_SSID, - .password = WIFI_PASSWORD, - }, - }; - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); - ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); - - ESP_LOGI(TAG, "connecting to %s", WIFI_SSID); - ESP_ERROR_CHECK(esp_wifi_start()); - waiting_task = xTaskGetCurrentTaskHandle(); - if (!xTaskNotifyWait(0, 0, 0, pdMS_TO_TICKS(IP_TIMEOUT))) { - ESP_LOGE(TAG, "timeout waiting for IP address"); - } -} diff --git a/lib/wifi/wifi.h b/lib/wifi/wifi.h deleted file mode 100644 index b30a40c..0000000 --- a/lib/wifi/wifi.h +++ /dev/null @@ -1,5 +0,0 @@ -#include "wifi_config.h" - -void wifi_init(void); - -char *wifi_ip_address(void); diff --git a/mk/CMakeLists.project b/mk/CMakeLists.project index 229cf6e..c06fb00 100644 --- a/mk/CMakeLists.project +++ b/mk/CMakeLists.project @@ -2,8 +2,6 @@ cmake_minimum_required(VERSION 3.5) include_directories(BEFORE include) -set(EXTRA_COMPONENT_DIRS lib) - include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(xyzzy) diff --git a/mk/Makefile b/mk/Makefile index 1885623..56dc54b 100644 --- a/mk/Makefile +++ b/mk/Makefile @@ -2,6 +2,4 @@ PROJECT_NAME := xyzzy CPPFLAGS += -I $(abspath include) -EXTRA_COMPONENT_DIRS = $(abspath lib) - include $(IDF_PATH)/make/project.mk diff --git a/mk/make-project.sh b/mk/make-project.sh index 66a9a8d..a53df2e 100755 --- a/mk/make-project.sh +++ b/mk/make-project.sh @@ -3,52 +3,42 @@ project="$1" src="src/$project" +if [ "$(basename $(pwd))" != pickle ]; then + echo "script must be run from the top-level gnarl directory" + exit 1 +fi + if [ ! -d "$src" ]; then echo "project source directory $src not found" exit 1 fi -current_for_make() { - [ -d project ] && \ - [ -f project/Makefile ] && \ - grep ^PROJECT_NAME project/Makefile | grep -q $project -} - -current_for_cmake() { - [ -d project ] && \ - [ -f project/CMakeLists.txt ] && \ - grep ^project project/CMakeLists.txt | grep -q $project -} - -project_is_current() { - current_for_make && current_for_cmake -} - -create_project() { - rm -fr project - mkdir project - cd project - - ln -s ../components . - ln -s ../include . - ln -s ../lib . - sed "s/xyzzy/$project/" < ../mk/Makefile > Makefile - sed "s/xyzzy/$project/" < ../mk/CMakeLists.project > CMakeLists.txt - cp ../mk/sdkconfig . - cp ../mk/partitions.csv . - - mkdir main - cd main - ln -sv ../../$src/* . - [ -f component.mk ] || cp ../../mk/component.mk component.mk - [ -f CMakeLists.txt ] || cp ../../mk/CMakeLists.main CMakeLists.txt - - cd ../.. -} - -if ! project_is_current; then - create_project +mkdir -p project +cd project +rm -fr CMakeLists.txt component.mk components dependencies include main Makefile partitions.csv sdkconfig +if [ -d build ]; then + # build directory will be owned by root if using docker + if [ $(stat --format=%U build) = root ]; then + sudo rm -fr build + else + rm -fr build + fi fi -echo Initial setup of $project project is complete. -echo 'Now change to the "project" subdirectory and run "make" or "idf.py build".' +cp -a ../$src main +mv main/sdkconfig . +if [ -f main/dependencies ]; then + mv main/dependencies . + mkdir components + for dep in $(cat dependencies); do + cp -a ../lib/$dep components + done +fi +cp -a ../include . +sed "s/xyzzy/$project/" < ../mk/Makefile > Makefile +sed "s/xyzzy/$project/" < ../mk/CMakeLists.project > CMakeLists.txt +cp ../mk/partitions.csv . +cp ../mk/CMakeLists.main main/CMakeLists.txt +cp ../mk/component.mk main/component.mk + +echo The $project project has been set up in the '"project"' subdirectory. diff --git a/mk/sdkconfig b/mk/sdkconfig index 166615b..2c83835 100644 --- a/mk/sdkconfig +++ b/mk/sdkconfig @@ -2,8 +2,9 @@ # Automatically generated file. DO NOT EDIT. # Espressif IoT Development Framework (ESP-IDF) Project Configuration # -CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 # # SDK tool configuration @@ -11,9 +12,30 @@ CONFIG_IDF_TARGET="esp32" CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-" CONFIG_SDK_PYTHON="python" CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES=y +# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set +# end of SDK tool configuration + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# end of Build type + +# +# Application manager +# CONFIG_APP_COMPILE_TIME_DATE=y # CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set # CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# end of Application manager + +# +# Bootloader config +# # CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set # CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set # CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set @@ -29,17 +51,37 @@ CONFIG_BOOTLOADER_WDT_ENABLE=y # CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set CONFIG_BOOTLOADER_WDT_TIME_MS=9000 # CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# # CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set # CONFIG_SECURE_BOOT_ENABLED is not set # CONFIG_SECURE_FLASH_ENC_ENABLED is not set -CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0" -CONFIG_ESPTOOLPY_BAUD_115200B=y +# end of Security features + +# +# Example Board Configuration +# +# CONFIG_ESP_LYRAT_V4_3_BOARD is not set +CONFIG_ESP_CUSTOM_BOARD=y +# end of Example Board Configuration + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_PORT="/dev/cu.SLAB_USBtoUART" +# CONFIG_ESPTOOLPY_BAUD_115200B is not set # CONFIG_ESPTOOLPY_BAUD_230400B is not set -# CONFIG_ESPTOOLPY_BAUD_921600B is not set +CONFIG_ESPTOOLPY_BAUD_921600B=y # CONFIG_ESPTOOLPY_BAUD_2MB is not set # CONFIG_ESPTOOLPY_BAUD_OTHER is not set CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 -CONFIG_ESPTOOLPY_BAUD=115200 +CONFIG_ESPTOOLPY_BAUD=921600 CONFIG_ESPTOOLPY_COMPRESSED=y # CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set # CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set @@ -73,6 +115,11 @@ CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y # CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# # CONFIG_PARTITION_TABLE_SINGLE_APP is not set # CONFIG_PARTITION_TABLE_TWO_OTA is not set CONFIG_PARTITION_TABLE_CUSTOM=y @@ -80,25 +127,49 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set CONFIG_COMPILER_CXX_EXCEPTIONS=y CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +# CONFIG_COMPILER_CXX_RTTI is not set CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set -# CONFIG_COMPILER_STACK_CHECK is not set CONFIG_COMPILER_WARN_WRITE_STRINGS=y # CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set -# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set -CONFIG_ESP32_APPTRACE_DEST_NONE=y -# CONFIG_ESP32_APPTRACE_ENABLE is not set -CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_TRAX is not set +CONFIG_APPTRACE_DEST_NONE=y +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# CONFIG_BT_ENABLED=y + +# +# Bluetooth controller +# CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y # CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set # CONFIG_BTDM_CTRL_MODE_BTDM is not set @@ -112,10 +183,16 @@ CONFIG_BTDM_CTRL_PINNED_TO_CORE_0=y CONFIG_BTDM_CTRL_PINNED_TO_CORE=0 CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y # CONFIG_BTDM_CTRL_HCI_MODE_UART_H4 is not set + +# +# MODEM SLEEP Options +# CONFIG_BTDM_MODEM_SLEEP=y CONFIG_BTDM_MODEM_SLEEP_MODE_ORIG=y # CONFIG_BTDM_MODEM_SLEEP_MODE_EVED is not set CONFIG_BTDM_LPCLK_SEL_MAIN_XTAL=y +# end of MODEM SLEEP Options + CONFIG_BTDM_BLE_DEFAULT_SCA_250PPM=y CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1 CONFIG_BTDM_BLE_SCAN_DUPL=y @@ -125,13 +202,23 @@ CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE=y CONFIG_BTDM_SCAN_DUPL_TYPE=0 CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=200 # CONFIG_BTDM_BLE_MESH_SCAN_DUPL_EN is not set -# CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED is not set +CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED=y CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100 CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 +# CONFIG_BTDM_COEX_BT_OPTIONS is not set +# end of Bluetooth controller + # CONFIG_BT_BLUEDROID_ENABLED is not set CONFIG_BT_NIMBLE_ENABLED=y +# CONFIG_BT_CONTROLLER_ONLY is not set CONFIG_BT_RESERVE_DRAM=0xdb5c + +# +# NimBLE Options +# +CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y +# CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 CONFIG_BT_NIMBLE_MAX_BONDS=3 CONFIG_BT_NIMBLE_MAX_CCCDS=8 @@ -148,6 +235,7 @@ CONFIG_BT_NIMBLE_NVS_PERSIST=y CONFIG_BT_NIMBLE_SM_LEGACY=y CONFIG_BT_NIMBLE_SM_SC=y # CONFIG_BT_NIMBLE_DEBUG is not set +# CONFIG_BT_NIMBLE_SM_SC_DEBUG_KEYS is not set CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble" CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31 CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256 @@ -157,25 +245,83 @@ CONFIG_BT_NIMBLE_ACL_BUF_SIZE=255 CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=30 CONFIG_BT_NIMBLE_HCI_EVT_LO_BUF_COUNT=8 +CONFIG_BT_NIMBLE_MSYS1_BLOCK_COUNT=12 +CONFIG_BT_NIMBLE_HS_FLOW_CTRL=y +CONFIG_BT_NIMBLE_HS_FLOW_CTRL_ITVL=1000 +CONFIG_BT_NIMBLE_HS_FLOW_CTRL_THRESH=2 +CONFIG_BT_NIMBLE_HS_FLOW_CTRL_TX_ON_DISCONNECT=y +CONFIG_BT_NIMBLE_RPA_TIMEOUT=900 # CONFIG_BT_NIMBLE_MESH is not set +CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS=y +# end of NimBLE Options +# end of Bluetooth + +# CONFIG_BLE_MESH is not set + +# +# CoAP Configuration +# CONFIG_COAP_MBEDTLS_PSK=y # CONFIG_COAP_MBEDTLS_PKI is not set # CONFIG_COAP_MBEDTLS_DEBUG is not set CONFIG_COAP_LOG_DEFAULT_LEVEL=0 +# end of CoAP Configuration + +# +# Driver configurations +# + +# +# ADC configuration +# # CONFIG_ADC_FORCE_XPD_FSM is not set CONFIG_ADC_DISABLE_DAC=y +# end of ADC configuration + +# +# SPI configuration +# CONFIG_SPI_MASTER_IN_IRAM=y CONFIG_SPI_MASTER_ISR_IN_IRAM=y # CONFIG_SPI_SLAVE_IN_IRAM is not set # CONFIG_SPI_SLAVE_ISR_IN_IRAM is not set +# end of SPI configuration + +# +# UART configuration +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of UART configuration + +# +# RTCIO configuration +# +# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set +# end of RTCIO configuration +# end of Driver configurations + +# +# eFuse Bit Manager +# # CONFIG_EFUSE_CUSTOM_TABLE is not set # CONFIG_EFUSE_VIRTUAL is not set # CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y # CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y # CONFIG_ESP_TLS_SERVER is not set # CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# end of ESP-TLS + +# +# ESP32-specific +# CONFIG_ESP32_REV_MIN_0=y # CONFIG_ESP32_REV_MIN_1 is not set # CONFIG_ESP32_REV_MIN_2 is not set @@ -187,8 +333,6 @@ CONFIG_ESP32_DEFAULT_CPU_FREQ_80=y # CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=80 # CONFIG_ESP32_SPIRAM_SUPPORT is not set -# CONFIG_ESP32_MEMMAP_TRACEMEM is not set -# CONFIG_ESP32_MEMMAP_TRACEMEM_TWOBANKS is not set # CONFIG_ESP32_TRAX is not set CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set @@ -201,7 +345,6 @@ CONFIG_ESP32_PANIC_PRINT_REBOOT=y # CONFIG_ESP32_PANIC_SILENT_REBOOT is not set # CONFIG_ESP32_PANIC_GDBSTUB is not set CONFIG_ESP32_DEBUG_OCDAWARE=y -CONFIG_ESP32_DEBUG_STUBS_ENABLE=y CONFIG_ESP32_BROWNOUT_DET=y CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set @@ -231,17 +374,44 @@ CONFIG_ESP32_XTAL_FREQ=26 # CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set # CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 +# end of ESP32-specific + +# +# Power Management +# # CONFIG_PM_ENABLE is not set +# end of Power Management + +# +# Cache config +# +# end of Cache config + +CONFIG_ESP32S2_TRACEMEM_RESERVE_DRAM=0x0 +CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM=0 +CONFIG_ESP32S2_DEBUG_OCDAWARE=y +CONFIG_ESP32S2_BROWNOUT_DET=y + +# +# ADC-Calibration +# CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y CONFIG_ADC_CAL_LUT_ENABLE=y +# end of ADC-Calibration + +# +# Common ESP-related +# # CONFIG_ESP_TIMER_PROFILING is not set CONFIG_ESP_ERR_TO_NAME_LOOKUP=y CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 CONFIG_ESP_CONSOLE_UART_DEFAULT=y # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set # CONFIG_ESP_CONSOLE_UART_NONE is not set @@ -255,39 +425,82 @@ CONFIG_ESP_TASK_WDT=y CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 # CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 is not set # CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 is not set +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# end of Common ESP-related + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y CONFIG_ETH_USE_ESP32_EMAC=y CONFIG_ETH_PHY_INTERFACE_RMII=y # CONFIG_ETH_PHY_INTERFACE_MII is not set CONFIG_ETH_RMII_CLK_INPUT=y # CONFIG_ETH_RMII_CLK_OUTPUT is not set CONFIG_ETH_RMII_CLK_IN_GPIO=0 -CONFIG_ETH_SMI_MDC_GPIO=23 -CONFIG_ETH_SMI_MDIO_GPIO=18 -CONFIG_ETH_PHY_USE_RST=y -CONFIG_ETH_PHY_RST_GPIO=5 CONFIG_ETH_DMA_BUFFER_SIZE=512 CONFIG_ETH_DMA_RX_BUFFER_NUM=10 CONFIG_ETH_DMA_TX_BUFFER_NUM=10 CONFIG_ETH_USE_SPI_ETHERNET=y CONFIG_ETH_SPI_ETHERNET_DM9051=y -CONFIG_ETH_DM9051_INT_GPIO=4 +# CONFIG_ETH_USE_OPENETH is not set +# end of Ethernet + +# +# Event Loop Library +# # CONFIG_ESP_EVENT_LOOP_PROFILING is not set CONFIG_ESP_EVENT_POST_FROM_ISR=y CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +# end of GDB Stub + +# +# ESP HTTP client +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y # CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# end of ESP HTTP client + +# +# HTTP Server +# CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 CONFIG_HTTPD_MAX_URI_LEN=512 CONFIG_HTTPD_ERR_RESP_NO_DELAY=y CONFIG_HTTPD_PURGE_BUF_LEN=32 # CONFIG_HTTPD_LOG_PURGE_DATA is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# # CONFIG_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# # CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y +# end of ESP NETIF Adapter + +# +# Wi-Fi +# CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y -# CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_WIFI is not set -CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_BT=y -# CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_BALANCE is not set -CONFIG_ESP32_WIFI_SW_COEXIST_PREFERENCE_VALUE=1 CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 # CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set @@ -306,14 +519,30 @@ CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 # CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +# CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE is not set +# end of Wi-Fi + +# +# PHY +# CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# end of PHY + +# +# Core dump +# # CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y -# CONFIG_ESP32_ENABLE_COREDUMP is not set +# end of Core dump + +# +# FAT Filesystem support +# # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_720 is not set @@ -343,11 +572,20 @@ CONFIG_FATFS_LFN_NONE=y CONFIG_FATFS_FS_LOCK=0 CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y +# end of FAT Filesystem support + +# +# Modbus configuration +# +CONFIG_FMB_COMM_MODE_RTU_EN=y +CONFIG_FMB_COMM_MODE_ASCII_EN=y CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 CONFIG_FMB_QUEUE_LENGTH=20 CONFIG_FMB_SERIAL_TASK_STACK_SIZE=2048 CONFIG_FMB_SERIAL_BUF_SIZE=256 +CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 +CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 CONFIG_FMB_SERIAL_TASK_PRIO=10 # CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT is not set CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 @@ -357,6 +595,12 @@ CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 CONFIG_FMB_TIMER_PORT_ENABLED=y CONFIG_FMB_TIMER_GROUP=0 CONFIG_FMB_TIMER_INDEX=0 +# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set +# end of Modbus configuration + +# +# FreeRTOS +# # CONFIG_FREERTOS_UNICORE is not set CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF CONFIG_FREERTOS_CORETIMER_0=y @@ -387,14 +631,36 @@ CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +# end of FreeRTOS + +# +# Heap memory debugging +# CONFIG_HEAP_POISONING_DISABLED=y # CONFIG_HEAP_POISONING_LIGHT is not set # CONFIG_HEAP_POISONING_COMPREHENSIVE is not set CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_TRACING_STANDALONE is not set # CONFIG_HEAP_TRACING_TOHOST is not set -# CONFIG_HEAP_TRACING is not set +# end of Heap memory debugging + +# +# jsmn +# +# CONFIG_JSMN_PARENT_LINKS is not set +# CONFIG_JSMN_STRICT is not set +# end of jsmn + +# +# libsodium +# CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y +# end of libsodium + +# +# Log output +# # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set # CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set CONFIG_LOG_DEFAULT_LEVEL_WARN=y @@ -403,7 +669,15 @@ CONFIG_LOG_DEFAULT_LEVEL_WARN=y # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set CONFIG_LOG_DEFAULT_LEVEL=2 CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set # CONFIG_LWIP_IRAM_OPTIMIZATION is not set CONFIG_LWIP_TIMERS_ONDEMAND=y @@ -412,6 +686,7 @@ CONFIG_LWIP_MAX_SOCKETS=10 CONFIG_LWIP_SO_REUSE=y CONFIG_LWIP_SO_REUSE_RXTOALL=y CONFIG_LWIP_SO_RCVBUF=y +# CONFIG_LWIP_NETBUF_RECVINFO is not set # CONFIG_LWIP_IP_FRAG is not set # CONFIG_LWIP_IP_REASSEMBLY is not set # CONFIG_LWIP_STATS is not set @@ -421,44 +696,86 @@ CONFIG_LWIP_GARP_TMR_INTERVAL=60 CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set + +# +# DHCP server +# CONFIG_LWIP_DHCPS_LEASE_UNIT=60 CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +# end of DHCP server + # CONFIG_LWIP_AUTOIP is not set +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set CONFIG_LWIP_NETIF_LOOPBACK=y CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# CONFIG_LWIP_MAX_ACTIVE_TCP=16 CONFIG_LWIP_MAX_LISTENING_TCP=16 CONFIG_LWIP_TCP_MAXRTX=12 CONFIG_LWIP_TCP_SYNMAXRTX=6 CONFIG_LWIP_TCP_MSS=1436 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 CONFIG_LWIP_TCP_MSL=60000 CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 CONFIG_LWIP_TCP_WND_DEFAULT=5744 CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +# CONFIG_LWIP_TCP_SACK_OUT is not set # CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_LWIP_TCP_OVERSIZE_MSS=y # CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +# end of TCP + +# +# UDP +# CONFIG_LWIP_MAX_UDP_PCBS=16 CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_LWIP_PPP_SUPPORT is not set + +# +# ICMP +# # CONFIG_LWIP_MULTICAST_PING is not set # CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1 CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +# end of SNTP +# end of LWIP + +# +# mbedTLS +# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y # CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set # CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384 # CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN is not set # CONFIG_MBEDTLS_DEBUG is not set +CONFIG_MBEDTLS_ECP_RESTARTABLE=y +CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y # CONFIG_MBEDTLS_HARDWARE_MPI is not set # CONFIG_MBEDTLS_HARDWARE_SHA is not set @@ -471,6 +788,10 @@ CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y CONFIG_MBEDTLS_TLS_SERVER=y CONFIG_MBEDTLS_TLS_CLIENT=y CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# CONFIG_MBEDTLS_PSK_MODES=y CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK=y @@ -483,6 +804,8 @@ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + CONFIG_MBEDTLS_SSL_RENEGOTIATION=y # CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set CONFIG_MBEDTLS_SSL_PROTO_TLS1=y @@ -492,6 +815,10 @@ CONFIG_MBEDTLS_SSL_PROTO_DTLS=y CONFIG_MBEDTLS_SSL_ALPN=y CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# CONFIG_MBEDTLS_AES_C=y # CONFIG_MBEDTLS_CAMELLIA_C is not set # CONFIG_MBEDTLS_DES_C is not set @@ -502,11 +829,19 @@ CONFIG_MBEDTLS_RC4_DISABLED=y # CONFIG_MBEDTLS_XTEA_C is not set CONFIG_MBEDTLS_CCM_C=y CONFIG_MBEDTLS_GCM_C=y +# end of Symmetric Ciphers + # CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# CONFIG_MBEDTLS_PEM_PARSE_C=y CONFIG_MBEDTLS_PEM_WRITE_C=y CONFIG_MBEDTLS_X509_CRL_PARSE_C=y CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + CONFIG_MBEDTLS_ECP_C=y CONFIG_MBEDTLS_ECDH_C=y CONFIG_MBEDTLS_ECDSA_C=y @@ -523,7 +858,25 @@ CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_SECURITY_RISKS is not set +# end of mbedTLS + +# +# mDNS +# CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# end of mDNS + +# +# ESP-MQTT Configurations +# CONFIG_MQTT_PROTOCOL_311=y CONFIG_MQTT_TRANSPORT_SSL=y CONFIG_MQTT_TRANSPORT_WEBSOCKET=y @@ -531,6 +884,11 @@ CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y # CONFIG_MQTT_USE_CUSTOM_CONFIG is not set # CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set # CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y # CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set # CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set @@ -538,9 +896,24 @@ CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y # CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y # CONFIG_NEWLIB_NANO_FORMAT is not set +# end of Newlib + +# +# NVS +# +# end of NVS + +# +# OpenSSL +# # CONFIG_OPENSSL_DEBUG is not set CONFIG_OPENSSL_ASSERT_DO_NOTHING=y # CONFIG_OPENSSL_ASSERT_EXIT is not set +# end of OpenSSL + +# +# PThreads +# CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_PTHREAD_STACK_MIN=768 @@ -549,6 +922,11 @@ CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y # CONFIG_PTHREAD_DEFAULT_CORE_1 is not set CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# SPI Flash driver +# # CONFIG_SPI_FLASH_VERIFY_WRITE is not set # CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y @@ -556,44 +934,103 @@ CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y # CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set # CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set # CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set + +# +# Auto-detect flash chips +# CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +# end of Auto-detect flash chips +# end of SPI Flash driver + +# +# SPIFFS Configuration +# CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# CONFIG_SPIFFS_CACHE=y CONFIG_SPIFFS_CACHE_WR=y # CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + CONFIG_SPIFFS_PAGE_CHECK=y CONFIG_SPIFFS_GC_MAX_RUNS=10 # CONFIG_SPIFFS_GC_STATS is not set CONFIG_SPIFFS_PAGE_SIZE=256 CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set CONFIG_SPIFFS_USE_MAGIC=y CONFIG_SPIFFS_USE_MAGIC_LENGTH=y CONFIG_SPIFFS_META_LENGTH=4 CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# # CONFIG_SPIFFS_DBG is not set # CONFIG_SPIFFS_API_DBG is not set # CONFIG_SPIFFS_GC_DBG is not set # CONFIG_SPIFFS_CACHE_DBG is not set # CONFIG_SPIFFS_CHECK_DBG is not set # CONFIG_SPIFFS_TEST_VISUALISATION is not set -CONFIG_NETIF_IP_LOST_TIMER_INTERVAL=120 -CONFIG_TCPIP_LWIP=y +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# Unity unit testing library +# CONFIG_UNITY_ENABLE_FLOAT=y CONFIG_UNITY_ENABLE_DOUBLE=y # CONFIG_UNITY_ENABLE_COLOR is not set CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_FIXTURE is not set # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# Virtual file system +# CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y CONFIG_VFS_SUPPORT_TERMIOS=y + +# +# Host File System I/O (Semihosting) +# CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# # CONFIG_WL_SECTOR_SIZE_512 is not set CONFIG_WL_SECTOR_SIZE_4096=y CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# end of Wi-Fi Provisioning Manager + +# +# Supplicant +# CONFIG_WPA_MBEDTLS_CRYPTO=y +# end of Supplicant +# end of Component config + +# +# Compatibility options +# # CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set +# end of Compatibility options # Deprecated options for backward compatibility CONFIG_TOOLPREFIX="xtensa-esp32-elf-" @@ -621,8 +1058,8 @@ CONFIG_MONITOR_BAUD_115200B=y # CONFIG_MONITOR_BAUD_OTHER is not set CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 -CONFIG_OPTIMIZATION_LEVEL_DEBUG=y -# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set @@ -632,9 +1069,11 @@ CONFIG_STACK_CHECK_NONE=y # CONFIG_STACK_CHECK_NORM is not set # CONFIG_STACK_CHECK_STRONG is not set # CONFIG_STACK_CHECK_ALL is not set -# CONFIG_STACK_CHECK is not set CONFIG_WARN_WRITE_STRINGS=y # CONFIG_DISABLE_GCC8_WARNINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY=y # CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY is not set # CONFIG_BTDM_CONTROLLER_MODE_BTDM is not set @@ -653,15 +1092,13 @@ CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR=y CONFIG_SCAN_DUPLICATE_TYPE=0 CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200 # CONFIG_BLE_MESH_SCAN_DUPLICATE_EN is not set -# CONFIG_BTDM_CONTROLLER_FULL_SCAN_SUPPORTED is not set +CONFIG_BTDM_CONTROLLER_FULL_SCAN_SUPPORTED=y CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED=y CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM=100 CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 # CONFIG_BLUEDROID_ENABLED is not set CONFIG_ADC2_DISABLE_DAC=y # CONFIG_SPIRAM_SUPPORT is not set -# CONFIG_MEMMAP_TRACEMEM is not set -# CONFIG_MEMMAP_TRACEMEM_TWOBANKS is not set CONFIG_TRACEMEM_RESERVE_DRAM=0x0 # CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y @@ -707,10 +1144,6 @@ CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_POST_EVENTS_FROM_ISR=y CONFIG_POST_EVENTS_FROM_IRAM_ISR=y CONFIG_SW_COEXIST_ENABLE=y -# CONFIG_SW_COEXIST_PREFERENCE_WIFI is not set -CONFIG_SW_COEXIST_PREFERENCE_BT=y -# CONFIG_SW_COEXIST_PREFERENCE_BALANCE is not set -CONFIG_SW_COEXIST_PREFERENCE_VALUE=1 CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 CONFIG_MB_QUEUE_LENGTH=20 @@ -764,7 +1197,6 @@ CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set -CONFIG_IP_LOST_TIMER_INTERVAL=120 CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y CONFIG_SUPPORT_TERMIOS=y # End of deprecated options diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..d57ff74 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/bletest/main.c b/src/bletest/main.c deleted file mode 100644 index 1f1542f..0000000 --- a/src/bletest/main.c +++ /dev/null @@ -1,212 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void ble_store_ram_init(void); - -#define B0(x) ((x) & 0xFF) -#define B1(x) (((x) >> 8) & 0xFF) -#define B2(x) (((x) >> 16) & 0xFF) -#define B3(x) (((x) >> 24) & 0xFF) -#define B4(x) (((x) >> 32) & 0xFF) -#define B5(x) (((x) >> 40) & 0xFF) - -#define UUID128_CONST(a32, b16, c16, d16, e48) \ - BLE_UUID128_INIT( \ - B0(e48), B1(e48), B2(e48), B3(e48), B4(e48), B5(e48), \ - B0(d16), B1(d16), \ - B0(c16), B1(c16), \ - B0(b16), B1(b16), \ - B0(a32), B1(a32), B2(a32), B3(a32), \ - ) - -static ble_uuid128_t service_uuid = UUID128_CONST(0xf6b35e8c, 0xb4a7, 0x4838, 0x8569, 0xe9091b9a8b0e); -static ble_uuid128_t timer_uuid = UUID128_CONST(0x6952b350, 0x8d61, 0x4461, 0xb9c9, 0xb1ebfa70a838); -static ble_uuid16_t cpf_uuid = BLE_UUID16_INIT(0x2904); - -static uint8_t addr_type; -static ble_gatt_access_fn read_timer_chr; -static ble_gatt_access_fn read_cpf_dsc; -static void advertise(); - -static const struct ble_gatt_svc_def service_list[] = { - { - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = &service_uuid.u, - .characteristics = (struct ble_gatt_chr_def[]){ - { - .uuid = &timer_uuid.u, - .access_cb = read_timer_chr, - .descriptors = (struct ble_gatt_dsc_def[]){ - { - .uuid = &cpf_uuid.u, - .att_flags = BLE_ATT_F_READ, - .access_cb = read_cpf_dsc, - }, - {}, // End of descriptor list. - }, - .flags = BLE_GATT_CHR_F_READ, - }, - {}, // End of characteristic list. - }, - }, - {}, // End of service list. -}; - -static void server_init() { - int err; - char buf[40]; - - ble_uuid_to_str((ble_uuid_t *)&service_uuid, buf); - printf("service UUID: %s\n", buf); - - ble_uuid_to_str((ble_uuid_t *)&timer_uuid, buf); - printf("timer UUID: %s\n", buf); - - ble_svc_gap_init(); - ble_svc_gatt_init(); - - err = ble_gatts_count_cfg(service_list); - assert(!err); - - err = ble_gatts_add_svcs(service_list); - assert(!err); -} - -static void host_task(void *arg) { - nimble_port_run(); -} - -static int handle_gap_event(struct ble_gap_event *e, void *arg) { - switch (e->type) { - case BLE_GAP_EVENT_CONNECT: - if (e->connect.status != 0) { - // Connection failed; resume advertising. - printf("connection failed\n"); - advertise(); - return 0; - } - printf("connected\n"); - break; - case BLE_GAP_EVENT_DISCONNECT: - // Connection terminated; resume advertising. - printf("disconnected\n"); - advertise(); - break; - case BLE_GAP_EVENT_ADV_COMPLETE: - printf("advertising complete\n"); - advertise(); - break; - default: - printf("GAP event %d\n", e->type); - break; - } - return 0; -} - -static void advertise() { - struct ble_hs_adv_fields fields; - memset(&fields, 0, sizeof(fields)); - - fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP; - - fields.tx_pwr_lvl_is_present = 1; - fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; - - const char *name = ble_svc_gap_device_name(); - fields.name = (uint8_t *)name; - fields.name_len = strlen(name); - fields.name_is_complete = 1; - - fields.uuids128 = &service_uuid; - fields.num_uuids128 = 1; - fields.uuids128_is_complete = 1; - - int err = ble_gap_adv_set_fields(&fields); - assert(!err); - - // Begin advertising. - struct ble_gap_adv_params adv; - memset(&adv, 0, sizeof(adv)); - adv.conn_mode = BLE_GAP_CONN_MODE_UND; - adv.disc_mode = BLE_GAP_DISC_MODE_GEN; - - err = ble_gap_adv_start(addr_type, 0, BLE_HS_FOREVER, &adv, handle_gap_event, 0); - assert(!err); - - printf("advertising started\n"); -} - -static void sync_callback() { - int err; - - err = ble_hs_util_ensure_addr(0); - assert(!err); - - err = ble_hs_id_infer_auto(0, &addr_type); - assert(!err); - - uint8_t addr[6]; - ble_hs_id_copy_addr(addr_type, addr, 0); - printf("device address: "); - for (int i = 0; i < sizeof(addr); i++) { - printf("%s%02x", i == 0 ? "" : ":", addr[i]); - } - printf("\n"); - - advertise(); -} - -static int read_timer_chr(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { - assert(ble_uuid_cmp(ctxt->chr->uuid, &timer_uuid.u) == 0); - assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR); - uint32_t ms = esp_timer_get_time() / 1000; - printf("timer value = %u\n", ms); - if (os_mbuf_append(ctxt->om, &ms, sizeof(ms)) != 0) { - return BLE_ATT_ERR_INSUFFICIENT_RES; - } - return 0; -} - -static int read_cpf_dsc(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { - assert(ble_uuid_cmp(ctxt->dsc->uuid, &cpf_uuid.u) == 0); - assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_DSC); - printf("read CPF descriptor\n"); - uint8_t data[7] = { - [0] = 8, // format = uint32 - [4] = 1, // namespace = Bluetooth SIG Assigned Numbers - }; - if (os_mbuf_append(ctxt->om, data, sizeof(data)) != 0) { - return BLE_ATT_ERR_INSUFFICIENT_RES; - } - return 0; -} - -void app_main() { - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); - } - ESP_ERROR_CHECK(ret); - ESP_ERROR_CHECK(esp_nimble_hci_and_controller_init()); - nimble_port_init(); - - ble_hs_cfg.sync_cb = sync_callback; - - server_init(); - - int err = ble_svc_gap_device_name_set("ESP32"); - assert(!err); - - ble_store_ram_init(); - nimble_port_freertos_init(host_task); -} diff --git a/src/blink/main.c b/src/blink/main.c deleted file mode 100644 index f294919..0000000 --- a/src/blink/main.c +++ /dev/null @@ -1,17 +0,0 @@ -#include - -#include - -#include "module.h" - -#define MILLISECONDS 1000 - -void app_main() { - gpio_set_direction(LED, GPIO_MODE_OUTPUT); - int on_off = 0; - for (;;) { - on_off ^= 1; - gpio_set_level(LED, on_off); - usleep(500*MILLISECONDS); - } -} diff --git a/src/gnarl/ble.c b/src/gnarl/ble.c index e7865c1..b2ee653 100644 --- a/src/gnarl/ble.c +++ b/src/gnarl/ble.c @@ -13,11 +13,13 @@ #include #include "commands.h" -#include "display.h" +//#include "led.h" + #define MAX_DATA 150 void ble_store_ram_init(void); +int ble_errors = 0; #define B0(x) ((x) & 0xFF) #define B1(x) (((x) >> 8) & 0xFF) @@ -106,7 +108,7 @@ static const struct ble_gatt_svc_def service_list[] = { {}, // End of service list. }; -static void server_init() { +static void server_init(void) { int err; char u[60]; @@ -130,7 +132,7 @@ static void server_init() { ESP_ERROR_CHECK(esp_timer_start_periodic(t, 60*SECONDS)); } -static void advertise() { +static void advertise(void) { struct ble_hs_adv_fields fields; memset(&fields, 0, sizeof(fields)); @@ -163,6 +165,7 @@ static void advertise() { ESP_LOGD(TAG, "advertising started"); } + static int handle_gap_event(struct ble_gap_event *e, void *arg) { switch (e->type) { case BLE_GAP_EVENT_CONNECT: @@ -172,7 +175,7 @@ static int handle_gap_event(struct ble_gap_event *e, void *arg) { return 0; } connected = true; - display_update(CONNECTED, true); + //led_on(); connection_handle = e->connect.conn_handle; ESP_LOGI(TAG, "connected"); ESP_LOGD(TAG, "connection handle %04X", connection_handle); @@ -181,9 +184,13 @@ static int handle_gap_event(struct ble_gap_event *e, void *arg) { break; case BLE_GAP_EVENT_DISCONNECT: connected = false; - display_update(CONNECTED, false); + //led_off(); ESP_LOGD(TAG, "disconnected"); advertise(); + ble_errors = ble_errors + 1; + if (ble_errors > 2) { + esp_restart(); + } break; case BLE_GAP_EVENT_ADV_COMPLETE: ESP_LOGD(TAG, "advertising complete"); @@ -209,7 +216,7 @@ static int handle_gap_event(struct ble_gap_event *e, void *arg) { return 0; } -static void sync_callback() { +static void sync_callback(void) { int err; err = ble_hs_util_ensure_addr(0); @@ -236,7 +243,7 @@ static uint16_t data_in_len; static uint8_t data_out[MAX_DATA]; static uint16_t data_out_len; -static void response_notify() { +static void response_notify(void) { response_count++; if (!response_count_notify_state) { ESP_LOGD(TAG, "not notifying for response count %d", response_count); @@ -382,15 +389,10 @@ static void host_task(void *arg) { nimble_port_run(); } -void gnarl_init() { +void gnarl_init(void) { start_gnarl_task(); - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); - } - ESP_ERROR_CHECK(ret); + ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_nimble_hci_and_controller_init()); nimble_port_init(); @@ -398,7 +400,7 @@ void gnarl_init() { server_init(); - int err = ble_svc_gap_device_name_set("GNARL"); + int err = ble_svc_gap_device_name_set("PICKL"); assert(!err); ble_store_ram_init(); diff --git a/src/gnarl/dependencies b/src/gnarl/dependencies new file mode 100644 index 0000000..75a9e8b --- /dev/null +++ b/src/gnarl/dependencies @@ -0,0 +1,2 @@ +medtronic +radio diff --git a/src/gnarl/display.c b/src/gnarl/display.c deleted file mode 100644 index ae890c4..0000000 --- a/src/gnarl/display.c +++ /dev/null @@ -1,135 +0,0 @@ -#include "gnarl.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include "display.h" -#include "module.h" -#include "oled.h" - -typedef struct { - display_op_t op; - int arg; -} display_command_t; - -#define QUEUE_LENGTH 100 - -static QueueHandle_t display_queue; - -static int connected = false; -static int phone_rssi; -static int pump_rssi; -static int command_time; // seconds - -#define DISPLAY_TIMEOUT 5 // seconds - -static void format_time_ago(char *buf) { - int now = esp_timer_get_time() / 1000000; - int delta = now - command_time; - int min = delta / 60; - if (min == 0) { - sprintf(buf, "%ds", delta); - return; - } - if (min < 60) { - sprintf(buf, "%dm", min); - return; - } - int hr = min / 60; - min = min % 60; - sprintf(buf, "%dh%dm", hr, min); -} - -static void update(display_command_t cmd) { - switch (cmd.op) { - case PHONE_RSSI: - phone_rssi = cmd.arg; - ESP_LOGD(TAG, "phone RSSI = %d", phone_rssi); - return; - case PUMP_RSSI: - pump_rssi = cmd.arg; - ESP_LOGD(TAG, "pump RSSI = %d", pump_rssi); - return; - case COMMAND_TIME: - command_time = cmd.arg; - ESP_LOGD(TAG, "command time = %d", command_time); - return; - case CONNECTED: - connected = cmd.arg; - break; - default: - break; - } - oled_on(); - oled_clear(); - - oled_font_medium(); - oled_align_center(); - oled_draw_string(64, 15, connected ? "Connected" : "Disconnected"); - - oled_font_small(); - oled_align_left(); - oled_draw_string(5, 32, "Last command:"); - oled_draw_string(5, 46, "Phone RSSI:"); - oled_draw_string(5, 60, "Pump RSSI:"); - - oled_align_right(); - char buf[16]; - format_time_ago(buf); - oled_draw_string(122, 32, buf); - if (connected) { - sprintf(buf, "%d", phone_rssi); - oled_draw_string(122, 46, buf); - sprintf(buf, "%d", pump_rssi); - oled_draw_string(122, 60, buf); - } else { - oled_draw_string(122, 46, "--"); - oled_draw_string(122, 60, "--"); - } - - oled_update(); - usleep(DISPLAY_TIMEOUT*SECONDS); - oled_off(); -} - -static void display_loop() { - for (;;) { - display_command_t cmd; - if (!xQueueReceive(display_queue, &cmd, pdMS_TO_TICKS(100))) { - continue; - } - ESP_LOGD(TAG, "display_loop: op %d arg %d", cmd.op, cmd.arg); - update(cmd); - } -} - -static void button_interrupt() { - display_command_t cmd = { .op = SHOW_STATUS }; - xQueueSendFromISR(display_queue, &cmd, 0); -} - -void display_update(display_op_t op, int arg) { - display_command_t cmd = { .op = op, .arg = arg }; - if (!xQueueSend(display_queue, &cmd, 0)) { - ESP_LOGE(TAG, "display_update: queue full"); - } -} - -void display_init(void) { - oled_init(); - display_queue = xQueueCreate(QUEUE_LENGTH, sizeof(display_command_t)); - xTaskCreate(display_loop, "display", 2048, 0, 10, 0); - display_update(SHOW_STATUS, 0); - - // Enable interrupt on button press. - gpio_set_direction(BUTTON, GPIO_MODE_INPUT); - gpio_set_intr_type(BUTTON, GPIO_INTR_NEGEDGE); - gpio_isr_handler_add(BUTTON, button_interrupt, 0); - gpio_intr_enable(BUTTON); -} diff --git a/src/gnarl/display.h b/src/gnarl/display.h deleted file mode 100644 index dc67d2e..0000000 --- a/src/gnarl/display.h +++ /dev/null @@ -1,11 +0,0 @@ -typedef enum { - CONNECTED, - PHONE_RSSI, - PUMP_RSSI, - COMMAND_TIME, - SHOW_STATUS, -} display_op_t; - -void display_init(void); - -void display_update(display_op_t op, int arg); diff --git a/src/gnarl/gnarl.c b/src/gnarl/gnarl.c index 7d37343..54ea0ac 100644 --- a/src/gnarl/gnarl.c +++ b/src/gnarl/gnarl.c @@ -11,11 +11,10 @@ #include "4b6b.h" #include "commands.h" -#include "display.h" #include "rfm95.h" -#define MAX_PARAM_LEN 16 -#define MAX_PACKET_LEN 107 +#define MAX_PARAM_LEN 32 +#define MAX_PACKET_LEN 256 typedef enum { ENCODING_NONE = 0, @@ -208,7 +207,7 @@ static inline bool valid_frequency(uint32_t f) { } // Change the radio frequency if the current register values make sense. -static void check_frequency() { +static void check_frequency(void) { uint32_t f = ((uint32_t)fr[0] << 16) + ((uint32_t)fr[1] << 8) + ((uint32_t)fr[2]); uint32_t freq = (uint32_t)(((uint64_t)f * 24*MHz) >> 16); if (valid_frequency(freq)) { @@ -292,9 +291,9 @@ void rfspy_command(const uint8_t *buf, int count, int rssi) { ESP_LOGD(TAG, "rfspy_command %d, queue length %d", cmd, uxQueueMessagesWaiting(request_queue)); } -static void gnarl_loop() { +static void gnarl_loop(void *unused) { ESP_LOGD(TAG, "starting gnarl_loop"); - const int timeout_ms = 60*MILLISECONDS; + const int timeout_ms = 30*MILLISECONDS; for (;;) { rfspy_request_t req; if (!xQueueReceive(request_queue, &req, pdMS_TO_TICKS(timeout_ms))) { @@ -320,7 +319,6 @@ static void gnarl_loop() { case CmdSendAndListen: ESP_LOGI(TAG, "CmdSendAndListen"); send_and_listen(req.data, req.length); - display_update(PUMP_RSSI, read_rssi()); break; case CmdUpdateRegister: ESP_LOGI(TAG, "CmdUpdateRegister"); @@ -342,13 +340,11 @@ static void gnarl_loop() { ESP_LOGE(TAG, "unimplemented rfspy command %d", req.command); break; } - display_update(PHONE_RSSI, req.rssi); - display_update(COMMAND_TIME, esp_timer_get_time()/SECONDS); } } -void start_gnarl_task() { +void start_gnarl_task(void) { request_queue = xQueueCreate(QUEUE_LENGTH, sizeof(rfspy_request_t)); // Start radio task with high priority to avoid receiving truncated packets. - xTaskCreate(gnarl_loop, "gnarl", 4096, 0, 24, 0); + xTaskCreate(gnarl_loop, "PICKL", 8192, 0, tskIDLE_PRIORITY + 24, 0); } diff --git a/src/gnarl/gnarl.h b/src/gnarl/gnarl.h index c544b42..e7864c4 100644 --- a/src/gnarl/gnarl.h +++ b/src/gnarl/gnarl.h @@ -2,6 +2,7 @@ #include "version.h" +#define TAG "GNARL" #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG #include @@ -10,8 +11,6 @@ #define MHz 1000000 -#define TAG "GNARL" - // Track github.com/ps2/rileylink/firmware/ble113_rfspy/gatt.xml #define BLE_RFSPY_VERSION "ble_rfspy 2.0" diff --git a/src/gnarl/led.h b/src/gnarl/led.h new file mode 100644 index 0000000..e653b04 --- /dev/null +++ b/src/gnarl/led.h @@ -0,0 +1,25 @@ +#include + +#include +#include "module.h" + +void led_on() { + gpio_set_direction(LED, GPIO_MODE_OUTPUT); + gpio_set_level(LED, 1); +} + +void led_off() { + gpio_set_direction(LED, GPIO_MODE_OUTPUT); + gpio_set_level(LED, 0); +} + + +void blink() { + while(1) { + led_on(); + for(int i = 0; i < 999999; i++); + led_off(); + for(int i = 0; i < 999999; i++); + } + return 0; +} diff --git a/src/gnarl/main.c b/src/gnarl/main.c index 9368ef5..a380271 100644 --- a/src/gnarl/main.c +++ b/src/gnarl/main.c @@ -1,21 +1,16 @@ #include "gnarl.h" #include - -#include - -#include "display.h" #include "rfm95.h" -#define PUMP_FREQUENCY 916600000 +#define PUMP_FREQUENCY 868000000 -void app_main() { +void app_main(void) { ESP_LOGI(TAG, "%s", SUBG_RFSPY_VERSION); rfm95_init(); uint8_t v = read_version(); ESP_LOGD(TAG, "radio version %d.%d", version_major(v), version_minor(v)); set_frequency(PUMP_FREQUENCY); ESP_LOGD(TAG, "frequency set to %d Hz", read_frequency()); - display_init(); gnarl_init(); } diff --git a/src/gnarl/sdkconfig b/src/gnarl/sdkconfig new file mode 100644 index 0000000..9f097a0 --- /dev/null +++ b/src/gnarl/sdkconfig @@ -0,0 +1,1164 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) Project Configuration +# +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 + +# +# SDK tool configuration +# +CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set +# end of SDK tool configuration + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# end of Build type + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# end of Application manager + +# +# Bootloader config +# +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 +# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT_ENABLED is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="40m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" +CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y +# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +CONFIG_COMPILER_WARN_WRITE_STRINGS=y +# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_TRAX is not set +CONFIG_APPTRACE_DEST_NONE=y +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +CONFIG_BT_ENABLED=y + +# +# Bluetooth controller +# +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +# CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set +# CONFIG_BTDM_CTRL_MODE_BTDM is not set +CONFIG_BTDM_CTRL_BLE_MAX_CONN=3 +CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=0 +CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF=3 +CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF=0 +CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF=0 +CONFIG_BTDM_CTRL_PINNED_TO_CORE_0=y +# CONFIG_BTDM_CTRL_PINNED_TO_CORE_1 is not set +CONFIG_BTDM_CTRL_PINNED_TO_CORE=0 +CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y +# CONFIG_BTDM_CTRL_HCI_MODE_UART_H4 is not set + +# +# MODEM SLEEP Options +# +CONFIG_BTDM_MODEM_SLEEP=y +CONFIG_BTDM_MODEM_SLEEP_MODE_ORIG=y +# CONFIG_BTDM_MODEM_SLEEP_MODE_EVED is not set +CONFIG_BTDM_LPCLK_SEL_MAIN_XTAL=y +# end of MODEM SLEEP Options + +CONFIG_BTDM_BLE_DEFAULT_SCA_250PPM=y +CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1 +CONFIG_BTDM_BLE_SCAN_DUPL=y +CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE=y +# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA is not set +# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE is not set +CONFIG_BTDM_SCAN_DUPL_TYPE=0 +CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=200 +# CONFIG_BTDM_BLE_MESH_SCAN_DUPL_EN is not set +CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED=y +CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y +CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100 +CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 +# CONFIG_BTDM_COEX_BT_OPTIONS is not set +# end of Bluetooth controller + +# CONFIG_BT_BLUEDROID_ENABLED is not set +CONFIG_BT_NIMBLE_ENABLED=y +# CONFIG_BT_CONTROLLER_ONLY is not set +CONFIG_BT_RESERVE_DRAM=0xdb5c + +# +# NimBLE Options +# +CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y +# CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=3 +CONFIG_BT_NIMBLE_MAX_BONDS=3 +CONFIG_BT_NIMBLE_MAX_CCCDS=8 +CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=0 +CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=y +# CONFIG_BT_NIMBLE_PINNED_TO_CORE_1 is not set +CONFIG_BT_NIMBLE_PINNED_TO_CORE=0 +CONFIG_BT_NIMBLE_TASK_STACK_SIZE=4096 +CONFIG_BT_NIMBLE_ROLE_CENTRAL=y +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y +CONFIG_BT_NIMBLE_ROLE_OBSERVER=y +CONFIG_BT_NIMBLE_NVS_PERSIST=y +CONFIG_BT_NIMBLE_SM_LEGACY=y +CONFIG_BT_NIMBLE_SM_SC=y +# CONFIG_BT_NIMBLE_DEBUG is not set +# CONFIG_BT_NIMBLE_SM_SC_DEBUG_KEYS is not set +CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble" +CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31 +CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256 +CONFIG_BT_NIMBLE_SVC_GAP_APPEARANCE=0 +CONFIG_BT_NIMBLE_ACL_BUF_COUNT=12 +CONFIG_BT_NIMBLE_ACL_BUF_SIZE=255 +CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 +CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=30 +CONFIG_BT_NIMBLE_HCI_EVT_LO_BUF_COUNT=8 +CONFIG_BT_NIMBLE_MSYS1_BLOCK_COUNT=12 +CONFIG_BT_NIMBLE_HS_FLOW_CTRL=y +CONFIG_BT_NIMBLE_HS_FLOW_CTRL_ITVL=1000 +CONFIG_BT_NIMBLE_HS_FLOW_CTRL_THRESH=2 +CONFIG_BT_NIMBLE_HS_FLOW_CTRL_TX_ON_DISCONNECT=y +CONFIG_BT_NIMBLE_RPA_TIMEOUT=900 +# CONFIG_BT_NIMBLE_MESH is not set +CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS=y +# end of NimBLE Options +# end of Bluetooth + +# CONFIG_BLE_MESH is not set + +# +# CoAP Configuration +# +CONFIG_COAP_MBEDTLS_PSK=y +# CONFIG_COAP_MBEDTLS_PKI is not set +# CONFIG_COAP_MBEDTLS_DEBUG is not set +CONFIG_COAP_LOG_DEFAULT_LEVEL=0 +# end of CoAP Configuration + +# +# Driver configurations +# + +# +# ADC configuration +# +# CONFIG_ADC_FORCE_XPD_FSM is not set +CONFIG_ADC_DISABLE_DAC=y +# end of ADC configuration + +# +# SPI configuration +# +CONFIG_SPI_MASTER_IN_IRAM=y +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +# CONFIG_SPI_SLAVE_ISR_IN_IRAM is not set +# end of SPI configuration + +# +# UART configuration +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of UART configuration + +# +# RTCIO configuration +# +# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set +# end of RTCIO configuration +# end of Driver configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set +CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set +CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_SERVER is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# end of ESP-TLS + +# +# ESP32-specific +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_DPORT_WORKAROUND=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_80=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=80 +# CONFIG_ESP32_SPIRAM_SUPPORT is not set +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32_ULP_COPROC_ENABLED is not set +CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32_PANIC_GDBSTUB is not set +CONFIG_ESP32_DEBUG_OCDAWARE=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_REDUCE_PHY_TX_POWER=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +# CONFIG_ESP32_XTAL_FREQ_40 is not set +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_AUTO=y +CONFIG_ESP32_XTAL_FREQ=0 +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set +CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 +# end of ESP32-specific + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +# end of Power Management + +# +# ADC-Calibration +# +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# end of ADC-Calibration + +# +# Common ESP-related +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +# CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 is not set +# CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 is not set +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# end of Common ESP-related + +# +# Ethernet +# +# CONFIG_ETH_USE_ESP32_EMAC is not set +# CONFIG_ETH_USE_SPI_ETHERNET is not set +# CONFIG_ETH_USE_OPENETH is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y +# end of ESP NETIF Adapter + +# +# Wi-Fi +# +CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +# CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +# CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE is not set +# end of Wi-Fi + +# +# PHY +# +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# end of PHY + +# +# Core dump +# +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# end of FAT Filesystem support + +# +# Modbus configuration +# +CONFIG_FMB_COMM_MODE_RTU_EN=y +CONFIG_FMB_COMM_MODE_ASCII_EN=y +CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_FMB_QUEUE_LENGTH=20 +CONFIG_FMB_SERIAL_TASK_STACK_SIZE=2048 +CONFIG_FMB_SERIAL_BUF_SIZE=256 +CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 +CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 +CONFIG_FMB_SERIAL_TASK_PRIO=10 +# CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT is not set +CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 +CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 +CONFIG_FMB_TIMER_PORT_ENABLED=y +CONFIG_FMB_TIMER_GROUP=0 +CONFIG_FMB_TIMER_INDEX=0 +# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set +# end of Modbus configuration + +# +# FreeRTOS +# +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y +# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set +# CONFIG_FREERTOS_ASSERT_DISABLE is not set +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +# CONFIG_FREERTOS_LEGACY_HOOKS is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION is not set +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_DEBUG_INTERNALS is not set +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +# end of FreeRTOS + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# end of Heap memory debugging + +# +# jsmn +# +# CONFIG_JSMN_PARENT_LINKS is not set +# CONFIG_JSMN_STRICT is not set +# end of jsmn + +# +# libsodium +# +CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y +# end of libsodium + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +CONFIG_LOG_DEFAULT_LEVEL_WARN=y +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=2 +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="gnarl" +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +CONFIG_LWIP_SO_RCVBUF=y +# CONFIG_LWIP_NETBUF_RECVINFO is not set +# CONFIG_LWIP_IP_FRAG is not set +# CONFIG_LWIP_IP_REASSEMBLY is not set +# CONFIG_LWIP_STATS is not set +# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set + +# +# DHCP server +# +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=6 +CONFIG_LWIP_TCP_MSS=1436 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 +CONFIG_LWIP_TCP_WND_DEFAULT=5744 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +# CONFIG_LWIP_TCP_SACK_OUT is not set +# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_LWIP_PPP_SUPPORT is not set + +# +# ICMP +# +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1 +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +# end of SNTP +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384 +# CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN is not set +# CONFIG_MBEDTLS_DEBUG is not set +CONFIG_MBEDTLS_ECP_RESTARTABLE=y +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +# CONFIG_MBEDTLS_HARDWARE_MPI is not set +# CONFIG_MBEDTLS_HARDWARE_SHA is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +CONFIG_MBEDTLS_PSK_MODES=y +CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y +CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_PSK=y +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set +CONFIG_MBEDTLS_SSL_PROTO_TLS1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +CONFIG_MBEDTLS_SSL_PROTO_DTLS=y +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +CONFIG_MBEDTLS_RC4_DISABLED=y +# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set +# CONFIG_MBEDTLS_RC4_ENABLED is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_SECURITY_RISKS is not set +# end of mbedTLS + +# +# mDNS +# +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# end of mDNS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +# end of Newlib + +# +# NVS +# +# end of NVS + +# +# OpenSSL +# +# CONFIG_OPENSSL_DEBUG is not set +CONFIG_OPENSSL_ASSERT_DO_NOTHING=y +# CONFIG_OPENSSL_ASSERT_EXIT is not set +# end of OpenSSL + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +# end of Auto-detect flash chips +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_VFS_SUPPORT_TERMIOS=y + +# +# Host File System I/O (Semihosting) +# +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# end of Wi-Fi Provisioning Manager + +# +# Supplicant +# +CONFIG_WPA_MBEDTLS_CRYPTO=y +# end of Supplicant +# end of Component config + +# +# Compatibility options +# +# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set +# end of Compatibility options + +# Deprecated options for backward compatibility +CONFIG_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +# CONFIG_MONITOR_BAUD_9600B is not set +# CONFIG_MONITOR_BAUD_57600B is not set +CONFIG_MONITOR_BAUD_115200B=y +# CONFIG_MONITOR_BAUD_230400B is not set +# CONFIG_MONITOR_BAUD_921600B is not set +# CONFIG_MONITOR_BAUD_2MB is not set +# CONFIG_MONITOR_BAUD_OTHER is not set +CONFIG_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_MONITOR_BAUD=115200 +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_CXX_EXCEPTIONS=y +CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +CONFIG_WARN_WRITE_STRINGS=y +# CONFIG_DISABLE_GCC8_WARNINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY=y +# CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY is not set +# CONFIG_BTDM_CONTROLLER_MODE_BTDM is not set +CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN=3 +CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=3 +CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 +CONFIG_BTDM_CONTROLLER_HCI_MODE_VHCI=y +# CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4 is not set +CONFIG_BTDM_CONTROLLER_MODEM_SLEEP=y +CONFIG_BLE_SCAN_DUPLICATE=y +CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR=y +# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA is not set +# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR is not set +CONFIG_SCAN_DUPLICATE_TYPE=0 +CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200 +# CONFIG_BLE_MESH_SCAN_DUPLICATE_EN is not set +CONFIG_BTDM_CONTROLLER_FULL_SCAN_SUPPORTED=y +CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED=y +CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM=100 +CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 +# CONFIG_BLUEDROID_ENABLED is not set +CONFIG_ADC2_DISABLE_DAC=y +# CONFIG_SPIRAM_SUPPORT is not set +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ULP_COPROC_ENABLED is not set +CONFIG_ULP_COPROC_RESERVE_MEM=0 +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_REDUCE_PHY_TX_POWER=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +# CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0 is not set +# CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_SW_COEXIST_ENABLE=y +CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_MB_QUEUE_LENGTH=20 +CONFIG_MB_SERIAL_TASK_STACK_SIZE=2048 +CONFIG_MB_SERIAL_BUF_SIZE=256 +CONFIG_MB_SERIAL_TASK_PRIO=10 +# CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT is not set +CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_MB_CONTROLLER_STACK_SIZE=4096 +CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 +CONFIG_MB_TIMER_PORT_ENABLED=y +CONFIG_MB_TIMER_GROUP=0 +CONFIG_MB_TIMER_INDEX=0 +# CONFIG_SUPPORT_STATIC_ALLOCATION is not set +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_L2_TO_L3_COPY is not set +# CONFIG_USE_ONLY_LWIP_SELECT is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=6 +CONFIG_TCP_MSS=1436 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5744 +CONFIG_TCP_WND_DEFAULT=5744 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +# End of deprecated options diff --git a/src/mmtune/main.c b/src/mmtune/main.c deleted file mode 100644 index 9d1face..0000000 --- a/src/mmtune/main.c +++ /dev/null @@ -1,105 +0,0 @@ -#include - -#include - -#include "medtronic.h" -#include "module.h" -#include "oled.h" -#include "pump.h" -#include "rfm95.h" - -int model; -int rssi; - -int try_frequency(uint32_t frequency) { - set_frequency(frequency); - printf("frequency set to %d Hz\n", read_frequency()); - printf("waking pump %s\n", PUMP_ID); - if (model == 0 && !pump_wakeup()) { - printf("wakeup failed\n"); - return -128; - } - model = pump_model(); - printf("model %d\n", model); - rssi = read_rssi(); - printf("rssi %d\n", rssi); - return rssi; -} - -void splash() { - oled_on(); - oled_font_large(); - oled_align_center(); - oled_draw_string(64, 44, "MMTune"); - oled_update(); -} - -void draw_freq_bar(uint32_t freq, int rssi) { - int x = 2 + 10*freq; - int y = -rssi/2 - 3; - int w = 6; - int h = OLED_HEIGHT - y; - oled_draw_box(x, y, w, h); -} - -#define SECONDS 1000000 -#define DISPLAY_TIMEOUT (30 * SECONDS) - -#define FP_FQ(n) (n)/1000000, ((n)%1000000)/1000 - -char str[100]; - -void app_main() { - rfm95_init(); - uint8_t v = read_version(); - printf("radio version %d.%d\n", version_major(v), version_minor(v)); - - oled_init(); - splash(); - usleep(2 * SECONDS); - pump_set_id(PUMP_ID); - - oled_clear(); - oled_font_medium(); - oled_align_left(); - oled_draw_string(0, 20, "Scanning..."); - oled_update(); - usleep(1 * SECONDS); - - int best_rssi = -128; - uint32_t best_freq = 0; - for (int i = 0; i <= 12; i++) { - uint32_t cur_freq = MMTUNE_START + 50000*i; - int rssi = try_frequency(cur_freq); - if (rssi > best_rssi) { - best_rssi = rssi; - best_freq = cur_freq; - } - draw_freq_bar(i, rssi); - usleep(100); - oled_update(); - usleep(1 * SECONDS); - } - printf("Best frequency %d Hz\n", best_freq); - printf("RSSI: %d\n", best_rssi); - oled_draw_string(0, 20, "Scanning... done."); - usleep(100); - oled_update(); - usleep(5 * SECONDS); - - oled_clear(); - oled_font_medium(); - oled_align_left(); - sprintf(str, "Best RSSI: %d", best_rssi); - oled_draw_string(0, 20, str); - sprintf(str, "Best Frq: %d.%03d", FP_FQ(best_freq)); - oled_draw_string(0, 40, str); - usleep(100); - oled_update(); - - usleep(DISPLAY_TIMEOUT); - - // Wake up on button press. - esp_sleep_enable_ext0_wakeup(BUTTON, 0); - esp_deep_sleep_start(); -} diff --git a/src/nightscout/CMakeLists.txt b/src/nightscout/CMakeLists.txt deleted file mode 100644 index dc053bf..0000000 --- a/src/nightscout/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -idf_component_register( - INCLUDE_DIRS . - SRC_DIRS . - EMBED_TXTFILES ../include/root_cert.pem -) diff --git a/src/nightscout/component.mk b/src/nightscout/component.mk deleted file mode 100644 index 6da13c5..0000000 --- a/src/nightscout/component.mk +++ /dev/null @@ -1 +0,0 @@ -COMPONENT_EMBED_TXTFILES := ../include/root_cert.pem diff --git a/src/nightscout/main.c b/src/nightscout/main.c deleted file mode 100644 index 88aff40..0000000 --- a/src/nightscout/main.c +++ /dev/null @@ -1,175 +0,0 @@ -#include -#include -#include - -#include - -#include - -#define TAG "NS" -#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG -#include -#include - -#include "nightscout_config.h" -#include "timezone.h" -#include "wifi.h" - -#define NIGHTSCOUT_URL "https://" NIGHTSCOUT_HOST -#define NS_URL NIGHTSCOUT_URL "/api/v1/entries.json" - -static const char *request = "GET " NS_URL " HTTP/1.0\r\n" - "Host: "NIGHTSCOUT_HOST"\r\n" - "User-Agent: esp-idf/4.1 esp32\r\n" - "\r\n"; - -// Root cert for Nightscout server. -// The PEM file was extracted from the output of this command: -// openssl s_client -showcerts -connect NIGHTSCOUT_HOST:443 0) { - int n = esp_tls_conn_write(tls, p, len); - if (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE) { - continue; - } - if (n < 0) { - ESP_LOGE(TAG, "esp_tls_conn_write returned %d", n); - esp_tls_conn_delete(tls); - return 0; - } - if (n == 0) { - ESP_LOGE(TAG, "no response (connection closed)"); - esp_tls_conn_delete(tls); - return 0; - } - ESP_LOGI(TAG, "%d bytes written", n); - p += n; - len -= n; - } - - static char response[4096]; - p = response; - len = sizeof(response)-1; - while (len > 0) { - int n = esp_tls_conn_read(tls, p, len); - if (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE) { - continue; - } - if (n < 0) { - ESP_LOGE(TAG, "esp_tls_conn_read returned %d", n); - esp_tls_conn_delete(tls); - return 0; - } - if (n == 0) { - ESP_LOGI(TAG, "connection closed"); - break; - } - ESP_LOGI(TAG, "%d bytes read", n); - p += n; - len -= n; - } - if (len == 0) { - // Response buffer may be too small! - ESP_LOGW(TAG, "%d-byte response from %s", sizeof(response)-1, NS_URL); - } - *p = 0; - esp_tls_conn_delete(tls); - return response; -} - -// Find the body after the \r\n\r\n separator. -const char *find_body(const char *response) { - for (const char *p = response; *p; p++) { - if (p[0] == '\r' && p[1] == '\n' && p[2] == '\r' && p[3] == '\n') { - return &p[4]; - } - } - return 0; -} - -cJSON *parse_response(const char *response) { - const char *body = find_body(response); - if (!body) { - return 0; - } - return cJSON_Parse(body); -} - -void print_entry(const cJSON *e) { - const cJSON *item = cJSON_GetObjectItem(e, "type"); - if (!item) { - ESP_LOGE(TAG, "JSON entry has no type field"); - return; - } - const char *typ = item->valuestring; - if (strcmp(typ, "sgv") != 0) { - ESP_LOGI(TAG, "ignoring JSON entry with type %s", typ); - return; - } - item = cJSON_GetObjectItem(e, "date"); - if (!item) { - ESP_LOGI(TAG, "JSON entry has no date field"); - return; - } - time_t t = (time_t)(item->valuedouble / 1000); - item = cJSON_GetObjectItem(e, "sgv"); - if (!item) { - ESP_LOGE(TAG, "ignoring JSON entry with no sgv field"); - return; - } - int sgv = item->valueint; - struct tm *tm = localtime(&t); - static char buf[20]; - strftime(buf, sizeof(buf), "%F %T", tm); - printf("%s %3d\n", buf, sgv); -} - -void app_main(void) { - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); - } - ESP_ERROR_CHECK(ret); - wifi_init(); - ESP_LOGI(TAG, "setting TZ = %s", TZ); - setenv("TZ", TZ, 1); - tzset(); - const char *resp = https_get(); - if (!resp) { - return; - } - cJSON *root = parse_response(resp); - if (!root || !cJSON_IsArray(root)) { - ESP_LOGE(TAG, "expected JSON array from %s", NS_URL); - puts(resp); - return; - } - int n = cJSON_GetArraySize(root); - ESP_LOGI(TAG, "received JSON array of %d entries", n); - for (int i = 0; i < n; i++) { - print_entry(cJSON_GetArrayItem(root, i)); - } - cJSON_Delete(root); -} diff --git a/src/oledtest/main.c b/src/oledtest/main.c deleted file mode 100644 index 44dd397..0000000 --- a/src/oledtest/main.c +++ /dev/null @@ -1,92 +0,0 @@ -#include -#include - -#include "oled.h" - -const char *lorem_ipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; - -inline int is_space(char c) { - return c == ' ' || c == '\t' || c == '\n'; -} - -const char *next_word(const char *s, char *buf, int bufsize) { - int n = 0; - while (*s != 0 && is_space(*s)) { - s++; - } - if (*s == 0) { - return 0; - } - while (*s != 0 && !is_space(*s)) { - if (n == bufsize - 1) { - break; - } - buf[n++] = *s++; - } - buf[n] = 0; - return s; -} - -void draw_text(const char *s) { - int asc = oled_font_ascent(); - int desc = oled_font_descent(); - int vsp = 1; - int hsp = oled_string_width(" "); - int x = 0; - int y = asc; - char word[20]; - const char *p = s; - for (;;) { - p = next_word(p, word, sizeof(word)); - if (p == 0) { - return; - } - int n = oled_string_width(word); - if (x + n >= OLED_WIDTH) { - x = 0; - y += desc + vsp + asc; - } - if (y >= OLED_HEIGHT) { - return; - } - printf("(%3d,%3d) [%s]\n", x, y, word); - oled_draw_string(x, y, word); - x += n + hsp; - } -} - -typedef void (*void_fn_t)(void); - -void_fn_t font_size[] = { - oled_font_small, - oled_font_medium, - oled_font_large, -}; -#define NUM_SIZES (sizeof(font_size)/sizeof(font_size[0])) - -void_fn_t font_style[] = { - oled_font_sans_serif, - oled_font_serif, - oled_font_monospace, -}; -#define NUM_STYLES (sizeof(font_style)/sizeof(font_style[0])) - -void display() { - oled_clear(); - draw_text(lorem_ipsum); - oled_update(); - sleep(2); -} - -void app_main() { - oled_init(); - for (;;) { - for (int i = 0; i < NUM_SIZES; i++) { - font_size[i](); - for (int j = 0; j < NUM_STYLES; j++) { - font_style[j](); - display(); - } - } - } -} diff --git a/src/pumpclock/main.c b/src/pumpclock/main.c deleted file mode 100644 index 47367b5..0000000 --- a/src/pumpclock/main.c +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include -#include - -#include "medtronic.h" -#include "module.h" -#include "oled.h" -#include "pump.h" -#include "rfm95.h" - -struct tm pump_time; - -void get_time() { - printf("waking pump %s\n", PUMP_ID); - if (!pump_wakeup()) { - printf("pump_wakeup() failed\n"); - return; - } - if (pump_clock(&pump_time) != 0) { - printf("pump_clock() failed\n"); - return; - } - struct timeval tv = { .tv_sec = mktime(&pump_time) }; - settimeofday(&tv, 0); -} - -char str[100]; - -void display_info() { - time_t t = time(0); - struct tm *tm = localtime(&t); - oled_clear(); - oled_font_medium(); - oled_font_monospace(); - oled_align_center(); - strftime(str, sizeof(str), "%F", tm); - oled_draw_string(64, 25, str); - strftime(str, sizeof(str), "%T", tm); - oled_draw_string(64, 55, str); - oled_update(); -} - -void splash() { - oled_on(); - oled_font_large(); - oled_align_center(); - oled_draw_string(64, 44, "Hello"); - oled_update(); -} - -#define SECONDS 1000000 - -void app_main() { - oled_init(); - splash(); - pump_set_id(PUMP_ID); - rfm95_init(); - set_frequency(PUMP_FREQUENCY); - printf("frequency set to %d Hz\n", read_frequency()); - get_time(); - for (;;) { - display_info(); - usleep(1*SECONDS); - } -} diff --git a/src/pumpstat/main.c b/src/pumpstat/main.c deleted file mode 100644 index 2e18c3b..0000000 --- a/src/pumpstat/main.c +++ /dev/null @@ -1,74 +0,0 @@ -#include - -#include - -#include "medtronic.h" -#include "module.h" -#include "oled.h" -#include "pump.h" -#include "rfm95.h" - -int basal_rate, basal_minutes; -int reservoir_level; -int battery_level; -int model; - -void get_pump_info() { - printf("waking pump %s\n", PUMP_ID); - if (!pump_wakeup()) { - printf("wakeup failed\n"); - return; - } - model = pump_model(); - printf("model %d\n", model); - battery_level = pump_battery(); - printf("battery %d\n", battery_level); - reservoir_level = pump_reservoir(); - printf("reservoir %d\n", reservoir_level); - basal_rate = pump_temp_basal(&basal_minutes); - printf("temp basal %d for %d min\n", basal_rate, basal_minutes); -} - -char str[100]; - -#define FP1(n) (n)/1000, ((n)%1000)/100 -#define FP2(n) (n)/1000, ((n)%1000)/10 - -void display_info() { - oled_clear(); - oled_font_medium(); - oled_align_left(); - sprintf(str, "%d.%d U/hr %d min", FP1(basal_rate), basal_minutes); - oled_draw_string(0, 20, str); - sprintf(str, "%d.%dU %d.%02dV", FP1(reservoir_level), FP2(battery_level)); - oled_draw_string(0, 40, str); - sprintf(str, "model %d pump", model); - oled_draw_string(0, 60, str); - oled_update(); -} - -void splash() { - oled_on(); - oled_font_large(); - oled_align_center(); - oled_draw_string(64, 44, "Hello"); - oled_update(); -} - -#define SECONDS 1000000 -#define DISPLAY_TIMEOUT (5*SECONDS) - -void app_main() { - oled_init(); - splash(); - pump_set_id(PUMP_ID); - rfm95_init(); - set_frequency(PUMP_FREQUENCY); - printf("frequency set to %d Hz\n", read_frequency()); - get_pump_info(); - display_info(); - usleep(DISPLAY_TIMEOUT); - // Wake up on button press. - esp_sleep_enable_ext0_wakeup(BUTTON, 0); - esp_deep_sleep_start(); -} diff --git a/src/regtest/main.c b/src/regtest/main.c deleted file mode 100644 index 6dd64b3..0000000 --- a/src/regtest/main.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#include "spi.h" - -void app_main() { - spi_init(); - for (uint8_t addr = 0; addr <= 0x50; addr++) { - printf("%02X: %02X\n", addr, read_register(addr)); - } -} diff --git a/src/sleep/main.c b/src/sleep/main.c deleted file mode 100644 index 6eba5c5..0000000 --- a/src/sleep/main.c +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -#include -#include -#include - -#include "module.h" - -static void print_wakeup_reason() { - esp_sleep_wakeup_cause_t r = esp_sleep_get_wakeup_cause(); - const char *reason; - switch(r) { - case ESP_SLEEP_WAKEUP_EXT0: - reason = "external signal using RTC_IO"; - break; - case ESP_SLEEP_WAKEUP_EXT1: - reason = "external signal using RTC controller"; - break; - case ESP_SLEEP_WAKEUP_TIMER: - reason = "timer"; - break; - case ESP_SLEEP_WAKEUP_TOUCHPAD: - reason = "touchpad"; - break; - case ESP_SLEEP_WAKEUP_ULP: - reason = "ULP program"; - break; - default: - reason = "???"; - break; - } - printf("wakeup reason: %s\n", reason); -} - -void app_main() { - gpio_pad_select_gpio(LED); - gpio_set_direction(LED, GPIO_MODE_OUTPUT); - gpio_pad_select_gpio(BUTTON); - gpio_set_direction(BUTTON, GPIO_MODE_INPUT); - esp_sleep_enable_ext0_wakeup(BUTTON, 0); - for (;;) { - gpio_set_level(LED, 1); - sleep(1); - gpio_set_level(LED, 0); - - uart_tx_wait_idle(0); - // Wake up on button press or 5-second timeout. - esp_sleep_enable_timer_wakeup(5000000); - esp_light_sleep_start(); - print_wakeup_reason(); - } -} diff --git a/src/sniffer/main.c b/src/sniffer/main.c deleted file mode 100644 index 67cbbb1..0000000 --- a/src/sniffer/main.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include - -#include - -#include "pump.h" -#include "rfm95.h" - -#define TIMEOUT 60*1000 // 1 minute, in milliseconds - -uint8_t rx_buf[256]; - -void app_main() { - rfm95_init(); - uint8_t v = read_version(); - printf("radio version %d.%d\n", version_major(v), version_minor(v)); - set_frequency(PUMP_FREQUENCY); - printf("frequency set to %d Hz\n", read_frequency()); - for (;;) { - esp_task_wdt_reset(); - int n = sleep_receive(rx_buf, sizeof(rx_buf), TIMEOUT); - if (n == 0) { - printf("[timeout]\n"); - continue; - } - for (int i = 0; i < n; i++) { - printf("%02X ", rx_buf[i]); - } - printf("(RSSI = %d, # bytes = %d, count = %d)\n", read_rssi(), n, rx_packet_count()); - } -} diff --git a/src/wifi/main.c b/src/wifi/main.c deleted file mode 100644 index 4d801c8..0000000 --- a/src/wifi/main.c +++ /dev/null @@ -1,21 +0,0 @@ -#include - -#include - -#include "wifi.h" - -void app_main(void) { - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); - } - ESP_ERROR_CHECK(ret); - - wifi_init(); - char *ip_address = wifi_ip_address(); - if (!ip_address) { - return; - } - printf("IP address: %s\n", ip_address); -}