I am developing a homekit device using ESP8266 and I am unable to programmatically generate services. I need to generate 16 of them. Here is the code I attempted to assign to *service
:
homekit_service_t *services[18] = {
&(homekit_service_t){
.type = HOMEKIT_SERVICE_ACCESSORY_INFORMATION,
.characteristics = (homekit_characteristic_t *[]){
HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino HomeKit"),
HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"),
HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
NULL,
},
},
&(homekit_service_t){
.type = HOMEKIT_SERVICE_SWITCH,
.characteristics = (homekit_characteristic_t *[]){
HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
&cha_switch_on,
NULL,
},
},
NULL,
};
However, when I try to generate additional services, using the code below:
services[3] = &(homekit_service_t){
.type = HOMEKIT_SERVICE_SWITCH,
.characteristics = (homekit_characteristic_t *[]){
HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
&cha_switch_on,
NULL,
},
};
The compiler throws this error:
C:\Users\black\OneDrive\Desktop\homekit\my_accessory.c:34:1: error: conflicting types for 'services'
34 | services[3] = &(homekit_service_t){
| ^~~~~~~~
C:\Users\black\OneDrive\Desktop\homekit\my_accessory.c:10:20: note: previous definition of 'services' was here
10 | homekit_service_t *services[18] = {
| ^~~~~~~~
C:\Users\black\OneDrive\Desktop\homekit\my_accessory.c:34:15: error: invalid initializer
34 | services[3] = &(homekit_service_t){
How can I programmatically generate additional services?
You can't put executable statements like array element assignment outside a function. If you want to do this at top-level, you have to do it as part of the array declaration.
homekit_service_t *services[18] = {
&(homekit_service_t){
.type = HOMEKIT_SERVICE_ACCESSORY_INFORMATION,
.characteristics = (homekit_characteristic_t *[]){
HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino HomeKit"),
HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"),
HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
NULL,
},
},
&(homekit_service_t){
.type = HOMEKIT_SERVICE_SWITCH,
.characteristics = (homekit_characteristic_t *[]){
HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
&cha_switch_on,
NULL,
},
},
NULL,
&(homekit_service_t){
.type = HOMEKIT_SERVICE_SWITCH,
.characteristics = (homekit_characteristic_t *[]){
HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
&cha_switch_on,
NULL,
},
},
};