Skip to content

Commit a0d2081

Browse files
committed
feat: disable spin when bag is full, queue re-enabling
1 parent 9e0c9ce commit a0d2081

File tree

9 files changed

+127
-21
lines changed

9 files changed

+127
-21
lines changed

pgpemu-esp32/main/log_tags.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ void log_levels_debug() {
1212
esp_log_level_set(CONFIG_SECRETS_TAG, ESP_LOG_DEBUG);
1313
esp_log_level_set(CONFIG_STORAGE_TAG, ESP_LOG_DEBUG);
1414
esp_log_level_set(HANDSHAKE_TAG, ESP_LOG_DEBUG);
15-
esp_log_level_set(PGPEMU_TAG, ESP_LOG_DEBUG);
1615
esp_log_level_set(LEDHANDLER_TAG, ESP_LOG_DEBUG);
16+
esp_log_level_set(PGPEMU_TAG, ESP_LOG_DEBUG);
17+
esp_log_level_set(SETTINGS_TAG, ESP_LOG_DEBUG);
1718
esp_log_level_set(STATS_TAG, ESP_LOG_DEBUG);
1819
esp_log_level_set(UART_TAG, ESP_LOG_DEBUG);
1920
}
@@ -28,8 +29,9 @@ void log_levels_info() {
2829
esp_log_level_set(CONFIG_SECRETS_TAG, ESP_LOG_INFO);
2930
esp_log_level_set(CONFIG_STORAGE_TAG, ESP_LOG_INFO);
3031
esp_log_level_set(HANDSHAKE_TAG, ESP_LOG_INFO);
31-
esp_log_level_set(PGPEMU_TAG, ESP_LOG_INFO);
3232
esp_log_level_set(LEDHANDLER_TAG, ESP_LOG_INFO);
33+
esp_log_level_set(PGPEMU_TAG, ESP_LOG_INFO);
34+
esp_log_level_set(SETTINGS_TAG, ESP_LOG_INFO);
3335
esp_log_level_set(STATS_TAG, ESP_LOG_INFO);
3436
esp_log_level_set(UART_TAG, ESP_LOG_INFO);
3537
}
@@ -44,8 +46,9 @@ void log_levels_verbose() {
4446
esp_log_level_set(CONFIG_SECRETS_TAG, ESP_LOG_VERBOSE);
4547
esp_log_level_set(CONFIG_STORAGE_TAG, ESP_LOG_VERBOSE);
4648
esp_log_level_set(HANDSHAKE_TAG, ESP_LOG_VERBOSE);
47-
esp_log_level_set(PGPEMU_TAG, ESP_LOG_VERBOSE);
4849
esp_log_level_set(LEDHANDLER_TAG, ESP_LOG_VERBOSE);
50+
esp_log_level_set(PGPEMU_TAG, ESP_LOG_VERBOSE);
51+
esp_log_level_set(SETTINGS_TAG, ESP_LOG_VERBOSE);
4952
esp_log_level_set(STATS_TAG, ESP_LOG_VERBOSE);
5053
esp_log_level_set(UART_TAG, ESP_LOG_VERBOSE);
5154
}

pgpemu-esp32/main/log_tags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ static const char CONFIG_STORAGE_TAG[] = "config_storage";
2121
static const char HANDSHAKE_TAG[] = "pgp_handshake";
2222
static const char LEDHANDLER_TAG[] = "pgp_led";
2323
static const char PGPEMU_TAG[] = "PGPEMU";
24+
static const char SETTINGS_TAG[] = "settings";
2425
static const char STATS_TAG[] = "stats";
2526
static const char UART_TAG[] = "uart_events";
2627

pgpemu-esp32/main/pgp_autobutton.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@ static void autobutton_task(void* pvParameters);
1717

1818
bool init_autobutton() {
1919
button_queue = xQueueCreate(10, sizeof(button_queue_item_t));
20-
if (button_queue == 0) {
21-
ESP_LOGE(BUTTON_TASK_TAG, "%s creating button queue failed", __func__);
20+
if (!button_queue) {
21+
ESP_LOGE(SETTINGS_TAG, "%s creating button queue failed", __func__);
2222
return false;
2323
}
2424

25-
xTaskCreate(autobutton_task, "autobutton_task", 3072, NULL, 11, NULL);
25+
BaseType_t ret = xTaskCreate(autobutton_task, "autobutton_task", 3072, NULL, 11, NULL);
26+
if (ret != pdPASS) {
27+
ESP_LOGE(SETTINGS_TAG, "%s creating task failed", __func__);
28+
vQueueDelete(button_queue);
29+
return false;
30+
}
2631

2732
return true;
2833
}

pgpemu-esp32/main/pgp_led_handler.c

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
#include "log_tags.h"
99
#include "pgp_autobutton.h"
1010
#include "settings.h"
11+
#include "uart.h"
12+
13+
const int retoggle_delay = 300000;
1114

1215
void handle_led_notify_from_app(esp_gatt_if_t gatts_if, uint16_t conn_id, const uint8_t* buffer) {
1316
int number_of_patterns = buffer[3] & 0x1f;
@@ -92,27 +95,54 @@ void handle_led_notify_from_app(esp_gatt_if_t gatts_if, uint16_t conn_id, const
9295
ESP_LOGD(LEDHANDLER_TAG, "[%d] Turn LEDs off.", conn_id);
9396
} else if (count_white && count_white == count_notoff) {
9497
// only white
95-
ESP_LOGW(LEDHANDLER_TAG, "[%d] Can't spin Pokestop. Bag is full.", conn_id);
98+
process_char('s');
99+
100+
ESP_LOGW(LEDHANDLER_TAG,
101+
"[%d] Bag is full: press button %s - re-enabling autospin after %d ms",
102+
conn_id,
103+
get_setting_log_value(&settings.autospin),
104+
retoggle_delay);
105+
106+
settings_queue_item_t item;
107+
item.gatts_if = gatts_if;
108+
item.conn_id = conn_id;
109+
item.delay = retoggle_delay;
110+
xQueueSend(settings_queue, &item, portMAX_DELAY);
96111
} else if (count_red && count_off && count_red == count_notoff) {
97112
// blinking just red
98113
ESP_LOGW(
99114
LEDHANDLER_TAG, "[%d] Pokeballs are empty or Pokestop went out of range.", conn_id);
100115
} else if (count_red && !count_off && count_red == count_notoff) {
101116
// only red
102-
ESP_LOGW(LEDHANDLER_TAG, "[%d] Can't catch Pokemon. Box is full.", conn_id);
117+
process_char('c');
118+
ESP_LOGW(LEDHANDLER_TAG,
119+
"[%d] Box is full: press button %s",
120+
conn_id,
121+
get_setting_log_value(&settings.autospin));
103122
} else if (count_green && count_green == count_notoff) {
104123
// blinking green
105-
ESP_LOGI(LEDHANDLER_TAG, "[%d] Pokemon in range!", conn_id);
124+
ESP_LOGI(LEDHANDLER_TAG,
125+
"[%d] Pokemon in range: press button %s",
126+
conn_id,
127+
get_setting_log_value(&settings.autocatch));
106128
if (get_setting(&settings.autocatch)) {
107129
press_button = true;
108130
}
109131
} else if (count_yellow && count_yellow == count_notoff) {
110132
// blinking yellow
111-
ESP_LOGI(LEDHANDLER_TAG, "[%d] New Pokemon in range!", conn_id);
112-
press_button = true;
133+
ESP_LOGI(LEDHANDLER_TAG,
134+
"[%d] New pokemon in range: press button %s",
135+
conn_id,
136+
get_setting_log_value(&settings.autocatch));
137+
if (get_setting(&settings.autocatch)) {
138+
press_button = true;
139+
}
113140
} else if (count_blue && count_blue == count_notoff) {
114141
// blinking blue
115-
ESP_LOGI(LEDHANDLER_TAG, "[%d] Pokestop in range!", conn_id);
142+
ESP_LOGI(LEDHANDLER_TAG,
143+
"[%d] Pokestop in range: press button %s",
144+
conn_id,
145+
get_setting_log_value(&settings.autospin));
116146
if (get_setting(&settings.autospin)) {
117147
press_button = true;
118148
}

pgpemu-esp32/main/pgpemu.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ void app_main() {
7878
// runtime counter
7979
init_stats();
8080

81+
// start autosetting task
82+
if (!init_autosetting()) {
83+
ESP_LOGI(PGPEMU_TAG, "creating setting task failed");
84+
return;
85+
}
86+
8187
// start autobutton task
8288
if (!init_autobutton()) {
8389
ESP_LOGI(PGPEMU_TAG, "creating button task failed");

pgpemu-esp32/main/settings.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "settings.h"
22

33
#include "config_secrets.h"
4+
#include "esp_log.h"
5+
#include "log_tags.h"
46

57
#include <stdint.h>
68

@@ -20,6 +22,45 @@ void init_settings() {
2022
xSemaphoreTake(settings.mutex, portMAX_DELAY); // block until end of this function
2123
}
2224

25+
QueueHandle_t settings_queue;
26+
27+
static void autosettings_task(void* pvParameters);
28+
29+
bool init_autosetting() {
30+
settings_queue = xQueueCreate(10, sizeof(settings_queue_item_t));
31+
if (!settings_queue) {
32+
ESP_LOGE(SETTINGS_TAG, "%s creating settings queue failed", __func__);
33+
return false;
34+
}
35+
36+
BaseType_t ret = xTaskCreate(autosettings_task, "autosettings_task", 3072, NULL, 11, NULL);
37+
if (ret != pdPASS) {
38+
ESP_LOGE(SETTINGS_TAG, "%s creating task failed", __func__);
39+
vQueueDelete(settings_queue);
40+
return false;
41+
}
42+
43+
return true;
44+
}
45+
46+
static void autosettings_task(void* pvParameters) {
47+
settings_queue_item_t item;
48+
49+
ESP_LOGI(SETTINGS_TAG, "task start");
50+
51+
while (1) {
52+
if (xQueueReceive(settings_queue, &item, portMAX_DELAY)) {
53+
ESP_LOGD(
54+
SETTINGS_TAG, "[%d] toggling setting after delay=%d ms", item.conn_id, item.delay);
55+
vTaskDelay(item.delay / portTICK_PERIOD_MS);
56+
57+
toggle_setting(&settings.autospin);
58+
}
59+
}
60+
61+
vTaskDelete(NULL);
62+
}
63+
2364
void settings_ready() {
2465
xSemaphoreGive(settings.mutex);
2566
}
@@ -61,6 +102,10 @@ bool get_setting(bool* var) {
61102
return result;
62103
}
63104

105+
char* get_setting_log_value(bool* var) {
106+
return get_setting(var) ? "on" : "off";
107+
}
108+
64109
uint8_t get_setting_uint8(uint8_t* var) {
65110
if (!var || !xSemaphoreTake(settings.mutex, portMAX_DELAY)) {
66111
return 0;

pgpemu-esp32/main/settings.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef SETTINGS_H
22
#define SETTINGS_H
33

4+
#include "esp_gatt_defs.h"
45
#include "freertos/FreeRTOS.h"
56
#include "freertos/FreeRTOSConfig.h"
67
#include "freertos/semphr.h"
@@ -29,11 +30,25 @@ typedef struct {
2930

3031
extern Settings settings;
3132

33+
typedef struct {
34+
// which session does this belong to
35+
esp_gatt_if_t gatts_if;
36+
uint16_t conn_id;
37+
38+
// delay after which setting is toggled
39+
int delay;
40+
} settings_queue_item_t;
41+
42+
extern QueueHandle_t settings_queue;
43+
44+
bool init_autosetting();
45+
3246
void init_settings();
3347
void settings_ready();
3448
bool toggle_setting(bool* var);
3549
bool cycle_setting(uint8_t* var, uint8_t min, uint8_t max);
3650
bool get_setting(bool* var);
51+
char* get_setting_log_value(bool* var);
3752
uint8_t get_setting_uint8(uint8_t* var);
3853
bool set_setting_uint8(uint8_t* var, const uint8_t val);
3954
bool set_chosen_device(uint8_t id);

pgpemu-esp32/main/uart.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void init_uart() {
5959
xTaskCreate(usb_console_task, "usb_console", 4096, NULL, 12, NULL);
6060
}
6161

62-
static void process_char(uint8_t c) {
62+
void process_char(uint8_t c) {
6363
if (c == 't') {
6464
// show connection status
6565
dump_client_connection_times();
@@ -71,21 +71,19 @@ static void process_char(uint8_t c) {
7171
if (!toggle_setting(&settings.autospin)) {
7272
ESP_LOGE(UART_TAG, "failed!");
7373
}
74-
ESP_LOGI(UART_TAG, "autospin %s", get_setting(&settings.autospin) ? "on" : "off");
74+
ESP_LOGI(UART_TAG, "autospin %s", get_setting_log_value(&settings.autospin));
7575
} else if (c == 'c') {
7676
// toggle autocatch
7777
if (!toggle_setting(&settings.autocatch)) {
7878
ESP_LOGE(UART_TAG, "failed!");
7979
}
80-
ESP_LOGI(UART_TAG, "autocatch %s", get_setting(&settings.autocatch) ? "on" : "off");
80+
ESP_LOGI(UART_TAG, "autocatch %s", get_setting_log_value(&settings.autocatch));
8181
} else if (c == 'B') {
8282
// toggle input button
8383
if (!toggle_setting(&settings.use_button)) {
8484
ESP_LOGE(UART_TAG, "failed!");
8585
}
86-
ESP_LOGI(UART_TAG,
87-
"input button %s",
88-
get_setting(&settings.use_button) ? "available" : "not available");
86+
ESP_LOGI(UART_TAG, "input button %s", get_setting_log_value(&settings.use_button));
8987
} else if (c == 'l') {
9088
// cycle through log levels
9189
if (!cycle_setting(&settings.log_level, 1, 3)) {
@@ -167,9 +165,9 @@ static void process_char(uint8_t c) {
167165
"Log level: %d\n"
168166
"Chosen device #: %d - Name: %s\n"
169167
"Connections: %d / %d",
170-
get_setting(&settings.autospin) ? "on" : "off",
171-
get_setting(&settings.autocatch) ? "on" : "off",
172-
get_setting(&settings.use_button) ? "available" : "not available",
168+
get_setting_log_value(&settings.autospin),
169+
get_setting_log_value(&settings.autocatch),
170+
get_setting_log_value(&settings.use_button),
173171
get_setting_uint8(&settings.log_level),
174172
get_setting_uint8(&settings.chosen_device),
175173
PGP_CLONE_NAME,

pgpemu-esp32/main/uart.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#ifndef UART_H
22
#define UART_H
33

4+
#include <stdint.h>
5+
46
void init_uart();
7+
void process_char(uint8_t);
58

69
#endif /* UART_H */

0 commit comments

Comments
 (0)