Files
aqhomecontrol/avr/devices/all/main.asm
2025-05-18 00:59:19 +02:00

199 lines
3.6 KiB
NASM

; ***************************************************************************
; 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_UART_HW
rcall NET_Uart_Periodically
#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