/
main.c
150 lines (118 loc) · 3.55 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <stdlib.h>
#include <esp_event.h>
#include <esp_log.h>
#include <esp_wifi.h>
#include <nvs_flash.h>
#include <esp_osc.h>
#define WIFI_SSID ""
#define WIFI_PASS ""
#define OSC_ADDRESS ""
#define OSC_PORT 0
#define TAG "main"
esp_osc_client_t client;
static void sender() {
// select targets
esp_osc_target_t targets[2] = {
esp_osc_target("127.0.0.1", 9000),
esp_osc_target(OSC_ADDRESS, OSC_PORT),
};
for (;;) {
// delay
vTaskDelay(1000 / portTICK_PERIOD_MS);
// send messages
for (size_t i = 0; i < 2; i++) {
esp_osc_send(&client, &targets[i], "test", "ihfdsb", 42, (int64_t)84, 3.14f, 6.28, "foo", 3, "bar");
}
}
}
static bool callback(const char *topic, const char *format, esp_osc_value_t *values) {
// log message
ESP_LOGI(TAG, "got message: %s (%s)", topic, format);
for (size_t i = 0; i < strlen(format); i++) {
switch (format[i]) {
case 'i':
ESP_LOGI(TAG, "==> i: %d", values[i].i);
break;
case 'h':
ESP_LOGI(TAG, "==> h: %lld", values[i].h);
break;
case 'f':
ESP_LOGI(TAG, "==> f: %f", values[i].f);
break;
case 'd':
ESP_LOGI(TAG, "==> d: %f", values[i].d);
break;
case 's':
ESP_LOGI(TAG, "==> s: %s", values[i].s);
break;
case 'b':
ESP_LOGI(TAG, "==> b: %.*s (%d)", values[i].bl, values[i].b, values[i].bl);
break;
}
}
return true;
}
static void receiver() {
for (;;) {
// receive messages
esp_osc_receive(&client, callback);
}
}
static void restarter() {
for (;;) {
// delay
vTaskDelay(5000 / portTICK_PERIOD_MS);
// restart client
esp_osc_init(&client, 1024, 9000);
}
}
static void handler(void *arg, esp_event_base_t base, int32_t id, void *data) {
if (base == WIFI_EVENT) {
switch (id) {
case SYSTEM_EVENT_STA_START:
// connect to ap
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_wifi_connect());
break;
case SYSTEM_EVENT_STA_GOT_IP:
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
// reconnect Wi-Fi
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_wifi_connect());
break;
default:
break;
}
}
}
void app_main() {
// initialize NVS flash
ESP_ERROR_CHECK(nvs_flash_init());
// initialize networking
ESP_ERROR_CHECK(esp_netif_init());
// create default event loop
ESP_ERROR_CHECK(esp_event_loop_create_default());
// enable Wi-Fi
esp_netif_create_default_wifi_sta();
// initialize Wi-Fi
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// set Wi-Fi storage to ram
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
// set wifi mode
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
// register event handlers
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &handler, NULL, NULL));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &handler, NULL, NULL));
// prepare Wi-Fi config
wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID, .password = WIFI_PASS}};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
// start Wi-Fi
ESP_ERROR_CHECK(esp_wifi_start());
// prepare client
esp_osc_init(&client, 1024, 9000);
// create tasks
xTaskCreatePinnedToCore(sender, "sender", 4096, NULL, 10, NULL, 1);
xTaskCreatePinnedToCore(receiver, "receiver", 4096, NULL, 10, NULL, 1);
xTaskCreatePinnedToCore(restarter, "restarter", 4096, NULL, 10, NULL, 1);
}