@ -34,45 +34,65 @@ 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 ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					        }         }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        void  enableSerialDebug ( bool  enable )  {         void  enableSerialDebug ( bool  enable )  {  
			
		
	
		
		
			
				
					            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 )  {  
			
		
	
		
		
			
				
					            return  mPayload [ iv - > id ] . retransmits ;  
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					        }         }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					        uint32_t  getTs ( Inverter < >  * iv )  {         void  ivSend ( Inverter < >  * iv )  {  
			
				
				
			
		
	
		
		
			
				
					
					            return  mPayload [ iv - > id ] . ts ;             if  ( ! mPayload [ iv - > id ] . complete )  
			
				
				
			
		
	
		
		
			
				
					
					        }                     process ( false ) ;  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					        void  request ( Inverter < >  * iv )  {                 if  ( ! mPayload [ iv - > id ] . complete )  {  
			
				
				
			
		
	
		
		
			
				
					
					            mPayload [ iv - > id ] . requested  =  true ;                     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  setTxCmd ( Inverter < >  * iv ,  uint8_t  cmd )  {                 reset ( iv ) ;  
			
				
				
			
		
	
		
		
			
				
					
					            mPayload [ iv - > id ] . txCmd  =  cmd ;                 mPayload [ iv - > id ] . requested  =  true ;  
			
				
				
			
		
	
		
		
			
				
					        }  
			
		
	
		
		
	
		
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					        void  notify ( uint8_t  val )  {                 yield ( ) ;  
			
				
				
			
		
	
		
		
			
				
					
					            for ( typename  std : : list < payloadListenerType > : : iterator  it  =  mList . begin ( ) ;  it  ! =  mList . end ( ) ;  + + it )  {                 if  ( mSerialDebug )  
			
				
				
			
		
	
		
		
			
				
					
					               ( * it ) ( val ) ;                     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 ;  
			
		
	
		
		
			
				
					                }  
			
		
	
		
		
			
				
					        }         }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        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 ;