support for ena-eke-proxy, improved interface

This commit is contained in:
Lurkars
2020-12-06 12:48:12 +01:00
parent 4029099d2a
commit d0e52071f1
53 changed files with 1478 additions and 5252 deletions
+2
View File
@@ -4,6 +4,7 @@ idf_component_register(
"interface-main.c"
"interface-data.c"
"interface-datetime.c"
"interface-info.c"
"interface-input.c"
"interface-label.c"
"interface-report.c"
@@ -12,6 +13,7 @@ idf_component_register(
INCLUDE_DIRS "."
PRIV_REQUIRES
ena
ena-eke-proxy
display
display-ssd1306
rtc
+3 -2
View File
@@ -91,12 +91,12 @@ void interface_data_rst(void)
void interface_data_lft(void)
{
interface_wifi_start();
interface_datetime_start();
}
void interface_data_rht(void)
{
interface_settings_start();
interface_info_start();
}
void interface_data_mid(void)
@@ -190,6 +190,7 @@ void interface_data_start(void)
interface_register_command_callback(INTERFACE_COMMAND_UP, &interface_data_up);
interface_register_command_callback(INTERFACE_COMMAND_DWN, &interface_data_dwn);
interface_set_display_function(&interface_data_display);
interface_set_display_refresh_function(NULL);
ESP_LOGD(INTERFACE_LOG, "start delete data interface");
}
+6 -4
View File
@@ -49,12 +49,12 @@ void interface_datetime_set(void)
void interface_datetime_lft(void)
{
interface_settings_start();
interface_wifi_start();
}
void interface_datetime_rht(void)
{
interface_wifi_start();
interface_data_start();
}
void interface_datetime_mid(void)
@@ -106,7 +106,8 @@ void interface_datetime_display(void)
display_clear_line( edit_line + 1, false);
time(&current_timstamp);
current_tm = localtime(&current_timstamp);
current_tm = gmtime(&current_timstamp);
current_tm->tm_hour = current_tm->tm_hour + (interface_get_timezone_offset()) % 24;
strftime(time_buffer, 16, INTERFACE_FORMAT_TIME, current_tm);
display_text_line_column( time_buffer, 3, 4, false);
@@ -168,6 +169,7 @@ void interface_datetime_start(void)
interface_register_command_callback(INTERFACE_COMMAND_DWN, &interface_datetime_dwn);
interface_register_command_callback(INTERFACE_COMMAND_SET, &interface_datetime_set);
interface_register_command_callback(INTERFACE_COMMAND_RST, NULL);
interface_set_display_function(&interface_datetime_display);
interface_set_display_function(NULL);
interface_set_display_refresh_function(&interface_datetime_display);
ESP_LOGD(INTERFACE_LOG, "start datetime interface");
}
+111
View File
@@ -0,0 +1,111 @@
// Copyright 2020 Lukas Haubaum
//
// Licensed under the GNU Affero General Public License, Version 3;
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// https://www.gnu.org/licenses/agpl-3.0.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/gpio.h"
#include "display.h"
#include "display-gfx.h"
#include "ena-storage.h"
#include "ena-exposure.h"
#include "interface.h"
void interface_info_set(void)
{
interface_main_start();
}
void interface_info_rst(void)
{
}
void interface_info_lft(void)
{
interface_data_start();
}
void interface_info_rht(void)
{
interface_settings_start();
}
void interface_info_mid(void)
{
}
void interface_info_up(void)
{
}
void interface_info_dwn(void)
{
}
void interface_info_display(void)
{
char data_chars[10];
display_menu_headline(interface_get_label_text(&interface_text_headline_info), true, 0);
display_text_line_column(interface_get_label_text(&interface_text_info_num_keys), 2, 1, false);
sprintf(data_chars, "%u", ena_storage_beacons_count());
display_text_line_column(data_chars, 2, 9, false);
ena_exposure_summary_t *current_exposure_summary = ena_exposure_current_summary();
display_text_line_column(interface_get_label_text(&interface_text_info_exp_days), 4, 1, false);
sprintf(data_chars, "%d", current_exposure_summary->days_since_last_exposure);
if (current_exposure_summary->days_since_last_exposure < 0)
{
display_text_line_column("/", 4, 12, false);
}
else
{
display_text_line_column(data_chars, 4, 12, false);
}
display_text_line_column(interface_get_label_text(&interface_text_info_exp_num), 5, 1, false);
sprintf(data_chars, "%d", current_exposure_summary->num_exposures);
display_text_line_column(data_chars, 5, 12, false);
display_text_line_column(interface_get_label_text(&interface_text_info_exp_max), 6, 1, false);
sprintf(data_chars, "%d", current_exposure_summary->max_risk_score);
display_text_line_column(data_chars, 6, 12, false);
display_text_line_column(interface_get_label_text(&interface_text_info_exp_sum), 7, 1, false);
sprintf(data_chars, "%d", current_exposure_summary->risk_score_sum);
display_text_line_column(data_chars, 7, 12, false);
}
void interface_info_start(void)
{
interface_register_command_callback(INTERFACE_COMMAND_RST, &interface_info_rst);
interface_register_command_callback(INTERFACE_COMMAND_SET, &interface_info_set);
interface_register_command_callback(INTERFACE_COMMAND_LFT, &interface_info_lft);
interface_register_command_callback(INTERFACE_COMMAND_RHT, &interface_info_rht);
interface_register_command_callback(INTERFACE_COMMAND_MID, &interface_info_mid);
interface_register_command_callback(INTERFACE_COMMAND_UP, &interface_info_up);
interface_register_command_callback(INTERFACE_COMMAND_DWN, &interface_info_dwn);
interface_set_display_function(&interface_info_display);
interface_set_display_refresh_function(NULL);
ESP_LOGD(INTERFACE_LOG, "start info interface");
}
+2
View File
@@ -154,6 +154,7 @@ void interface_input_mid(void)
current_text[current_cursor] = current_char_set[current_char_index];
printf("current_char_set: %d %s\n", strlen(current_char_set), current_char_set);
}
void interface_input_up(void)
{
if (current_char_index == 0)
@@ -314,5 +315,6 @@ void interface_input(interface_text_callback callback_rst, interface_text_callba
interface_register_command_callback(INTERFACE_COMMAND_DWN, &interface_input_dwn);
interface_set_display_function(&interface_input_display);
interface_set_display_refresh_function(NULL);
ESP_LOGD(INTERFACE_LOG, "start input interface");
}
+32 -5
View File
@@ -27,23 +27,36 @@ void interface_init_label(void)
// EN
interface_text_button_cancel.text[EN] = "CANCEL";
interface_text_button_ok.text[EN] = "OK";
interface_text_button_back.text[EN] = "BACK";
interface_text_button_menu.text[EN] = "MENU";
interface_text_button_report.text[EN] = "REPORT";
interface_text_headline_tan.text[EN] = "ENTER TAN";
interface_text_headline_report.text[EN] = "REPORT";
interface_text_headline_wifi.text[EN] = "WIFI";
interface_text_headline_time.text[EN] = "TIME/DATE";
interface_text_headline_data.text[EN] = "DEL DATA";
interface_text_headline_settings.text[EN] = "SETTING";
interface_text_headline_info.text[EN] = "INFO";
interface_text_headline_debug.text[EN] = "DEBUG";
interface_text_wifi_scanning.text[EN] = "Scanning...";
interface_text_settings_locale.text[EN] = "Language:";
interface_text_settings_locales[EN].text[EN] = "EN";
interface_text_settings_locales[DE].text[EN] = "DE";
interface_text_settings_timezone.text[EN] = "Timezone:";
interface_text_settings_timezone.text[EN] = "UTC:";
interface_text_wifi_scanning.text[EN] = "Scanning...";
interface_text_info_num_keys.text[EN] = "Seen:";
interface_text_info_exp_days.text[EN] = "Last Exp:";
interface_text_info_exp_num.text[EN] = "Num Exp:";
interface_text_info_exp_max.text[EN] = "Score:";
interface_text_info_exp_sum.text[EN] = "Scores:";
interface_text_report_pending.text[EN] = "Uploading...";
interface_text_report_success.text[EN] = "Upload succeed!";
interface_text_report_fail.text[EN] = "Upload failed!";
interface_text_data_del[0].text[EN] = "DEL TEK";
interface_text_data_del[1].text[EN] = "DEL Exp Info";
@@ -75,26 +88,40 @@ void interface_init_label(void)
// DE
interface_text_button_cancel.text[DE] = "ZURÜCK";
interface_text_button_back.text[DE] = "ZURÜCK";
interface_text_button_ok.text[DE] = "OK";
interface_text_button_menu.text[DE] = "MENU";
interface_text_button_report.text[DE] = "MELDEN";
interface_text_headline_tan.text[DE] = "TAN EING.";
interface_text_headline_report.text[DE] = "MELDEN";
interface_text_headline_wifi.text[DE] = "WLAN";
interface_text_headline_time.text[DE] = "ZEIT/DATUM";
interface_text_headline_data.text[DE] = "DATEN ENTF";
interface_text_headline_settings.text[DE] = "EINSTEL.";
interface_text_headline_info.text[DE] = "INFOS";
interface_text_headline_debug.text[DE] = "DEBUG";
interface_text_wifi_scanning.text[DE] = "Scannen...";
interface_text_settings_locale.text[DE] = "Sprache:";
interface_text_settings_locales[EN].text[DE] = "EN";
interface_text_settings_locales[DE].text[DE] = "DE";
interface_text_settings_timezone.text[DE] = "Zeitzone:";
interface_text_settings_timezone.text[DE] = "GMT:";
interface_text_wifi_scanning.text[DE] = "Scannen...";
interface_text_info_num_keys.text[DE] = "Gesehen:";
interface_text_info_exp_days.text[DE] = "letz. Exp:";
interface_text_info_exp_num.text[DE] = "Anz. Exp:";
interface_text_info_exp_max.text[DE] = "Score:";
interface_text_info_exp_sum.text[DE] = "Scores:";
interface_text_data_del[0].text[DE] = "ENTF TEK";
interface_text_report_pending.text[DE] = "Hochladen...";
interface_text_report_success.text[DE] = "Erfolgreich!";
interface_text_report_fail.text[DE] = "Fehlgeschlagen!";
interface_text_data_del[0]
.text[DE] = "ENTF TEK";
interface_text_data_del[1].text[DE] = "ENTF Exp Info";
interface_text_data_del[2].text[DE] = "ENTF Tmp RPI";
interface_text_data_del[3].text[DE] = "ENTF RPI";
+64 -65
View File
@@ -30,11 +30,10 @@ static time_t current_timstamp;
static struct tm *current_tm;
static char time_buffer[32];
static char text_buffer[32];
static bool wifi_connected;
void interface_main_set(void)
{
interface_datetime_start();
interface_info_start();
}
void interface_main_rst(void)
@@ -44,28 +43,83 @@ void interface_main_rst(void)
void interface_main_display(void)
{
if (wifi_connected)
ena_exposure_summary_t *current_exposure_summary = ena_exposure_current_summary();
time(&current_timstamp);
uint32_t last_update = current_exposure_summary->last_update;
// status unknown if no update or last update older than two days
if (last_update == 0 || ((current_timstamp - last_update) / (60 * 60 * 24)) > 2)
{
display_data( display_gfx_wifi, 8, 0, 0, false);
display_data(display_gfx_question[0], 24, 0, 12, false);
display_data(display_gfx_question[1], 24, 1, 12, false);
display_data(display_gfx_question[2], 24, 2, 12, false);
display_data(display_gfx_question[3], 24, 3, 12, false);
}
else if (current_exposure_summary->max_risk_score < 100)
{
display_data(display_gfx_smile[0], 24, 0, 12, false);
display_data(display_gfx_smile[1], 24, 1, 12, false);
display_data(display_gfx_smile[2], 24, 2, 12, false);
display_data(display_gfx_smile[3], 24, 3, 12, false);
}
else
{
display_data( display_gfx_cross, 8, 0, 0, false);
display_data(display_gfx_sad[0], 24, 0, 12, false);
display_data(display_gfx_sad[1], 24, 1, 12, false);
display_data(display_gfx_sad[2], 24, 2, 12, false);
display_data(display_gfx_sad[3], 24, 3, 12, false);
}
// clock icon
display_data(display_gfx_clock, 8, 4, 8, false);
// last update
struct tm *last_update_tm = gmtime((time_t *)&last_update);
last_update_tm->tm_hour = last_update_tm->tm_hour + (interface_get_timezone_offset()) % 24;
sprintf(time_buffer, "%02d %s %02d:%02d",
last_update_tm->tm_mday,
interface_get_label_text(&interface_texts_month[last_update_tm->tm_mon]),
last_update_tm->tm_hour,
last_update_tm->tm_min);
if (last_update != 0)
{
display_text_line_column(time_buffer, 4, 3, false);
}
// buttons
display_set_button(interface_get_label_text(&interface_text_button_menu), true, false);
display_set_button(interface_get_label_text(&interface_text_button_report), false, true);
}
void interface_main_display_refresh(void)
{
if (wifi_controller_connection() != NULL)
{
display_data(display_gfx_wifi, 8, 0, 0, false);
}
else
{
display_data(display_gfx_cross, 8, 0, 0, false);
}
time(&current_timstamp);
current_tm = localtime(&current_timstamp);
current_tm = gmtime(&current_timstamp);
current_tm->tm_hour = current_tm->tm_hour + (interface_get_timezone_offset()) % 24;
// curent date
sprintf(text_buffer, "%s %s %d",
interface_get_label_text(&interface_texts_weekday[current_tm->tm_wday]),
interface_get_label_text(&interface_texts_month[current_tm->tm_mon]),
current_tm->tm_mday);
display_text_line_column( text_buffer, 0, 16 - strlen(text_buffer), false);
display_text_line_column(text_buffer, 0, 16 - strlen(text_buffer), false);
// current time
strftime(time_buffer, 16, INTERFACE_FORMAT_TIME, current_tm);
display_text_line_column( time_buffer, 1, 16 - strlen(time_buffer), false);
display_text_line_column(time_buffer, 1, 16 - strlen(time_buffer), false);
}
void interface_main_start(void)
@@ -79,64 +133,9 @@ void interface_main_start(void)
interface_register_command_callback(INTERFACE_COMMAND_UP, NULL);
interface_register_command_callback(INTERFACE_COMMAND_DWN, NULL);
if (wifi_controller_connection() != NULL)
{
wifi_connected = true;
}
else
{
wifi_connected = false;
}
interface_set_display_function(&interface_main_display);
interface_set_display_refresh_function(&interface_main_display_refresh);
ena_exposure_summary_t *current_exposure_summary = ena_exposure_current_summary();
time(&current_timstamp);
uint32_t last_update = ena_storage_read_last_exposure_date();
// status unknown if no update or last update older than two days
if (last_update == 0 || ((current_timstamp - last_update) / (60 * 60 * 24)) > 2)
{
display_data( display_gfx_question[0], 24, 0, 12, false);
display_data( display_gfx_question[1], 24, 1, 12, false);
display_data( display_gfx_question[2], 24, 2, 12, false);
display_data( display_gfx_question[3], 24, 3, 12, false);
}
else if (current_exposure_summary->max_risk_score < 100)
{
display_data( display_gfx_smile[0], 24, 0, 12, false);
display_data( display_gfx_smile[1], 24, 1, 12, false);
display_data( display_gfx_smile[2], 24, 2, 12, false);
display_data( display_gfx_smile[3], 24, 3, 12, false);
}
else
{
display_data( display_gfx_sad[0], 24, 0, 12, false);
display_data( display_gfx_sad[1], 24, 1, 12, false);
display_data( display_gfx_sad[2], 24, 2, 12, false);
display_data( display_gfx_sad[3], 24, 3, 12, false);
}
// clock icon
display_data( display_gfx_clock, 8, 4, 8, false);
// last update
struct tm *last_update_tm = localtime((time_t*) &last_update);
sprintf(time_buffer, "%02d %s %02d:%02d",
last_update_tm->tm_mday,
interface_get_label_text(&interface_texts_month[last_update_tm->tm_mon]),
last_update_tm->tm_hour,
last_update_tm->tm_min);
if (last_update != 0)
{
display_text_line_column( time_buffer, 4, 3, false);
}
// buttons
display_set_button( interface_get_label_text(&interface_text_button_menu), true, false);
display_set_button( interface_get_label_text(&interface_text_button_report), false, true);
interface_main_display();
ESP_LOGD(INTERFACE_LOG, "start main interface");
}
+236 -100
View File
@@ -24,154 +24,290 @@
#include "wifi-controller.h"
#include "ena-eke-proxy.h"
#include "interface.h"
static int interface_report_tan[10] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
static int interface_report_tan_index = 0;
static char current_tan[10];
static uint8_t current_cursor;
static char current_char_set[32];
static uint8_t current_char_index;
static char char_set_uppercase[32];
static char char_set_numeric[32];
static uint8_t current_max_index;
typedef enum
{
INTERFACE_REPORT_STATUS_NONE = 0,
INTERFACE_REPORT_STATUS_PENDING,
INTERFACE_REPORT_STATUS_SUCCESS,
INTERFACE_REPORT_STATUS_FAIL
} report_status_e;
static int current_report_status = INTERFACE_REPORT_STATUS_NONE;
void interface_report_display(void)
{
display_clear();
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
display_menu_headline(interface_get_label_text(&interface_text_headline_tan), false, 0);
// buttons
display_set_button(interface_get_label_text(&interface_text_button_cancel), true, false);
if (current_cursor == 9)
{
display_set_button(interface_get_label_text(&interface_text_button_ok), false, true);
}
if (current_cursor > 0)
{
display_data(display_gfx_arrow_left, 8, 3, 8, false);
}
else
{
display_data(display_gfx_clear, 8, 3, 8, false);
}
if (current_cursor < 9)
{
display_data(display_gfx_arrow_right, 8, 3, 112, false);
}
else
{
display_data(display_gfx_clear, 8, 3, 112, false);
}
display_clear_line(2, false);
display_clear_line(4, false);
display_text_line_column("-", 3, 5, false);
display_text_line_column("-", 3, 9, false);
display_text_line_column("___", 3, 2, false);
display_text_line_column("___", 3, 6, false);
display_text_line_column("____", 3, 10, false);
int offset = 2;
for (int i = 0; i < 3; i++)
{
if (i < current_cursor)
{
display_chars(&current_tan[i], 1, 3, i + offset, true);
}
}
if (current_cursor > 2)
{
offset = 3;
for (int i = 3; i < 6; i++)
{
if (i < current_cursor)
{
display_chars(&current_tan[i], 1, 3, i + offset, true);
}
}
}
if (current_cursor > 5)
{
offset = 4;
for (int i = 6; i < 10; i++)
{
if (i < current_cursor)
{
display_chars(&current_tan[i], 1, 3, i + offset, true);
}
}
}
display_data(display_gfx_arrow_up, 8, 2, current_cursor * 8 + offset * 8, false);
display_data(display_gfx_arrow_down, 8, 4, current_cursor * 8 + offset * 8, false);
display_chars(&current_tan[current_cursor], 1, 3, current_cursor + offset, false);
}
else if (current_report_status == INTERFACE_REPORT_STATUS_PENDING)
{
display_menu_headline(interface_get_label_text(&interface_text_headline_report), false, 0);
display_text_line_column(interface_get_label_text(&interface_text_report_pending), 4, 1, false);
}
else if (current_report_status == INTERFACE_REPORT_STATUS_SUCCESS)
{
display_menu_headline(interface_get_label_text(&interface_text_headline_report), false, 0);
display_text_line_column(interface_get_label_text(&interface_text_report_success), 3, 1, false);
display_set_button(interface_get_label_text(&interface_text_button_ok), false, true);
}
else if (current_report_status == INTERFACE_REPORT_STATUS_FAIL)
{
display_menu_headline(interface_get_label_text(&interface_text_headline_report), false, 0);
display_text_line_column(interface_get_label_text(&interface_text_report_fail), 3, 1, false);
display_set_button(interface_get_label_text(&interface_text_button_back), true, false);
display_set_button(interface_get_label_text(&interface_text_button_ok), false, true);
}
}
void interface_report_set_char_set(void)
{
char *ret;
char cur_char = current_tan[current_cursor];
if ((ret = strchr(char_set_uppercase, cur_char)) != NULL)
{
strcpy(current_char_set, char_set_uppercase);
current_char_index = strlen(current_char_set) - strlen(ret);
}
else if ((ret = strchr(char_set_numeric, cur_char)) != NULL)
{
strcpy(current_char_set, char_set_numeric);
current_char_index = strlen(current_char_set) - strlen(ret);
}
}
void interface_report_set(void)
{
interface_main_start();
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
interface_main_start();
}
else if (current_report_status == INTERFACE_REPORT_STATUS_FAIL)
{
current_report_status = INTERFACE_REPORT_STATUS_NONE;
}
}
void interface_report_rst(void)
{
// TODO: REPORT here, check tan etc.
if (current_cursor == 9 && current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
current_report_status = INTERFACE_REPORT_STATUS_PENDING;
interface_report_display();
ESP_LOGI(INTERFACE_LOG, "publish tan: %s", current_tan);
esp_err_t err = ena_eke_proxy_upload(current_tan, 0);
if (err == ESP_OK)
{
current_report_status = INTERFACE_REPORT_STATUS_SUCCESS;
}
else
{
current_report_status = INTERFACE_REPORT_STATUS_FAIL;
}
interface_report_display();
}
else if (current_report_status == INTERFACE_REPORT_STATUS_SUCCESS || current_report_status == INTERFACE_REPORT_STATUS_FAIL)
{
interface_main_start();
}
}
void interface_report_mid(void)
{
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
if (current_char_set[0] == char_set_uppercase[0])
{
strcpy(current_char_set, char_set_numeric);
}
else if (current_char_set[0] == char_set_numeric[0])
{
strcpy(current_char_set, char_set_uppercase);
}
current_char_index = 0;
current_tan[current_cursor] = current_char_set[current_char_index];
}
}
void interface_report_lft(void)
{
if (interface_report_tan_index > 0)
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
interface_report_tan_index--;
if (current_cursor > 0)
{
current_cursor--;
interface_report_set_char_set();
}
}
ESP_LOGD(INTERFACE_LOG, "tan index %d", interface_report_tan_index);
}
void interface_report_rht(void)
{
if (interface_report_tan_index < 9)
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
interface_report_tan_index++;
if (current_cursor < 9)
{
current_cursor++;
if (current_cursor > current_max_index)
{
current_max_index = current_cursor;
strcpy(current_char_set, char_set_uppercase);
current_char_index = 0;
current_tan[current_cursor] = current_char_set[current_char_index];
}
else
{
interface_report_set_char_set();
}
}
}
ESP_LOGD(INTERFACE_LOG, "tan index %d", interface_report_tan_index);
}
void interface_report_up(void)
{
if (interface_report_tan[interface_report_tan_index] > 0)
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
interface_report_tan[interface_report_tan_index]--;
}
else
{
interface_report_tan[interface_report_tan_index] = 9;
if (current_char_index == 0)
{
current_char_index = strlen(current_char_set) - 1;
}
else
{
current_char_index--;
}
current_tan[current_cursor] = current_char_set[current_char_index];
}
}
void interface_report_dwn(void)
{
if (interface_report_tan[interface_report_tan_index] < 9)
if (current_report_status == INTERFACE_REPORT_STATUS_NONE)
{
interface_report_tan[interface_report_tan_index]++;
}
else
{
interface_report_tan[interface_report_tan_index] = 0;
}
}
void interface_report_display(void)
{
display_menu_headline( interface_get_label_text(&interface_text_headline_tan), false, 0);
// buttons
display_set_button( interface_get_label_text(&interface_text_button_cancel), true, false);
display_set_button( interface_get_label_text(&interface_text_button_ok), false, true);
static char tan_buffer[10] = {0};
if (interface_report_tan_index > 0)
{
display_data( display_gfx_arrow_left, 8, 3, 8, false);
}
else
{
display_data( display_gfx_clear, 8, 3, 8, false);
}
if (interface_report_tan_index < 9)
{
display_data( display_gfx_arrow_right, 8, 3, 112, false);
}
else
{
display_data( display_gfx_clear, 8, 3, 112, false);
}
for (int i = 0; i < interface_report_tan_index + 1; i++)
{
sprintf(&tan_buffer[i], "%d", interface_report_tan[i]);
}
display_clear_line( 2, false);
display_clear_line( 4, false);
display_text_line_column( "-", 3, 5, false);
display_text_line_column( "-", 3, 9, false);
display_text_line_column( "___", 3, 2, false);
display_text_line_column( "___", 3, 6, false);
display_text_line_column( "____", 3, 10, false);
int offset = 2;
for (int i = 0; i < 3; i++)
{
if (i < interface_report_tan_index)
if (current_char_index == strlen(current_char_set) - 1)
{
display_chars( &tan_buffer[i], 1, 3, i + offset, true);
current_char_index = 0;
}
}
if (interface_report_tan_index > 2)
{
offset = 3;
for (int i = 3; i < 6; i++)
else
{
if (i < interface_report_tan_index)
{
display_chars( &tan_buffer[i], 1, 3, i + offset, true);
}
current_char_index++;
}
current_tan[current_cursor] = current_char_set[current_char_index];
}
if (interface_report_tan_index > 5)
{
offset = 4;
for (int i = 6; i < 10; i++)
{
if (i < interface_report_tan_index)
{
display_chars( &tan_buffer[i], 1, 3, i + offset, true);
}
}
}
display_data( display_gfx_arrow_up, 8, 2, interface_report_tan_index * 8 + offset * 8, false);
display_data( display_gfx_arrow_down, 8, 4, interface_report_tan_index * 8 + offset * 8, false);
display_chars( &tan_buffer[interface_report_tan_index], 1, 3, interface_report_tan_index + offset, false);
}
void interface_report_start(void)
{
display_utf8_to_ascii("ABCDEFGHIJKLMNOPQRSTUVWXYZ", char_set_uppercase);
display_utf8_to_ascii("0123456789", char_set_numeric);
strcpy(current_char_set, char_set_uppercase);
current_report_status = INTERFACE_REPORT_STATUS_NONE;
current_max_index = 0;
current_char_index = 0;
current_cursor = 0;
current_tan[current_cursor] = current_char_set[current_char_index];
interface_register_command_callback(INTERFACE_COMMAND_RST, &interface_report_rst);
interface_register_command_callback(INTERFACE_COMMAND_SET, &interface_report_set);
interface_register_command_callback(INTERFACE_COMMAND_MID, &interface_report_mid);
interface_register_command_callback(INTERFACE_COMMAND_LFT, &interface_report_lft);
interface_register_command_callback(INTERFACE_COMMAND_RHT, &interface_report_rht);
interface_register_command_callback(INTERFACE_COMMAND_UP, &interface_report_up);
interface_register_command_callback(INTERFACE_COMMAND_DWN, &interface_report_dwn);
interface_register_command_callback(INTERFACE_COMMAND_MID, NULL);
interface_set_display_function(&interface_report_display);
interface_set_display_refresh_function(NULL);
ESP_LOGD(INTERFACE_LOG, "start report interface");
}
+76 -18
View File
@@ -33,6 +33,17 @@ typedef enum
} interface_settings_state_t;
static int current_interface_settings_state;
static int current_timezone_offset = 0;
int interface_get_timezone_offset(void)
{
return current_timezone_offset;
}
void interface_set_timezone_offset(int timezone_offset)
{
current_timezone_offset = timezone_offset;
}
void interface_settings_set(void)
{
@@ -45,12 +56,12 @@ void interface_settings_rst(void)
void interface_settings_lft(void)
{
interface_data_start();
interface_info_start();
}
void interface_settings_rht(void)
{
interface_datetime_start();
interface_wifi_start();
}
void interface_settings_mid(void)
@@ -62,12 +73,12 @@ void interface_settings_mid(void)
current_interface_settings_state = INTERFACE_SETTINGS_LOCALE;
}
display_clear_line( 2, false);
display_clear_line( 3, false);
display_clear_line( 4, false);
display_clear_line( 5, false);
display_clear_line( 6, false);
display_clear_line( 7, false);
display_clear_line(2, false);
display_clear_line(3, false);
display_clear_line(4, false);
display_clear_line(5, false);
display_clear_line(6, false);
display_clear_line(7, false);
}
void interface_settings_up(void)
@@ -83,6 +94,14 @@ void interface_settings_up(void)
interface_set_locale(interface_get_locale() - 1);
}
}
else if (current_interface_settings_state == INTERFACE_SETTINGS_TIMEZONE)
{
current_timezone_offset++;
if (current_timezone_offset > 12)
{
current_timezone_offset = -11;
}
}
}
void interface_settings_dwn(void)
@@ -99,34 +118,72 @@ void interface_settings_dwn(void)
interface_set_locale(interface_get_locale() + 1);
}
}
else if (current_interface_settings_state == INTERFACE_SETTINGS_TIMEZONE)
{
current_timezone_offset--;
if (current_timezone_offset < -11)
{
current_timezone_offset = 12;
}
}
}
void interface_settings_display(void)
{
display_menu_headline( interface_get_label_text(&interface_text_headline_settings), true, 0);
display_menu_headline(interface_get_label_text(&interface_text_headline_settings), true, 0);
display_text_line_column( interface_get_label_text(&interface_text_settings_locale), 3, 1, false);
display_text_line_column(interface_get_label_text(&interface_text_settings_locale), 3, 1, false);
display_text_line_column( interface_get_label_text(&interface_text_settings_timezone), 6, 1, false);
display_text_line_column(interface_get_label_text(&interface_text_settings_timezone), 6, 1, false);
if (current_interface_settings_state == INTERFACE_SETTINGS_LOCALE)
{
display_data( display_gfx_arrow_up, 8, 2, 12 * 8 + 4, false);
display_data(display_gfx_arrow_up, 8, 2, 11 * 8 + 4, false);
display_text_line_column(
interface_get_label_text(&interface_text_settings_locales[interface_get_locale()]), 3, 12, true);
display_data( display_gfx_arrow_down, 8, 4, 12 * 8 + 4, false);
interface_get_label_text(&interface_text_settings_locales[interface_get_locale()]), 3, 11, true);
display_data(display_gfx_arrow_down, 8, 4, 11 * 8 + 4, false);
}
else
{
display_text_line_column(
interface_get_label_text(&interface_text_settings_locales[interface_get_locale()]), 3, 12, true);
interface_get_label_text(&interface_text_settings_locales[interface_get_locale()]), 3, 11, false);
}
char timezone_char[32];
timezone_char[0] = ' ';
if (current_timezone_offset == 0)
{
timezone_char[0] = ' ';
sprintf(&timezone_char[1], "%d", current_timezone_offset);
timezone_char[2] = ' ';
}
else if (current_timezone_offset > 0)
{
timezone_char[0] = '+';
sprintf(&timezone_char[1], "%d", current_timezone_offset);
if (current_timezone_offset < 10)
{
timezone_char[2] = ' ';
}
}
else if (current_timezone_offset < 0)
{
sprintf(&timezone_char[0], "%d", current_timezone_offset);
if (current_timezone_offset > -10)
{
timezone_char[2] = ' ';
}
}
if (current_interface_settings_state == INTERFACE_SETTINGS_TIMEZONE)
{
display_data( display_gfx_arrow_up, 8, 5, 12 * 8 + 4, false);
display_data( display_gfx_arrow_down, 8, 7, 12 * 8 + 4, false);
display_data(display_gfx_arrow_up, 8, 5, 7 * 8, false);
display_chars(timezone_char, 3, 6, 6, true);
display_data(display_gfx_arrow_down, 8, 7, 7 * 8, false);
}
else
{
display_chars(timezone_char, 3, 6, 6, false);
}
}
@@ -142,6 +199,7 @@ void interface_settings_start(void)
interface_register_command_callback(INTERFACE_COMMAND_UP, &interface_settings_up);
interface_register_command_callback(INTERFACE_COMMAND_DWN, &interface_settings_dwn);
interface_set_display_function(&interface_settings_display);
interface_set_display_refresh_function(NULL);
ESP_LOGD(INTERFACE_LOG, "start settings interface");
}
+19 -15
View File
@@ -45,7 +45,7 @@ void interface_wifi_input_set(char *text, uint8_t cursor)
ESP_LOGD(INTERFACE_LOG, "ssid: '%s' password '%s'", current_wifi_config.sta.ssid, current_wifi_config.sta.password);
if (wifi_controller_connect(current_wifi_config) == ESP_OK)
if (wifi_controller_connect(current_wifi_config, NULL) == ESP_OK)
{
interface_main_start();
}
@@ -63,19 +63,18 @@ void interface_wifi_set(void)
void interface_wifi_lft(void)
{
interface_datetime_start();
interface_settings_start();
}
void interface_wifi_rht(void)
{
interface_data_start();
interface_datetime_start();
}
void interface_wifi_mid(void)
{
memset(&current_wifi_config, 0, sizeof(wifi_config_t));
memcpy(current_wifi_config.sta.ssid, ap_info[ap_selected].ssid, strlen((char *)ap_info[ap_selected].ssid));
interface_input(&interface_wifi_input_rst, &interface_wifi_input_set, 64);
interface_input_set_text("muffimuffi");
}
void interface_wifi_up(void)
{
@@ -114,13 +113,16 @@ void interface_wifi_dwn(void)
void interface_wifi_display(void)
{
display_menu_headline( interface_get_label_text(&interface_text_headline_wifi), true, 0);
display_menu_headline(interface_get_label_text(&interface_text_headline_wifi), true, 0);
}
void interface_wifi_display_refresh(void)
{
if (ap_count > 0)
{
display_clear_line( 2, false);
display_clear_line( 4, false);
display_clear_line( 6, false);
display_clear_line(2, false);
display_clear_line(4, false);
display_clear_line(6, false);
for (int i = 0; i < 3; i++)
{
int index = i + ap_index;
@@ -128,36 +130,36 @@ void interface_wifi_display(void)
{
if (index == ap_selected)
{
display_data( display_gfx_arrow_right, 8, i * 2 + 2, 8, false);
display_data(display_gfx_arrow_right, 8, i * 2 + 2, 8, false);
}
if (sizeof(ap_info[i].ssid) > 0)
{
display_text_line_column( (char *)ap_info[index].ssid, i * 2 + 2, 2, false);
display_text_line_column((char *)ap_info[index].ssid, i * 2 + 2, 2, false);
}
else
{
display_text_line_column( " / ", i * 2 + 2, 2, false);
display_text_line_column(" / ", i * 2 + 2, 2, false);
}
if (ap_info[index].rssi >= -67)
{
display_data( display_gfx_wifi, 8, i * 2 + 2, 112, false);
display_data(display_gfx_wifi, 8, i * 2 + 2, 112, false);
}
else if (ap_info[index].rssi >= -80)
{
display_data( display_gfx_wifi_low, 8, i * 2 + 2, 112, false);
display_data(display_gfx_wifi_low, 8, i * 2 + 2, 112, false);
}
else if (ap_info[index].rssi >= -90)
{
display_data( display_gfx_wifi_lowest, 8, i * 2 + 2, 112, false);
display_data(display_gfx_wifi_lowest, 8, i * 2 + 2, 112, false);
}
}
}
}
else
{
display_text_line_column( interface_get_label_text(&interface_text_wifi_scanning), 4, 1, false);
display_text_line_column(interface_get_label_text(&interface_text_wifi_scanning), 4, 1, false);
}
}
@@ -172,6 +174,8 @@ void interface_wifi_start(void)
interface_register_command_callback(INTERFACE_COMMAND_RST, NULL);
interface_set_display_function(&interface_wifi_display);
interface_set_display_refresh_function(&interface_wifi_display_refresh);
interface_wifi_display();
ESP_LOGD(INTERFACE_LOG, "start wifi interface and scanning");
+52 -5
View File
@@ -14,6 +14,7 @@
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <freertos/timers.h>
#include "driver/gpio.h"
#include "esp_log.h"
@@ -24,6 +25,10 @@
static interface_command_callback command_callbacks[INTERFACE_COMMANDS_SIZE];
static interface_display_function current_display_function;
static interface_display_function current_display_refresh_function;
static TimerHandle_t interface_idle_timer;
static bool interface_idle = false;
void interface_register_command_callback(interface_command_t command, interface_command_callback callback)
{
@@ -36,30 +41,70 @@ void interface_set_display_function(interface_display_function display_function)
current_display_function = display_function;
}
void interface_set_display_refresh_function(interface_display_function display_function)
{
display_clear();
current_display_refresh_function = display_function;
}
void interface_execute_command(interface_command_t command)
{
if (command_callbacks[command] != NULL)
if (!interface_idle && command_callbacks[command] != NULL)
{
display_clear();
xTimerReset(interface_idle_timer, 0);
(*command_callbacks[command])();
if (current_display_function != NULL || current_display_refresh_function != NULL)
{
display_clear();
if (current_display_refresh_function != NULL)
{
vTaskDelay(10 / portTICK_PERIOD_MS);
(*current_display_refresh_function)();
}
if (current_display_function != NULL)
{
vTaskDelay(10 / portTICK_PERIOD_MS);
(*current_display_function)();
}
}
}
else if (interface_idle && command == INTERFACE_COMMAND_SET)
{
xTimerReset(interface_idle_timer, 0);
interface_idle = false;
display_on(true);
}
}
void interface_display_task(void *pvParameter)
{
xTimerStart(interface_idle_timer, 0);
while (1)
{
if (current_display_function != NULL)
if (current_display_refresh_function != NULL)
{
(*current_display_function)();
(*current_display_refresh_function)();
}
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void interface_idle_callback(TimerHandle_t timer)
{
display_on(false);
interface_idle = true;
}
void interface_start(void)
{
xTaskCreate(&interface_display_task, "interface_display_task", 4096, NULL, 5, NULL);
interface_idle_timer = xTimerCreate(
"interface_idle",
(15 * 1000) / portTICK_PERIOD_MS,
false,
NULL,
interface_idle_callback);
// init label
interface_init_label();
@@ -71,4 +116,6 @@ void interface_start(void)
{
display_data(display_gfx_logo[i], 64, i, 32, false);
}
xTaskCreate(&interface_display_task, "interface_display_task", 4096, NULL, 5, NULL);
}
+43 -4
View File
@@ -24,8 +24,6 @@
#define INTERFACE_LOG "INTERFACE" // TAG for Logging
#define INTERFACE_FORMAT_TIME "%X"
#define INTERFACE_NUM_LOCALE 2
@@ -64,23 +62,37 @@ typedef struct
// label variables
interface_label_t interface_text_button_cancel;
interface_label_t interface_text_button_ok;
interface_label_t interface_text_button_back;
interface_label_t interface_text_button_menu;
interface_label_t interface_text_button_report;
interface_label_t interface_text_headline_tan;
interface_label_t interface_text_headline_report;
interface_label_t interface_text_headline_wifi;
interface_label_t interface_text_headline_time;
interface_label_t interface_text_headline_data;
interface_label_t interface_text_headline_settings;
interface_label_t interface_text_headline_info;
interface_label_t interface_text_headline_debug;
interface_label_t interface_text_settings_locale;
interface_label_t interface_text_settings_locales[INTERFACE_NUM_LOCALE];
interface_label_t interface_text_settings_timezone;
interface_label_t interface_text_info_num_keys;
interface_label_t interface_text_info_exp_update;
interface_label_t interface_text_info_exp_days;
interface_label_t interface_text_info_exp_num;
interface_label_t interface_text_info_exp_max;
interface_label_t interface_text_info_exp_sum;
interface_label_t interface_text_report_pending;
interface_label_t interface_text_report_success;
interface_label_t interface_text_report_fail;
interface_label_t interface_text_wifi_scanning;
interface_label_t interface_text_data_del[5];
interface_label_t interface_text_data_del[6];
interface_label_t interface_texts_weekday[7];
@@ -117,7 +129,7 @@ void interface_init_label(void);
char *interface_get_label_text(interface_label_t *label);
/**
* @brief set locale for interface
* @brief get locale for interface
*
* @return
* interface_locale_t current locale
@@ -131,6 +143,21 @@ interface_locale_t interface_get_locale(void);
*/
void interface_set_locale(interface_locale_t locale);
/**
* @brief get timezone offset for interface
*
* @return
* int current timezone offset
*/
int interface_get_timezone_offset(void);
/**
* @brief set timezone offset for interface
*
* @param[in] timezone_offset the timezone offset to set
*/
void interface_set_timezone_offset(int timezone_offset);
/**
* @brief register a callback function for command event
*
@@ -153,6 +180,13 @@ void interface_execute_command(interface_command_t command);
*/
void interface_set_display_function(interface_display_function display_function);
/**
* @brief set the display refresh function
*
* @param[in] display_function display function
*/
void interface_set_display_refresh_function(interface_display_function display_function);
/**
* @brief start interface logic
*
@@ -190,6 +224,11 @@ void interface_wifi_start(void);
*/
void interface_settings_start(void);
/**
* @brief start info interface
*/
void interface_info_start(void);
/**
* @brief start interface for input
*