@ -68,49 +68,90 @@ class MiPayload { 
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        void  loop ( )  {  
			
		
	
		
			
				
					            /*if(NULL != mHighPrioIv) {
  
			
		
	
		
			
				
					                iv - > iv Send( mHighPrioIv ,  true ) ;  // should request firmware version etc. ?
  
			
		
	
		
			
				
					            if ( NULL  ! =  mHighPrioIv )  {  
			
		
	
		
			
				
					                ivSend ( mHighPrioIv ,  true ) ;  // for devcontrol commands ?
  
			
		
	
		
			
				
					                mHighPrioIv  =  NULL ;  
			
		
	
		
			
				
					            } */  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        void  ivSendHighPrio ( Inverter < >  * iv )  {  
			
		
	
		
			
				
					            mHighPrioIv  =  iv ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        void  ivSend ( Inverter < >  * iv )  {  
			
		
	
		
			
				
					        void  ivSend ( Inverter < >  * iv ,  bool  highPrio  =  false )  {  
			
		
	
		
			
				
					            if ( ! highPrio )  {  
			
		
	
		
			
				
					                if  ( mPayload [ iv - > id ] . requested )  {  
			
		
	
		
			
				
					                    if  ( ! mPayload [ iv - > id ] . complete )  
			
		
	
		
			
				
					                        process ( false ) ;  // no retransmit
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if  ( ! mPayload [ iv - > id ] . complete )  {  
			
		
	
		
			
				
					                        if  ( ! mPayload [ iv - > id ] . gotFragment )  
			
		
	
		
			
				
					                            mStat - > rxFailNoAnser + + ;  // got nothing
  
			
		
	
		
			
				
					                        else  
			
		
	
		
			
				
					                            mStat - > rxFail + + ;  // got fragments but not complete response
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        iv - > setQueuedCmdFinished ( ) ;   // command failed
  
			
		
	
		
			
				
					                        if  ( mSerialDebug )  
			
		
	
		
			
				
					                            DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                            DBGPRINTLN ( F ( " enqueued cmd failed/timeout " ) ) ;  
			
		
	
		
			
				
					                        if  ( mSerialDebug )  {  
			
		
	
		
			
				
					                            DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                            DBGPRINT ( F ( " no Payload received! (retransmits:  " ) ) ;  
			
		
	
		
			
				
					                            DBGPRINT ( String ( mPayload [ iv - > id ] . retransmits ) ) ;  
			
		
	
		
			
				
					                            DBGPRINTLN ( F ( " ) " ) ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            reset ( iv - > id ) ;  
			
		
	
		
			
				
					            mPayload [ iv - > id ] . requested  =  true ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            yield ( ) ;  
			
		
	
		
			
				
					            if  ( mSerialDebug )  
			
		
	
		
			
				
					                DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) Requesting Inv SN  " )  +  String ( iv - > config - > serial . u64 ,  HEX ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            uint8_t  cmd  =  iv - > getQueuedCmd ( ) ;  
			
		
	
		
			
				
					            DPRINT ( DBG_INFO ,  F ( " (# " ) ) ;  
			
		
	
		
			
				
					            DBGPRINT ( String ( iv - > id ) ) ;  
			
		
	
		
			
				
					            DBGPRINT ( F ( " ) prepareDevInformCmd 0x " ) ) ;  
			
		
	
		
			
				
					            DBGPRINTLN ( String ( cmd ,  HEX ) ) ;  
			
		
	
		
			
				
					            uint8_t  cmd2  =  cmd ;  
			
		
	
		
			
				
					            if  ( cmd  = =  0x1  )  {  //0x1
  
			
		
	
		
			
				
					                cmd   =  0x0f ;  
			
		
	
		
			
				
					                cmd2  =  0x00 ;  
			
		
	
		
			
				
					                mSys - > Radio . sendCmdPacket ( iv - > radioId . u64 ,  cmd ,  cmd2 ,  false ) ;  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                mSys - > Radio . prepareDevInformCmd ( iv - > radioId . u64 ,  cmd2 ,  mPayload [ iv - > id ] . ts ,  iv - > alarmMesIndex ,  false ,  cmd ) ;  
			
		
	
		
			
				
					            } ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            mPayload [ iv - > id ] . txCmd  =  cmd ;  
			
		
	
		
			
				
					            if  ( iv - > type  = =  INV_TYPE_1CH  | |  iv - > type  = =  INV_TYPE_2CH )  {  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . dataAB [ CH1 ]  =  false ;  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . stsAB [ CH1 ]  =  false ;  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . dataAB [ CH0 ]  =  false ;  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . stsAB [ CH0 ]  =  false ;  
			
		
	
		
			
				
					            if  ( mSerialDebug ) {  
			
		
	
		
			
				
					                DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                DBGPRINT ( F ( " Requesting Inv SN  " ) ) ;  
			
		
	
		
			
				
					                DBGPRINTLN ( String ( iv - > config - > serial . u64 ,  HEX ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( iv - > type  = =  INV_TYPE_2CH )  {  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . dataAB [ CH2 ]  =  false ;  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . stsAB [ CH2 ]  =  false ;  
			
		
	
		
			
				
					            if  ( iv - > getDevControlRequest ( ) )  {  
			
		
	
		
			
				
					                if  ( mSerialDebug )  {  
			
		
	
		
			
				
					                    DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                    DBGPRINT ( F ( " Devcontrol request 0x " ) ) ;  
			
		
	
		
			
				
					                    DBGPRINT ( String ( iv - > devControlCmd ,  HEX ) ) ;  
			
		
	
		
			
				
					                    DBGPRINT ( F ( "  power limit  " ) ) ;  
			
		
	
		
			
				
					                    DBGPRINTLN ( String ( iv - > powerLimit [ 0 ] ) ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                mSys - > Radio . sendControlPacket ( iv - > radioId . u64 ,  iv - > devControlCmd ,  iv - > powerLimit ,  false ) ;  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . txCmd  =  iv - > devControlCmd ;  
			
		
	
		
			
				
					                //iv->clearCmdQueue();
  
			
		
	
		
			
				
					                //iv->enqueCommand<InfoCommand>(SystemConfigPara); // read back power limit
  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                uint8_t  cmd  =  iv - > getQueuedCmd ( ) ;  
			
		
	
		
			
				
					                DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                DBGPRINT ( F ( " prepareDevInformCmd 0x " ) ) ;  
			
		
	
		
			
				
					                DBGPRINTLN ( String ( cmd ,  HEX ) ) ;  
			
		
	
		
			
				
					                uint8_t  cmd2  =  cmd ;  
			
		
	
		
			
				
					                if  ( cmd  = =  0x1  )  {  //0x1
  
			
		
	
		
			
				
					                    cmd   =  0x0f ;  
			
		
	
		
			
				
					                    cmd2  =  0x00 ;  
			
		
	
		
			
				
					                    mSys - > Radio . sendCmdPacket ( iv - > radioId . u64 ,  cmd ,  cmd2 ,  false ) ;  
			
		
	
		
			
				
					                }  else  {  
			
		
	
		
			
				
					                    mSys - > Radio . prepareDevInformCmd ( iv - > radioId . u64 ,  cmd2 ,  mPayload [ iv - > id ] . ts ,  iv - > alarmMesIndex ,  false ,  cmd ) ;  
			
		
	
		
			
				
					                } ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                mPayload [ iv - > id ] . txCmd  =  cmd ;  
			
		
	
		
			
				
					                if  ( iv - > type  = =  INV_TYPE_1CH  | |  iv - > type  = =  INV_TYPE_2CH )  {  
			
		
	
		
			
				
					                    mPayload [ iv - > id ] . dataAB [ CH1 ]  =  false ;  
			
		
	
		
			
				
					                    mPayload [ iv - > id ] . stsAB [ CH1 ]  =  false ;  
			
		
	
		
			
				
					                    mPayload [ iv - > id ] . dataAB [ CH0 ]  =  false ;  
			
		
	
		
			
				
					                    mPayload [ iv - > id ] . stsAB [ CH0 ]  =  false ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( iv - > type  = =  INV_TYPE_2CH )  {  
			
		
	
		
			
				
					                    mPayload [ iv - > id ] . dataAB [ CH2 ]  =  false ;  
			
		
	
		
			
				
					                    mPayload [ iv - > id ] . stsAB [ CH2 ]  =  false ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -118,7 +159,7 @@ class MiPayload { 
			
		
	
		
			
				
					            //DPRINTLN(DBG_INFO, F("MI got data [0]=") + String(p->packet[0], HEX));
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( p - > packet [ 0 ]  = =  ( 0x08  +  ALL_FRAMES ) )  {  // 0x88; MI status response to 0x09
  
			
		
	
		
			
				
					                miStsDecode ( iv ,  p ,  CH1 ) ;  
			
		
	
		
			
				
					                miStsDecode ( iv ,  p ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            else  if  ( p - > packet [ 0 ]  = =  ( 0x11  +  SINGLE_FRAME ) )  {  // 0x92; MI status response to 0x11
  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -177,14 +218,18 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                    for  ( uint8_t  i  =  0 ;  i  <  5 ;  i + + )  {  
			
		
	
		
			
				
					                        iv - > setValue ( i ,  rec ,  ( float )  ( ( p - > packet [ ( 12 + 2 * i ) ]  < <  8 )  +  p - > packet [ ( 13 + 2 * i ) ] ) / 1 ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    iv - > setQueuedCmdFinished ( ) ;  
			
		
	
		
			
				
					                    /*iv->setQueuedCmdFinished();
  
			
		
	
		
			
				
					                    mStat - > rxSuccess + + ;  
			
		
	
		
			
				
					                    mSys - > Radio . sendCmdPacket ( iv - > radioId . u64 ,  0x0f ,  0x01 ,  false ) ;  
			
		
	
		
			
				
					                    mSys - > Radio . sendCmdPacket ( iv - > radioId . u64 ,  0x0f ,  0x01 ,  false ) ; */  
			
		
	
		
			
				
					                }  else  if  (  p - > packet [ 9 ]  = =  0x01  )  { //second frame
  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) got 2nd frame (hw info) " ) ) ;  
			
		
	
		
			
				
					                    mSys - > Radio . sendCmdPacket ( iv - > radioId . u64 ,  0x0f ,  0x12 ,  false ) ;  
			
		
	
		
			
				
					                    DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                    DBGPRINTLN ( F ( " got 2nd frame (hw info) " ) ) ;  
			
		
	
		
			
				
					                    //mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x12, false);
  
			
		
	
		
			
				
					                }  else  if  (  p - > packet [ 9 ]  = =  0x12  )  { //3rd frame
  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) got 3rd frame (hw info) " ) ) ;  
			
		
	
		
			
				
					                    DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                    DBGPRINTLN ( F ( " got 3rd frame (hw info) " ) ) ;  
			
		
	
		
			
				
					                    iv - > setQueuedCmdFinished ( ) ;  
			
		
	
		
			
				
					                    mStat - > rxSuccess + + ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            }  else  if  ( p - > packet [ 0 ]  = =  ( TX_REQ_INFO  +  ALL_FRAMES ) )  {   // response from get information command
  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -216,7 +261,8 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  */  
			
		
	
		
			
				
					            }  else  if  ( p - > packet [ 0 ]  = =  ( TX_REQ_DEVCONTROL  +  ALL_FRAMES ) )  {  // response from dev control command
  
			
		
	
		
			
				
					                DPRINTLN ( DBG_DEBUG ,  F ( " Response from devcontrol request received " ) ) ;  
			
		
	
		
			
				
					                DPRINTHEAD ( DBG_DEBUG ,  iv - > id ) ;  
			
		
	
		
			
				
					                DBGPRINTLN ( F ( " Response from devcontrol request received " ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                mPayload [ iv - > id ] . txId  =  p - > packet [ 0 ] ;  
			
		
	
		
			
				
					                iv - > clearDevControlRequest ( ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -227,7 +273,10 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                        mApp - > setMqttPowerLimitAck ( iv ) ;  
			
		
	
		
			
				
					                    else  
			
		
	
		
			
				
					                        msg  =  " NOT  " ;  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " Inverter  " )  +  String ( iv - > id )  +  F ( "  has  " )  +  msg  +  F ( " accepted power limit set point  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( "  with PowerLimitControl  " )  +  String ( iv - > powerLimit [ 1 ] ) ) ;  
			
		
	
		
			
				
					                    //DPRINTLN(DBG_INFO, F("Inverter ") + String(iv->id) + F(" has ") + msg + F("accepted power limit set point ") + String(iv->powerLimit[0]) + F(" with PowerLimitControl ") + String(iv->powerLimit[1]));
  
			
		
	
		
			
				
					                    DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                    DBGPRINTLN ( F ( " has  " )  +  msg  +  F ( " accepted power limit set point  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( "  with PowerLimitControl  " )  +  String ( iv - > powerLimit [ 1 ] ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    iv - > clearCmdQueue ( ) ;  
			
		
	
		
			
				
					                    iv - > enqueCommand < InfoCommand > ( SystemConfigPara ) ;  // read back power limit
  
			
		
	
		
			
				
					                }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -330,21 +379,20 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                        if  ( ( mPayload [ iv - > id ] . requested )  & &  ( retransmit ) )  {  
			
		
	
		
			
				
					                            if  ( iv - > devControlCmd  = =  Restart  | |  iv - > devControlCmd  = =  CleanState_LockAndAlarm )  {  
			
		
	
		
			
				
					                                // This is required to prevent retransmissions without answer.
  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Prevent retransmit on Restart / CleanState_LockAndAlarm... " ) ) ;  
			
		
	
		
			
				
					                                DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                                DBGPRINTLN ( F ( " Prevent retransmit on Restart / CleanState_LockAndAlarm... " ) ) ;  
			
		
	
		
			
				
					                                mPayload [ iv - > id ] . retransmits  =  mMaxRetrans ;  
			
		
	
		
			
				
					                            }  else  if ( iv - > devControlCmd  = =  ActivePowerContr )  {  
			
		
	
		
			
				
					                                DPRINT ( DBG_INFO ,  F ( " (# " ) ) ;  
			
		
	
		
			
				
					                                DBGPRINT ( String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                DBGPRINTLN ( F ( " ) retransmit power limit " ) ) ;  
			
		
	
		
			
				
					                                DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                                DBGPRINTLN ( F ( " retransmit power limit " ) ) ;  
			
		
	
		
			
				
					                                mSys - > Radio . sendControlPacket ( iv - > radioId . u64 ,  iv - > devControlCmd ,  iv - > powerLimit ,  true ) ;  
			
		
	
		
			
				
					                            }  else  {  
			
		
	
		
			
				
					                                uint8_t  cmd  =  mPayload [ iv - > id ] . txCmd ;  
			
		
	
		
			
				
					                                if  ( mPayload [ iv - > id ] . retransmits  <  mMaxRetrans )  {  
			
		
	
		
			
				
					                                    mPayload [ iv - > id ] . retransmits + + ;  
			
		
	
		
			
				
					                                    if (  ! mPayload [ iv - > id ] . gotFragment  )  {  
			
		
	
		
			
				
					                                        DPRINT ( DBG_INFO ,  F ( " (# " ) ) ;  
			
		
	
		
			
				
					                                        DBGPRINT ( String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                        DBGPRINTLN ( F ( " ) nothing received " ) ) ;  
			
		
	
		
			
				
					                                        DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                                        DBGPRINTLN ( F ( " nothing received " ) ) ;  
			
		
	
		
			
				
					                                        mPayload [ iv - > id ] . retransmits  =  mMaxRetrans ;  
			
		
	
		
			
				
					                                    }  else  if  (  cmd  = =  0x0f  )  {  
			
		
	
		
			
				
					                                        //hard/firmware request
  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -358,23 +406,23 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                                            change  =  true ;  
			
		
	
		
			
				
					                                        }  else  if  (  cmd  = =  0x09  )  { //MI single or dual channel device
  
			
		
	
		
			
				
					                                            if  (  mPayload [ iv - > id ] . dataAB [ CH1 ]  & &  iv - > type  = =  INV_TYPE_2CH   )  {  
			
		
	
		
			
				
					                                                if  ( ! mPayload [ iv - > id ] . stsAB [ CH2 ]  | |  ! mPayload [ iv - > id ] . dataAB [ CH2 ]  )  {  
			
		
	
		
			
				
					                                                if  ( ! mPayload [ iv - > id ] . stsAB [ CH1 ]  & &  mPayload [ iv - > id ] . retransmits < 2 )  { }  
			
		
	
		
			
				
					                                                    //first try to get missing sts for first channel a second time
  
			
		
	
		
			
				
					                                                else  if  ( ! mPayload [ iv - > id ] . stsAB [ CH2 ]  | |  ! mPayload [ iv - > id ] . dataAB [ CH2 ]  )  {  
			
		
	
		
			
				
					                                                    cmd  =  0x11 ;  
			
		
	
		
			
				
					                                                    change  =  true ;  
			
		
	
		
			
				
					                                                    mPayload [ iv - > id ] . retransmits  =  0 ;  //reset counter
  
			
		
	
		
			
				
					                                                }  
			
		
	
		
			
				
					                                            }  
			
		
	
		
			
				
					                                        }  else  if  (  cmd  = =  0x11 )  {  
			
		
	
		
			
				
					                                            if  (  mPayload [ iv - > id ] . dataAB [ CH2 ]  )  {  // data is there, but no status 
  
			
		
	
		
			
				
					                                                if  ( ! mPayload [ iv - > id ] . stsAB [ CH1 ]  | |  ! mPayload [ iv - > id ] . dataAB [ CH1 ]   )  {  
			
		
	
		
			
				
					                                            if  (  mPayload [ iv - > id ] . dataAB [ CH2 ]  )  {  // data + status ch2 are there? 
  
			
		
	
		
			
				
					                                                if  ( mPayload [ iv - > id ] . stsAB [ CH2 ]  & &  ( ! mPayload [ iv - > id ] . stsAB [ CH1 ]  | |  ! mPayload [ iv - > id ] . dataAB [ CH1 ] ) )  {  
			
		
	
		
			
				
					                                                    cmd  =  0x09 ;  
			
		
	
		
			
				
					                                                    change  =  true ;  
			
		
	
		
			
				
					                                                }  
			
		
	
		
			
				
					                                            }  
			
		
	
		
			
				
					                                        }  
			
		
	
		
			
				
					                                        DPRINT ( DBG_INFO ,  F ( " (# " ) ) ;  
			
		
	
		
			
				
					                                        DBGPRINT ( String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                        DBGPRINT ( F ( " )  " ) ) ;  
			
		
	
		
			
				
					                                        DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                                        if  ( change )  {  
			
		
	
		
			
				
					                                            DBGPRINT ( F ( " next request is 0x " ) ) ;  
			
		
	
		
			
				
					                                        }  else  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -392,9 +440,12 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                    }  else  if ( ! crcPass  & &  pyldComplete )  {  // crc error on complete Payload
  
			
		
	
		
			
				
					                        if  ( mPayload [ iv - > id ] . retransmits  <  mMaxRetrans )  {  
			
		
	
		
			
				
					                            mPayload [ iv - > id ] . retransmits + + ;  
			
		
	
		
			
				
					                            DPRINTLN ( DBG_WARN ,  F ( " CRC Error: Request Complete Retransmit " ) ) ;  
			
		
	
		
			
				
					                            DPRINTHEAD ( DBG_WARN ,  iv - > id ) ;  
			
		
	
		
			
				
					                            DBGPRINTLN ( F ( " CRC Error: Request Complete Retransmit " ) ) ;  
			
		
	
		
			
				
					                            mPayload [ iv - > id ] . txCmd  =  iv - > getQueuedCmd ( ) ;  
			
		
	
		
			
				
					                            DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) prepareDevInformCmd 0x " )  +  String ( mPayload [ iv - > id ] . txCmd ,  HEX ) ) ;  
			
		
	
		
			
				
					                            DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            DBGPRINTLN ( F ( " prepareDevInformCmd 0x " )  +  String ( mPayload [ iv - > id ] . txCmd ,  HEX ) ) ;  
			
		
	
		
			
				
					                            mSys - > Radio . prepareDevInformCmd ( iv - > radioId . u64 ,  mPayload [ iv - > id ] . txCmd ,  mPayload [ iv - > id ] . ts ,  iv - > alarmMesIndex ,  true ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -470,7 +521,7 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        void  miStsDecode ( Inverter < >  * iv ,  packet_t  * p ,  uint8_t  stschan  =  CH1 )  {  
			
		
	
		
			
				
					            DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) status msg 0x " )  +  String ( p - > packet [ 0 ] ,  HEX ) ) ;  
			
		
	
		
			
				
					            //DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") status msg 0x") + String(p->packet[0], HEX));
  
			
		
	
		
			
				
					            record_t < >  * rec  =  iv - > getRecordStruct ( RealTimeRunData_Debug ) ;   // choose the record structure
  
			
		
	
		
			
				
					            rec - > ts  =  mPayload [ iv - > id ] . ts ;  
			
		
	
		
			
				
					            mPayload [ iv - > id ] . gotFragment  =  true ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -491,7 +542,8 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					            if  ( iv - > alarmMesIndex  <  rec - > record [ iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ] ) {  
			
		
	
		
			
				
					                iv - > alarmMesIndex  =  rec - > record [ iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ] ;  // seems there's no status per channel in 3rd gen. models?!?
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) alarm ID incremented to  " )  +  String ( iv - > alarmMesIndex ) ) ;  
			
		
	
		
			
				
					                DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                DBGPRINTLN ( F ( " alarm ID incremented to  " )  +  String ( iv - > alarmMesIndex ) ) ;  
			
		
	
		
			
				
					                iv - > enqueCommand < InfoCommand > ( AlarmData ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            //mPayload[iv->id].skipfirstrepeat = 1;
  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -509,7 +561,7 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                           (  p - > packet [ 0 ]  = =  0x91  | |  p - > packet [ 0 ]  = =  ( 0x37  +  ALL_FRAMES )  )  ?  CH2  :  
			
		
	
		
			
				
					                           p - > packet [ 0 ]  = =  ( 0x38  +  ALL_FRAMES )  ?  CH3  :  
			
		
	
		
			
				
					                           CH4 ;  
			
		
	
		
			
				
					            DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) data msg 0x " )  +  String ( p - > packet [ 0 ] ,  HEX )  +  F ( "  channel  " )  +  datachan ) ;  
			
		
	
		
			
				
					            //DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") data msg 0x") + String(p->packet[0], HEX) + F(" channel ") + datachan);
  
			
		
	
		
			
				
					            // count in RF_communication_protocol.xlsx is with offset = -1
  
			
		
	
		
			
				
					            iv - > setValue ( iv - > getPosByChFld ( datachan ,  FLD_UDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 9 ]  < <  8 )  +  p - > packet [ 10 ] ) / 10 ) ;  
			
		
	
		
			
				
					            yield ( ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -567,33 +619,18 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					                if  ( iv - > alarmMesIndex  <  rec - > record [ iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ] ) {  
			
		
	
		
			
				
					                    iv - > alarmMesIndex  =  rec - > record [ iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ] ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " alarm ID incremented to  " )  +  String ( iv - > alarmMesIndex ) ) ;  
			
		
	
		
			
				
					                    DPRINTHEAD ( DBG_INFO ,  iv - > id ) ;  
			
		
	
		
			
				
					                    DBGPRINTLN ( F ( " alarm ID incremented to  " )  +  String ( iv - > alarmMesIndex ) ) ;  
			
		
	
		
			
				
					                    //iv->enqueCommand<InfoCommand>(AlarmData);
  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  (  mPayload [ iv - > id ] . complete  | |  //4ch device
  
			
		
	
		
			
				
					                 ( iv - > type  ! =  INV_TYPE_4CH      //other devices
  
			
		
	
		
			
				
					                 & &  mPayload [ iv - > id ] . dataAB [ CH0 ]  
			
		
	
		
			
				
					                 & &  mPayload [ iv - > id ] . stsAB [ CH0 ] ) )  {  
			
		
	
		
			
				
					                     miComplete ( iv ) ;  
			
		
	
		
			
				
					                    /*mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) got all msgs " ) ) ;  
			
		
	
		
			
				
					                    iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_YD ,  rec ) ,  rec ,  calcYieldDayCh0 ( iv , 0 ) ) ;  
			
		
	
		
			
				
					                    //preliminary AC calculation...
  
			
		
	
		
			
				
					                    uint8_t  ac_pow  =  0 ;  
			
		
	
		
			
				
					                    //if (mPayload[iv->id].sts[0] == 3) {
  
			
		
	
		
			
				
					                        ac_pow  =  calcPowerDcCh0 ( iv ,  0 ) * 9.5 ;  
			
		
	
		
			
				
					                    //}
  
			
		
	
		
			
				
					                    iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_PAC ,  rec ) ,  rec ,  ( float )  ( ac_pow / 10 ) ) ;  
			
		
	
		
			
				
					                    iv - > doCalculations ( ) ;  
			
		
	
		
			
				
					                    iv - > setQueuedCmdFinished ( ) ;  
			
		
	
		
			
				
					                    mStat - > rxSuccess + + ;  
			
		
	
		
			
				
					                    yield ( ) ;  
			
		
	
		
			
				
					                    notify ( mPayload [ iv - > id ] . txCmd ) ; */  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -619,18 +656,18 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					            DPRINTLN ( DBG_INFO ,  F ( " (# " )  +  String ( iv - > id )  +  F ( " ) got all msgs " ) ) ;  
			
		
	
		
			
				
					            record_t < >  * rec  =  iv - > getRecordStruct ( RealTimeRunData_Debug ) ;  
			
		
	
		
			
				
					            iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_YD ,  rec ) ,  rec ,  calcYieldDayCh0 ( iv , 0 ) ) ;  
			
		
	
		
			
				
					            //preliminary AC calculation...
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            uint8_t  ac_pow  =  0 ;  
			
		
	
		
			
				
					            //preliminary AC calculation...
  
			
		
	
		
			
				
					            float  ac_pow  =  0 ;  
			
		
	
		
			
				
					            for ( uint8_t  i  =  1 ;  i  < =  iv - > channels ;  i + + )  {  
			
		
	
		
			
				
					                if  ( mPayload [ iv - > id ] . sts [ i ]  = =  3 )  {  
			
		
	
		
			
				
					                    uint8_t  pos  =  iv - > getPosByChFld ( i ,  FLD_PDC ,  rec ) ;  
			
		
	
		
			
				
					                    ac_pow  + =  iv - > getValue ( pos ,  rec ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            ac_pow  =  ac_pow * 9.5 ;  
			
		
	
		
			
				
					            ac_pow  =  ( int )  ( ac_pow * 9.5 ) ;  
			
		
	
		
			
				
					            iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_PAC ,  rec ) ,  rec ,  ( float )  ac_pow / 10 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_PAC ,  rec ) ,  rec ,  ( float )  ( ac_pow / 10 ) ) ;  
			
		
	
		
			
				
					            iv - > doCalculations ( ) ;  
			
		
	
		
			
				
					            iv - > setQueuedCmdFinished ( ) ;  
			
		
	
		
			
				
					            mStat - > rxSuccess + + ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -669,8 +706,16 @@ const byteAssign_t InfoAssignment[] = { 
			
		
	
		
			
				
					            return  true ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/*        void miDPRINTHead(uint8_t lvl, uint8_t id) {
  
			
		
	
		
			
				
					            DPRINT ( lvl ,  F ( " (# " ) ) ;  
			
		
	
		
			
				
					            DBGPRINT ( String ( id ) ) ;  
			
		
	
		
			
				
					            DBGPRINT ( F ( " )  " ) ) ;  
			
		
	
		
			
				
					        } */  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        void  reset ( uint8_t  id )  {  
			
		
	
		
			
				
					            DPRINTLN ( DBG_INFO ,  F ( " resetPayload: id:  " )  +  String ( id ) ) ;  
			
		
	
		
			
				
					            //DPRINTLN(DBG_INFO, F("resetPayload: id: ") + String(id));
  
			
		
	
		
			
				
					            DPRINTHEAD ( DBG_INFO ,  id ) ;  
			
		
	
		
			
				
					            DBGPRINTLN ( F ( " resetPayload " ) ) ;  
			
		
	
		
			
				
					            memset ( mPayload [ id ] . len ,  0 ,  MAX_PAYLOAD_ENTRIES ) ;  
			
		
	
		
			
				
					            mPayload [ id ] . gotFragment  =  false ;  
			
		
	
		
			
				
					            /*mPayload[id].maxPackId   = MAX_PAYLOAD_ENTRIES;