diff --git a/T-Beam_V10_OLED_SH1106_STRATUX_BT b/T-Beam_V10_OLED_SH1106_STRATUX_BT new file mode 100644 index 0000000..098abf4 --- /dev/null +++ b/T-Beam_V10_OLED_SH1106_STRATUX_BT @@ -0,0 +1,87 @@ +#define DEFAULT_AcftType 8 // [0..15] default aircraft-type: Powered Aircraft +#define DEFAULT_GeoidSepar 40 // [m] +#define DEFAULT_CONbaud 115200 +#define DEFAULT_PPSdelay 100 +#define DEFAULT_FreqPlan 0 +#define DEFAULT_DispPage 3 // Fab501 Page to Display After Boot or Reset + + +// #define WITH_HELTEC // HELTEC module: PCB LED on GPI025 +// #define WITH_HELTEC_V2 // HELTEC module v2 +// #define WITH_TTGO // TTGO module: PCB LED on GPIO2, GPIO25 free to use as DAC2 output +// #define WITH_TBEAM // T-Beam module +#define WITH_TBEAM_V10 // T-Beam module +// #define WITH_M5_JACEK // JACEK M5 ESP32 OGN-Tracker +// #define WITH_FollowMe // by Avionix + +// #define WITH_ILI9341 // 320x240 M5stack +// #define WITH_ST7789 // IPS 240x240 ST7789 +// #define WITH_TFT_LCD // TFT LCD +// #define WITH_OLED // OLED display on the I2C: some TTGO modules are without OLED display +// #define WITH_OLED2 // 2nd OLED display, I2C address next higher +#define WITH_U8G2_OLED // I2C OLED through the U8g2 library +#define WITH_U8G2_SH1106 // correct controller for the bigger OLED +// #define WITH_U8G2_FLIP // flip the OLED screen (rotate by 180deg) + +#define WITH_RFM95 // RF chip selection: both HELTEC and TTGO use sx1276 which is same as RFM95 + +// #define WITH_SLEEP // with software sleep mode controlled by the long-press on the button + +#define WITH_AXP // with AXP192 power controller (T-BEAM V1.0) +// #define WITH_BQ // with BQ24295 power controller (FollowMe) + +// #define WITH_LED_RX +// #define WITH_LED_TX + +// #define WITH_GPS_ENABLE // use GPS_ENABLE control line to turn the GPS ON/OFF +#define WITH_GPS_PPS // use the PPS signal from GPS for precise time-sync. +#define WITH_GPS_CONFIG // attempt to configure higher GPS baud rate and airborne mode + +#define WITH_GPS_UBX // GPS understands UBX +// #define WITH_GPS_MTK // GPS understands MTK +// #define WITH_GPS_SRF +// #define WITH_MAVLINK + +#define WITH_GPS_UBX_PASS // to pass directly UBX packets to/from GPS +#define WITH_GPS_NMEA_PASS // to pass directly NMEA to/from GPS + +// #define WITH_BMP180 // BMP180 pressure sensor +// #define WITH_BMP280 // BMP280 pressure sensor +#define WITH_BME280 // BMP280 with humidity (but still works with BMP280) +// #define WITH_MS5607 // MS5607 pressure sensor +// #define WITH_MS5611 // MS5611 pressure sensor + +// #define WITH_BMX055 // BMX055 magnetic and IMU sensor + +// #define WITH_LORAWAN // LoRaWAN connectivity +// #define WITH_FANET // FANET transmission and reception +#define WITH_PAW // Add PAW transmission + +#define WITH_PFLAA // PFLAU and PFLAA for compatibility with XCsoar and LK8000 +// #define WITH_POGNT +// #define WITH_GDL90 +// #define WITH_PGAV5 +#define WITH_LOOKOUT + +#define WITH_CONFIG // interpret the console input: $POGNS to change parameters + +#define WITH_BEEPER // with digital buzzer +// #define WITH_SOUND // with analog sound produced by DAC on pin 25 + +// #define WITH_KNOB +// #define WITH_VARIO + +// #define WITH_SD // use the SD card in SPI mode and FAT file system +#define WITH_SPIFFS // use SPIFFS file system in Flash +// #define WITH_SPIFFS_FAT +#define WITH_LOG // log own positions and other received to SPIFFS +// #define WITH_SDLOG // log own position and other data to uSD card + +#define WITH_STRATUX +#define WITH_BT_SPP // Bluetooth serial port for smartphone/tablet link +#define WITH_WIFI // attempt to connect to the wifi router for uploading the log files +// #define WITH_AP // Open Access Point MOde +#define WITH_HTTP // Open Web Interface + +// #define WITH_ENCRYPT // Encrypt (optionally) the position + diff --git a/main/config.h b/main/config.h index 72419cf..beba1ff 100644 --- a/main/config.h +++ b/main/config.h @@ -1,17 +1,29 @@ -#define DEFAULT_AcftType 1 // [0..15] default aircraft-type: glider +#define DEFAULT_AcftType 8 // [0..15] default aircraft-type: Powered Aircraft #define DEFAULT_GeoidSepar 40 // [m] #define DEFAULT_CONbaud 115200 #define DEFAULT_PPSdelay 100 #define DEFAULT_FreqPlan 0 - +#define DEFAULT_DispPage 3 // Fab501 Page to Display After Boot or Reset +#define WIFI_ADDRESS_IP1 192 // 192.168.1.1 for IP Address +#define WIFI_ADDRESS_IP2 168 +#define WIFI_ADDRESS_IP3 1 +#define WIFI_ADDRESS_IP4 1 +#define WIFI_ADDRESS_GW1 0 // 0.0.0.0 for Gateway +#define WIFI_ADDRESS_GW2 0 +#define WIFI_ADDRESS_GW3 0 +#define WIFI_ADDRESS_GW4 0 +#define WIFI_ADDRESS_MK1 255 // 255.255.255.0 for Mask +#define WIFI_ADDRESS_MK2 255 +#define WIFI_ADDRESS_MK3 255 +#define WIFI_ADDRESS_MK4 0 // #define WITH_HELTEC // HELTEC module: PCB LED on GPI025 // #define WITH_HELTEC_V2 // HELTEC module v2 // #define WITH_TTGO // TTGO module: PCB LED on GPIO2, GPIO25 free to use as DAC2 output // #define WITH_TBEAM // T-Beam module -// #define WITH_TBEAM_V10 // T-Beam module +#define WITH_TBEAM_V10 // T-Beam module // #define WITH_M5_JACEK // JACEK M5 ESP32 OGN-Tracker -#define WITH_FollowMe // by Avionix +// #define WITH_FollowMe // by Avionix // #define WITH_ILI9341 // 320x240 M5stack // #define WITH_ST7789 // IPS 240x240 ST7789 @@ -20,29 +32,30 @@ // #define WITH_OLED2 // 2nd OLED display, I2C address next higher #define WITH_U8G2_OLED // I2C OLED through the U8g2 library #define WITH_U8G2_SH1106 // correct controller for the bigger OLED -#define WITH_U8G2_FLIP // flip the OLED screen (rotate by 180deg) +// #define WITH_U8G2_FLIP // flip the OLED screen (rotate by 180deg) #define WITH_RFM95 // RF chip selection: both HELTEC and TTGO use sx1276 which is same as RFM95 +//#define WITH_SX1262 // SX1262 Support // #define WITH_SLEEP // with software sleep mode controlled by the long-press on the button -// #define WITH_AXP // with AXP192 power controller (T-BEAM V1.0) +#define WITH_AXP // with AXP192 power controller (T-BEAM V1.0) // #define WITH_BQ // with BQ24295 power controller (FollowMe) // #define WITH_LED_RX // #define WITH_LED_TX -#define WITH_GPS_ENABLE // use GPS_ENABLE control line to turn the GPS ON/OFF +// #define WITH_GPS_ENABLE // use GPS_ENABLE control line to turn the GPS ON/OFF #define WITH_GPS_PPS // use the PPS signal from GPS for precise time-sync. #define WITH_GPS_CONFIG // attempt to configure higher GPS baud rate and airborne mode -// #define WITH_GPS_UBX // GPS understands UBX -#define WITH_GPS_MTK // GPS understands MTK +#define WITH_GPS_UBX // GPS understands UBX +// #define WITH_GPS_MTK // GPS understands MTK // #define WITH_GPS_SRF // #define WITH_MAVLINK -// #define WITH_GPS_UBX_PASS // to pass directly UBX packets to/from GPS -// #define WITH_GPS_NMEA_PASS // to pass directly NMEA to/from GPS +#define WITH_GPS_UBX_PASS // to pass directly UBX packets to/from GPS +#define WITH_GPS_NMEA_PASS // to pass directly NMEA to/from GPS // #define WITH_BMP180 // BMP180 pressure sensor // #define WITH_BMP280 // BMP280 pressure sensor @@ -54,6 +67,7 @@ #define WITH_LORAWAN // LoRaWAN connectivity #define WITH_FANET // FANET transmission and reception +#define WITH_PAW // Add PAW transmission #define WITH_PFLAA // PFLAU and PFLAA for compatibility with XCsoar and LK8000 // #define WITH_POGNT @@ -61,23 +75,27 @@ // #define WITH_PGAV5 #define WITH_LOOKOUT +#define WITH_SKYDEMON //Adapt NMEA Output for SKYDEMON + #define WITH_CONFIG // interpret the console input: $POGNS to change parameters -// #define WITH_BEEPER // with digital buzzer +#define WITH_BEEPER // with digital buzzer // #define WITH_SOUND // with analog sound produced by DAC on pin 25 // #define WITH_KNOB // #define WITH_VARIO -#define WITH_SD // use the SD card in SPI mode and FAT file system +// #define WITH_SD // use the SD card in SPI mode and FAT file system #define WITH_SPIFFS // use SPIFFS file system in Flash -#define WITH_SPIFFS_FAT +// #define WITH_SPIFFS_FAT #define WITH_LOG // log own positions and other received to SPIFFS -#define WITH_SDLOG // log own position and other data to uSD card +// #define WITH_SDLOG // log own position and other data to uSD card -// #define WITH_STRATUX +//#define WITH_STRATUX #define WITH_BT_SPP // Bluetooth serial port for smartphone/tablet link -// #define WITH_WIFI // attempt to connect to the wifi router for uploading the log files +#define WITH_WIFI // attempt to connect to the wifi router for uploading the log files +#define WITH_AP // Open Access Point MOde +#define WITH_HTTP // Open Web Interface // #define WITH_ENCRYPT // Encrypt (optionally) the position diff --git a/main/disp.cpp b/main/disp.cpp index 091fb5f..9bf3686 100644 --- a/main/disp.cpp +++ b/main/disp.cpp @@ -26,11 +26,11 @@ #ifdef WITH_U8G2_OLED const uint8_t DISP_Pages = 12; -static uint8_t DISP_Page = 0; +static uint8_t DISP_Page = DEFAULT_DispPage ; //Fab501 before 0 #endif #if defined(WITH_ST7789) || defined(WITH_ILI9341) const uint8_t DISP_Pages = 9; -static uint8_t DISP_Page = 0; +static uint8_t DISP_Page = DEFAULT_DispPage ; //Fab501 before 0 #endif diff --git a/main/disp_oled.cpp b/main/disp_oled.cpp index a40e0fb..7704d69 100644 --- a/main/disp_oled.cpp +++ b/main/disp_oled.cpp @@ -227,7 +227,9 @@ void OLED_DrawPosition(u8g2_t *OLED, GPS_Position *GPS=0, uint8_t LineIdx=2) } void OLED_DrawGPS(u8g2_t *OLED, GPS_Position *GPS) // GPS time, position, altitude -{ // u8g2_SetFont(OLED, u8g2_font_ncenB14_tr); +{ bool isAltitudeUnitMeter = Parameters.AltitudeUnit == 0; // display altitude in meters + bool isAltitudeUnitFeet = Parameters.AltitudeUnit == 1; // display altitude in feet + // u8g2_SetFont(OLED, u8g2_font_ncenB14_tr); u8g2_SetFont(OLED, u8g2_font_7x13_tf); // 5 lines, 12 pixels/line uint8_t Len=0; /* @@ -276,14 +278,14 @@ void OLED_DrawGPS(u8g2_t *OLED, GPS_Position *GPS) // GPS time, position, altit if(GPS && GPS->isValid()) { int32_t Alt = GPS->Altitude; if(Alt>=0) Line[Len++]=' '; - if(GPS->Sec&4) // display altitude in meters - { Len+=Format_SignDec(Line+Len, Alt, 1, 1, 1); // [0.1m/s] + if(isAltitudeUnitMeter) // display altitude in meters + { Len+=Format_SignDec(Line+Len, Alt, 1, 1, 1); // [0.1m] Line[Len++]='m'; } - else // and alternate in feet - { Alt = (Alt*336+512)>>10; // [0.1m/s] => [feet] + else if(isAltitudeUnitFeet) // display altitude in feet + { Alt = (Alt*336+512)>>10; // [0.1m] => [feet] Len+=Format_SignDec(Line+Len, Alt, 1, 0, 1); // [feet] Line[Len++]='f'; Line[Len++]='t'; } - // for( ; Len<14; ) Line[Len++]=' '; // tail of spaces to cover older printouts + // for( ; Len<14; ) Line[Len++]=' '; // tail of spaces to cover older printouts } else Len+=Format_String(Line+Len, "-----.- "); Line[Len]=0; @@ -433,7 +435,13 @@ void OLED_DrawTrafWarn(u8g2_t *OLED, GPS_Position *GPS) #endif // WITH_LOOKOUT void OLED_DrawBaro(u8g2_t *OLED, GPS_Position *GPS) -{ u8g2_SetFont(OLED, u8g2_font_7x13_tf); // 5 lines, 12 pixels/line +{ bool isAltitudeUnitMeter = Parameters.AltitudeUnit == 0; // display altitude in meters + bool isAltitudeUnitFeet = Parameters.AltitudeUnit == 1; // display altitude in feet + + bool isVarioUnitMPS = Parameters.VarioUnit == 0; // display Vario in m/s + bool isVarioUnitFPM = Parameters.VarioUnit == 1; // display Vario in fpm + + u8g2_SetFont(OLED, u8g2_font_7x13_tf); // 5 lines, 12 pixels/line uint8_t Len=0; #ifdef WITH_BMP180 Len+=Format_String(Line+Len, "BMP180 "); @@ -458,11 +466,22 @@ void OLED_DrawBaro(u8g2_t *OLED, GPS_Position *GPS) u8g2_DrawStr(OLED, 0, 24, Line); Len=0; if(GPS && GPS->hasBaro) - { Len+=Format_SignDec(Line+Len, GPS->StdAltitude, 5, 1); - Len+=Format_String(Line+Len, "m "); - Len+=Format_SignDec(Line+Len, GPS->ClimbRate, 2, 1); - Len+=Format_String(Line+Len, "m/s "); } - else Len+=Format_String(Line+Len, "-----.-m --.-m/s "); + { if(isAltitudeUnitMeter) + { Len+=Format_SignDec(Line+Len, GPS->StdAltitude, 5, 1); + Len+=Format_String(Line+Len, "m "); } + else if(isAltitudeUnitFeet) + { Len+=Format_SignDec(Line+Len, (GPS->StdAltitude*336+512)>>10, 5, 0); + Len+=Format_String(Line+Len, "ft "); } + if(isVarioUnitMPS) + { Len+=Format_SignDec(Line+Len, GPS->ClimbRate, 2, 1); + Len+=Format_String(Line+Len, "m/s "); } + else if(isVarioUnitFPM) + { Len+=Format_SignDec(Line+Len, (GPS->ClimbRate*5039+128)>>8, 2, 0); + Len+=Format_String(Line+Len, "fpm "); } } + else + { if(isAltitudeUnitMeter) Len+=Format_String(Line+Len, "-----.-m"); + else if(isAltitudeUnitFeet) Len+=Format_String(Line+Len, "-----ft "); + Len+=Format_String(Line+Len, " --.-m/s "); } Line[Len]=0; u8g2_DrawStr(OLED, 0, 36, Line); Len=0; @@ -773,13 +792,21 @@ void OLED_DrawID(u8g2_t *OLED, GPS_Position *GPS) void OLED_DrawAltitudeAndSpeed(u8g2_t *OLED, GPS_Position *GPS) { uint8_t Len; - bool inFeet = GPS->Sec&4; // decide if display altitude in meters or in feet + bool isAltitudeUnitMeter = Parameters.AltitudeUnit == 0; // display altitude in meters + bool isAltitudeUnitFeet = Parameters.AltitudeUnit == 1; // display altitude in feet + + bool isSpeedUnitKMH = Parameters.SpeedUnit == 0; // display Speed in km/h + bool isSpeedUnitKnot = Parameters.SpeedUnit == 1; // display Speed in knot + + bool isVarioUnitMPS = Parameters.VarioUnit == 0; // display Vario in m/s + bool isVarioUnitFPM = Parameters.VarioUnit == 1; // display Vario in fpm + // Standard Pressure Altitude if(GPS && (GPS->hasBaro || GPS->isValid())) // if GPS has lock or just the pressure data { int32_t Alt = GPS->Altitude; // [0.1m/s] take GPS (geometrical) altitude if(GPS->hasBaro) Alt = GPS->StdAltitude; // but if pressure sensor is there then replace with pressure altitude - if(inFeet) Alt = (Alt*336+512)>>10; // [0.1m] => [feet] // convert to feet - else Alt = (Alt+5)/10; // [0.1m] => [m] // or to meters + if(isAltitudeUnitMeter) Alt = (Alt+5)/10; // [0.1m] => [m] // or to meters + else if(isAltitudeUnitFeet) Alt = (Alt*336+512)>>10; // [0.1m] => [feet] // convert to feet Len=Format_SignDec(Line, Alt, 1, 0, 1); } // print altitude into the string else Len=Format_String(Line, "----"); // if altitude not available then print place holders @@ -789,8 +816,8 @@ void OLED_DrawAltitudeAndSpeed(u8g2_t *OLED, GPS_Position *GPS) u8g2_DrawStr(OLED, 60-Altitude_width, 40, Line); // print the string u8g2_SetFont(OLED, u8g2_font_9x15_tr); // smaller font - if(inFeet) u8g2_DrawStr(OLED, 62, 40, "ft"); // print units - else u8g2_DrawStr(OLED, 64, 40, "m"); + if(isAltitudeUnitMeter) u8g2_DrawStr(OLED, 64, 40, "m"); + else if(isAltitudeUnitFeet) u8g2_DrawStr(OLED, 62, 40, "ft"); // print units u8g2_SetFont(OLED, u8g2_font_fub17_tr); if(GPS && GPS->isValid()) @@ -807,6 +834,7 @@ void OLED_DrawAltitudeAndSpeed(u8g2_t *OLED, GPS_Position *GPS) if(GPS && (GPS->hasBaro || GPS->isValid())) // if GPS has lock or just the pressure data { int16_t vario_value = GPS->ClimbRate; // [0.1m/s] climb rate + if(isVarioUnitFPM) vario_value = (vario_value*5039+128)>>8; // [0.1m/s] => [feet per meter] if(vario_value<0) { vario_value=(-vario_value); const int minus_width=10; @@ -826,7 +854,8 @@ void OLED_DrawAltitudeAndSpeed(u8g2_t *OLED, GPS_Position *GPS) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; u8g2_DrawXBM(OLED, 0, 47, plus_width, plus_height, plus_bits); } - Len=Format_UnsDec(Line, vario_value, 2, 1); + if(isVarioUnitMPS) Len=Format_UnsDec(Line, vario_value, 2, 1); + if(isVarioUnitFPM) Len=Format_UnsDec(Line, vario_value, 2, 0); } else Len=Format_String(Line, "-.-"); @@ -835,16 +864,24 @@ void OLED_DrawAltitudeAndSpeed(u8g2_t *OLED, GPS_Position *GPS) uint8_t Vario_width = u8g2_GetStrWidth(OLED, Line); u8g2_DrawStr(OLED, 54-Vario_width, 64, Line); - const int ms_width=7; - const int ms_height=17; - static unsigned char ms_bits[] = - { 0x00, 0x00, 0x16, 0x2a, 0x2a, 0x2a, 0x2a, 0x00, 0x7f, 0x00, 0x1c, 0x22, - 0x02, 0x1c, 0x20, 0x22, 0x1c }; - u8g2_DrawXBM(OLED, 58, 47, ms_width, ms_height, ms_bits); + if(isVarioUnitMPS) + { const int ms_width=7; + const int ms_height=17; + static unsigned char ms_bits[] = + { 0x00, 0x00, 0x16, 0x2a, 0x2a, 0x2a, 0x2a, 0x00, 0x7f, 0x00, 0x1c, 0x22, + 0x02, 0x1c, 0x20, 0x22, 0x1c }; + u8g2_DrawXBM(OLED, 58, 47, ms_width, ms_height, ms_bits); } + else if(isVarioUnitFPM) + { const int ms_width=7; + const int ms_height=17; + static unsigned char ms_bits[] = + { 0x84, 0xa2, 0xf7, 0xa2, 0xa2, 0xa2, 0xc2, 0x80, 0xff, 0x80, 0x00, 0x16, 0x2a, 0x2a, 0x2a, 0x2a, 0x00 }; + u8g2_DrawXBM(OLED, 58, 47, ms_width, ms_height, ms_bits); } // Speed if(GPS && GPS->isValid()) { uint16_t speed = (GPS->Speed*9+12)/25; + if(isSpeedUnitKnot) speed = (GPS->Speed*199+512)>>10; Len=Format_UnsDec(Line, speed, 1, 0); } else Len=Format_String(Line, "--"); @@ -853,13 +890,22 @@ void OLED_DrawAltitudeAndSpeed(u8g2_t *OLED, GPS_Position *GPS) uint8_t Speed_width = u8g2_GetStrWidth(OLED, Line); u8g2_DrawStr(OLED, 114-Speed_width, 64, Line); - const int kmh_width=10; - const int kmh_height=17; - static unsigned char kmh_bits[] = - { 0x01, 0x00, 0x01, 0x00, 0x69, 0x01, 0xa5, 0x02, 0xa3, 0x02, 0xa5, 0x02, - 0xa9, 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00 }; - u8g2_DrawXBM(OLED, 118, 47, kmh_width, kmh_height, kmh_bits); + if(isSpeedUnitKMH) + { const int kmh_width=10; + const int kmh_height=17; + static unsigned char kmh_bits[] = + { 0x01, 0x00, 0x01, 0x00, 0x69, 0x01, 0xa5, 0x02, 0xa3, 0x02, 0xa5, 0x02, + 0xa9, 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00 }; + u8g2_DrawXBM(OLED, 118, 47, kmh_width, kmh_height, kmh_bits); } + else if(isSpeedUnitKnot) + { const int kmh_width=10; + const int kmh_height=17; + static unsigned char kmh_bits[] = + { 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x01, 0xfc, 0x01, 0xfc, + 0xe9, 0xfc, 0x25, 0xfd, 0x23, 0xfd, 0x25, 0xfd, 0x29, 0xfd, 0x00, 0xfc, + 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc}; + u8g2_DrawXBM(OLED, 118, 47, kmh_width, kmh_height, kmh_bits); } } void OLED_DrawFlight(u8g2_t *OLED, GPS_Position *GPS) // draw flight status page diff --git a/main/http.cpp b/main/http.cpp index 525f39a..7706f74 100644 --- a/main/http.cpp +++ b/main/http.cpp @@ -212,41 +212,25 @@ static void ParmForm_GPS(httpd_req_t *Req) // produce HTML form for GPS paramet httpd_resp_sendstr_chunk(Req, "
\n"); httpd_resp_sendstr_chunk(Req, "\n"); } -static void ParmForm_Other(httpd_req_t *Req) // produce HTML form for parameters not included in other forms +static void ParmForm_Page(httpd_req_t *Req) // produce HTML form for parameters not included in other forms { char Line[16]; int Len; - httpd_resp_sendstr_chunk(Req, "

Other

"); - httpd_resp_sendstr_chunk(Req, "
\n"); + httpd_resp_sendstr_chunk(Req, "

Pages

"); + httpd_resp_sendstr_chunk(Req, "\n"); - Begin_Control_Row(Req, "Freq. plan"); - const char *FreqPlanTable[6] = { "Auto", "Europe/Africa", "USA/Canada", "Australia/Chile", "New Zeeland", "Izrael" }; - SelectList(Req, "FreqPlan", FreqPlanTable, 6, Parameters.FreqPlan); + Begin_Control_Row(Req, "Altitude Unit"); + const char *AltitudeUnitTable[2] = { "meter", "feet" } ; + SelectList(Req, "AltitudeUnit", AltitudeUnitTable, 2, Parameters.AltitudeUnit); End_Control_Row(Req); - Begin_Control_Row(Req, "Tx power [dBm]"); - httpd_resp_sendstr_chunk(Req, ""); + Begin_Control_Row(Req, "Speed Unit"); + const char *SpeedUnitTable[2] = { "km/h", "knot" } ; + SelectList(Req, "SpeedUnit", SpeedUnitTable, 2, Parameters.SpeedUnit); End_Control_Row(Req); - Begin_Control_Row(Req, "Freq.corr. [ppm]"); - httpd_resp_sendstr_chunk(Req, ""); - End_Control_Row(Req); - - Begin_Control_Row(Req, "Console baud"); - httpd_resp_sendstr_chunk(Req, ""); - End_Control_Row(Req); - - Begin_Control_Row(Req, "Verbose"); - const char *VerboseTable[2] = { "0 (off)", "1 (on)" }; - SelectList(Req, "Verbose", VerboseTable, 2, Parameters.Verbose); + Begin_Control_Row(Req, "Vario Unit"); + const char *VarioUnitTable[2] = { "m/s", "fpm" } ; + SelectList(Req, "VarioUnit", VarioUnitTable, 2, Parameters.VarioUnit); End_Control_Row(Req); Begin_Control_Row(Req, "Pages"); @@ -299,6 +283,45 @@ function pageCheckbox(checkbox) {\n\ }\n\ \n"); + httpd_resp_sendstr_chunk(Req, "
\n"); + httpd_resp_sendstr_chunk(Req, "
\n"); } + +static void ParmForm_Other(httpd_req_t *Req) // produce HTML form for parameters not included in other forms +{ char Line[16]; int Len; + + httpd_resp_sendstr_chunk(Req, "

Other

"); + httpd_resp_sendstr_chunk(Req, "
\n"); + + Begin_Control_Row(Req, "Freq. plan"); + const char *FreqPlanTable[6] = { "Auto", "Europe/Africa", "USA/Canada", "Australia/Chile", "New Zeeland", "Izrael" }; + SelectList(Req, "FreqPlan", FreqPlanTable, 6, Parameters.FreqPlan); + End_Control_Row(Req); + + Begin_Control_Row(Req, "Tx power [dBm]"); + httpd_resp_sendstr_chunk(Req, ""); + End_Control_Row(Req); + + Begin_Control_Row(Req, "Freq.corr. [ppm]"); + httpd_resp_sendstr_chunk(Req, ""); + End_Control_Row(Req); + + Begin_Control_Row(Req, "Console baud"); + httpd_resp_sendstr_chunk(Req, ""); + End_Control_Row(Req); + + Begin_Control_Row(Req, "Verbose"); + const char *VerboseTable[2] = { "0 (off)", "1 (on)" }; + SelectList(Req, "Verbose", VerboseTable, 2, Parameters.Verbose); + End_Control_Row(Req); httpd_resp_sendstr_chunk(Req, "
\n"); httpd_resp_sendstr_chunk(Req, "
\n"); } @@ -397,7 +420,14 @@ static void ParmForm_AP(httpd_req_t *Req) // Wi-Fi access point parameters { cha httpd_resp_sendstr_chunk(Req, "\n"); } #endif - +static void ParmForm_Defaults(httpd_req_t *Req) +{ + httpd_resp_sendstr_chunk(Req, "\ +
\n\ +\n\ +\n\ +
\n"); +} static void ParmForm_Restart(httpd_req_t *Req) { @@ -410,6 +440,184 @@ static void ParmForm_Restart(httpd_req_t *Req) // ============================================================================================================ + + +static void Table_System(httpd_req_t *Req) +{ char Line[128]; int Len; + uint32_t Time=TimeSync_Time(); + uint32_t Sec = (Time-1)%60; + GPS_Position *GPS = GPS_getPosition(Sec); if(GPS==0) return; + + httpd_resp_sendstr_chunk(Req, "

System

"); + httpd_resp_sendstr_chunk(Req, "\n"); + + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + Len =Format_String(Line, "\n"); + httpd_resp_send_chunk(Req, Line, Len); + + + httpd_resp_sendstr_chunk(Req, "
Board"); +#ifdef WITH_FollowMe + Len+=Format_String(Line+Len, "FollowMe"); +#endif +#ifdef WITH_TTGO + Len+=Format_String(Line+Len, "TTGO"); +#endif +#if defined(WITH_HELTEC) || defined(WITH_HELTEC_V2) + Len+=Format_String(Line+Len, "HELTEC"); +#endif +#if defined(WITH_TBEAM) || defined(WITH_TBEAM_V10) + Len+=Format_String(Line+Len, "T-BEAM"); +#endif + Len+=Format_String(Line+Len, "
Display"); +#ifdef WITH_ILI9341 // 320x240 M5stack + Len+=Format_String(Line+Len, "ILI9341"); +#endif +#ifdef WITH_ST7789 // IPS 240x240 ST7789 + Len+=Format_String(Line+Len, "ST7789"); +#endif +#ifdef WITH_TFT_LCD // TFT LCD + Len+=Format_String(Line+Len, "TFT_LCD"); +#endif +#ifdef WITH_OLED // OLED display on the I2C: some TTGO modules are without OLED display + Len+=Format_String(Line+Len, "OLED"); +#endif +#ifdef WITH_OLED2 // 2nd OLED display, I2C address next higher + Len+=Format_String(Line+Len, "
OLED2"); +#endif +#ifdef WITH_U8G2_OLED // I2C OLED through the U8g2 library + Len+=Format_String(Line+Len, "U8G2_OLED"); +#endif + Len+=Format_String(Line+Len, "
GPS"); +#ifdef WITH_GPS_MTK + Len+=Format_String(Line+Len, "MTK GPS"); +#endif +#ifdef WITH_GPS_UBX + Len+=Format_String(Line+Len, "UBX GPS"); +#endif +#ifdef WITH_GPS_SRF + Len+=Format_String(Line+Len, "SRF GPS"); +#endif + Len+=Format_String(Line+Len, "
Radio"); +#ifdef WITH_RFM95 + Len+=Format_String(Line+Len, "RFM95"); +#endif +#ifdef WITH_RFM69 + Len+=Format_String(Line+Len, "RFM69"); +#endif + Len+=Format_String(Line+Len, "
Baro"); +#ifdef WITH_BMP180 + Len+=Format_String(Line+Len, "BMP180"); +#endif +#ifdef WITH_BMP280 + Len+=Format_String(Line+Len, "BMP280"); +#endif +#ifdef WITH_BME280 + Len+=Format_String(Line+Len, "BME280"); +#endif +#ifdef WITH_MS5607 + Len+=Format_String(Line+Len, "MS5607"); +#endif +#ifdef WITH_MS5611 + Len+=Format_String(Line+Len, "MS5611"); +#endif + Len+=Format_String(Line+Len, "
Bluetooth serial port"); +#ifdef WITH_BT_SPP + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
LoRaWAN"); +#ifdef WITH_LORAWAN + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
Digital Buzzer"); +#ifdef WITH_BEEPER + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
Analog Sound"); +#ifdef WITH_SOUND + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
SD Card"); +#ifdef WITH_SD + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
SPIFFS"); +#ifdef WITH_SPIFFS + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
WiFi"); +#ifdef WITH_WIFI + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
Access Point (wifi)"); +#ifdef WITH_AP + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
Encrypt"); +#ifdef WITH_ENCRYPT + Len+=Format_String(Line+Len, "Yes"); +#else + Len+=Format_String(Line+Len, "No"); +#endif + Len+=Format_String(Line+Len, "
\n"); } + static void Table_GPS(httpd_req_t *Req) { char Line[128]; int Len; uint32_t Time=TimeSync_Time(); @@ -771,6 +979,7 @@ static void Html_End(httpd_req_t *Req) static esp_err_t parm_post_handler(httpd_req_t *Req) { bool Restart=0; + bool Defaults=0; /* Destination buffer for content of HTTP POST request. * httpd_req_recv() accepts char* only, but content could * as well be any binary data (needs type casting). @@ -806,6 +1015,7 @@ static esp_err_t parm_post_handler(httpd_req_t *Req) #endif char *Line=URL; Restart = strstr(Line,"Restart=1"); + Defaults = strstr(Line,"Defaults=1"); for( ; ; ) { Parameters.ReadLine(Line); Line = strchr(Line, '&'); if(Line==0) break; @@ -813,6 +1023,9 @@ static esp_err_t parm_post_handler(httpd_req_t *Req) free(URL); Parameters.WriteToNVS(); + if(Defaults) + { Parameters.setDefault(); } + if(Restart) { #ifdef WITH_SPIFFS @@ -842,8 +1055,12 @@ static esp_err_t parm_get_handler(httpd_req_t *Req) #ifdef WITH_STRATUX ParmForm_Stratux(Req); #endif + ParmForm_Page(Req); + ParmForm_Other(Req); + ParmForm_Defaults(Req); + ParmForm_Restart(Req); Html_End(Req); @@ -860,6 +1077,7 @@ static esp_err_t top_get_handler(httpd_req_t *Req) httpd_resp_send_chunk(Req, Line, Len); httpd_resp_sendstr_chunk(Req, "
\n"); + Table_System(Req); Table_GPS(Req); Table_RF(Req); Table_Batt(Req); diff --git a/main/parameters.h b/main/parameters.h index cbbad25..56113e9 100644 --- a/main/parameters.h +++ b/main/parameters.h @@ -128,8 +128,11 @@ class FlashParameters union { uint32_t Page; struct - { uint32_t PageMask:27; // enable/disable individual pages on the LCD or OLED screen + { uint32_t PageMask:21; // enable/disable individual pages on the LCD or OLED screen uint8_t InitialPage:5; // the first page to show after boot + uint8_t AltitudeUnit:2; // 0=meter, 1=feet + uint8_t SpeedUnit:2; // 0=km/h, 1=knot + uint8_t VarioUnit:2; // 0=m/s, 1=feet/minute } ; } ; @@ -269,6 +272,9 @@ uint16_t StratuxPort; PPSdelay = DEFAULT_PPSdelay; // [ms] PageMask = 0xFF; InitialPage = 0; + AltitudeUnit = 0; // meter + SpeedUnit = 0; // km/h + VarioUnit = 0; // m/s for(uint8_t Idx=0; Idx - +#include "config.h" //Added By Fab501 #include "wifi.h" #include "format.h" @@ -49,7 +49,23 @@ static esp_err_t WIFI_event_handler(void *ctx, system_event_t *event) return ESP_OK; } esp_err_t WIFI_Init(void) -{ esp_err_t Err; +{ + + //Fab501 test to change IP to 192.168.1.1 for comptability with SkyDemon + + esp_netif_init(); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_t* wifiAP = esp_netif_create_default_wifi_ap(); + esp_netif_ip_info_t ipInfo; + IP4_ADDR(&ipInfo.ip, WIFI_ADDRESS_IP1,WIFI_ADDRESS_IP2,WIFI_ADDRESS_IP3,WIFI_ADDRESS_IP4); // Change IP in config.h + IP4_ADDR(&ipInfo.gw, WIFI_ADDRESS_GW1,WIFI_ADDRESS_GW2,WIFI_ADDRESS_GW3,WIFI_ADDRESS_GW4); // Change GATEWAY in config.h + IP4_ADDR(&ipInfo.netmask, WIFI_ADDRESS_MK1,WIFI_ADDRESS_MK2,WIFI_ADDRESS_MK3,WIFI_ADDRESS_MK4); // change MASK in config.h + esp_netif_dhcps_stop(wifiAP); + esp_netif_set_ip_info(wifiAP, &ipInfo); + esp_netif_dhcps_start(wifiAP); + + // end of Fab501 changes + esp_err_t Err; tcpip_adapter_init(); Err = esp_event_loop_init(WIFI_event_handler, NULL); if(Err!=ESP_OK) return Err; wifi_init_config_t Config = WIFI_INIT_CONFIG_DEFAULT();