@ -34,8 +34,11 @@ class Payload : public Handler<payloadListenerType> {
public :
public :
Payload ( ) : Handler ( ) { }
Payload ( ) : Handler ( ) { }
void setup ( HMSYSTEM * sys ) {
void setup ( HMSYSTEM * sys , statistics_t * stat , uint8_t maxRetransmits , uint32_t * timestamp ) {
mSys = sys ;
mSys = sys ;
mStat = stat ;
mMaxRetrans = maxRetransmits ;
mTimestamp = timestamp ;
memset ( mPayload , 0 , ( MAX_NUM_INVERTERS * sizeof ( invPayload_t ) ) ) ;
memset ( mPayload , 0 , ( MAX_NUM_INVERTERS * sizeof ( invPayload_t ) ) ) ;
mLastPacketId = 0x00 ;
mLastPacketId = 0x00 ;
mSerialDebug = false ;
mSerialDebug = false ;
@ -45,34 +48,51 @@ class Payload : public Handler<payloadListenerType> {
mSerialDebug = enable ;
mSerialDebug = enable ;
}
}
bool isComplete ( Inverter < > * iv ) {
void notify ( uint8_t val ) {
return mPayload [ iv - > id ] . complete ;
for ( typename std : : list < payloadListenerType > : : iterator it = mList . begin ( ) ; it ! = mList . end ( ) ; + + it ) {
( * it ) ( val ) ;
}
}
uint8_t getMaxPacketId ( Inverter < > * iv ) {
return mPayload [ iv - > id ] . maxPackId ;
}
}
uint8_t getRetransmits ( Inverter < > * iv ) {
void ivSend ( Inverter < > * iv ) {
return mPayload [ iv - > id ] . retransmits ;
if ( ! mPayload [ iv - > id ] . complete )
}
process ( false ) ;
uint32_t getTs ( Inverter < > * iv ) {
if ( ! mPayload [ iv - > id ] . complete ) {
return mPayload [ iv - > id ] . ts ;
if ( 0 = = mPayload [ iv - > id ] . maxPackId )
mStat - > rxFailNoAnser + + ;
else
mStat - > rxFail + + ;
iv - > setQueuedCmdFinished ( ) ; // command failed
if ( mSerialDebug )
DPRINTLN ( DBG_INFO , F ( " enqueued cmd failed/timeout " ) ) ;
if ( mSerialDebug ) {
DPRINT ( DBG_INFO , F ( " (# " ) + String ( iv - > id ) + " ) " ) ;
DPRINTLN ( DBG_INFO , F ( " no Payload received! (retransmits: " ) + String ( mPayload [ iv - > id ] . retransmits ) + " ) " ) ;
}
}
}
void request ( Inverter < > * iv ) {
reset ( iv ) ;
mPayload [ iv - > id ] . requested = true ;
mPayload [ iv - > id ] . requested = true ;
}
void setTxCmd ( Inverter < > * iv , uint8_t cmd ) {
yield ( ) ;
if ( mSerialDebug )
DPRINTLN ( DBG_INFO , F ( " (# " ) + String ( iv - > id ) + F ( " ) Requesting Inv SN " ) + String ( iv - > config - > serial . u64 , HEX ) ) ;
if ( iv - > devControlRequest ) {
if ( mSerialDebug )
DPRINTLN ( DBG_INFO , F ( " (# " ) + String ( iv - > id ) + F ( " ) Devcontrol request " ) + String ( iv - > devControlCmd ) + F ( " power limit " ) + String ( iv - > powerLimit [ 0 ] ) ) ;
mSys - > Radio . sendControlPacket ( iv - > radioId . u64 , iv - > devControlCmd , iv - > powerLimit ) ;
mPayload [ iv - > id ] . txCmd = iv - > devControlCmd ;
iv - > clearCmdQueue ( ) ;
iv - > enqueCommand < InfoCommand > ( SystemConfigPara ) ; // read back power limit
} else {
uint8_t cmd = iv - > getQueuedCmd ( ) ;
DPRINTLN ( DBG_INFO , F ( " (# " ) + String ( iv - > id ) + F ( " ) sendTimePacket " ) ) ;
mSys - > Radio . sendTimePacket ( iv - > radioId . u64 , cmd , mPayload [ iv - > id ] . ts , iv - > alarmMesIndex ) ;
mPayload [ iv - > id ] . txCmd = cmd ;
mPayload [ iv - > id ] . txCmd = cmd ;
}
}
void notify ( uint8_t val ) {
for ( typename std : : list < payloadListenerType > : : iterator it = mList . begin ( ) ; it ! = mList . end ( ) ; + + it ) {
( * it ) ( val ) ;
}
}
}
void add ( packet_t * p , uint8_t len ) {
void add ( packet_t * p , uint8_t len ) {
@ -134,7 +154,7 @@ class Payload : public Handler<payloadListenerType> {
return ( crc = = crcRcv ) ? true : false ;
return ( crc = = crcRcv ) ? true : false ;
}
}
void process ( bool retransmit , uint8_t maxRetransmits , statistics_t * stat ) {
void process ( bool retransmit ) {
for ( uint8_t id = 0 ; id < mSys - > getNumInverters ( ) ; id + + ) {
for ( uint8_t id = 0 ; id < mSys - > getNumInverters ( ) ; id + + ) {
Inverter < > * iv = mSys - > getInverterByPos ( id ) ;
Inverter < > * iv = mSys - > getInverterByPos ( id ) ;
if ( NULL = = iv )
if ( NULL = = iv )
@ -152,9 +172,9 @@ class Payload : public Handler<payloadListenerType> {
if ( iv - > devControlCmd = = Restart | | iv - > devControlCmd = = CleanState_LockAndAlarm ) {
if ( iv - > devControlCmd = = Restart | | iv - > devControlCmd = = CleanState_LockAndAlarm ) {
// This is required to prevent retransmissions without answer.
// This is required to prevent retransmissions without answer.
DPRINTLN ( DBG_INFO , F ( " Prevent retransmit on Restart / CleanState_LockAndAlarm... " ) ) ;
DPRINTLN ( DBG_INFO , F ( " Prevent retransmit on Restart / CleanState_LockAndAlarm... " ) ) ;
mPayload [ iv - > id ] . retransmits = maxRetransmit s ;
mPayload [ iv - > id ] . retransmits = mM axRetrans ;
} else {
} else {
if ( mPayload [ iv - > id ] . retransmits < maxRetransmit s ) {
if ( mPayload [ iv - > id ] . retransmits < mM axRetrans ) {
mPayload [ iv - > id ] . retransmits + + ;
mPayload [ iv - > id ] . retransmits + + ;
if ( mPayload [ iv - > id ] . maxPackId ! = 0 ) {
if ( mPayload [ iv - > id ] . maxPackId ! = 0 ) {
for ( uint8_t i = 0 ; i < ( mPayload [ iv - > id ] . maxPackId - 1 ) ; i + + ) {
for ( uint8_t i = 0 ; i < ( mPayload [ iv - > id ] . maxPackId - 1 ) ; i + + ) {
@ -207,7 +227,7 @@ class Payload : public Handler<payloadListenerType> {
DPRINTLN ( DBG_ERROR , F ( " record is NULL! " ) ) ;
DPRINTLN ( DBG_ERROR , F ( " record is NULL! " ) ) ;
} else if ( ( rec - > pyldLen = = payloadLen ) | | ( 0 = = rec - > pyldLen ) ) {
} else if ( ( rec - > pyldLen = = payloadLen ) | | ( 0 = = rec - > pyldLen ) ) {
if ( mPayload [ iv - > id ] . txId = = ( TX_REQ_INFO + 0x80 ) )
if ( mPayload [ iv - > id ] . txId = = ( TX_REQ_INFO + 0x80 ) )
s tat- > rxSuccess + + ;
mS tat- > rxSuccess + + ;
rec - > ts = mPayload [ iv - > id ] . ts ;
rec - > ts = mPayload [ iv - > id ] . ts ;
for ( uint8_t i = 0 ; i < rec - > length ; i + + ) {
for ( uint8_t i = 0 ; i < rec - > length ; i + + ) {
@ -218,7 +238,7 @@ class Payload : public Handler<payloadListenerType> {
notify ( mPayload [ iv - > id ] . txCmd ) ;
notify ( mPayload [ iv - > id ] . txCmd ) ;
} else {
} else {
DPRINTLN ( DBG_ERROR , F ( " plausibility check failed, expected " ) + String ( rec - > pyldLen ) + F ( " bytes " ) ) ;
DPRINTLN ( DBG_ERROR , F ( " plausibility check failed, expected " ) + String ( rec - > pyldLen ) + F ( " bytes " ) ) ;
s tat- > rxFail + + ;
mS tat- > rxFail + + ;
}
}
iv - > setQueuedCmdFinished ( ) ;
iv - > setQueuedCmdFinished ( ) ;
@ -230,7 +250,7 @@ class Payload : public Handler<payloadListenerType> {
}
}
}
}
void reset ( Inverter < > * iv , uint32_t utcTs ) {
void reset ( Inverter < > * iv ) {
DPRINTLN ( DBG_INFO , " resetPayload: id: " + String ( iv - > id ) ) ;
DPRINTLN ( DBG_INFO , " resetPayload: id: " + String ( iv - > id ) ) ;
memset ( mPayload [ iv - > id ] . len , 0 , MAX_PAYLOAD_ENTRIES ) ;
memset ( mPayload [ iv - > id ] . len , 0 , MAX_PAYLOAD_ENTRIES ) ;
mPayload [ iv - > id ] . txCmd = 0 ;
mPayload [ iv - > id ] . txCmd = 0 ;
@ -238,11 +258,14 @@ class Payload : public Handler<payloadListenerType> {
mPayload [ iv - > id ] . maxPackId = 0 ;
mPayload [ iv - > id ] . maxPackId = 0 ;
mPayload [ iv - > id ] . complete = false ;
mPayload [ iv - > id ] . complete = false ;
mPayload [ iv - > id ] . requested = false ;
mPayload [ iv - > id ] . requested = false ;
mPayload [ iv - > id ] . ts = utcTs ;
mPayload [ iv - > id ] . ts = * mTimestamp ;
}
}
private :
private :
HMSYSTEM * mSys ;
HMSYSTEM * mSys ;
statistics_t * mStat ;
uint8_t mMaxRetrans ;
uint32_t * mTimestamp ;
invPayload_t mPayload [ MAX_NUM_INVERTERS ] ;
invPayload_t mPayload [ MAX_NUM_INVERTERS ] ;
uint8_t mLastPacketId ;
uint8_t mLastPacketId ;
bool mSerialDebug ;
bool mSerialDebug ;