-
Notifications
You must be signed in to change notification settings - Fork 20
/
wifitask.ino
163 lines (143 loc) · 5.29 KB
/
wifitask.ino
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
151
152
153
154
155
156
157
158
159
160
161
162
163
void wifiTask( void * pvParameters ) {
if (SET_STATIC_IP && !WiFi.config(STATIC_IP, GATEWAY, SUBNET, PRIMARY_DNS, SECONDARY_DNS))
ESP_LOGE(TAG, "Setting static IP failed");
WiFi.mode( WIFI_STA );
WiFi.setSleep( false );
if (strlen(wifi_network)) {
ESP_LOGI(TAG, "Connecting to %s.", wifi_network);
WiFi.begin(wifi_network, wifi_password);
}
/* trying last accesspoint */
else WiFi.begin();
if ( xTftTaskHandle ) {
tft.setTextColor( TFT_TEXT_COLOR , TFT_BACK_COLOR );
tft.println( "Connecting WiFi");
}
WiFi.waitForConnectResult();
if ( WiFi.status() != WL_CONNECTED && ( WiFi.status() != WL_CONNECT_FAILED ) ) {
if ( xTftTaskHandle ) {
tft.println( "\nNo WiFi connection.\nWaiting for SmartConfig." );
tft.invertDisplay( true );
}
WiFi.mode( WIFI_AP_STA );
WiFi.beginSmartConfig();
const time_t DELAY_SECONDS = 60 * 5;
const time_t END_TIME = time( NULL ) + DELAY_SECONDS;
ESP_LOGI( TAG, "Waiting %i seconds for SmartConfig.", DELAY_SECONDS );
while ( !WiFi.smartConfigDone() && time( NULL ) < END_TIME ) {
char remainingSCTime[12];
if ( xOledTaskHandle ) {
OLED.clear();
OLED.setFont( ArialMT_Plain_10 );
OLED.drawString( 64, 10, "Waiting for SmartConfig." );
snprintf( remainingSCTime, sizeof( remainingSCTime), "%3.i seconds", END_TIME - time( NULL ) );
OLED.drawString( 64, 30, remainingSCTime );
OLED.invertDisplay();
OLED.display();
}
if ( xTftTaskHandle ) {
tft.setCursor( 70, 100 );
tft.print( END_TIME - time( NULL ) );
tft.println( " seconds left. " );
}
else
digitalWrite( LED_BUILTIN, !gpio_get_level( gpio_num_t( LED_BUILTIN ) ) );
vTaskDelay( 500 / portTICK_PERIOD_MS );
}
if ( !WiFi.smartConfigDone() )
ESP.restart();
if ( !xTftTaskHandle )
digitalWrite( LED_BUILTIN, LOW );
}
waitForWifi();
/* We have succesfully connected */
WiFi.onEvent( WiFiEvent );
ESP_LOGI( TAG, "WiFi connected to '%s' %s %s",
WiFi.SSID().c_str(), WiFi.localIP().toString().c_str(), WiFi.macAddress().c_str() );
if ( xTftTaskHandle ) {
tft.invertDisplay( false );
tft.printf( "WiFi connected.\nIP: %s\nmac: %s\n", WiFi.localIP().toString().c_str(), WiFi.macAddress().c_str() );
}
if ( xOledTaskHandle )
OLED.normalDisplay();
strncpy( hostName, preferences.getString( "hostname", "" ).c_str(), sizeof( hostName ) );
if ( hostName[0] == 0 ) {
snprintf( hostName, sizeof( hostName ), "%s-%c%c%c%c%c%c", DEFAULT_HOSTNAME_PREFIX,
WiFi.macAddress()[9], WiFi.macAddress()[10],
WiFi.macAddress()[12], WiFi.macAddress()[13],
WiFi.macAddress()[15], WiFi.macAddress()[16]
);
}
if ( !MDNS.begin( "" ) && !setupMDNS( hostName ) )
ESP_LOGE( TAG, "Error setting up %s as hostname. ", hostName );
/* start network dependent tasks */
xTaskCreatePinnedToCore(
ntpTask, /* Function to implement the task */
"ntpTask", /* Name of the task */
3000, /* Stack size in words */
NULL, /* Task input parameter */
ntpTaskPriority, /* Priority of the task */
NULL, /* Task handle. */
1);
xTaskCreatePinnedToCore(
webServerTask, /* Function to implement the task */
"webServerTask", /* Name of the task */
2000, /* Stack size in words */
NULL, /* Task input parameter */
webserverTaskPriority, /* Priority of the task */
NULL, /* Task handle. */
1); /* Core where the task should run */
/*
while (1) {
if ( !WiFi.isConnected() ) {
ESP_LOGI( TAG, "No Wifi. Reconnecting.." );
WiFi.reconnect();
vTaskDelay( 9000 / portTICK_PERIOD_MS );
}
vTaskDelay( 1000 / portTICK_PERIOD_MS );
}
*/
vTaskDelete(NULL);
}
/* https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiType.h */
void waitForWifi() {
unsigned long timeOut = millis() + 10000UL;
while ( !WiFi.isConnected() && millis() < timeOut )
vTaskDelay( 20 / portTICK_PERIOD_MS );
}
void WiFiEvent( WiFiEvent_t event ) {
switch ( event ) {
case SYSTEM_EVENT_AP_START:
ESP_LOGI( TAG, "AP Started");
//WiFi.softAPsetHostname(AP_SSID);
break;
case SYSTEM_EVENT_AP_STOP:
ESP_LOGI( TAG, "AP Stopped");
break;
case SYSTEM_EVENT_STA_START:
ESP_LOGI( TAG, "STA Started");
//WiFi.setHostname( DEFAULT_HOSTNAME_PREFIX.c_str( );
break;
case SYSTEM_EVENT_STA_CONNECTED:
ESP_LOGI( TAG, "STA Connected");
//WiFi.enableIpV6();
break;
case SYSTEM_EVENT_AP_STA_GOT_IP6:
ESP_LOGI( TAG, "STA IPv6: ");
//ESP_LOGI( TAG, "%s", WiFi.localIPv6().toString());
break;
case SYSTEM_EVENT_STA_GOT_IP:
//ESP_LOGI( TAG, "STA IPv4: ");
//ESP_LOGI( TAG, "%s", WiFi.localIP());
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
ESP_LOGI( TAG, "STA Disconnected");
WiFi.begin();
break;
case SYSTEM_EVENT_STA_STOP:
ESP_LOGI( TAG, "STA Stopped");
break;
default:
break;
}
}