Updates and bug fixes

pull/15/head
Pawel Jalocha 2020-04-19 20:19:32 +01:00
rodzic 6a82d84870
commit 5b343beeeb
9 zmienionych plików z 204 dodań i 111 usunięć

Wyświetl plik

@ -4,7 +4,9 @@
#define DEFAULT_PPSdelay 100
#define DEFAULT_FreqPlan 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
@ -17,7 +19,7 @@
// #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_OLED // I2C OLED through the U8g2 library
// #define WITH_U8G2_SH1106
#define WITH_RFM95 // RF chip selection: both HELTEC and TTGO use sx1276 which is same as RFM95
@ -46,6 +48,7 @@
// #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_PFLAA // PFLAU and PFLAA for compatibility with XCsoar and LK8000
// #define WITH_POGNT
@ -67,5 +70,5 @@
// #define WITH_WIFI // attempt to connect to the wifi router for uploading the log files
// #define WITH_SPIFFS_LOG // log transmitted and received packets to SPIFFS
// #define WITH_ENCRYPT // Encrypt (optionally) the position
#define WITH_ENCRYPT // Encrypt (optionally) the position

Wyświetl plik

@ -4,7 +4,9 @@
#define DEFAULT_PPSdelay 100
#define DEFAULT_FreqPlan 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
@ -17,7 +19,7 @@
// #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_OLED // I2C OLED through the U8g2 library
// #define WITH_U8G2_SH1106
#define WITH_RFM95 // RF chip selection: both HELTEC and TTGO use sx1276 which is same as RFM95
@ -54,7 +56,7 @@
#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
@ -68,5 +70,5 @@
// #define WITH_WIFI // attempt to connect to the wifi router for uploading the log files
// #define WITH_SPIFFS_LOG // log transmitted and received packets to SPIFFS
// #define WITH_ENCRYPT // Encrypt (optionally) the position
#define WITH_ENCRYPT // Encrypt (optionally) the position

Wyświetl plik

@ -261,7 +261,11 @@ void SleepIn(void)
#endif
PowerMode=0;
vTaskDelay(1000); }
for(int Idx=0; Idx<1500; Idx++)
{ LED_TimerCheck(1);
vTaskDelay(1); }
}
void SleepOut(void)
{
@ -472,7 +476,7 @@ void vTaskCTRL(void* pvParameters)
#endif
#ifdef WITH_AXP
// #ifdef DEBUG_PRINT
#ifdef DEBUG_PRINT
if(TimeChange)
{ uint16_t Batt=AXP.readBatteryVoltage(); // [mV]
uint16_t InpCurr=AXP.readBatteryInpCurrent(); // [mA]
@ -501,7 +505,7 @@ void vTaskCTRL(void* pvParameters)
Format_SignDec(CONS_UART_Write, Temp, 2, 1);
Format_String(CONS_UART_Write, "degC\n");
xSemaphoreGive(CONS_Mutex); }
// #endif
#endif
#endif
#ifdef DEBUG_PRINT

Wyświetl plik

@ -25,7 +25,11 @@
#include "disp_lcd.h"
#ifdef WITH_U8G2_OLED
#ifdef WITH_U8G2_LISTS
const uint8_t DISP_Pages = 6+3;
#else
const uint8_t DISP_Pages = 6;
#endif
static uint8_t DISP_Page = 1;
#endif
#if defined(WITH_ST7789) || defined(WITH_ILI9341)
@ -39,8 +43,9 @@ void vTaskDISP(void* pvParameters)
{
#ifdef WITH_U8G2_OLED
u8g2_ClearBuffer(&U8G2_OLED);
OLED_DrawLogo(&U8G2_OLED);
OLED_DrawLogo(&U8G2_OLED); // draw logo
u8g2_SendBuffer(&U8G2_OLED);
vTaskDelay(5000); // allow 5sec for the user to see the logo
#endif
#if defined(WITH_ST7789) || defined(WITH_ILI9341)
// LCD_Start();
@ -48,6 +53,7 @@ void vTaskDISP(void* pvParameters)
LCD_SetBacklightLevel(6); // backlight level
#endif
uint32_t PrevTime=0;
GPS_Position *PrevGPS=0;
for( ; ; ) //
@ -65,19 +71,22 @@ void vTaskDISP(void* pvParameters)
bool PageChange = 0;
uint8_t Key = 0;
KeyBuffer.Read(Key); // read key pressed from the buffer
if(Key) PageChange=1; // page-change on any key
// if(Key) PageChange=1; // page-change on any key
uint32_t Time=TimeSync_Time();
bool TimeChange = Time!=PrevTime; // did time change = a new second ?
uint32_t Sec = (Time-1)%60;
GPS_Position *GPS = GPS_getPosition(Sec);
bool GPSchange = GPS!=PrevGPS; // did GPS data change = new position ?
if(!PageChange) // if no page change was requested
if(Key==0) //
{ if( (!TimeChange) && (!GPSchange) ) continue;
PrevTime=Time; PrevGPS=GPS; }
#if defined(WITH_U8G2_OLED) || defined(WITH_ST7789) || defined(WITH_ILI9341)
if(PageChange) DISP_Page++; if(DISP_Page>=DISP_Pages) DISP_Page=0;
if(Key)
{ if(Key&0x40) { if(DISP_Page==0) DISP_Page=DISP_Pages-1; else DISP_Page--; }
else { DISP_Page++; if(DISP_Page>=DISP_Pages) DISP_Page=0; }
PageChange=1; }
#endif
#if defined(WITH_ST7789) || defined(WITH_ILI9341)
@ -155,9 +164,11 @@ void vTaskDISP(void* pvParameters)
// else
if(PageChange || ( GPS?GPSchange:TimeChange) )
{ u8g2_ClearBuffer(&U8G2_OLED);
// if(Look.WarnLevel)
// { OLED_DrawTrafWarn(&U8G2_OLED, GPS); }
// else
// #ifdef WITH_LOOKOUT
// if(Look.WarnLevel)
// { OLED_DrawTrafWarn(&U8G2_OLED, GPS); }
// else
// #endif
{ switch(DISP_Page)
{ case 2: OLED_DrawGPS (&U8G2_OLED, GPS); break;
case 3: OLED_DrawRF (&U8G2_OLED); break;
@ -167,7 +178,11 @@ void vTaskDISP(void* pvParameters)
// case 6: OLED_DrawRelay (&U8G2_OLED, GPS); break;
// case 7: OLED_DrawLookout(&U8G2_OLED, GPS); break;
case 0: OLED_DrawBattery(&U8G2_OLED); break;
// case 9: OLED_DrawTrafWarn(&U8G2_OLED, GPS); break;
#ifdef WITH_U8G2_LISTS
case 6: OLED_DrawRelay (&U8G2_OLED, GPS); break;
case 7: OLED_DrawLookout(&U8G2_OLED, GPS); break;
case 9: OLED_DrawTrafWarn(&U8G2_OLED, GPS); break;
#endif
// default:
// { OLED_DrawStatus(&U8G2_OLED, Time, 0);
// OLED_DrawPosition(&U8G2_OLED, GPS, 2); }

Wyświetl plik

@ -97,7 +97,7 @@ void OLED_DrawLogo(u8g2_t *OLED) // draw logo and hardware options in software
#ifdef WITH_TTGO
u8g2_DrawStr(OLED, 0, 16 ,"TTGO");
#endif
#ifdef WITH_HELTEC
#if defined(WITH_HELTEC) || defined(WITH_HELTEC_V2)
u8g2_DrawStr(OLED, 0, 16 ,"HELTEC");
#endif
#if defined(WITH_TBEAM) || defined(WITH_TBEAM_V10)
@ -301,8 +301,8 @@ void OLED_DrawRF(u8g2_t *OLED) // RF
void OLED_DrawRelay(u8g2_t *OLED, GPS_Position *GPS)
{ u8g2_SetFont(OLED, u8g2_font_amstrad_cpc_extended_8r);
uint8_t Len=Format_String(Line, "Relay queue :");
if(GPS && GPS->Sec>=0) Len+=Format_UnsDec(Line+Len, (uint16_t)(GPS->Sec), 2);
uint8_t Len=Format_String(Line, "Relay:");
if(GPS && GPS->Sec>=0) { Len+=Format_UnsDec(Line+Len, (uint16_t)(GPS->Sec), 2); Line[Len++]='s'; }
Line[Len]=0;
u8g2_DrawStr(OLED, 0, 24, Line);
uint8_t LineIdx=1;
@ -325,7 +325,7 @@ void OLED_DrawRelay(u8g2_t *OLED, GPS_Position *GPS)
void OLED_DrawLookout(u8g2_t *OLED, GPS_Position *GPS)
{ u8g2_SetFont(OLED, u8g2_font_amstrad_cpc_extended_8r);
uint8_t Len=Format_String(Line, "Look ");
uint8_t Len=Format_String(Line, "=> ");
if(Look.WarnLevel)
{ const LookOut_Target *Tgt = Look.Target+Look.WorstTgtIdx;
Len+=Format_Hex(Line+Len, Tgt->ID, 7);
@ -363,26 +363,26 @@ void OLED_DrawTrafWarn(u8g2_t *OLED, GPS_Position *GPS)
if(Look.WarnLevel==0) return;
const LookOut_Target *Tgt = Look.Target+Look.WorstTgtIdx;
uint8_t Len=0;
Len+=Format_Hex(Line+Len, Tgt->ID, 7);
Len+=Format_Hex(Line+Len, Tgt->ID, 7); // ID of the target
Line[Len++]='/';
Line[Len++]='0'+Tgt->WarnLevel;
Line[Len++]='0'+Tgt->WarnLevel; // warning level
Line[Len]=0;
u8g2_DrawStr(OLED, 0, 30, Line);
Len=0;
Len+=Format_UnsDec(Line+Len, Tgt->TimeMargin*5, 2, 1);
Len+=Format_UnsDec(Line+Len, Tgt->TimeMargin*5, 2, 1); // time-to-impact
Line[Len++]='s';
Line[Len++]=' ';
Len+=Format_UnsDec(Line+Len, Tgt->MissDist*5, 2, 1);
Len+=Format_UnsDec(Line+Len, Tgt->MissDist*5, 2, 1); // miss-distance
Line[Len++]='m';
Line[Len]=0;
u8g2_DrawStr(OLED, 0, 45, Line);
Len=0;
Len+=Format_UnsDec(Line+Len, Tgt->getRelHorSpeed()*5, 2, 1);
Len+=Format_UnsDec(Line+Len, Tgt->getRelHorSpeed()*5, 2, 1); // horizontal speed
Line[Len++]='m';
Line[Len++]='/';
Line[Len++]='s';
Line[Len++]=' ';
Len+=Format_UnsDec(Line+Len, Tgt->HorDist*5, 2, 1);
Len+=Format_UnsDec(Line+Len, Tgt->HorDist*5, 2, 1); // horizontal distance
Line[Len++]='m';
Line[Len]=0;
u8g2_DrawStr(OLED, 0, 60, Line);
@ -408,8 +408,8 @@ void OLED_DrawBaro(u8g2_t *OLED, GPS_Position *GPS)
#endif
if(GPS && GPS->hasBaro)
{ Len+=Format_UnsDec(Line+Len, GPS->Pressure/4, 5, 2);
Len+=Format_String(Line+Len, "Pa "); }
else Len+=Format_String(Line+Len, "----.--Pa ");
Len+=Format_String(Line+Len, "hPa "); }
else Len+=Format_String(Line+Len, "----.--hPa ");
Line[Len]=0;
u8g2_DrawStr(OLED, 0, 24, Line);
Len=0;
@ -439,8 +439,8 @@ static uint8_t BattCapacity(uint16_t mVolt)
if(mVolt<=3600) return 0;
return (mVolt-3600+2)/5; }
void OLED_DrawBattery(u8g2_t *OLED)
{ uint8_t Cap=BattCapacity(BatteryVoltage>>8);
void OLED_DrawBattery(u8g2_t *OLED) // draw battery status page
{ uint8_t Cap=BattCapacity(BatteryVoltage>>8); // est. battery capacity based on the voltage readout
// u8g2_SetFont(OLED, u8g2_font_battery19_tn);
// u8g2_DrawGlyph(OLED, 120, 60, '0'+(Cap+10)/20);
@ -455,25 +455,34 @@ void OLED_DrawBattery(u8g2_t *OLED)
if(Cap>=100) Format_UnsDec(Line, Cap, 3);
else if(Cap>=10) Format_UnsDec(Line+1, Cap, 2);
else Line[2]='0'+Cap;
u8g2_DrawStr (OLED, 16, 32, Line);
u8g2_DrawFrame(OLED, 12, 20, 42, 14);
u8g2_DrawBox (OLED, 8, 23, 4, 8);
u8g2_DrawStr (OLED, 16, 32, Line); // print battery est. capacity
u8g2_DrawFrame(OLED, 12, 20, 42, 14); // draw battery empty box around it
u8g2_DrawBox (OLED, 8, 23, 4, 8); // and the battery tip
strcpy(Line, " . V");
Format_UnsDec(Line, BatteryVoltage>>8, 4, 3);
Format_UnsDec(Line, BatteryVoltage>>8, 4, 3); // print the battery voltage readout
u8g2_DrawStr(OLED, 0, 48, Line);
strcpy(Line, " . mV/min ");
strcpy(Line, " . mV/min "); // print the battery voltage rate
Format_SignDec(Line, (600*BatteryVoltageRate+128)>>8, 3, 1);
u8g2_DrawStr(OLED, 0, 60, Line);
#ifdef WITH_BQ
// uint8_t Status = BQ.readStatus();
// uint8_t State = (Status>>4)&0x03;
// const char *StateName[4] = { "Not charging", "Pre-charge", "Fast charge", "Full" } ;
uint8_t Fault = BQ.readFault(); // read fault register
uint8_t ChargeErr = (Fault>>4)&0x3F; // charging fault:
bool BattErr = Fault&0x08; // Battery OVP
bool OTGerr = Fault&0x40; // VBus problem
uint8_t NTCerr = Fault&0x03; //
uint8_t Status = BQ.readStatus(); // read status register
uint8_t State = (Status>>4)&0x03; // charging status
const char *StateName[4] = { "" /* "Not charging" */ , "Pre-charge", "Charging", "Full" } ;
// u8g2_SetFont(OLED, u8g2_font_amstrad_cpc_extended_8r);
// u8g2_SetFont(OLED, u8g2_font_6x10_tr);
// u8g2_DrawStr(OLED, 0, 50, StateName[State]);
u8g2_SetFont(OLED, u8g2_font_6x10_tr);
if(Fault)
{ strcpy(Line, "Fault: "); Format_Hex(Line+7, Fault); Line[9]=0;
u8g2_DrawStr(OLED, 60, 28, Line); }
else
u8g2_DrawStr(OLED, 60, 28, StateName[State]);
// u8g2_DrawStr(OLED, 0, 60, Status&0x04?"Power-is-Good":"Power-is-not-Good");
/* print BQ registers for debug
@ -490,9 +499,9 @@ void OLED_DrawBattery(u8g2_t *OLED)
void OLED_DrawStatusBar(u8g2_t *OLED, GPS_Position *GPS)
{ static bool Odd=0;
uint8_t Cap=BattCapacity(BatteryVoltage>>8);
uint8_t BattLev = (Cap+10)/20;
uint8_t Charging = 0;
uint8_t Cap = BattCapacity(BatteryVoltage>>8); // est. battery capacity
uint8_t BattLev = (Cap+10)/20; // [0..5] convert to display scale
uint8_t Charging = 0; // charging or not changing ?
#ifdef WITH_BQ
uint8_t Status = BQ.readStatus();
Charging = (Status>>4)&0x03;
@ -503,14 +512,18 @@ void OLED_DrawStatusBar(u8g2_t *OLED, GPS_Position *GPS)
uint8_t &DispLev = BattLev;
#endif
if(BattLev==0 && !Charging && Odd) // when battery is empty, then flash it at 0.5Hz
{ }
else
{ } // thus here avoid printing the battery symbol for flashing effect
else // print the battery symbol with DispLev
{ u8g2_SetFont(OLED, u8g2_font_battery19_tn);
u8g2_SetFontDirection(OLED, 3);
u8g2_DrawGlyph(OLED, 24, 10, '0'+DispLev);
u8g2_DrawGlyph(OLED, 20, 10, '0'+DispLev);
u8g2_SetFontDirection(OLED, 0); }
Odd=!Odd;
#ifdef WITH_SD
if(SD_isMounted())
{ u8g2_SetFont(OLED, u8g2_font_twelvedings_t_all);
u8g2_DrawGlyph(OLED, 30, 12, 0x73); }
#endif
// u8g2_SetFont(OLED, u8g2_font_5x7_tr);
// u8g2_SetFont(OLED, u8g2_font_5x8_tr);
static uint8_t Sec=0;
@ -528,7 +541,7 @@ void OLED_DrawStatusBar(u8g2_t *OLED, GPS_Position *GPS)
{ Format_UnsDec(Line, (uint16_t)(GPS_SatSNR+2)/4, 2); memcpy(Line+2, "dB ", 3);}
}
else Format_String(Line, "--sat");
u8g2_DrawStr(OLED, 40, 10, Line);
u8g2_DrawStr(OLED, 52, 10, Line);
Sec++; if(Sec>=3) Sec=0; }
void OLED_DrawSystem(u8g2_t *OLED)
@ -625,16 +638,25 @@ void OLED_DrawSystem(u8g2_t *OLED)
void OLED_DrawID(u8g2_t *OLED)
{ u8g2_SetFont(OLED, u8g2_font_9x15_tr);
strcpy(Line, "ID "); Parameters.Print(Line+3); Line[13]=0;
u8g2_DrawStr(OLED, 0, 28, Line);
Parameters.Print(Line); Line[10]=0;
u8g2_DrawStr(OLED, 26, 28, Line);
// u8g2_SetFont(OLED, u8g2_font_10x20_tr);
#ifdef WITH_FollowMe
u8g2_SetFont(OLED, u8g2_font_7x13_tf);
u8g2_DrawStr(OLED, 0, 27, "ID:");
if(Parameters.Pilot[0] || Parameters.Reg[0])
{ strcpy(Line, "Reg: "); strcat(Line, Parameters.Reg);
u8g2_DrawStr(OLED, 0, 54, Line);
strcpy(Line, "Pilot: "); strcat(Line, Parameters.Pilot);
u8g2_DrawStr(OLED, 0, 42, Line); }
else
{
#ifdef WITH_FollowMe
u8g2_DrawStr(OLED, 15, 44, "FollowMe868");
u8g2_DrawStr(OLED, 20, 56, "by AVIONIX");
#endif
}
u8g2_SetFont(OLED, u8g2_font_5x8_tr);
u8g2_DrawStr(OLED, 96, 62, "v0.0.0");
u8g2_DrawStr(OLED, 96, 62, "v0.1.1");
}
#endif

Wyświetl plik

@ -368,7 +368,7 @@ static void GPS_BurstComplete(void) // wh
int32_t Alt = GPS->Altitude; // [0.1m] thus it appears to give pressure readout lower by a factor of two.
int32_t Delta1 = StdAlt1-Alt; // [0.1m] Here we check which pressure fits better the GPS altitude
int32_t Delta2 = StdAlt2-Alt; // [0.1m]
if(fabs(Delta1)<fabs(Delta2)) { GPS->StdAltitude=StdAlt1; } //
if( abs(Delta1)< abs(Delta2)) { GPS->StdAltitude=StdAlt1; } //
else { GPS->Pressure*=2; GPS->StdAltitude=StdAlt2; }
}
#endif
@ -499,7 +499,7 @@ GPS_Position *GPS_getPosition(uint8_t &BestIdx, int16_t &BestRes, int8_t Sec, in
int16_t Diff = TargetTime - (Pos->FracSec + (int16_t)Pos->Sec*100); // difference from the target time
if(Diff<(-3000)) Diff+=6000; // wrap-around 60 sec
else if(Diff>=3000) Diff-=6000;
if(fabs(Diff)<fabs(BestRes)) { BestRes=Diff; BestIdx=Idx; } // store the smallest difference from target
if(abs(Diff)<abs(BestRes)) { BestRes=Diff; BestIdx=Idx; } // store the smallest difference from target
}
return BestRes==0x7FFF ? 0:Position+BestIdx; }

Wyświetl plik

@ -29,6 +29,7 @@
#ifdef WITH_SD
#include "esp_vfs_fat.h"
#include "driver/sdmmc_host.h"
#include "driver/spi_common.h"
#include "driver/sdspi_host.h"
#include "sdmmc_cmd.h"
#endif
@ -154,6 +155,7 @@ PSRM32 = SDIO ?
*/
/*
https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
GPIO HELTEC TTGO JACEK M5_JACEK T-Beam T-Beamv10 FollowMe Restrictions
@ -162,17 +164,17 @@ GPIO HELTEC TTGO JACEK M5_JACEK T-Beam T-Beamv10 Foll
2 SD/MISO . LCD/MOSI LCD/MOSI LED/DBG Bootstrap: LOW to enter UART download mode
3 CONS/RxD CONS/RxD CONS/RxD CONS/RxD CONS/RxD CONS/RxD Console/Program
4 OLED/SDA OLED/SDA ADC/CS LCD/BCKL LCD/BCKL PERF/RST
5 RF/SCK RF/SCK RF/SCK GPS/ANT RF/SCK RF/SCK RF/CS
6 SD/CLK SD/CLK SD/CLK
7 SD/DATA0
8 SD/DATA1
9 SD/DATA2
10 SD/DATA3
11 DC/CMD SD/CMD SD/CMD
12 GPS/RxD GPS/RxD SD/CS GPS/RxD GPS/TxD SD/MISO HSPI/MISO JTAG/TDI Bootstrap: select output voltage to power the flash chip
5 RF/SCK RF/SCK RF/SCK GPS/ANT RF/SCK RF/SCK RF/CS PWM at boot
6 SD/CLK SD/CLK SD/CLK SPI flash
7 SD/DATA0 SD/DATA0 SPI flash
8 SD/DATA1 SD/DATA1 SPI flash
9 SD/DATA2 SD/DATA2 SPI flash
10 SD/DATA3 SD/DATA3 SPI flash
11 SD/CMD SD/CMD SD/CMD SPI flash
12 GPS/RxD GPS/RxD SD/CS GPS/RxD GPS/TxD SD/MISO HSPI/MISO JTAG/TDI Bootstrap: select output voltage to power the flash chip
13 GPS/Ena GPS/Ena SD/SCK LCD/SCL LCD/CLK LCD/CLK SD/MOSI HSPI/MOSI JTAG/TCK
14 RF/RST RF/RST Beeper ? LED/PCB . SD/CLK HSPI/CLK JTAG/TMS
15 OLED/SCL OLED/SCL SD/MOSI GPS/TxD . HSPI/CS0 JTAG/TDO
14 RF/RST RF/RST Beeper ? LED/PCB . SD/CLK HSPI/CLK JTAG/TMS PWM at boot
15 OLED/SCL OLED/SCL SD/MOSI GPS/TxD . HSPI/CS0 JTAG/TDO PWM at boot
16 OLED/RST OLED/RST RF/IRQ GPS/Tx RAM/CS GPS/TX U2_RXD
17 Beeper Beeper RF/RST GPS/Rx Beeper GPS/RX U2_TXD
18 RF/CS RF/CS RF/MISO RF/CS RF/SCK RF/CS VSPI/CLK
@ -205,7 +207,7 @@ GPIO HELTEC TTGO JACEK M5_JACEK T-Beam T-Beamv10 Foll
#define PIN_LED_PCB GPIO_NUM_2 // status LED on the PCB
#endif
#ifdef WITH_HELTEC
#if defined(WITH_HELTEC) || defined(WITH_HELTEC_V2)
#define PIN_LED_PCB GPIO_NUM_25 // status LED on the PCB: 25, GPIO25 is DAC2
#endif
@ -243,7 +245,7 @@ GPIO HELTEC TTGO JACEK M5_JACEK T-Beam T-Beamv10 Foll
#define PIN_RFM_MOSI GPIO_NUM_23 // SPI MOSI (save as LCD)
#endif // M5_JACEK
#if defined(WITH_HELTEC) || defined(WITH_TTGO)
#if defined(WITH_HELTEC) || defined(WITH_HELTEC_V2) || defined(WITH_TTGO)
#define PIN_RFM_RST GPIO_NUM_14 // Reset
#define PIN_RFM_IRQ GPIO_NUM_26 // packet done on receive or transmit
#define PIN_RFM_SS GPIO_NUM_18 // SPI chip-select
@ -284,18 +286,21 @@ GPIO HELTEC TTGO JACEK M5_JACEK T-Beam T-Beamv10 Foll
#define RFM_SPI_SPEED 4000000 // [Hz] 4MHz SPI clock rate for RF chip
#ifdef WITH_ST7789
#ifdef WITH_TBEAM
#ifdef WITH_TBEAM // old T-Beam
#define LCD_PIN_MOSI GPIO_NUM_2 // SDA
#define LCD_PIN_MISO GPIO_NUM_NC // MISO not connected
#define LCD_PIN_CLK GPIO_NUM_13 // SCL
#endif // TBEAM
#ifdef WITH_TBEAM_V10
#define LCD_PIN_MOSI GPIO_NUM_2 // 13 // SDA
#ifdef WITH_TBEAM_V10 // new T-Beam
#define LCD_PIN_MOSI GPIO_NUM_14 // 13 // SDA
#define LCD_PIN_MISO GPIO_NUM_NC // MISO not connected
#define LCD_PIN_CLK GPIO_NUM_13 // 14 // SCL
#define LCD_PIN_CLK GPIO_NUM_13 // 2 // SCL
// #define LCD_PIN_MOSI GPIO_NUM_2 // 13 // SDA
// #define LCD_PIN_MISO GPIO_NUM_NC // MISO not connected
// #define LCD_PIN_CLK GPIO_NUM_13 // 14 // SCL
// #define LCD_PIN_RST GPIO_NUM_15 // NC // RST
#endif // TBEAM v1.0
#define LCD_SPI_SPEED 26000000 // [Hz]
#define LCD_SPI_SPEED 10000000 // [Hz]
#define LCD_SPI_HOST HSPI_HOST // VSPI_HOST or HSPI_HOST
#define LCD_SPI_DMA 2 // DMA channel
#define LCD_SPI_MODE 3 // for ST7789 with CS tied to LOW
@ -327,6 +332,13 @@ GPIO HELTEC TTGO JACEK M5_JACEK T-Beam T-Beamv10 Foll
// #define PIN_GPS_ENA GPIO_NUM_13 // yellow white
#endif // HELTEC || TTGO
#if defined(WITH_HELTEC_V2)
// VK2828U GN-801 MAVlink
#define PIN_GPS_TXD GPIO_NUM_13 // green green green
#define PIN_GPS_RXD GPIO_NUM_39 // blue yellow yellow
#define PIN_GPS_PPS GPIO_NUM_38 // white blue
#endif
// Note: I had a problem with GPS ENABLE on GPIO13, thus I tied the enable wire to 3.3V for the time being.
#ifdef WITH_TBEAM
@ -372,7 +384,7 @@ uint8_t BARO_I2C = (uint8_t)I2C_BUS;
#define PIN_I2C_SDA GPIO_NUM_21 // SDA pin
#endif // M5_JACEK
#if defined(WITH_HELTEC) || defined(WITH_TTGO)
#if defined(WITH_HELTEC) || defined(WITH_HELTEC_V2) || defined(WITH_TTGO)
#define PIN_I2C_SCL GPIO_NUM_15 // SCL pin
#define PIN_I2C_SDA GPIO_NUM_4 // SDA pin
#define OLED_I2C_ADDR 0x3C // I2C address of the OLED display
@ -392,9 +404,9 @@ uint8_t BARO_I2C = (uint8_t)I2C_BUS;
// #define PIN_OLED_RST GPIO_NUM_15 // OLED RESET: low-active
#endif
#if defined(WITH_HELTEC) || defined(WITH_TTGO)
#define PIN_OLED_RST GPIO_NUM_16 // OLED RESET: low-active
#endif
// #if defined(WITH_HELTEC) || defined(WITH_TTGO)
// #define PIN_OLED_RST GPIO_NUM_16 // OLED RESET: low-active
// #endif
#ifdef WITH_JACEK
@ -418,7 +430,7 @@ uint8_t BARO_I2C = (uint8_t)I2C_BUS;
#define PIN_BEEPER GPIO_NUM_25 // same as DAC
#endif // TBEAM
#if defined(WITH_HELTEC) || defined(WITH_TTGO)
#if defined(WITH_HELTEC) || defined(WITH_HELTEC_V2) || defined(WITH_TTGO)
#define PIN_BEEPER GPIO_NUM_17
#endif // HELTEC || TTGO
@ -426,10 +438,11 @@ uint8_t BARO_I2C = (uint8_t)I2C_BUS;
#define PIN_GPS_ANT GPIO_NUM_5 // internal(H) or external(L) GPS antenna
// #define PIN_SD_CS GPIO_NUM_4 // SD card interface in SPI mode
// #define PIN_SD_SCK GPIO_NUM_18
// #define PIN_SD_MISO GPIO_NUM_19
// #define PIN_SD_MOSI GPIO_NUM_23
#define PIN_SD_CS GPIO_NUM_11 // SD card interface in SPI mode
#define PIN_SD_SCK GPIO_NUM_6
#define PIN_SD_MISO GPIO_NUM_7
#define PIN_SD_MOSI GPIO_NUM_8
#define SD_SPI_DMA 2
#define PIN_BEEPER GPIO_NUM_25 // DAC
@ -468,7 +481,7 @@ uint8_t BARO_I2C = (uint8_t)I2C_BUS;
#define PIN_BUTTON GPIO_NUM_38
#endif
#if defined(WITH_TTGO) || defined(WITH_HELTEC)
#if defined(WITH_TTGO) || defined(WITH_HELTEC) || defined(WITH_HELTEC_V2)
#define PIN_BUTTON GPIO_NUM_0
#endif
@ -640,6 +653,7 @@ static void esp_spp_cb(esp_spp_cb_event_t Event, esp_spp_cb_param_t *Param)
case ESP_SPP_DATA_IND_EVT: // [30] data is sent by the client
#ifdef DEBUG_PRINT
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);
Param->data_ind.handle, Param->data_ind.data, Param->data_ind.len
Format_String(CONS_UART_Write, "BT_SPP: [");
Format_UnsDec(CONS_UART_Write, Param->data_ind.len);
Format_String(CONS_UART_Write, "]\n");
@ -783,6 +797,8 @@ int CONS_UART_Read (uint8_t &Byte) { int Ret=getchar(); if(Ret>=0) { Byte=Ret
// int CONS_UART_Free (void) { return UART2_Free(); }
// int CONS_UART_Full (void) { return UART2_Full(); }
void CONS_UART_SetBaudrate(int BaudRate) { uart_set_baudrate(CONS_UART, BaudRate); }
//--------------------------------------------------------------------------------------------------------
// ADS-B UART
@ -1330,9 +1346,19 @@ void U8G2_Init(void)
#ifdef WITH_SD
static sdmmc_host_t Host;
static sdspi_slot_config_t SlotConfig;
static esp_vfs_fat_sdmmc_mount_config_t MountConfig =
static sdmmc_host_t SD_Host = SDSPI_HOST_DEFAULT();
// static spi_bus_config_t SD_BusConfig = {
// .mosi_io_num = PIN_SD_MOSI,
// .miso_io_num = PIN_SD_MISO,
// .sclk_io_num = PIN_SD_SCK,
// .quadwp_io_num = -1,
// .quadhd_io_num = -1,
// .max_transfer_sz = 4000,
// } ;
// static sdspi_device_config_t SD_SlotConfig = SDSPI_DEVICE_CONFIG_DEFAULT();
static sdspi_slot_config_t SD_SlotConfig;
static esp_vfs_fat_sdmmc_mount_config_t SD_MountConfig =
{ .format_if_mount_failed = false,
.max_files = 5,
/* .allocation_unit_size = 16 * 1024 */ };
@ -1347,21 +1373,22 @@ void SD_Unmount(void)
{ esp_vfs_fat_sdmmc_unmount(); SD_Card=0; }
esp_err_t SD_Mount(void)
{ esp_err_t Ret = esp_vfs_fat_sdmmc_mount("/sdcard", &Host, &SlotConfig, &MountConfig, &SD_Card); // ESP_OK => good, ESP_FAIL => failed to mound the file system, other => HW not working
{ esp_err_t Ret = esp_vfs_fat_sdmmc_mount("/sdcard", &SD_Host, &SD_SlotConfig, &SD_MountConfig, &SD_Card); // ESP_OK => good, ESP_FAIL => failed to mound the file system, other => HW not working
if(Ret!=ESP_OK) SD_Unmount();
return Ret; } // ESP_OK => all good, ESP_FAIL => failed to mount file system, other => failed to init. the SD card
static esp_err_t SD_Init(void)
{
Host = SDSPI_HOST_DEFAULT();
// Host = SDSPI_HOST_DEFAULT();
// Host.max_freq_khz = SDMMC_FREQ_PROBING;
SlotConfig = SDSPI_SLOT_CONFIG_DEFAULT();
SlotConfig.gpio_miso = PIN_SD_MISO;
SlotConfig.gpio_mosi = PIN_SD_MOSI;
SlotConfig.gpio_sck = PIN_SD_SCK;
SlotConfig.gpio_cs = PIN_SD_CS;
SlotConfig.dma_channel = SD_SPI_DMA; // otherwise it conflicts with RFM SPI or LCD SPI
// esp_err_t Ret = spi_bus_initialize((spi_host_device_t)SD_Host.slot, &SD_BusConfig, SD_SPI_DMA);
SD_SlotConfig = SDSPI_SLOT_CONFIG_DEFAULT();
SD_SlotConfig.gpio_miso = PIN_SD_MISO;
SD_SlotConfig.gpio_mosi = PIN_SD_MOSI;
SD_SlotConfig.gpio_sck = PIN_SD_SCK;
SD_SlotConfig.gpio_cs = PIN_SD_CS;
// SD_SlotConfig.host_id = (spi_host_device_t)SD_Host.slot;
SD_SlotConfig.dma_channel = SD_SPI_DMA; // otherwise it conflicts with RFM SPI or LCD SPI
return SD_Mount(); } // ESP_OK => all good, ESP_FAIL => failed to mount file system, other => failed to init. the SD card
#endif // WITH_SD
@ -1588,7 +1615,7 @@ void IO_Configuration(void)
{
#ifdef PIN_LED_PCB
LED_PCB_Dir();
LED_PCB_Dir(); // PCB LED
LED_PCB_Off();
#endif
#ifdef WITH_LED_TX
@ -1597,11 +1624,11 @@ void IO_Configuration(void)
#endif
#ifdef PIN_BUTTON
Button_Dir();
Button_Dir(); // Push-button
#endif
#ifdef WITH_JACEK
POWER_LDO_Dir();
POWER_LDO_Dir(); // speific power control
POWER_Dir();
POWER_LDO_On();
POWER_On();
@ -1609,7 +1636,7 @@ void IO_Configuration(void)
#ifdef WITH_M5_JACEK
GPS_ANT_Dir();
GPS_ANT_Sel(1); // 0 = external entenna
GPS_ANT_Sel(1); // 0 = external entenna
#endif
#ifdef PIN_PERIPH_RST
@ -1689,7 +1716,7 @@ void IO_Configuration(void)
BQ.checkID();
// BQ.writeSource(0x05); // Reg #00
// BQ.writePowerON(0x2F); // Reg #01, disable charging
BQ.writeChargeCurr(0x00); // Reg #02
BQ.writeChargeCurr(0x20); // Reg #02 00 = 512mA, 0x20 = 512+512mA
BQ.writePreCharge(0x00); // Reg #03
BQ.writeChargeVolt(0x9A); // Reg #04
// BQ.writePowerON(0x3F); // Reg #01, enable charging
@ -1803,7 +1830,9 @@ void IO_Configuration(void)
LCD_WIDTH=240; LCD_HEIGHT=240;
LCD_TYPE=0;
#ifdef WITH_TBEAM_V10
LCD_PIN_RST = GPIO_NUM_15;
LCD_PIN_RST = GPIO_NUM_33;
LCD_PIN_DC = GPIO_NUM_2;
LCD_PIN_BCKL = GPIO_NUM_35; // on one baord it is 15
#endif
LCD_Init(LCD_SPI_HOST, LCD_SPI_MODE, LCD_SPI_SPEED);
LCD_Start();

Wyświetl plik

@ -42,13 +42,18 @@ void app_main(void)
IO_Configuration(); // initialize the GPIO/UART/I2C/SPI for Radio, GPS, OLED, Baro
#ifdef WITH_SD
if(SD_isMounted())
if(SD_isMounted()) // if SD card succesfully mounted at startup
{ Parameters.SaveToFlash=0;
if(Parameters.ReadFromFile("/sdcard/TRACKER.CFG")>0)
{ if(Parameters.SaveToFlash) Parameters.WriteToNVS(); }
if(Parameters.ReadFromFile("/sdcard/TRACKER.CFG")>0) // try to read parameters from the TRACKER.CFG file
{ if(Parameters.SaveToFlash) Parameters.WriteToNVS(); } // if succesfull and SaveToFlash==1 then save them to flash
// #ifdef WITH_SPIFFS
// SPIFFSlog_CopyToSD(); // copy all flash log files to the SD card
// #endif
}
#endif
CONS_UART_SetBaudrate(Parameters.CONbaud);
#ifdef WITH_BT_SPP
{ int32_t Err=BT_SPP_Init(); // start BT SPP
// #ifdef DEBUG_PRINT
@ -63,7 +68,7 @@ void app_main(void)
xTaskCreate(vTaskRF, "RF", 2048, 0, tskIDLE_PRIORITY+4, 0);
#ifdef WITH_LOG
xTaskCreate(vTaskLOG , "LOG", 2560, 0, tskIDLE_PRIORITY+1, 0);
xTaskCreate(vTaskLOG , "LOG", 4096, 0, tskIDLE_PRIORITY+1, 0);
#endif
xTaskCreate(vTaskPROC, "PROC", 2048, 0, tskIDLE_PRIORITY+3, 0);
xTaskCreate(vTaskGPS, "GPS", 2048, 0, tskIDLE_PRIORITY+4, 0);

Wyświetl plik

@ -44,9 +44,16 @@ class FlashParameters
int8_t RFchipTxPower; // [dBm] highest bit set => HW module (up to +20dBm Tx power)
int8_t RFchipTempCorr; // [degC] correction to the temperature measured in the RF chip
uint32_t CONbaud; // [bps] Console baud rate
union
{ uint32_t Console;
struct
{ uint32_t CONbaud:24; // [bps] Console baud rate
uint8_t CONprot: 8; // [bit-mask] Console protocol mask: 0=minGPS, 1=allGPS, 2=Baro, 3=UBX, 4=OGN, 5=FLARM, 6=GDL90, 7=
} ;
} ;
int16_t PressCorr; // [0.25Pa] pressure correction for the baro
union
{ uint16_t Flags;
struct
@ -179,6 +186,7 @@ class FlashParameters
RFchipTempCorr = 0; // [degC]
CONbaud = DEFAULT_CONbaud; // [bps]
CONprot = 0xFF;
PressCorr = 0; // [0.25Pa]
TimeCorr = 0; // [sec]
GeoidSepar = 10*DEFAULT_GeoidSepar; // [0.1m]
@ -438,9 +446,12 @@ class FlashParameters
if(strcmp(Name, "AcftType")==0)
{ uint32_t Type=0; if(Read_Int(Type, Value)<=0) return 0;
AcftType=Type; return 1; }
if(strcmp(Name, "Console")==0)
if(strcmp(Name, "CONbaud")==0)
{ uint32_t Baud=0; if(Read_Int(Baud, Value)<=0) return 0;
CONbaud=Baud; return 1; }
if(strcmp(Name, "CONprot")==0)
{ uint32_t Prot=0; if(Read_Int(Prot, Value)<=0) return 0;
CONprot=Prot; return 1; }
if(strcmp(Name, "TxHW")==0)
{ int32_t HW=1; if(Read_Int(HW, Value)<=0) return 0;
if(HW) setTxTypeHW(); else clrTxTypeHW(); }
@ -585,7 +596,8 @@ class FlashParameters
Write_Hex (Line, "Address" , Address , 6); strcat(Line, " # [24-bit]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_Hex (Line, "AddrType" , AddrType, 1); strcat(Line, " # [2-bit]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_Hex (Line, "AcftType" , AcftType, 1); strcat(Line, " # [4-bit]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_UnsDec (Line, "Console" , CONbaud ); strcat(Line, " # [ bps]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_UnsDec (Line, "CONbaud" , CONbaud ); strcat(Line, " # [ bps]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_Hex (Line, "CONprot" , CONprot, 1); strcat(Line, " # [ mask]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_SignDec(Line, "TxPower" , getTxPower() ); strcat(Line, " # [ dBm]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_UnsDec (Line, "TxHW" ,(uint32_t)isTxTypeHW() ); strcat(Line, " # [ bool]\n"); if(fputs(Line, File)==EOF) return EOF;
Write_UnsDec (Line, "FreqPlan" ,(uint32_t)FreqPlan ); strcat(Line, " # [ 0..5]\n"); if(fputs(Line, File)==EOF) return EOF;
@ -634,7 +646,8 @@ class FlashParameters
Write_Hex (Line, "Address" , Address , 6); strcat(Line, " # [24-bit]\n"); Format_String(Output, Line);
Write_Hex (Line, "AddrType" , AddrType, 1); strcat(Line, " # [2-bit]\n"); Format_String(Output, Line);
Write_Hex (Line, "AcftType" , AcftType, 1); strcat(Line, " # [4-bit]\n"); Format_String(Output, Line);
Write_UnsDec (Line, "Console" , CONbaud ); strcat(Line, " # [ bps]\n"); Format_String(Output, Line);
Write_UnsDec (Line, "CONbaud" , CONbaud ); strcat(Line, " # [ bps]\n"); Format_String(Output, Line);
Write_Hex (Line, "CONprot" , CONprot, 1); strcat(Line, " # [ mask]\n"); Format_String(Output, Line);
Write_SignDec(Line, "TxPower" , getTxPower() ); strcat(Line, " # [ dBm]\n"); Format_String(Output, Line);
Write_UnsDec (Line, "TxHW" ,(uint32_t)isTxTypeHW() ); strcat(Line, " # [ bool]\n"); Format_String(Output, Line);
Write_UnsDec (Line, "FreqPlan" ,(uint32_t)FreqPlan ); strcat(Line, " # [ 0..5]\n"); Format_String(Output, Line);
@ -648,10 +661,10 @@ class FlashParameters
Write_UnsDec (Line, "NavRate" , (uint32_t)NavRate ); strcat(Line, " # [ 1,2]\n"); Format_String(Output, Line);
#ifdef WITH_ENCRYPT
Write_UnsDec (Line, "Encrypt" , Encrypt ); strcat(Line, " # [ 1|0]\n"); Format_String(Output, Line);
Write_Hex (Line, "EncryptKey[0]", EncryptKey[0] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
Write_Hex (Line, "EncryptKey[1]", EncryptKey[1] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
Write_Hex (Line, "EncryptKey[2]", EncryptKey[2] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
Write_Hex (Line, "EncryptKey[3]", EncryptKey[3] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
// Write_Hex (Line, "EncryptKey[0]", EncryptKey[0] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
// Write_Hex (Line, "EncryptKey[1]", EncryptKey[1] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
// Write_Hex (Line, "EncryptKey[2]", EncryptKey[2] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
// Write_Hex (Line, "EncryptKey[3]", EncryptKey[3] , 8); strcat(Line, " # [32-bit]\n"); Format_String(Output, Line);
#endif
Write_UnsDec (Line, "Verbose" , (uint32_t)Verbose ); strcat(Line, " # [ 0..3]\n"); Format_String(Output, Line);
Write_UnsDec (Line, "PPSdelay" ,(uint32_t)PPSdelay ); strcat(Line, " # [ ms]\n"); Format_String(Output, Line);