Files
aqhomecontrol/avr/devices/all/main.asm
2026-03-16 21:37:46 +01:00

169 lines
3.2 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)
bigcall systemSetSpeed
bigcall systemInitHardware
bigcall Utils_Init
bigcall Utils_SetupUid
bigcall modulesInit
bigcall appsInit
bigcall Utils_InitialWait
sei ; Enable interrupts TODO: move below!
bigcall 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:
bigcall systemSleep ; system-dependant
; run loop as long as some run function returns with CFLAG set
clr r17
main_runLoop:
push r17
clr r16
push r16
bigcall modulesRun
pop r16
sbci r16, 0
push r16
bigcall appsRun
pop r16
sbci r16, 0
push r16
bigcall onEveryLoop ; call into main app
pop r16
pop r17
tst r16
breq main_endRunLoop
inc r17
cpi r17, 10
brcc main_endRunLoop
brne main_runLoop
main_endRunLoop:
#ifdef MODULES_NETWORK
#ifndef MAIN_WITHOUT_MSG_HANDLING
rcall mainHandleMessages
#endif
#endif
rjmp main_loop
main_loop_reboot:
cli
bigjmp BOOTLOADER_ADDR
; @end
onSystemTimerTick:
bigcall onEvery100ms
bigcall modulesOnEvery100ms
bigcall appsOnEvery100ms
ret
; @end
#ifdef MODULES_CLOCK
sysOnEverySecond:
bigcall modulesOnEverySecond
bigcall appsOnEverySecond
bigjmp onEverySecond
; @end
sysOnEveryMinute:
bigcall modulesOnEveryMinute
bigcall appsOnEveryMinute
bigjmp onEveryMinute
; @end
sysOnEveryHour:
bigcall modulesOnEveryHour
bigcall appsOnEveryHour
bigjmp onEveryHour
; @end
sysOnEveryDay:
bigcall modulesOnEveryDay
bigcall appsOnEveryDay
bigjmp onEveryDay
; @end
#endif
#ifdef MODULES_NETWORK
; ---------------------------------------------------------------------------
; @routine mainHandleMessages
mainHandleMessages:
bigcall NET_GetNextIncomingMsgNum ; R16=msg num
brcc mainHandleMessages_end
bigcall NET_Buffer_Locate ; X=buffer addr (R17)
adiw xh:xl, 1
push r16
bigcall onMessageReceived
bigcall modulesOnPacketReceived
bigcall appsOnPacketReceived
pop r16
bigcall NET_Buffer_ReleaseByNum
sec
mainHandleMessages_end:
ret
; @end
#endif