int AJ_Main(void) { AJ_Status status = AJ_OK; uint8_t isUnmarshalingSuccessful = FALSE; AJSVC_ServiceStatus serviceStatus; AJ_Message msg; AJ_Initialize(); AJ_AboutSetIcon(aboutIconContent, aboutIconContentSize, aboutIconMimetype, aboutIconUrl); status = PropertyStore_Init(); if (status != AJ_OK) { goto Exit; } status = AJServices_Init(AJ_ABOUT_SERVICE_PORT, AppObjects, ProxyObjects, deviceManufactureName, deviceProductName); if (status != AJ_OK) { goto Exit; } AJ_RegisterObjects(AppObjects, ProxyObjects); SetBusAuthPwdCallback(MyBusAuthPwdCB); while (TRUE) { status = AJ_OK; serviceStatus = AJSVC_SERVICE_STATUS_NOT_HANDLED; if (!isBusConnected) { isBusConnected = AJRouter_Connect(&busAttachment, ROUTER_NAME); if (!isBusConnected) { // Failed to connect to router? continue; // Retry establishing connection to router. } } status = AJApp_ConnectedHandler(&busAttachment); #ifdef ONBOARDING_SERVICE if (!AJOBS_IsWiFiConnected()) { status = AJ_ERR_RESTART; } #endif if (status == AJ_OK) { status = AJ_UnmarshalMsg(&busAttachment, &msg, AJAPP_UNMARSHAL_TIMEOUT); isUnmarshalingSuccessful = (status == AJ_OK); if (status == AJ_ERR_TIMEOUT) { if (AJ_ERR_LINK_TIMEOUT == AJ_BusLinkStateProc(&busAttachment)) { status = AJ_ERR_READ; // something's not right. force disconnect } else { // nothing on bus, do our own thing AJApp_DoWork(&busAttachment); continue; } } if (isUnmarshalingSuccessful) { if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJApp_MessageProcessor(&busAttachment, &msg, &status); } if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { //Pass to the built-in bus message handlers status = AJ_BusHandleBusMessage(&msg); } AJ_NotifyLinkActive(); } //Unmarshaled messages must be closed to free resources AJ_CloseMsg(&msg); } if (status == AJ_ERR_READ || status == AJ_ERR_RESTART || status == AJ_ERR_RESTART_APP) { if (isBusConnected) { AJApp_DisconnectHandler(&busAttachment, status != AJ_ERR_READ); isBusConnected = !AJRouter_Disconnect(&busAttachment, status != AJ_ERR_READ); if (status == AJ_ERR_RESTART_APP) { AJ_Reboot(); } } } } // while (TRUE) return 0; Exit: return (1); }
AJ_Status AJApp_ConnectedHandler(AJ_BusAttachment* busAttachment) { AJ_Status status = AJ_OK; if (AJ_GetUniqueName(busAttachment)) { if (currentServicesInitializationState == nextServicesInitializationState) { switch (currentServicesInitializationState) { case INIT_SERVICES_PORT: status = AJ_BusBindSessionPort(busAttachment, AJ_ABOUT_SERVICE_PORT, NULL, 0); if (status != AJ_OK) { goto Exit; } nextServicesInitializationState = INIT_ADVERTISE_NAME; break; case INIT_ADVERTISE_NAME: status = AJ_BusAdvertiseName(busAttachment, AJ_GetUniqueName(busAttachment), AJ_TRANSPORT_ANY, AJ_BUS_START_ADVERTISING, 0); if (status != AJ_OK) { goto Exit; } if (addSessionLessMatch) { nextServicesInitializationState = INIT_ADDSLMATCH; } else { nextServicesInitializationState = INIT_FINISHED; } break; case INIT_ADDSLMATCH: status = AJ_BusSetSignalRule(busAttachment, SESSIONLESS_MATCH, AJ_BUS_SIGNAL_ALLOW); if (status != AJ_OK) { goto Exit; } nextServicesInitializationState = INIT_FINISHED; break; case INIT_FINISHED: if (AJ_About_IsShouldAnnounce()) { status = AJ_About_Announce(busAttachment); if (status != AJ_OK) { goto Exit; } AJ_About_SetShouldAnnounce(FALSE); } #ifdef ONBOARDING_SERVICE if (!AJOBS_IsWiFiConnected()) { status = AJ_ERR_RESTART; } #endif break; } } } Exit: if (status == AJ_ERR_RESOURCES) { init_retries++; if (init_retries > MAX_INIT_RETRIES) { status = AJ_ERR_READ; // Force disconnect } else { AJ_Sleep(AJAPP_SLEEP_TIME); } } return status; }