; *************************************************************************** ; copyright : (C) 2025 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** ; * This file is part of the project "AqHome". * ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine main @global main: cli ; setup stack .ifdef SPH ; if SPH is defined ldi r16, High(RAMEND) out SPH, r16 ; init MSB stack pointer .endif ldi r16, Low(RAMEND) out SPL, r16 ; init LSB stack pointer ; rcall watchdogOff ; turn off watchdog timer (sometimes it stays on after reboot) rcall systemSetSpeed rcall systemInitHardware rcall Utils_Init rcall Utils_SetupUid rcall initModules rcall initApps rcall Utils_InitialWait sei ; Enable interrupts rcall onSystemStart #ifdef MODULES_LED ldi xl, LOW(blinkPattern) ; debug: set blink pattern ldi xh, HIGH(blinkPattern) ldi zl, LOW(ledA3Flash) ldi zh, HIGH(ledA3Flash) ldi yl, LOW(ledA3Sram) ldi yh, HIGH(ledA3Sram) rcall Led_SetPattern #endif main_loop: rcall systemSleep ; system-dependant rcall runModules rcall runApps rcall onEveryLoop ; call into main app #ifdef MODULES_NETWORK #ifndef MAIN_WITHOUT_MSG_HANDLING rcall mainHandleMessages #endif #endif rjmp main_loop main_loop_reboot: cli rjmp BOOTLOADER_ADDR ; @end ; --------------------------------------------------------------------------- ; @routine onSystemTimerTick ; ; Called every 100ms. No arguments, no results. onSystemTimerTick: rcall onEvery100ms #ifdef MODULES_CLOCK rcall Clock_Every100ms ; generates calls to onEverySecond/Minute/Hour/Day #endif #ifdef MODULES_LED_SIMPLE rcall LedSimple_Every100ms #endif #ifdef MODULES_UART_BITBANG rcall UART_BitBang_Every100ms #endif #ifdef MODULES_TTYONUART1 rcall TtyOnUart1_Periodically #endif #ifdef MODULES_COMONUART0 rcall ComOnUart0_Periodically #endif #ifdef MODULES_TCRT1000 rcall TCRT1K_Every100ms #endif #ifdef APPS_NETWORK ldi yl, LOW(netInterfaceData) ldi yh, HIGH(netInterfaceData) rcall AppNetwork_Every100ms #endif #ifdef APPS_MOTION rcall AppMotion_Every100ms #endif #ifdef APPS_DOOR rcall AppDoor_Every100ms #endif #ifdef APPS_MA_LIGHT rcall AppMotionLight_Every100ms #endif ret ; @end #ifdef MODULES_CLOCK sysOnEverySecond: #ifdef MODULES_DS18B20 rcall Ds18b20_OnEverySecond #endif #ifdef APPS_REPORTSENSORS rcall AppReportSensors_OnEverySecond #endif rjmp onEverySecond ; @end sysOnEveryMinute: #ifdef APPS_STATS rcall AppStats_OnEveryMinute #endif rjmp onEveryMinute ; @end sysOnEveryHour: rjmp onEveryHour ; @end sysOnEveryDay: rjmp onEveryDay ; @end #endif #ifdef MODULES_NETWORK ; --------------------------------------------------------------------------- ; @routine mainHandleMessages mainHandleMessages: rcall NET_GetNextIncomingMsgNum ; R16=msg num brcc mainHandleMessages_end rcall NET_Buffer_Locate ; X=buffer addr (R17) adiw xh:xl, 1 push r16 rcall onMessageReceived rcall mainModulesOnPacketReceived rcall mainAppsOnPacketReceived pop r16 rcall NET_Buffer_ReleaseByNum sec mainHandleMessages_end: ret ; @end #endif