diff --git a/aqhome/msg/msg_device.c b/aqhome/msg/msg_device.c index fa5bac4..45f66a0 100644 --- a/aqhome/msg/msg_device.c +++ b/aqhome/msg/msg_device.c @@ -92,6 +92,8 @@ void AQH_DeviceMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const ch GWEN_Buffer_AppendString(dbuf, " LCD"); if (modules & AQH_MSG_DEVICE_MASK_SI7021) GWEN_Buffer_AppendString(dbuf, " SI7021"); + if (modules & AQH_MSG_DEVICE_MASK_STATS) + GWEN_Buffer_AppendString(dbuf, " STATS"); GWEN_Buffer_AppendString(dbuf, " ]"); } GWEN_Buffer_AppendString(dbuf, ")\n"); diff --git a/aqhome/msg/msg_device.h b/aqhome/msg/msg_device.h index 8d37d5f..fad1aa5 100644 --- a/aqhome/msg/msg_device.h +++ b/aqhome/msg/msg_device.h @@ -24,6 +24,7 @@ #define AQH_MSG_DEVICE_MASK_TWIMASTER 0x10 #define AQH_MSG_DEVICE_MASK_LCD 0x20 #define AQH_MSG_DEVICE_MASK_SI7021 0x40 +#define AQH_MSG_DEVICE_MASK_STATS 0x80 diff --git a/aqhome/msg/msg_memstats.c b/aqhome/msg/msg_memstats.c index facfeaf..5b594af 100644 --- a/aqhome/msg/msg_memstats.c +++ b/aqhome/msg/msg_memstats.c @@ -21,11 +21,10 @@ #define AQH_MSG_OFFS_MEMSTATS_SECONDS 0 /* 4 bytes */ #define AQH_MSG_OFFS_MEMSTATS_UID 4 /* 4 bytes */ -#define AQH_MSG_OFFS_MEMSTATS_STACKPTR 8 /* 2 bytes */ +#define AQH_MSG_OFFS_MEMSTATS_STACKUSAGE 8 /* 2 bytes */ #define AQH_MSG_OFFS_MEMSTATS_BUFFERSUSED 10 /* 1 byte */ #define AQH_MSG_OFFS_MEMSTATS_MAXBUFFERSUSED 11 /* 1 byte */ -#define AQH_MSG_OFFS_MEMSTATS_SENDNOBUFFER 12 /* 2 bytes */ -#define AQH_MSG_OFFS_MEMSTATS_RECVNOBUFFER 14 /* 2 bytes */ +#define AQH_MSG_OFFS_MEMSTATS_RECVNOBUFFER 12 /* 2 bytes */ #define AQH_MSG_MEMSTATS_MINSIZE (AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_RECVNOBUFFER+2) @@ -44,9 +43,9 @@ uint32_t AQH_MemStatsMsg_GetSeconds(const GWEN_MSG *msg) } -uint16_t AQH_MemStatsMsg_GetStackPtr(const GWEN_MSG *msg) +uint16_t AQH_MemStatsMsg_GetStackUsage(const GWEN_MSG *msg) { - return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_STACKPTR, 0); + return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_STACKUSAGE, 0); } @@ -65,13 +64,6 @@ uint8_t AQH_MemStatsMsg_GetMaxBuffersUsed(const GWEN_MSG *msg) -uint16_t AQH_MemStatsMsg_GetSendNoBufferErrors(const GWEN_MSG *msg) -{ - return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_SENDNOBUFFER, 0); -} - - - uint16_t AQH_MemStatsMsg_GetRecvNoBufferErrors(const GWEN_MSG *msg) { return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_RECVNOBUFFER, 0); @@ -82,17 +74,15 @@ uint16_t AQH_MemStatsMsg_GetRecvNoBufferErrors(const GWEN_MSG *msg) void AQH_MemStatsMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText) { GWEN_Buffer_AppendArgs(dbuf, - "0x%02x->0x%02x: MEMSTATS %s (uid=0x%08x, uptime=%d, stackptr=%d[%04x], buffers used=%d(max=%d), no sendbuf errs=%d, no recvbuf=%d)\n", + "0x%02x->0x%02x: MEMSTATS %s (uid=0x%08x, uptime=%d, stack used=%d, buffers used=%d(max=%d), no recvbuf=%d)\n", AQH_NodeMsg_GetSourceAddress(msg), AQH_NodeMsg_GetDestAddress(msg), sText, (unsigned int) AQH_MemStatsMsg_GetUid(msg), AQH_MemStatsMsg_GetSeconds(msg), - AQH_MemStatsMsg_GetStackPtr(msg), - AQH_MemStatsMsg_GetStackPtr(msg), + AQH_MemStatsMsg_GetStackUsage(msg), AQH_MemStatsMsg_GetBuffersUsed(msg), AQH_MemStatsMsg_GetMaxBuffersUsed(msg), - AQH_MemStatsMsg_GetSendNoBufferErrors(msg), AQH_MemStatsMsg_GetRecvNoBufferErrors(msg)); } diff --git a/aqhome/msg/msg_memstats.h b/aqhome/msg/msg_memstats.h index e133bc2..c995244 100644 --- a/aqhome/msg/msg_memstats.h +++ b/aqhome/msg/msg_memstats.h @@ -20,7 +20,7 @@ AQHOME_API uint32_t AQH_MemStatsMsg_GetUid(const GWEN_MSG *msg); AQHOME_API uint32_t AQH_MemStatsMsg_GetSeconds(const GWEN_MSG *msg); -AQHOME_API uint16_t AQH_MemStatsMsg_GetStackPtr(const GWEN_MSG *msg); +AQHOME_API uint16_t AQH_MemStatsMsg_GetStackUsage(const GWEN_MSG *msg); AQHOME_API uint8_t AQH_MemStatsMsg_GetBuffersUsed(const GWEN_MSG *msg); AQHOME_API uint8_t AQH_MemStatsMsg_GetMaxBuffersUsed(const GWEN_MSG *msg); AQHOME_API uint16_t AQH_MemStatsMsg_GetSendNoBufferErrors(const GWEN_MSG *msg); diff --git a/avr/MESSAGES b/avr/MESSAGES index 661cb16..60cdbdf 100644 --- a/avr/MESSAGES +++ b/avr/MESSAGES @@ -216,6 +216,8 @@ Offset Length Meaning 10 2 content errors (invalid msg length, CRC errors) 12 2 io errors 14 2 no buffer errors + 16 2 handled packets + 18 2 missed packets diff --git a/avr/att84_temp1.asm b/avr/att84_temp1.asm index b74ccc8..bf42903 100644 --- a/avr/att84_temp1.asm +++ b/avr/att84_temp1.asm @@ -61,12 +61,12 @@ #define MODULES_TIMER #define MODULES_COM -;#define MODULES_COM_WITH_ADDR_PROTO +#define MODULES_COM_WITH_ADDR_PROTO #define MODULES_LED #define MODULES_TWI_MASTER #define MODULES_LCD #define MODULES_SI7021 - +#define MODULES_STATS .set MODULES_MASK = 0 @@ -88,7 +88,9 @@ #ifdef MODULES_SI7021 .set MODULES_MASK = MODULES_MASK | (1< R17 + brcs COM2_AllocBuffer_l1 + clr r17 ; wraparound +COM2_AllocBuffer_l1: + sts com2RecvBuffersWritePos, r17 ; store new writepos for next caller + rcall COM2_BufferPosToX ; (R16, R17) + out SREG, r21 ; restore global interrupt enable bit in SREG + sec + ret +COM2_AllocBuffer_error: + out SREG, r21 + clc + ret + + + +; --------------------------------------------------------------------------- +; COM2_BufferDeallocBack +; +; Release a transfer buffer at the end of the list by decreasing the write pos. +; This releases the last allocated buffer! +; +; IN: +; - nothing +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGISTERS: r16, r17, r21 + +COM2_BufferDeallocBack: + in r21, SREG ; save global interrupt enable bit from SREG + cli + lds r17, com2RecvBuffersUsed + tst r17 + breq COM2_BufferDeallocBack_error ; no buffer allocated, nothing to release + dec r17 + sts com2RecvBuffersUsed, r17 ; store new value + lds r17, com2RecvBuffersWritePos + tst r17 ; 0? + brne COM2_BufferDeallocBack_l1 ; nope go directly decrement r17 + ldi r17, COM2_BUFFER_NUM ; wrap-around +COM2_BufferDeallocBack_l1: + dec r17 + sts com2RecvBuffersWritePos, r17 + out SREG, r21 + sec + ret +COM2_BufferDeallocBack_error: + out SREG, r21 + clc + ret + + + +; --------------------------------------------------------------------------- +; COM2_BufferDeallocFront +; +; Release a transfer buffer by increasing the read pos. +; +; IN: +; - nothing +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGISTERS: r16, r17, r21 + +COM2_BufferDeallocFront: + in r21, SREG ; save global interrupt enable bit from SREG + cli + lds r17, com2RecvBuffersUsed + tst r17 + breq COM2_BufferDeallocFront_error ; no buffer allocated, nothing to release + dec r17 + sts com2RecvBuffersUsed, r17 ; store new value + lds r17, com2RecvBuffersReadPos + inc r17 + cpi r17, COM2_BUFFER_NUM + brcs COM2_BufferDeallocFront_l1 + clr r17 ; wrap-around +COM2_BufferDeallocFront_l1: + sts com2RecvBuffersReadPos, r17 + out SREG, r21 + sec + ret +COM2_BufferDeallocFront_error: + out SREG, r21 + clc + ret + + + +; --------------------------------------------------------------------------- +; COM2_BufferPosToX +; +; Get a pointer to the SRAM position of the given buffer. +; CAVE: Code must correspond to COM2_BUFFER_SIZE!! +; IN: +; - R16: buffer number (starting with 0) +; OUT: +; - X: pointer to buffer in SRAM +; MODIFIED REGISTERS: R16, R17 + +COM2_BufferPosToX: + ; calculate offset + clr r17 + mov xl, r16 + clr xh + + lsl xl + rol xh ; *2 + + add xl, r16 + adc xh, r17 ; *3 + + lsl xl + rol xh ; *6 + + lsl xl + rol xh ; *12 + + lsl xl + rol xh ; *24 + + ; add base position of buffers + ldi r16, LOW(com2RecvBuffers) + ldi r17, HIGH(com2RecvBuffers) + add xl, r16 + adc xh, r17 + ret + + + + + COM2_END: .equ MODULE_SIZE_COM2 = COM2_END-COM2_BEGIN diff --git a/avr/comproto_addr.asm b/avr/comproto_addr.asm index 8e2178a..002540a 100644 --- a/avr/comproto_addr.asm +++ b/avr/comproto_addr.asm @@ -72,13 +72,13 @@ cproAddressDataBegin: cproAddressFlags: .byte 1 - cproAddresModeTimer: .byte 2 cproAddrRangeBegin: .byte 1 cproAddrRangeEnd: .byte 1 - cproAddressWaitCounter: .byte 1 ; counter for seconds to wait for all nodes to respond cproUsedAddresses: .byte 16 ; one bit per address known to b in use cproAddressDataEnd: +cproAddresModeTimer: .byte 2 ; timer must not be zeroed, this is done by the timer module!! + ; *************************************************************************** @@ -109,20 +109,25 @@ CPRO_StartReclaimAddrProcedure: ldi xl, LOW(EEPROM_OFFS_COMADDR) ldi xh, HIGH(EEPROM_OFFS_COMADDR) in r15, SREG - cli - rcall Utils_ReadEepromIncr ; (R16) - tst r16 - breq CPRO_StartReclaimAddrProcedure_l1 - cpi r16, 0xff - breq CPRO_StartReclaimAddrProcedure_l1 - sts cproAddrRangeBegin, r16 ; currently claimed address - ldi r16, CPRO_MODE_SEND_RECLAIM_ADDR - sts cproMode, r16 - rcall cproAddressSetTimer1s ; use singleshot timer, send after 1s + push r15 + cli + rcall Utils_ReadEepromIncr ; (R16) + tst r16 + breq CPRO_StartReclaimAddrProcedure_l1 + cpi r16, 0xff + breq CPRO_StartReclaimAddrProcedure_l1 + sts cproAddrRangeBegin, r16 ; currently claimed address + ldi r16, CPRO_MODE_SEND_RECLAIM_ADDR + sts cproMode, r16 + rcall cproAddressSetTimer1s ; use singleshot timer, send after 1s + pop r15 + out SREG, r15 sec ret CPRO_StartReclaimAddrProcedure_l1: - rcall CPRO_StartGetAddrProcedure + rcall CPRO_StartGetAddrProcedure + pop r15 + out SREG, r15 ret diff --git a/avr/comproto_memstats.asm b/avr/comproto_memstats.asm index fd42781..b9e364f 100644 --- a/avr/comproto_memstats.asm +++ b/avr/comproto_memstats.asm @@ -22,50 +22,35 @@ ; IN: ; - R16: destination address ; OUT: -; - CFLAG: set if okay, clear otherwise -; MODIFIED REGS: R6, R16, R17, R18, R20 (R3, R4, R15, R19, R21, X) - -CPRO_EnqueueMemStats: - mov r6, r16 - - rcall COM_AllocBufferAndGetXY ; (r16, r17, r21) - brcc CPRO_EnqueueMemStats_error +; - nothing +; REGS: R3, R4, R16, R17, R18, X (R19, R20, R21) +CPRO_WriteMemStats: + ldi r17, COM2_PAYLOAD_FLAGS_UID | COM2_PAYLOAD_FLAGS_SECONDS | (6<