; ***************************************************************************
; 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.   *
; ***************************************************************************

;.equ clock=1000000 ; Define the clock frequency
.equ clock=16000000 ; Define the clock frequency



.nolist
.include "include/m644Pdef.inc" ; Define device ATmega644P
.list

.include "version.asm"
.include "../defs.asm"
.include "./data.asm"

.include "devices/all/defs.asm"
.include "common/calls.asm"
.include "common/utils_wait.asm"
.include "common/utils_io.asm"



; ***************************************************************************
; defines

; ---------------------------------------------------------------------------
; generic

.equ NET_BUFFERS_NUM              =  96
.equ NET_MSGNUMINBUF_SIZE         =  64 ; max buffer nums in ringbuffer (global incoming)
.equ NET_IFACE_OUTMSGBUF_SIZE     =  16 ; max buffer nums in ringbuffer (per interface outbound)



; ---------------------------------------------------------------------------
; firmware settings including list of modules used

;#define MAIN_WITHOUT_MSG_HANDLING ; message handling done here
#define APP_STATS_NETDEV2
#define COM_ACCEPT_ALL_DEST       ; accept all messages!

; #define MODULES_TIMER
#define MODULES_CLOCK
;#define MODULES_XRAM
;#define MODULES_HEAP
#define MODULES_LED1
#define MODULES_NETWORK
#define MODULES_COM2WI
;#define MODULES_COMONUART0
;#define MODULES_UART_HW
;#define MODULES_UART_BITBANG
;#define MODULES_SPI_HW
;#define MODULES_ILI9341
;#define MODULES_FONT
;#define MODULES_WIN
;#define MODULES_TWI_MASTER
;#define MODULES_LCD
;#define LCD_MINIMAL_FONT
;#define MODULES_SI7021
;#define MODULES_SGP30
;#define MODULES_SGP40
;#define MODULES_STATS
;#define MODULES_OWI_MASTER
;#define MODULES_DS18B20
;#define MODULES_MOTION
;#define MODULES_CCS811

#define APPS_NETWORK
;#define APPS_MOTION
;#define APPS_REPORTSENSORS
#define APPS_STATS
;#define APPS_HUB



; ---------------------------------------------------------------------------
; defines for values

.equ VALUE_ID_HUB_SETRANGE1    = 0x11
.equ VALUE_ID_HUB_SETRANGE2    = 0x12
.equ VALUE_ID_HUB_SETRANGE3    = 0x13
.equ VALUE_ID_HUB_SETRANGE4    = 0x14
.equ VALUE_ID_HUB_SETRANGE5    = 0x15
.equ VALUE_ID_HUB_SETRANGE6    = 0x16
.equ VALUE_ID_HUB_SETRANGE7    = 0x17
.equ VALUE_ID_HUB_SETRANGE8    = 0x18

.equ VALUE_ID_DEBUG            = 0x7f

.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88





; ***************************************************************************
; code segment

.cseg
.org 000000



; ---------------------------------------------------------------------------
; Reset and interrupt vectors
  jmp BOOTLOADER_ADDR           ;  1: Reset vector   RESET
  jmp irqNotSet                 ;  2: INT0           External Interrupt Request 0
  jmp irqNotSet                 ;  3: INT1           External Interrupt Request 1
  jmp irqNotSet                 ;  4: INT2           External Interrupt Request 2
  jmp irqNotSet                 ;  5: PCINT0         Pin Change Interrupt Request 0
  jmp irqNotSet                 ;  6: PCINT1         Pin Change Interrupt Request 1
  jmp irqNotSet                 ;  7: PCINT2         Pin Change Interrupt Request 2
  jmp irqNotSet                 ;  8: PCINT3         Pin Change Interrupt Request 3
  jmp irqNotSet                 ;  9: WDT            Watchdog Time-out Interrupt
  jmp irqNotSet                 ; 10: TIMER2_COMPA   Timer/Counter2 Compare Match A
  jmp irqNotSet                 ; 11: TIMER2_COMPB   Timer/Counter2 Compare Match B
  jmp irqNotSet                 ; 12: TIMER2_OVF     Timer/Counter2 Overflow
  jmp irqNotSet                 ; 13: TIMER1_CAPT    Timer/Counter1 Capture Event
  jmp COM2WI_Timer1Isr          ; 14: TIMER1_COMPA   Timer/Counter1 Compare Match A
  jmp irqNotSet                 ; 15: TIMER1_COMPB   Timer/Counter1 Compare Match B
  jmp irqNotSet                 ; 16: TIMER1_OVF     Timer/Counter1 Overflow
  jmp baseTimerIrqOC0A          ; 17: TIMER0_COMPA   Timer/Counter0 Compare Match A
  jmp irqNotSet                 ; 18: TIMER0_COMPB   Timer/Counter0 Compare Match B
  jmp irqNotSet                 ; 19: TIMER0_OVF     Timer/Counter0 Overflow
  jmp irqNotSet                 ; 20: SPI_STC        Serial Transfer Complete
  jmp irqNotSet                 ; 21: USART0_RXC     USART0 Rx Complete
  jmp irqNotSet                 ; 22: USART0_UDRE    USART0 Data Register Empty
  jmp irqNotSet                 ; 23: USART0_TXC     USART0 Tx Complete
  jmp irqNotSet                 ; 24: ANA_COMP       Analog Comparator
  jmp irqNotSet                 ; 25: ADC            ADC Conversion Complete
  jmp irqNotSet                 ; 26: EE_RDY         EEPROM Ready
  jmp irqNotSet                 ; 27: TWI            2-Wire Interface
  jmp irqNotSet                 ; 28: SPM_RDY        Store Program Memory Ready



devInfoBlock:        ; 12 bytes
devInfoManufacturer: .db 'A', 'Q', 'U', 'A'
devInfoId:           .db DEVICEINFO_ID, 0
devInfoVersion:      .db DEVICEINFO_VERSION, DEVICEINFO_REVISION             ; version, revision
firmwareVersion:     .db FIRMWARE_VARIANT_TEMP_WINDOW, FIRMWARE_VERSION_MAJOR
                     .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL



; ---------------------------------------------------------------------------
; @routine firmwareStart @global

firmwareStart:
  rjmp main
; @end


irqNotSet:
  reti



; ---------------------------------------------------------------------------
; @routine onSystemStart

onSystemStart:
;  rcall LedActivity_Trigger
  ret
; @end



; ---------------------------------------------------------------------------
; @routine onMessageReceived
;
; Called on every message received

onMessageReceived:
  clc
  ret
; @end



; ---------------------------------------------------------------------------
; @routine onEvery100ms
;
; Called every 100ms. Add your routine calls here. No arguments, no results.

onEvery100ms:
onEverySecond:
onEveryMinute:
onEveryHour:
onEveryDay:
  ret
; @end



; ---------------------------------------------------------------------------
; @routine onEveryLoop
;
; Called on every loop (i.e. after awakening from sleep).
;
onEveryLoop:
  ret
; @end





; ***************************************************************************
; includes

.include "devices/all/hw_m644p.asm"
.include "devices/all/includes.asm"

;.include "modules/network/msg/device-w.asm"
;.include "common/debug.asm"

;.include "modules/lcd2/font/font2.asm"
;.include "modules/lcd2/font/font3.asm"
;.include "modules/lcd2/font/font16x26.asm"
;.include "modules/lcd2/font/font4.asm"
;.include "modules/lcd2/font/font12x16.asm"
;.include "modules/lcd2/font/font5.asm"
;.include "modules/lcd2/font/font12x20.asm"
;.include "common/list_t.asm"
;.include "common/tree_t.asm"
;.include "common/divide.asm"


; ---------------------------------------------------------------------------
; defines for network interface

;.equ netInterfaceData = netUartIface
;.equ netInterfaceData = uart_bitbang_iface
.equ netInterfaceData  = com2wi0_iface
.equ netInterfaceData2 = com2wi1_iface





