Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / src / platform / ESP32 / PlatformManagerImpl.cpp
1 /*
2  *
3  *    Copyright (c) 2020 Project CHIP Authors
4  *    Copyright (c) 2018 Nest Labs, Inc.
5  *    All rights reserved.
6  *
7  *    Licensed under the Apache License, Version 2.0 (the "License");
8  *    you may not use this file except in compliance with the License.
9  *    You may obtain a copy of the License at
10  *
11  *        http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *    Unless required by applicable law or agreed to in writing, software
14  *    distributed under the License is distributed on an "AS IS" BASIS,
15  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *    See the License for the specific language governing permissions and
17  *    limitations under the License.
18  */
19
20 /**
21  *    @file
22  *          Provides an implementation of the PlatformManager object
23  *          for the ESP32 platform.
24  */
25 /* this file behaves like a config.h, comes first */
26 #include <platform/internal/CHIPDeviceLayerInternal.h>
27
28 #include <crypto/CHIPCryptoPAL.h>
29 #include <platform/PlatformManager.h>
30 #include <platform/internal/GenericPlatformManagerImpl_FreeRTOS.cpp>
31
32 #include "esp_event.h"
33 #include "esp_heap_caps_init.h"
34 #include "esp_log.h"
35 #include "esp_netif.h"
36 #include "esp_spi_flash.h"
37 #include "esp_system.h"
38 #include "esp_wifi.h"
39
40 namespace chip {
41 namespace DeviceLayer {
42
43 namespace Internal {
44 extern CHIP_ERROR InitLwIPCoreLock(void);
45 }
46
47 PlatformManagerImpl PlatformManagerImpl::sInstance;
48
49 static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen)
50 {
51     esp_fill_random(output, len);
52     *olen = len;
53     return 0;
54 }
55
56 CHIP_ERROR PlatformManagerImpl::_InitChipStack(void)
57 {
58     CHIP_ERROR err;
59     wifi_init_config_t cfg;
60     uint8_t ap_mac[6];
61     wifi_mode_t mode;
62
63     // Make sure the LwIP core lock has been initialized
64     err = Internal::InitLwIPCoreLock();
65     SuccessOrExit(err);
66
67     err = esp_netif_init();
68     SuccessOrExit(err);
69
70     // Arrange for the ESP event loop to deliver events into the CHIP Device layer.
71     err = esp_event_loop_create_default();
72     SuccessOrExit(err);
73
74     esp_netif_create_default_wifi_ap();
75     esp_netif_create_default_wifi_sta();
76
77     esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, PlatformManagerImpl::HandleESPSystemEvent, NULL);
78     SuccessOrExit(err);
79     esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, PlatformManagerImpl::HandleESPSystemEvent, NULL);
80     SuccessOrExit(err);
81
82     // Initialize the ESP WiFi layer.
83     cfg = WIFI_INIT_CONFIG_DEFAULT();
84     err = esp_wifi_init(&cfg);
85     SuccessOrExit(err);
86
87     esp_wifi_get_mode(&mode);
88     if ((mode == WIFI_MODE_AP) || (mode == WIFI_MODE_APSTA))
89     {
90         esp_fill_random(ap_mac, sizeof(ap_mac));
91         /* Bit 0 of the first octet of MAC Address should always be 0 */
92         ap_mac[0] &= (uint8_t) ~0x01;
93         err = esp_wifi_set_mac(ESP_IF_WIFI_AP, ap_mac);
94         SuccessOrExit(err);
95     }
96
97     // Call _InitChipStack() on the generic implementation base class
98     // to finish the initialization process.
99     err = Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_InitChipStack();
100     SuccessOrExit(err);
101
102     err = chip::Crypto::add_entropy_source(app_entropy_source, NULL, 16);
103     SuccessOrExit(err);
104
105 exit:
106     return err;
107 }
108
109 CHIP_ERROR PlatformManagerImpl::InitLwIPCoreLock(void)
110 {
111     return Internal::InitLwIPCoreLock();
112 }
113
114 void PlatformManagerImpl::HandleESPSystemEvent(void * arg, esp_event_base_t eventBase, int32_t eventId, void * eventData)
115 {
116     ChipDeviceEvent event;
117     memset(&event, 0, sizeof(event));
118     event.Type                         = DeviceEventType::kESPSystemEvent;
119     event.Platform.ESPSystemEvent.Base = eventBase;
120     event.Platform.ESPSystemEvent.Id   = eventId;
121     if (eventBase == IP_EVENT)
122     {
123         switch (eventId)
124         {
125         case IP_EVENT_STA_GOT_IP:
126             memcpy(&event.Platform.ESPSystemEvent.Data.IpGotIp, eventData, sizeof(event.Platform.ESPSystemEvent.Data.IpGotIp));
127             break;
128         case IP_EVENT_GOT_IP6:
129             memcpy(&event.Platform.ESPSystemEvent.Data.IpGotIp6, eventData, sizeof(event.Platform.ESPSystemEvent.Data.IpGotIp6));
130             break;
131         case IP_EVENT_AP_STAIPASSIGNED:
132             memcpy(&event.Platform.ESPSystemEvent.Data.IpApStaIpAssigned, eventData,
133                    sizeof(event.Platform.ESPSystemEvent.Data.IpApStaIpAssigned));
134             break;
135         default:
136             break;
137         }
138     }
139     else if (eventBase == WIFI_EVENT)
140     {
141         switch (eventId)
142         {
143         case WIFI_EVENT_SCAN_DONE:
144             memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaScanDone, eventData,
145                    sizeof(event.Platform.ESPSystemEvent.Data.WifiStaScanDone));
146             break;
147         case WIFI_EVENT_STA_CONNECTED:
148             memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaConnected, eventData,
149                    sizeof(event.Platform.ESPSystemEvent.Data.WifiStaConnected));
150             break;
151         case WIFI_EVENT_STA_DISCONNECTED:
152             memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaDisconnected, eventData,
153                    sizeof(event.Platform.ESPSystemEvent.Data.WifiStaDisconnected));
154             break;
155         case WIFI_EVENT_STA_AUTHMODE_CHANGE:
156             memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaAuthModeChange, eventData,
157                    sizeof(event.Platform.ESPSystemEvent.Data.WifiStaAuthModeChange));
158             break;
159         case WIFI_EVENT_STA_WPS_ER_PIN:
160             memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaWpsErPin, eventData,
161                    sizeof(event.Platform.ESPSystemEvent.Data.WifiStaWpsErPin));
162             break;
163         case WIFI_EVENT_STA_WPS_ER_FAILED:
164             memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaWpsErFailed, eventData,
165                    sizeof(event.Platform.ESPSystemEvent.Data.WifiStaWpsErFailed));
166             break;
167         case WIFI_EVENT_AP_STACONNECTED:
168             memcpy(&event.Platform.ESPSystemEvent.Data.WifiApStaConnected, eventData,
169                    sizeof(event.Platform.ESPSystemEvent.Data.WifiApStaConnected));
170             break;
171         case WIFI_EVENT_AP_STADISCONNECTED:
172             memcpy(&event.Platform.ESPSystemEvent.Data.WifiApStaDisconnected, eventData,
173                    sizeof(event.Platform.ESPSystemEvent.Data.WifiApStaDisconnected));
174             break;
175         case WIFI_EVENT_AP_PROBEREQRECVED:
176             memcpy(&event.Platform.ESPSystemEvent.Data.WifiApProbeReqRecved, eventData,
177                    sizeof(event.Platform.ESPSystemEvent.Data.WifiApProbeReqRecved));
178             break;
179         default:
180             break;
181         }
182     }
183
184     sInstance.PostEvent(&event);
185 }
186
187 } // namespace DeviceLayer
188 } // namespace chip