/* * * Copyright (c) 2022 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DeviceCallbacks.h" #include "Server.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using chip::ByteSpan; using chip::EndpointId; using chip::FabricIndex; using chip::NodeId; using chip::OnDeviceConnected; using chip::OnDeviceConnectionFailure; using chip::PeerId; using chip::Server; using chip::VendorId; using chip::Callback::Callback; using chip::System::Layer; using chip::Transport::PeerAddress; using namespace chip::Messaging; using namespace ::chip; using namespace ::chip::app; using namespace ::chip::Credentials; using namespace ::chip::DeviceManager; using namespace ::chip::DeviceLayer; static AppDeviceCallbacks EchoCallbacks; void OnIdentifyStart(Identify *) { ChipLogProgress(Zcl, "OnIdentifyStart"); } void OnIdentifyStop(Identify *) { ChipLogProgress(Zcl, "OnIdentifyStop"); } void OnTriggerEffect(Identify * identify) { switch (identify->mCurrentEffectIdentifier) { case Clusters::Identify::EffectIdentifierEnum::kBlink: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kBlink"); break; case Clusters::Identify::EffectIdentifierEnum::kBreathe: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kBreathe"); break; case Clusters::Identify::EffectIdentifierEnum::kOkay: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kOkay"); break; case Clusters::Identify::EffectIdentifierEnum::kChannelChange: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kChannelChange"); break; default: ChipLogProgress(Zcl, "No identifier effect"); return; } } static Identify gIdentify1 = { chip::EndpointId{ 1 }, OnIdentifyStart, OnIdentifyStop, Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator, OnTriggerEffect, }; // Warkaround for ld error:undefined reference to '__sync_synchronize' // refer to https://stackoverflow.com/questions/64658430/gnu-arm-embedded-toolchain-undefined-reference-to-sync-synchronize extern "C" void __sync_synchronize() {} extern "C" unsigned int __atomic_fetch_add_4(volatile void * ptr, unsigned int val, int memorder) { return (*(unsigned int *) ptr + val); } extern "C" bool __atomic_compare_exchange_4(volatile void * pulDestination, void * ulComparand, unsigned int desired, bool weak, int success_memorder, int failure_memorder) { bool ulReturnValue; if (*(unsigned int *) pulDestination == *(unsigned int *) ulComparand) { *(unsigned int *) pulDestination = desired; ulReturnValue = true; } else { *(unsigned int *) ulComparand = *(unsigned int *) pulDestination; ulReturnValue = false; } return ulReturnValue; } extern "C" unsigned int __atomic_fetch_sub_4(volatile void * ptr, unsigned int val, int memorder) { return (*(unsigned int *) ptr + val); } extern "C" bool __atomic_compare_exchange_1(volatile void * pulDestination, void * ulComparand, unsigned char desired, bool weak, int success_memorder, int failure_memorder) { bool ulReturnValue; if (*(unsigned char *) pulDestination == *(unsigned char *) ulComparand) { *(unsigned char *) pulDestination = desired; ulReturnValue = true; } else { *(unsigned char *) ulComparand = *(unsigned char *) pulDestination; ulReturnValue = false; } return ulReturnValue; } extern "C" unsigned int __atomic_fetch_and_4(volatile void * pulDestination, unsigned int ulValue, int memorder) { unsigned int ulCurrent; ulCurrent = *(unsigned int *) pulDestination; *(unsigned int *) pulDestination &= ulValue; return ulCurrent; } extern "C" bool __sync_bool_compare_and_swap_4(volatile void * ptr, unsigned int oldval, unsigned int newval) { if (*(unsigned int *) ptr == oldval) { *(unsigned int *) ptr = newval; return true; } else { return false; } } extern "C" bool __sync_bool_compare_and_swap_1(volatile void * ptr, unsigned char oldval, unsigned char newval) { if (*(unsigned char *) ptr == oldval) { *(unsigned char *) ptr = newval; return true; } else { return false; } } /* stub for __libc_init_array */ extern "C" void _fini(void) {} extern "C" void _init(void) { ; } static void InitServer(intptr_t context) { BekenAppServer::Init(); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); OTAHelpers::Instance().InitOTARequestor(); PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE)); } extern "C" void ChipTest(void) { ChipLogProgress(DeviceLayer, "Lighting App Demo!"); CHIP_ERROR err = CHIP_NO_ERROR; // initPref(); CHIPDeviceManager & deviceMgr = CHIPDeviceManager::GetInstance(); err = deviceMgr.Init(&EchoCallbacks); // start the CHIP task if (err != CHIP_NO_ERROR) { ChipLogError(DeviceLayer, "DeviceManagerInit() - ERROR!\r\n"); } else { ChipLogProgress(DeviceLayer, "DeviceManagerInit() - OK\r\n"); } chip::DeviceLayer::PlatformMgr().ScheduleWork(InitServer, 0); while (true) vTaskDelay(pdMS_TO_TICKS(50)); // Just server the application event handler ChipLogProgress(SoftwareUpdate, "Exited"); return; } bool lowPowerClusterSleep() { return true; }