introduce app "hub"
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
reportsensors
|
reportsensors
|
||||||
stats
|
stats
|
||||||
router
|
router
|
||||||
|
hub
|
||||||
</subdirs>
|
</subdirs>
|
||||||
|
|
||||||
<extradist>
|
<extradist>
|
||||||
|
|||||||
15
avr/apps/hub/0BUILD
Normal file
15
avr/apps/hub/0BUILD
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<subdirs>
|
||||||
|
</subdirs>
|
||||||
|
|
||||||
|
<extradist>
|
||||||
|
main.asm
|
||||||
|
</extradist>
|
||||||
|
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
|
|
||||||
|
|
||||||
715
avr/apps/hub/main.asm
Normal file
715
avr/apps/hub/main.asm
Normal file
@@ -0,0 +1,715 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; network interfaces
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; data
|
||||||
|
|
||||||
|
.dseg
|
||||||
|
|
||||||
|
appHubDataBegin:
|
||||||
|
appHubRangeBegin: .byte 1
|
||||||
|
appHubRangeEnd: .byte 1
|
||||||
|
appHubDataEnd:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppHub_Init @global
|
||||||
|
|
||||||
|
AppHub_Init:
|
||||||
|
ldi xh, HIGH(appHubDataBegin)
|
||||||
|
ldi xl, LOW(appHubDataBegin)
|
||||||
|
clr r16
|
||||||
|
ldi r17, (appHubDataEnd-appHubDataBegin)
|
||||||
|
rcall Utils_FillSram
|
||||||
|
|
||||||
|
; set device address and interface number in all interfaces
|
||||||
|
ldi r16, 0xf0 ; hub address
|
||||||
|
ldi r17, 1 ; first interface number
|
||||||
|
rcall appHubAllSetAddrIfaceNumAndRange ; (R17, R19, R20, Y)
|
||||||
|
|
||||||
|
; TODO: read ranges from EEPROM
|
||||||
|
; TODO: send range msg to all interfaces
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppHub_Run @global
|
||||||
|
;
|
||||||
|
; Read messages from any interface, handle them and probably forward to the other
|
||||||
|
; interfaces.
|
||||||
|
; @return CFLAG set if something done, cleared otherwise
|
||||||
|
; @clobbers all
|
||||||
|
|
||||||
|
AppHub_Run:
|
||||||
|
rjmp appHubCheckRecvdMsg
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubGetDeviceByIfaceNum
|
||||||
|
;
|
||||||
|
; @param r16 interface number
|
||||||
|
; @clobbers r17, r19, r20, Y
|
||||||
|
|
||||||
|
appHubGetDeviceByIfaceNum:
|
||||||
|
ldi r19, COM_PORTS
|
||||||
|
ldi yl, LOW(com2w0_iface) ; first interface
|
||||||
|
ldi yh, HIGH(com2w0_iface)
|
||||||
|
appHubGetDeviceByIfaceNum_loop:
|
||||||
|
ldd r17, Y+NET_IFACE_OFFS_IFACENUM
|
||||||
|
cp r16, r17
|
||||||
|
sec ; mark "found"
|
||||||
|
breq appHubGetDeviceByIfaceNum_ret
|
||||||
|
ldi r20, COM2W_IFACE_SIZE
|
||||||
|
add yl, r20
|
||||||
|
adc yh, r20
|
||||||
|
sub yh, r20
|
||||||
|
dec r19
|
||||||
|
brne appHubGetDeviceByIfaceNum_loop
|
||||||
|
clc ; mark "not found"
|
||||||
|
appHubGetDeviceByIfaceNum_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubAllSetAddrIfaceNumAndRange
|
||||||
|
;
|
||||||
|
; @clobbers R17, R18, R19, R20, Y
|
||||||
|
|
||||||
|
appHubAllSetAddrIfaceNumAndRange:
|
||||||
|
ldi r19, COM_PORTS
|
||||||
|
ldi yl, LOW(com2w0_iface) ; first interface
|
||||||
|
ldi yh, HIGH(com2w0_iface)
|
||||||
|
ldi r18, 0x10
|
||||||
|
appHubAllSetAddrIfaceNumAndRange_loop:
|
||||||
|
; set address
|
||||||
|
std Y+NET_IFACE_OFFS_ADDRESS, r16
|
||||||
|
; set interface number
|
||||||
|
std Y+NET_IFACE_OFFS_IFACENUM, r17
|
||||||
|
inc r17
|
||||||
|
; set default range (step of 16)
|
||||||
|
std Y+NET_IFACE_OFFS_RANGE_BEGIN, r18
|
||||||
|
subi r18, -15
|
||||||
|
std Y+NET_IFACE_OFFS_RANGE_END, r18
|
||||||
|
inc r18
|
||||||
|
; next interface
|
||||||
|
ldi r20, COM2W_IFACE_SIZE
|
||||||
|
add yl, r20
|
||||||
|
adc yh, r20
|
||||||
|
sub yh, r20
|
||||||
|
dec r19
|
||||||
|
brne appHubAllSetAddrIfaceNumAndRange_loop
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubSendRangeMsg
|
||||||
|
;
|
||||||
|
; @param R18 msg code
|
||||||
|
; @param Y pointer to interface data
|
||||||
|
; @return CFLAG set if message enqueued, cleared on error
|
||||||
|
; @clobbers (R16, R17, R18, R19, R20, R21, R24, R25, X)
|
||||||
|
|
||||||
|
appHubSendRangeMsg:
|
||||||
|
bigcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
|
brcc appHubSendRangeMsg_end
|
||||||
|
push r16
|
||||||
|
ldd r20, Y+NET_IFACE_OFFS_RANGE_BEGIN
|
||||||
|
ldd r21, Y+NET_IFACE_OFFS_RANGE_END
|
||||||
|
adiw xh:xl, 1
|
||||||
|
bigcall NETMSG_Range_Write ; (R16, R17, R18, R19, R20, R21)
|
||||||
|
sbiw xh:xl, 1
|
||||||
|
pop r16
|
||||||
|
rcall appHubSendMsg ; (R16, R17, R18, R24, R25, X)
|
||||||
|
appHubSendRangeMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubSendDenyAddrR19
|
||||||
|
;
|
||||||
|
; @param R19 address to send
|
||||||
|
; @clobbers R16, R17, R18, R19, R20, R21, X, Y
|
||||||
|
|
||||||
|
appHubSendDenyAddrR19:
|
||||||
|
ldi r18, NETMSG_CMD_DENY_ADDRESS ; deny addr
|
||||||
|
rjmp appHubSendAddrMsg ; (R16, R17, R18, R19, R20, R21, X, Y)
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubSendAddrMsg
|
||||||
|
;
|
||||||
|
; @param R18 command
|
||||||
|
; @param R19 address to send
|
||||||
|
; @clobbers R16 (R17, R18, R19, R20, R21, X, Y)
|
||||||
|
|
||||||
|
appHubSendAddrMsg:
|
||||||
|
bigcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
|
brcc appHubSendAddrMsg_end
|
||||||
|
push r16
|
||||||
|
adiw xh:xl, 1
|
||||||
|
bigcall NETMSG_Address_Write ; (R16, R17, R18, R19, R20, R21)
|
||||||
|
sbiw xh:xl, 1
|
||||||
|
pop r16
|
||||||
|
rcall appHubSendMsg ; (R16, R17, R18, R24, R25, X)
|
||||||
|
appHubSendAddrMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubSendValueResponse
|
||||||
|
;
|
||||||
|
; @param R17 value id
|
||||||
|
; @param R19:R18 value
|
||||||
|
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
|
||||||
|
; @param R23 command
|
||||||
|
; @param R25:R24 ref msg id
|
||||||
|
; @return CFLAG on success, cleared on error
|
||||||
|
; @clobbers r22 (r16, r17, r18, r19, r20, r21, r23, r24, r25, X)
|
||||||
|
|
||||||
|
appHubSendValueResponse:
|
||||||
|
push r17
|
||||||
|
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
|
pop r17
|
||||||
|
brcc appHubSendValueResponse_end ; jmp on error
|
||||||
|
push r16 ; buffer num
|
||||||
|
ldi r16, 0xff ; DEST addr
|
||||||
|
clr r22 ; value type
|
||||||
|
adiw xh:xl, 1
|
||||||
|
rcall NETMSG_ValueWriteResponse ; (R16, R17, R18, R19, R20, R21, R23, R24, R25)
|
||||||
|
sbiw xh:xl, 1
|
||||||
|
pop r16 ; buffer num
|
||||||
|
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
|
||||||
|
appHubSendValueResponse_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubSendMsg
|
||||||
|
;
|
||||||
|
; @param R16 num of allocated buffer
|
||||||
|
; @param Y pointer to interface data
|
||||||
|
; @param X msg to send (points to start of allocated buffer, e.g. buffer header)
|
||||||
|
; @return CFLAG set if message enqueued, cleared on error
|
||||||
|
; @clobbers R16 (R17, R18, R24, R25, X)
|
||||||
|
|
||||||
|
appHubSendMsg:
|
||||||
|
bigcall NET_Interface_AddOutgoingMsgNum ; (R17, R18, X)
|
||||||
|
brcs appHubSendMsg_end
|
||||||
|
bigcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||||
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
clc
|
||||||
|
appHubSendMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubAllResetStats
|
||||||
|
;
|
||||||
|
; @clobbers r19, r20, Y (r16, r17, X)
|
||||||
|
|
||||||
|
appHubAllResetStats:
|
||||||
|
ldi r19, COM_PORTS
|
||||||
|
ldi yl, LOW(com2w0_iface) ; first interface
|
||||||
|
ldi yh, HIGH(com2w0_iface)
|
||||||
|
appHubAllResetStats_loop:
|
||||||
|
bigcall NET_Interface_ResetStats ; (R16, R17, X)
|
||||||
|
|
||||||
|
ldi r20, COM2W_IFACE_SIZE
|
||||||
|
add yl, r20
|
||||||
|
adc yh, r20
|
||||||
|
sub yh, r20
|
||||||
|
dec r19
|
||||||
|
brne appHubAllResetStats_loop
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppHub_EveryDay @global
|
||||||
|
;
|
||||||
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
|
AppHub_EveryDay:
|
||||||
|
rcall appHubAllResetStats
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubSendMsgToAllOthers
|
||||||
|
;
|
||||||
|
; @param R16 buffer number
|
||||||
|
; @param X buffer pointer
|
||||||
|
; @clobbers r17, r19, r20, r24, r25 (r16, r18, X)
|
||||||
|
|
||||||
|
appHubSendMsgToAllOthers:
|
||||||
|
ld r24, X
|
||||||
|
andi r24, 0x0f ; get sender interface num
|
||||||
|
ldi r19, COM_PORTS ; number of ports
|
||||||
|
ldi yl, LOW(com2w0_iface) ; first interface
|
||||||
|
ldi yh, HIGH(com2w0_iface)
|
||||||
|
appHubSendMsgToAllOthers_loop:
|
||||||
|
ldd r25, Y+NET_IFACE_OFFS_IFACENUM
|
||||||
|
cp r24, r25 ; same interface?
|
||||||
|
breq appHubSendMsgToAllOthers_next
|
||||||
|
; current iface is not source, send and inc ref counter
|
||||||
|
bigcall NET_Interface_AddOutgoingMsgNum ; (R17, R18, X)
|
||||||
|
brcs appHubSendMsgToAllOthers_added
|
||||||
|
; inc error counter
|
||||||
|
push r24
|
||||||
|
mov r17, r16 ; save r16
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||||
|
bigcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
mov r16, r17 ; restore r16
|
||||||
|
pop r24
|
||||||
|
rjmp appHubSendMsgToAllOthers_next
|
||||||
|
appHubSendMsgToAllOthers_added:
|
||||||
|
mov r17, r16 ; save r16
|
||||||
|
bigcall NET_Buffer_IncRef ; (r16)
|
||||||
|
mov r16, r17 ; restore r16
|
||||||
|
appHubSendMsgToAllOthers_next:
|
||||||
|
ldi r20, COM2W_IFACE_SIZE
|
||||||
|
add yl, r20
|
||||||
|
adc yh, r20
|
||||||
|
sub yh, r20
|
||||||
|
dec r19
|
||||||
|
brne appHubSendMsgToAllOthers_loop
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleMsgLocally
|
||||||
|
;
|
||||||
|
; @param X pointer to received buffer (points to header byte)
|
||||||
|
; @param Y pointer to IFACE data from which msg was received
|
||||||
|
; @clobbers all, !X
|
||||||
|
|
||||||
|
appHubHandleMsgLocally:
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
rcall appHubHandleMsgLocally_savedX
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
rjmp appHubHandleMsgLocally_ret
|
||||||
|
appHubHandleMsgLocally_savedX:
|
||||||
|
; get message type
|
||||||
|
adiw xh:xl, NETMSG_OFFS_CMD+1 ; account for header byte
|
||||||
|
ld r16, X
|
||||||
|
sbiw xh:xl, NETMSG_OFFS_CMD+1
|
||||||
|
cpi r16, NETMSG_CMD_PING
|
||||||
|
breq appHubHandleMsgLocally_handlePingMsg
|
||||||
|
cpi r16, NETMSG_CMD_REBOOT_REQUEST
|
||||||
|
breq appHubHandleMsgLocally_handleRebootMsg
|
||||||
|
cpi r16, NETMSG_CMD_VALUE_SET
|
||||||
|
breq appHubHandleMsgLocally_handleSetValue
|
||||||
|
rjmp appHubHandleMsgLocally_ret
|
||||||
|
appHubHandleMsgLocally_handlePingMsg:
|
||||||
|
rjmp appHubHandlePingMsg
|
||||||
|
appHubHandleMsgLocally_handleRebootMsg:
|
||||||
|
rjmp appHubHandleRebootMsg
|
||||||
|
appHubHandleMsgLocally_handleSetValue:
|
||||||
|
rjmp appHubHandleSetValueMsg
|
||||||
|
appHubHandleMsgLocally_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandlePingMsg
|
||||||
|
;
|
||||||
|
; @param X pointer to received message
|
||||||
|
; @clobbers any, !X, !Y
|
||||||
|
|
||||||
|
appHubHandlePingMsg:
|
||||||
|
adiw xh:xl, NETMSG_OFFS_DESTADDR+1
|
||||||
|
ld r17, X
|
||||||
|
sbiw xh:xl, NETMSG_OFFS_DESTADDR+1
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_ADDRESS
|
||||||
|
cp r16, r17
|
||||||
|
breq appHubHandlePingMsg_forMe
|
||||||
|
cpi r17, 0xff
|
||||||
|
breq appHubHandlePingMsg_forMe
|
||||||
|
clc
|
||||||
|
rjmp appHubHandlePingMsg_end
|
||||||
|
appHubHandlePingMsg_forMe:
|
||||||
|
adiw xh:xl, NETMSG_OFFS_SRCADDR+1
|
||||||
|
ld r17, X
|
||||||
|
sbiw xh:xl, NETMSG_OFFS_SRCADDR+1
|
||||||
|
push r17
|
||||||
|
bigcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
|
pop r17
|
||||||
|
brcc appHubHandlePingMsg_end ; jmp on error
|
||||||
|
push r16 ; buffer num
|
||||||
|
mov r16, r17 ; DEST addr
|
||||||
|
adiw xh:xl, 1
|
||||||
|
bigcall NETMSG_Pong_Write ; (R16, R17, R18, R19, R20, X)
|
||||||
|
sbiw xh:xl, 1
|
||||||
|
pop r16 ; buffer num
|
||||||
|
bigcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
|
||||||
|
appHubHandlePingMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleRebootMsg
|
||||||
|
;
|
||||||
|
; Doesn't return if reboot msg is valid.
|
||||||
|
;
|
||||||
|
; @param X pointer to received message
|
||||||
|
|
||||||
|
appHubHandleRebootMsg:
|
||||||
|
rcall NETMSG_RebootRequestRead
|
||||||
|
brcc appHubHandleRebootMsg_end
|
||||||
|
; reboot
|
||||||
|
cli
|
||||||
|
bigjmp BOOTLOADER_ADDR
|
||||||
|
appHubHandleRebootMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleSetValueMsg
|
||||||
|
;
|
||||||
|
; @param X pointer to received message
|
||||||
|
; @param Y pointer to IFACE data from which msg was received
|
||||||
|
; @clobbers all, !Y
|
||||||
|
|
||||||
|
appHubHandleSetValueMsg:
|
||||||
|
adiw xh:xl, NETMSG_OFFS_DESTADDR+1
|
||||||
|
ld r17, X
|
||||||
|
sbiw xh:xl, NETMSG_OFFS_DESTADDR+1
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_ADDRESS
|
||||||
|
cp r16, r17
|
||||||
|
breq appHubHandleSetValueMsg_forMe
|
||||||
|
cpi r17, 0xff
|
||||||
|
breq appHubHandleSetValueMsg_forMe
|
||||||
|
rjmp appHubHandleSetValueMsg_ret
|
||||||
|
appHubHandleSetValueMsg_forMe:
|
||||||
|
rcall NETMSG_ValueRead ; (none)
|
||||||
|
cpi r17, VALUE_ID_HUB_SETRANGE1
|
||||||
|
brcs appHubHandleSetValueMsg_ret
|
||||||
|
cpi r17, VALUE_ID_HUB_SETRANGE8+1
|
||||||
|
brcc appHubHandleSetValueMsg_ret
|
||||||
|
appHubHandleSetValueMsg_setRange:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
subi r17, (VALUE_ID_HUB_SETRANGE1-1)
|
||||||
|
push r18
|
||||||
|
push r19
|
||||||
|
; send ACK back the same interface the request came from
|
||||||
|
push r17 ; interface number
|
||||||
|
ldi r23, NETMSG_CMD_VALUE_SET_ACK
|
||||||
|
rcall appHubSendValueResponse ; r22 (r16, r17, r18, r19, r20, r21, r23, r24, r25, X)
|
||||||
|
pop r16 ; pop interface number to r16 (from r17)
|
||||||
|
rcall appHubGetDeviceByIfaceNum ; Y=interface to modify (r17, r19, r20)
|
||||||
|
pop r19
|
||||||
|
pop r18
|
||||||
|
; modify interface
|
||||||
|
std Y+NET_IFACE_OFFS_RANGE_BEGIN, r18
|
||||||
|
std Y+NET_IFACE_OFFS_RANGE_END, r19
|
||||||
|
; TODO: store new config
|
||||||
|
|
||||||
|
; let subnodes of modified interface re-eunumerate
|
||||||
|
ldi r18, NETMSG_CMD_REENUM
|
||||||
|
rcall appHubSendRangeMsg ; (R16, R17, R18, R19, R20, R21, X)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
|
||||||
|
appHubHandleSetValueMsg_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleRoutingMsg
|
||||||
|
;
|
||||||
|
; @param X pointer to received buffer (points to header byte)
|
||||||
|
; @param Y pointer to IFACE data from which msg was received
|
||||||
|
; @clobbers all, !X
|
||||||
|
|
||||||
|
appHubHandleRoutingMsg:
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
rcall appHubHandleRoutingMsg_savedX
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
rjmp appHubHandleRoutingMsg_ret
|
||||||
|
appHubHandleRoutingMsg_savedX:
|
||||||
|
; get message type
|
||||||
|
adiw xh:xl, NETMSG_OFFS_CMD+1 ; account for header byte
|
||||||
|
ld r16, X
|
||||||
|
sbiw xh:xl, NETMSG_OFFS_CMD+1
|
||||||
|
cpi r16, NETMSG_CMD_NEED_ADDRESS
|
||||||
|
breq appHubHandleRoutingMsg_handleNeedAddress
|
||||||
|
cpi r16, NETMSG_CMD_CLAIM_ADDRESS
|
||||||
|
breq appHubHandleRoutingMsg_handleClaimAddress
|
||||||
|
clc
|
||||||
|
rjmp appHubHandleRoutingMsg_ret
|
||||||
|
appHubHandleRoutingMsg_handleNeedAddress:
|
||||||
|
rcall appHubHandleNeedAddressMsg
|
||||||
|
rjmp appHubHandleRoutingMsg_secRet
|
||||||
|
appHubHandleRoutingMsg_handleClaimAddress:
|
||||||
|
rcall appHubHandleClaimAddressMsg
|
||||||
|
appHubHandleRoutingMsg_secRet:
|
||||||
|
sec
|
||||||
|
appHubHandleRoutingMsg_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleNeedAddressMsg
|
||||||
|
;
|
||||||
|
; @param X pointer to received message
|
||||||
|
; @param Y pointer to IFACE data from which msg was received
|
||||||
|
; @clobbers all, !Y
|
||||||
|
|
||||||
|
appHubHandleNeedAddressMsg:
|
||||||
|
ldi r18, NETMSG_CMD_ADDRESS_RANGE
|
||||||
|
rcall appHubSendRangeMsg ; (R16, R17, R18, R19, R20, R21, X)
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleClaimAddressMsg
|
||||||
|
;
|
||||||
|
; @param X pointer to received message
|
||||||
|
; @param Y pointer to IFACE data from which msg was received
|
||||||
|
; @clobbers all, !Y
|
||||||
|
|
||||||
|
appHubHandleClaimAddressMsg:
|
||||||
|
rcall NETMSG_Address_Read ; R18=cmd, R19=addr(R18, R19)
|
||||||
|
rcall appHubIsR19InRange
|
||||||
|
brcs appHubHandleClaimAddressMsg_end
|
||||||
|
; is not in subnet range, deny
|
||||||
|
rcall appHubSendDenyAddrR19 ; (R16, R17, R18, R19, R20, R21, X)
|
||||||
|
appHubHandleClaimAddressMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubIsR19InRange
|
||||||
|
;
|
||||||
|
; @param R19 address to check against range
|
||||||
|
; @param Y pointer to IFACE data
|
||||||
|
; @clobbers R16
|
||||||
|
|
||||||
|
appHubIsR19InRange:
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_RANGE_BEGIN
|
||||||
|
cp r19, r16
|
||||||
|
brcs appHubIsR19InRangeClcRet
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_RANGE_END
|
||||||
|
cp r16, r19
|
||||||
|
brcs appHubIsR19InRangeClcRet
|
||||||
|
sec
|
||||||
|
rjmp appHubIsR19InRange_end
|
||||||
|
appHubIsR19InRangeClcRet:
|
||||||
|
clc
|
||||||
|
appHubIsR19InRange_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubCheckRecvdMsg
|
||||||
|
;
|
||||||
|
; Read messages from any interface and forward to the other ones.
|
||||||
|
;
|
||||||
|
; @return CFLAG set if something done, cleared otherwise
|
||||||
|
|
||||||
|
appHubCheckRecvdMsg:
|
||||||
|
rcall NET_PeekNextIncomingMsgNum ; check read queue (R16=bufNum)
|
||||||
|
brcc appHubCheckRecvdMsg_end ; no msg, jmp
|
||||||
|
rcall NET_Buffer_Locate ; (R17)
|
||||||
|
rcall appHubHandleRecvdMsg ; (all, !X)
|
||||||
|
rcall NET_GetNextIncomingMsgNum ; take off the queue
|
||||||
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
|
sec ; we had a message, so something was done
|
||||||
|
appHubCheckRecvdMsg_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubHandleRecvdMsg
|
||||||
|
;
|
||||||
|
; @param R16 buffer number
|
||||||
|
; @param X pointer to received message
|
||||||
|
; @clobbers all, !X
|
||||||
|
|
||||||
|
appHubHandleRecvdMsg:
|
||||||
|
mov r18, r16
|
||||||
|
ld r16, X
|
||||||
|
andi r16, 0x0f
|
||||||
|
rcall appHubGetDeviceByIfaceNum ; Y=source iface (r17, r19, r20)
|
||||||
|
brcc appHubHandleRecvdMsg_ret
|
||||||
|
; filter out routing msgs
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
push r18
|
||||||
|
rcall appHubHandleRoutingMsg ; (all, !X)
|
||||||
|
pop r18
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
brcs appHubHandleRecvdMsg_ret
|
||||||
|
; check for PING, SETVALUE etc
|
||||||
|
push r18
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
rcall appHubHandleMsgLocally ; (all, !X)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
; let other apps and modules handle message
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
rcall mainHandleMessages
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
pop r18
|
||||||
|
; forward message to all other interfaces
|
||||||
|
mov r16, r18 ; buffer number
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
rcall appHubSendMsgToAllOthers ; (r17, r19, r20, r24, r25 (r16, r18, X)
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
appHubHandleRecvdMsg_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubWriteConfToEeprom
|
||||||
|
;
|
||||||
|
; @clobbers R16, X (R17)
|
||||||
|
|
||||||
|
appHubWriteConfToEeprom:
|
||||||
|
; write range begin
|
||||||
|
ldi xl, LOW(EEPROM_OFFS_ROUTER_RANGE_BEGIN)
|
||||||
|
ldi xh, HIGH(EEPROM_OFFS_ROUTER_RANGE_BEGIN)
|
||||||
|
lds r16, appHubRangeBegin
|
||||||
|
rcall Eeprom_WriteByteIfChanged ; (R17)
|
||||||
|
brcc appHubWriteConfToEeprom_end
|
||||||
|
|
||||||
|
; write range end
|
||||||
|
ldi xl, LOW(EEPROM_OFFS_ROUTER_RANGE_END)
|
||||||
|
ldi xh, HIGH(EEPROM_OFFS_ROUTER_RANGE_END)
|
||||||
|
lds r16, appHubRangeEnd
|
||||||
|
rcall Eeprom_WriteByteIfChanged ; (R17)
|
||||||
|
appHubWriteConfToEeprom_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appHubReadConfFromEeprom
|
||||||
|
;
|
||||||
|
; @clobbers R16, X (R17)
|
||||||
|
|
||||||
|
appHubReadConfFromEeprom:
|
||||||
|
; read range begin
|
||||||
|
ldi xl, LOW(EEPROM_OFFS_ROUTER_RANGE_BEGIN)
|
||||||
|
ldi xh, HIGH(EEPROM_OFFS_ROUTER_RANGE_BEGIN)
|
||||||
|
rcall Eeprom_ReadByte
|
||||||
|
brcc appHubReadConfFromEeprom_end
|
||||||
|
cpi r16, 0xff
|
||||||
|
breq appHubReadConfFromEeprom_okay ; not set, jmp
|
||||||
|
cpi r16, 2 ; range should at least start at 2 to assign 1 to router
|
||||||
|
brcs appHubReadConfFromEeprom_okay
|
||||||
|
sts appHubRangeBegin, r16
|
||||||
|
dec r16
|
||||||
|
sts netInterfaceData+NET_IFACE_OFFS_ADDRESS, r16 ; use addr rangeBegin-1 for router itself
|
||||||
|
sts netInterfaceData2+NET_IFACE_OFFS_ADDRESS, r16 ; use same address for both interfaces to save on addresses
|
||||||
|
|
||||||
|
; read range end
|
||||||
|
ldi xl, LOW(EEPROM_OFFS_ROUTER_RANGE_END)
|
||||||
|
ldi xh, HIGH(EEPROM_OFFS_ROUTER_RANGE_END)
|
||||||
|
rcall Eeprom_ReadByte
|
||||||
|
brcc appHubReadConfFromEeprom_end
|
||||||
|
cpi r16, 0xff
|
||||||
|
breq appHubReadConfFromEeprom_okay
|
||||||
|
sts appHubRangeEnd, r16
|
||||||
|
appHubReadConfFromEeprom_okay:
|
||||||
|
sec
|
||||||
|
appHubReadConfFromEeprom_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -33,6 +33,10 @@ initApps:
|
|||||||
bigcall AppRouter_Init
|
bigcall AppRouter_Init
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef APPS_HUB
|
||||||
|
bigcall AppHub_Init
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef APPS_MOTION
|
#ifdef APPS_MOTION
|
||||||
bigcall AppMotion_Init
|
bigcall AppMotion_Init
|
||||||
#endif
|
#endif
|
||||||
@@ -74,6 +78,10 @@ runApps:
|
|||||||
sbci r16, 0 ; decrease r16 only if CFLAG set
|
sbci r16, 0 ; decrease r16 only if CFLAG set
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef APPS_HUB
|
||||||
|
bigcall AppHub_Run
|
||||||
|
#endif
|
||||||
|
|
||||||
; add more modules here
|
; add more modules here
|
||||||
|
|
||||||
tst r16
|
tst r16
|
||||||
|
|||||||
@@ -296,6 +296,19 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef APPS_HUB
|
||||||
|
.include "apps/hub/main.asm"
|
||||||
|
.include "modules/network/msg/reboot-d.asm"
|
||||||
|
.include "modules/network/msg/reboot-r.asm"
|
||||||
|
.include "modules/network/msg/pong-w.asm"
|
||||||
|
.include "modules/network/msg/range-d.asm"
|
||||||
|
.include "modules/network/msg/range-r.asm"
|
||||||
|
.include "modules/network/msg/range-w.asm"
|
||||||
|
.include "common/eeprom-r.asm"
|
||||||
|
.include "common/eeprom-w.asm"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef APPS_REPORTSENSORS
|
#ifdef APPS_REPORTSENSORS
|
||||||
.include "apps/reportsensors/data.asm"
|
.include "apps/reportsensors/data.asm"
|
||||||
.include "apps/reportsensors/main.asm"
|
.include "apps/reportsensors/main.asm"
|
||||||
|
|||||||
@@ -185,11 +185,8 @@ initModules:
|
|||||||
;
|
;
|
||||||
; Call run functions of the used modules. Add your routine calls here.
|
; Call run functions of the used modules. Add your routine calls here.
|
||||||
;
|
;
|
||||||
; IN:
|
; @return CFLAG set: at least one RUN routine returned CFLAG set
|
||||||
; - nothing
|
; @clobbers all
|
||||||
; OUT:
|
|
||||||
; - nothing
|
|
||||||
; USED: depending on called routines
|
|
||||||
|
|
||||||
runModules:
|
runModules:
|
||||||
clr r16
|
clr r16
|
||||||
@@ -197,6 +194,7 @@ runModules:
|
|||||||
push r16
|
push r16
|
||||||
bigcall BaseTimer_Run
|
bigcall BaseTimer_Run
|
||||||
pop r16
|
pop r16
|
||||||
|
sbci r16, 0
|
||||||
|
|
||||||
#ifdef MODULES_TTYONUART1
|
#ifdef MODULES_TTYONUART1
|
||||||
push r16
|
push r16
|
||||||
@@ -204,10 +202,40 @@ runModules:
|
|||||||
pop r16
|
pop r16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MODULES_COMONUART0
|
||||||
push r16
|
push r16
|
||||||
rcall runComModules
|
bigcall ComOnUart0_Run
|
||||||
pop r16
|
pop r16
|
||||||
sbci r16, 0
|
sbci r16, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MODULES_COMONUART1
|
||||||
|
push r16
|
||||||
|
bigcall ComOnUart1_Run
|
||||||
|
pop r16
|
||||||
|
sbci r16, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MODULES_COM2W0
|
||||||
|
push r16
|
||||||
|
bigcall COM2W0_Run
|
||||||
|
pop r16
|
||||||
|
sbci r16, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MODULES_COM2W1
|
||||||
|
push r16
|
||||||
|
bigcall COM2W1_Run
|
||||||
|
pop r16
|
||||||
|
sbci r16, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MODULES_COM2WN
|
||||||
|
push r16
|
||||||
|
bigcall COM2WN_Run
|
||||||
|
pop r16
|
||||||
|
sbci r16, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
; add more modules here
|
; add more modules here
|
||||||
|
|
||||||
@@ -218,67 +246,7 @@ runModules:
|
|||||||
sec
|
sec
|
||||||
runModules_end:
|
runModules_end:
|
||||||
ret
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
; run until every module idle
|
|
||||||
|
|
||||||
runComModules:
|
|
||||||
clr r17
|
|
||||||
runComModules_loop:
|
|
||||||
push r17
|
|
||||||
clr r16
|
|
||||||
#ifdef MODULES_COMONUART0
|
|
||||||
push r16
|
|
||||||
bigcall ComOnUart0_Run
|
|
||||||
pop r16
|
|
||||||
sbci r16, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MODULES_COMONUART1
|
|
||||||
push r16
|
|
||||||
bigcall ComOnUart1_Run
|
|
||||||
pop r16
|
|
||||||
sbci r16, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MODULES_COM2W0
|
|
||||||
push r16
|
|
||||||
bigcall COM2W0_Run
|
|
||||||
pop r16
|
|
||||||
sbci r16, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MODULES_COM2W1
|
|
||||||
push r16
|
|
||||||
bigcall COM2W1_Run
|
|
||||||
pop r16
|
|
||||||
sbci r16, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MODULES_COM2WN
|
|
||||||
push r16
|
|
||||||
bigcall COM2WN_Run
|
|
||||||
pop r16
|
|
||||||
sbci r16, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pop r17
|
|
||||||
; check for repeat request
|
|
||||||
tst r16
|
|
||||||
clc
|
|
||||||
breq runComModules_loopEnd
|
|
||||||
inc r17
|
|
||||||
cpi r17, 2
|
|
||||||
brne runComModules_loop
|
|
||||||
runComModules_loopEnd:
|
|
||||||
tst r17
|
|
||||||
clc
|
|
||||||
breq runComModules_end
|
|
||||||
sec
|
|
||||||
runComModules_end:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mainModulesOnPacketReceived:
|
mainModulesOnPacketReceived:
|
||||||
|
|||||||
Reference in New Issue
Block a user