Sat, 21 Oct 2023 17:22:37 +0200
Use on-board color LED
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
1 | /** |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
2 | * @file dcf77tx.c |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
3 | * @brief DCF77 emulator/transmitter |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
4 | */ |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
5 | #include "dcf77tx.h" |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
6 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
7 | static const char *TAG = "dcf77tx"; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
8 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
9 | static TaskHandle_t xTaskWifi = NULL; |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
10 | static TaskHandle_t xTaskDCF = NULL; |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
11 | char hostname[32]; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
12 | int Main_Loop = ML_INIT; |
5 | 13 | static led_strip_handle_t led_strip; ///< ESP32-C3 onboard LED |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
14 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
15 | extern SemaphoreHandle_t xSemaphoreWiFi; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
16 | extern WIFI_State *wifi_state; ///< WiFi state |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
17 | extern bool _wifi_ScanDone; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
18 | extern int8_t _wifi_RSSI; |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
19 | extern SemaphoreHandle_t xSemaphoreDCF; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
20 | extern DCF_State *dcf_state; ///< DCF77 state |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
21 | extern bool System_TimeOk; |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
22 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
23 | |
5 | 24 | void set_ob_led(uint32_t red, uint32_t green, uint32_t blue) |
25 | { | |
26 | if ((red + green + blue) > 0) { | |
27 | led_strip_set_pixel(led_strip, 0, red, green, blue); | |
28 | led_strip_refresh(led_strip); | |
29 | } else { | |
30 | led_strip_clear(led_strip); | |
31 | } | |
32 | } | |
33 | ||
34 | ||
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
35 | void app_main(void) |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
36 | { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
37 | esp_err_t ret; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
38 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
39 | ESP_LOGI(TAG, "Starting DCF77tx"); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
40 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
41 | /* |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
42 | * Initialize NVS |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
43 | */ |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
44 | ret = nvs_flash_init(); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
45 | if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
46 | ESP_ERROR_CHECK(nvs_flash_erase()); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
47 | ret = nvs_flash_init(); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
48 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
49 | ESP_ERROR_CHECK(ret); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
50 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
51 | uint8_t mac_addr[8] = {0}; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
52 | // Set the configured hostname for the dhcp client. |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
53 | esp_efuse_mac_get_default(mac_addr); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
54 | sprintf(hostname, "dcf77tx-%02x%02x%02x", mac_addr[3], mac_addr[4], mac_addr[5]); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
55 | |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
56 | setenv("TZ", "CET-01CEST-02,M3.4.0,M10.4.0", 1); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
57 | tzset(); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
58 | |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
59 | esp_log_level_set("wifi", ESP_LOG_ERROR); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
60 | xTaskCreate(&task_wifi, "task_wifi", 4096, NULL, 3, &xTaskWifi); |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
61 | xTaskCreate(&task_DCF, "task_DCF", 4096, NULL, 4, &xTaskDCF); |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
62 | |
5 | 63 | led_strip_config_t strip_config = { |
64 | .strip_gpio_num = 7, | |
65 | .max_leds = 1, // at least one LED on board | |
66 | }; | |
67 | led_strip_rmt_config_t rmt_config = { | |
68 | .resolution_hz = 10 * 1000 * 1000, // 10MHz | |
69 | }; | |
70 | ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); | |
71 | /* Set all LED off to clear all pixels */ | |
72 | led_strip_clear(led_strip); | |
73 | ||
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
74 | int wait = 150; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
75 | while (wait) { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
76 | vTaskDelay(100 / portTICK_PERIOD_MS); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
77 | if (ready_WiFi()) { |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
78 | ESP_LOGI(TAG, "Online in %.1f seconds", (150 - wait) / 10.0); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
79 | wait = 0; |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
80 | } else { |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
81 | wait--; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
82 | if (wait < 1) |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
83 | ESP_LOGE(TAG, "Timeout network connection"); |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
84 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
85 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
86 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
87 | time_t now; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
88 | struct tm timeinfo; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
89 | char strftime_buf[64]; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
90 | time(&now); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
91 | localtime_r(&now, &timeinfo); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
92 | strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
93 | ESP_LOGI(TAG, "The current date/time in Amsterdam is: %s", strftime_buf); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
94 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
95 | /* |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
96 | * Main application loop |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
97 | */ |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
98 | while (1) { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
99 | switch (Main_Loop) { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
100 | case ML_INIT: if (ready_WiFi() ) { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
101 | Main_Loop = ML_SYNC; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
102 | ESP_LOGI(TAG, "ML_INIT -> ML_SYNC"); |
5 | 103 | set_ob_led(5, 0, 0); |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
104 | } else { |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
105 | Main_Loop = ML_CONNECT; |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
106 | ESP_LOGI(TAG, "ML_INIT -> ML_CONNECT"); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
107 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
108 | break; |
1
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
109 | case ML_CONNECT: if (System_TimeOk) { |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
110 | Main_Loop = ML_SYNC; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
111 | ESP_LOGI(TAG, "ML_CONNECT -> ML_SYNC"); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
112 | } |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
113 | break; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
114 | case ML_SYNC: if (System_TimeOk == false) { |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
115 | Main_Loop = ML_CONNECT; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
116 | ESP_LOGI(TAG, "ML_SYNC -> ML_CONNECT"); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
117 | } |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
118 | time(&now); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
119 | localtime_r(&now, &timeinfo); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
120 | if (timeinfo.tm_sec == 0) { |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
121 | Main_Loop = ML_RUN; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
122 | ESP_LOGI(TAG, "ML_SYNC -> ML_RUN"); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
123 | request_DCF(true); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
124 | } |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
125 | break; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
126 | case ML_RUN: if (System_TimeOk == false) { |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
127 | Main_Loop = ML_CONNECT; |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
128 | ESP_LOGI(TAG, "ML_RUN -> ML_CONNECT"); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
129 | request_DCF(false); |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
130 | } |
86b275481021
Added framework for the DCF77 transmitter. Added two debug LEDs.
Michiel Broek <mbroek@mbse.eu>
parents:
0
diff
changeset
|
131 | break; |
0
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
132 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
133 | |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
134 | vTaskDelay(10 / portTICK_PERIOD_MS); |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
135 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
136 | } |
913eb9ca40b1
Initial checkin, WiFi connects and SNTP timesync works.
Michiel Broek <mbroek@mbse.eu>
parents:
diff
changeset
|
137 |