Attempt to enter sleep/shutdown when button pressed for 4sec

pull/5/head
Pawel Jalocha 2019-04-29 14:26:12 +01:00
rodzic a9a6a71159
commit a1a1dca5c3
6 zmienionych plików z 114 dodań i 27 usunięć

Wyświetl plik

@ -5,21 +5,21 @@
#define DEFAULT_FreqPlan 0
// #define WITH_HELTEC // HELTEC module: PCB LED on GPI025
// #define WITH_TTGO // TTGO module: PCB LED on GPIO2, GPIO25 free to use as DAC2 output
#define WITH_TBEAM // T-Beam module
#define WITH_TTGO // TTGO module: PCB LED on GPIO2, GPIO25 free to use as DAC2 output
// #define WITH_TBEAM // T-Beam module
// #define WITH_FollowMe // by Avionix
#define WITH_RFM95
// #define WITH_RFM69
// #define WITH_OLED // OLED display on the I2C: some TTGO modules are without OLED display
#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_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_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
@ -31,7 +31,7 @@
// #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_BME280 // BMP280 with humidity (but still works with BMP280)
// #define WITH_MS5607 // MS5607 pressure sensor
#define WITH_PFLAA // PFLAU and PFLAA for compatibility with XCsoar and LK8000
@ -41,8 +41,8 @@
// #define WITH_BEEPER
// #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_LOG // log own positions and other received to SPIFFS and possibly to uSD
// #define WITH_SPIFFS // use SPIFFS file system in Flash
// #define WITH_LOG // log own positions and other received to SPIFFS and possibly to uSD
#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

Wyświetl plik

@ -245,8 +245,6 @@ static void ProcessCtrlL(void) // print syste
#endif
}
static void ProcessInput(void)
{ for( ; ; )
{ uint8_t Byte; int Err=CONS_UART_Read(Byte); if(Err<=0) break; // get byte from console, if none: exit the loop
@ -286,8 +284,9 @@ void vTaskCTRL(void* pvParameters)
LED_TimerCheck(1); // update the LED flashes
#ifdef WITH_BEEPER
Play_TimerCheck(); // update the LED flashes
Play_TimerCheck(1); // read the button(s)
#endif
Button_TimerCheck();
uint32_t Time=TimeSync_Time();
GPS_Position *GPS = GPS_getPosition();
@ -297,12 +296,16 @@ void vTaskCTRL(void* pvParameters)
PrevTime=Time; PrevGPS=GPS;
#ifdef WITH_OLED
esp_err_t StatErr=ESP_OK;
esp_err_t PosErr=ESP_OK;
if(TimeChange)
{ StatErr = OLED_DisplayStatus(Time, 0); }
if(GPSchange)
{ PosErr = OLED_DisplayPosition(GPS, 2); }
if(Button_SleepRequest)
{ OLED_DisplayON(0); }
else
{ esp_err_t StatErr=ESP_OK;
esp_err_t PosErr=ESP_OK;
if(TimeChange)
{ StatErr = OLED_DisplayStatus(Time, 0); }
if(GPSchange)
{ PosErr = OLED_DisplayPosition(GPS, 2); }
}
#ifdef DEBUG_PRINT
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);
if(TimeChange)

Wyświetl plik

@ -404,6 +404,12 @@ static void GPS_NMEA(void) // wh
if(NMEA.isGxRMC()) GPS_Burst.GxRMC=1;
if(NMEA.isGxGGA()) GPS_Burst.GxGGA=1;
if(NMEA.isGxGSA()) GPS_Burst.GxGSA=1;
if(Button_SleepRequest)
{
#ifdef WITH_GPS_MTK
Format_String(GPS_UART_Write, "$PMTK225,4*2F\r\n", 15, 0); // request to the GPS to enter sleep
#endif
}
#ifdef DEBUG_PRINT
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);
Format_UnsDec(CONS_UART_Write, TimeSync_Time()%60);

Wyświetl plik

@ -123,7 +123,7 @@ PSRM32 = SDIO ?
GPIO HELTEC TTGO JACEK T-Beam FollowMe Restrictions
0 .
0 Button
1 CONS/TxD CONS/TxD CONS/TxD CONS/TxD Console/Program
2 SD/MISO . LED Bootstrap: LOW to enter UART download mode
3 CONS/RxD CONS/RxD CONS/RxD CONS/RxD Console/Program
@ -288,6 +288,12 @@ uint8_t BARO_I2C = (uint8_t)I2C_BUS;
#define PIN_SD_SCK GPIO_NUM_14
#define PIN_SD_CS GPIO_NUM_15
#ifdef WITH_FollowMe
#define PIN_BUTTON GPIO_NUM_39
#else
#define PIN_BUTTON GPIO_NUM_0
#endif
// ======================================================================================================
// 48-bit unique ID of the chip
@ -337,6 +343,11 @@ void LED_PCB_On (void) { }
void LED_PCB_Off (void) { }
#endif
#ifdef PIN_BUTTON
void Button_Dir (void) { gpio_set_direction(PIN_BUTTON, GPIO_MODE_INPUT); }
bool Button_isPressed(void) { return !gpio_get_level(PIN_BUTTON); }
#endif
// ========================================================================================================
// ~/esp-idf/components/bt/bluedroid/api/include/esp_spp_api.h
@ -742,6 +753,17 @@ esp_err_t OLED_Init(uint8_t DispIdx)
i2c_cmd_link_delete(cmd);
return espRc; }
esp_err_t OLED_DisplayON(uint8_t ON, uint8_t DispIdx)
{ i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, ((OLED_I2C_ADDR+DispIdx)<<1) | I2C_MASTER_WRITE, true);
i2c_master_write_byte(cmd, OLED_CONTROL_BYTE_CMD_STREAM, true);
i2c_master_write_byte(cmd, OLED_CMD_DISPLAY_OFF+ON, true);
i2c_master_stop(cmd);
esp_err_t espRc = i2c_master_cmd_begin(I2C_BUS, cmd, 10);
i2c_cmd_link_delete(cmd);
return espRc; }
esp_err_t OLED_SetContrast(uint8_t Contrast, uint8_t DispIdx)
{ i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
@ -874,6 +896,62 @@ void LED_TimerCheck(uint8_t Ticks)
#endif
}
bool Button_SleepRequest = 0;
const int8_t Button_FilterTime = 20; // [ms]
const int8_t Button_FilterThres = Button_FilterTime/2;
static int8_t Button_Filter=(-Button_FilterTime);
void Sleep(void)
{
// #ifdef PIN_PERIPH_RST
// gpio_set_level(PIN_PERIPH_RST, 0);
// #endif
#ifdef PIN_GPS_ENA
gpio_set_level(PIN_GPS_ENA, 0);
#endif
esp_light_sleep_start();
Button_SleepRequest = 0;
// #ifdef PIN_PERIPH_RST
// gpio_set_level(PIN_PERIPH_RST, 0);
//
// gpio_set_level(PIN_PERIPH_RST, 1);
// #endif
}
uint32_t Button_PressTime=0; // [ms] counts for how long the button is kept pressed
void Button_keptPressed(uint8_t Ticks)
{ Button_PressTime+=Ticks;
Button_SleepRequest = Button_PressTime>=4000; } // [ms] setup SleepRequest if button pressed for >= 4sec
void Button_keptReleased(uint8_t Ticks)
{
if(Button_PressTime)
{ Format_String(CONS_UART_Write, "Button released:");
Format_UnsDec(CONS_UART_Write, Button_PressTime);
Format_String(CONS_UART_Write, "\n");
if(Button_SleepRequest)
{ Format_String(CONS_UART_Write, "Sleep in 1 sec\n");
vTaskDelay(1000);
Sleep(); }
}
Button_PressTime=0; }
void Button_TimerCheck(uint8_t Ticks)
{
#ifdef PIN_BUTTON
if(Button_isPressed())
{ Button_Filter+=Ticks; if(Button_Filter>Button_FilterTime) Button_Filter=Button_FilterTime;
if(Button_Filter>=Button_FilterThres) { Button_keptPressed(Ticks); }
}
else
{ Button_Filter-=Ticks; if(Button_Filter<(-Button_FilterTime)) Button_Filter=(-Button_FilterTime);
if(Button_Filter<=(-Button_FilterThres)) { Button_keptReleased(Ticks); }
}
#endif
}
/*
extern "C"
void vApplicationIdleHook(void) // when RTOS is idle: should call "sleep until an interrupt"
@ -925,6 +1003,9 @@ void IO_Configuration(void)
LED_PCB_Dir();
LED_PCB_Off();
#endif
#ifdef PIN_BUTTON
Button_Dir();
#endif
RFM_IRQ_Dir();
RFM_RESET_Dir();
@ -1050,16 +1131,6 @@ void IO_Configuration(void)
// esp_register_freertos_tick_hook(&vApplicationTickHook);
/*
#ifdef PIN_PERIPH_RST
gpio_set_level(PIN_PERIPH_RST, 0);
#endif
#ifdef PIN_GPS_ENA
gpio_set_level(PIN_GPS_ENA, 0);
#endif
esp_light_sleep_start();
*/
}
// ======================================================================================================

Wyświetl plik

@ -117,6 +117,7 @@ void RFM_RESET(uint8_t On); // RF module reset
bool RFM_IRQ_isOn(void); // query the IRQ state
#ifdef WITH_OLED
int OLED_DisplayON(uint8_t ON, uint8_t DispIdx=0);
int OLED_SetContrast(uint8_t Contrast, uint8_t DispIdx=0);
int OLED_PutLine(uint8_t Line, const char *Text, uint8_t DispIdx=0);
#endif
@ -169,6 +170,9 @@ void LED_RX_Flash(uint8_t Time=100);
void LED_TimerCheck(uint8_t Ticks=1);
extern bool Button_SleepRequest;
void Button_TimerCheck(uint8_t Ticks=1);
void IO_Configuration(void); // Configure I/O
int NVS_Init(void); // initialize non-volatile-storage in the Flash

Wyświetl plik

@ -207,6 +207,9 @@ extern "C"
for( ; ; )
{
while(Button_SleepRequest)
{ TRX.WriteMode(RF_OPMODE_SLEEP);
vTaskDelay(100); }
uint32_t RxRssiSum=0; uint16_t RxRssiCount=0; // measure the average RSSI for lower frequency
do