@ -10,6 +10,9 @@ 
				
			 
			
		
	
		
		
			
				
					 
					 
					# include  <Arduino.h>  
					 
					 
					# include  <Arduino.h>  
				
			 
			
		
	
		
		
			
				
					 
					 
					# include  "../utils/crc.h"  
					 
					 
					# include  "../utils/crc.h"  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					# define MI_TIMEOUT 500  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					# define DEFAULT_TIMEOUT 500  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					typedef  std : : function < void ( uint8_t ,  Inverter < >  * ) >  payloadListenerType ;  
					 
					 
					typedef  std : : function < void ( uint8_t ,  Inverter < >  * ) >  payloadListenerType ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					typedef  std : : function < void ( Inverter < >  * ) >  alarmListenerType ;  
					 
					 
					typedef  std : : function < void ( Inverter < >  * ) >  alarmListenerType ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					@ -37,6 +40,8 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                if ( ! valid )  
					 
					 
					                if ( ! valid )  
				
			 
			
		
	
		
		
			
				
					 
					 
					                    return ;  // empty
  
					 
					 
					                    return ;  // empty
  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                uint16_t  lcl_tmo  =  q - > iv - > ivGen  ! =  IV_MI  ?  DEFAULT_TIMEOUT  :  MI_TIMEOUT ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                switch ( mState )  {  
					 
					 
					                switch ( mState )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					                    case  States : : RESET :  
					 
					 
					                    case  States : : RESET :  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        if ( millis ( )  <  mWaitTimeout )  
					 
					 
					                        if ( millis ( )  <  mWaitTimeout )  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -50,19 +55,14 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                    case  States : : START :  
					 
					 
					                    case  States : : START :  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        setTs ( mTimestamp ) ;  
					 
					 
					                        setTs ( mTimestamp ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        if  ( q - > iv - > ivGen  ! =  IV_MI )  {  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                        if ( q - > isDevControl )  {  
					 
					 
					                        if ( q - > isDevControl )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            if ( ActivePowerContr  = =  q - > cmd )  
					 
					 
					                            if ( ActivePowerContr  = =  q - > cmd )  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                q - > iv - > powerLimitAck  =  false ;  
					 
					 
					                                q - > iv - > powerLimitAck  =  false ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            q - > iv - > radio - > sendControlPacket ( q - > iv ,  q - > cmd ,  q - > iv - > powerLimit ,  false ) ;  
					 
					 
					                            q - > iv - > radio - > sendControlPacket ( q - > iv ,  q - > cmd ,  q - > iv - > powerLimit ,  false ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                                }  else  
					 
					 
					                        }  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        else  if  ( q - > iv - > ivGen  ! =  IV_MI )  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            q - > iv - > radio - > prepareDevInformCmd ( q - > iv ,  q - > cmd ,  q - > ts ,  q - > iv - > alarmLastId ,  false ) ;  
					 
					 
					                            q - > iv - > radio - > prepareDevInformCmd ( q - > iv ,  q - > cmd ,  q - > ts ,  q - > iv - > alarmLastId ,  false ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                        }  else  {  // IV_MI
  
					 
					 
					                        else  {  // IV_MI
  
				
			 
			
				
				
			
		
	
		
		
			
				
					 
					 
					                            if ( q - > isDevControl )  {  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    if ( ActivePowerContr  = =  q - > cmd )  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                        q - > iv - > powerLimitAck  =  false ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    q - > iv - > radio - > sendControlPacket ( q - > iv ,  q - > cmd ,  q - > iv - > powerLimit ,  false ,  false ,  ( q - > iv - > powerLimit [ 1 ]  = =  RelativNonPersistent )  ?  0  :  q - > iv - > getMaxPower ( ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                }  else  {  
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					 
					 
					                            //uint8_t cmd = q->iv->type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1;
  
					 
					 
					                            //uint8_t cmd = q->iv->type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            //q->iv->radio->sendCmdPacket(q->iv, cmd, cmd, false, false);
  
					 
					 
					                            //q->iv->radio->sendCmdPacket(q->iv, cmd, cmd, false, false);
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            q - > iv - > radio - > sendCmdPacket ( q - > iv ,  q - > cmd ,  q - > cmd ,  false ,  false ) ;  
					 
					 
					                            q - > iv - > radio - > sendCmdPacket ( q - > iv ,  q - > cmd ,  q - > cmd ,  false ,  false ) ;  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -73,11 +73,8 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            //}
  
					 
					 
					                            //}
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            //mPayload[q->iv->id]. = cmd;
  
					 
					 
					                            //mPayload[q->iv->id]. = cmd;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        }  
					 
					 
					                        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                        }  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                        q - > iv - > radioStatistics . txCnt + + ;  
					 
					 
					                        q - > iv - > radioStatistics . txCnt + + ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                        mWaitTimeout  =  millis ( )  +  500 ;  
					 
					 
					                        mWaitTimeout  =  millis ( )  +  lcl_tmo ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                        setAttempt ( ) ;  
					 
					 
					                        setAttempt ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        mState  =  States : : WAIT ;  
					 
					 
					                        mState  =  States : : WAIT ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        break ;  
					 
					 
					                        break ;  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -90,17 +87,10 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                    case  States : : CHECK_FRAMES :  {  
					 
					 
					                    case  States : : CHECK_FRAMES :  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        if ( ! q - > iv - > radio - > get ( ) )  {  // radio buffer empty
  
					 
					 
					                        if ( ! q - > iv - > radio - > get ( ) )  {  // radio buffer empty
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            // second try for nRF type inverters if available
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            /*if(isFirstTry()) {
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                DBGPRINTLN ( F ( " enqueue second try " ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                mState  =  States : : START ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                break ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            } */  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            cmdDone ( ) ;  
					 
					 
					                            cmdDone ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
					 
					 
					                            DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DBGPRINT ( F ( " request timeout:  " ) ) ;  
					 
					 
					                            DBGPRINT ( F ( " request timeout:  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                            DBGPRINT ( String ( millis ( )  -  mWaitTimeout  +  500 ) ) ;  
					 
					 
					                            DBGPRINT ( String ( millis ( )  -  mWaitTimeout  +  lcl_tmo ) ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                            DBGPRINTLN ( F ( " ms " ) ) ;  
					 
					 
					                            DBGPRINTLN ( F ( " ms " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            q - > iv - > radioStatistics . rxFailNoAnser + + ;  // got nothing
  
					 
					 
					                            q - > iv - > radioStatistics . rxFailNoAnser + + ;  // got nothing
  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -119,14 +109,14 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
					 
					 
					                            DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DBGPRINT ( F ( " RX  " ) ) ;  
					 
					 
					                            DBGPRINT ( F ( " RX  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            if ( p - > millis  <  100 )  
					 
					 
					                            if ( p - > millis  <  100 )  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                                DBGPRINT ( " 0 " ) ;  
					 
					 
					                                DBGPRINT ( F ( " 0 " ) ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                            DBGPRINT ( String ( p - > millis ) ) ;  
					 
					 
					                            DBGPRINT ( String ( p - > millis ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DBGPRINT ( F ( " ms  " ) ) ;  
					 
					 
					                            DBGPRINT ( F ( " ms  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DBGPRINT ( String ( p - > len ) ) ;  
					 
					 
					                            DBGPRINT ( String ( p - > len ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            if ( ( IV_HM  = =  q - > iv - > ivGen )  | |  ( IV_MI  = =  q - > iv - > ivGen ) )  {  
					 
					 
					                            if ( ( IV_HM  = =  q - > iv - > ivGen )  | |  ( IV_MI  = =  q - > iv - > ivGen ) )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                DBGPRINT ( F ( "  CH " ) ) ;  
					 
					 
					                                DBGPRINT ( F ( "  CH " ) ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                                if ( p - > ch  = =  3  )  
					 
					 
					                                if ( 3  = =  p - > ch )  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                                    DBGPRINT ( " 03 " ) ;  
					 
					 
					                                    DBGPRINT ( F ( " 03 " ) ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 
					 
					                                else  
					 
					 
					                                else  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    DBGPRINT ( String ( p - > ch ) ) ;  
					 
					 
					                                    DBGPRINT ( String ( p - > ch ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            }  
					 
					 
					                            }  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -144,25 +134,11 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                }  else  if  ( p - > packet [ 0 ]  = =  ( TX_REQ_DEVCONTROL  +  ALL_FRAMES ) )  {  // response from dev control command
  
					 
					 
					                                }  else  if  ( p - > packet [ 0 ]  = =  ( TX_REQ_DEVCONTROL  +  ALL_FRAMES ) )  {  // response from dev control command
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    parseDevCtrl ( p ,  q ) ;  
					 
					 
					                                    parseDevCtrl ( p ,  q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    cmdDone ( true ) ;  // remove done request
  
					 
					 
					                                    cmdDone ( true ) ;  // remove done request
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                                }  else  if  ( q - > iv - > ivGen  = =  IV_MI )  {  
					 
					 
					                                }  else  if ( IV_MI  = =  q - > iv - > ivGen )  {  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                                    /*if (p->packet[0] == (0x88)) { // 0x88 is MI status response to 0x09
  
					 
					 
					                                    parseMiFrame ( p ,  q ) ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					 
					 
					                                        miStsDecode ( p ,  q ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    }  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    else  if  ( p - > packet [ 0 ]  = =  ( MI_REQ_CH2  +  SINGLE_FRAME ) )  {  // 0x92; MI status response to 0x11
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                        miStsDecode ( p ,  q ,  CH2 ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    }  else */  if  (  p - > packet [ 0 ]  = =  MI_REQ_CH1  +  ALL_FRAMES  | |  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                                p - > packet [ 0 ]  = =  MI_REQ_CH2  +  ALL_FRAMES  | |  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                                (  p - > packet [ 0 ]  > =  ( MI_REQ_4CH  +  ALL_FRAMES )  & &  p - > packet [ 0 ]  <  ( 0x39  +  SINGLE_FRAME )  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                                & &  q - > cmd  ! =  0x0f )  )  {  // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                        //mPayload[iv->id].txId = p->packet[0];
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                        miDataDecode ( p ,  q ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    }  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    //parseMiFrame(p, q);
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                }  
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
	
		
		
			
				
					 
					 
					                                }  
					 
					 
					                                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                            }  else  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                DPRINTLN ( DBG_WARN ,  F ( " Inverter serial does not match " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            q - > iv - > radio - > mBufCtrl . pop ( ) ;  
					 
					 
					                            q - > iv - > radio - > mBufCtrl . pop ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            yield ( ) ;  
					 
					 
					                            yield ( ) ;  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -176,7 +152,7 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            setAttempt ( ) ;  
					 
					 
					                            setAttempt ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DPRINT_IVID ( DBG_WARN ,  q - > iv - > id ) ;  
					 
					 
					                            DPRINT_IVID ( DBG_WARN ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                            DBGPRINT ( F ( " last  frame missing: request retransmit (" ) ) ;  
					 
					 
					                            DBGPRINT ( F ( " frame missing: request retransmit ( " ) ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                            DBGPRINT ( String ( q - > attempts ) ) ;  
					 
					 
					                            DBGPRINT ( String ( q - > attempts ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            DBGPRINTLN ( F ( "  attempts left) " ) ) ;  
					 
					 
					                            DBGPRINTLN ( F ( "  attempts left) " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -186,11 +162,17 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    break ;  
					 
					 
					                                    break ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            }  
					 
					 
					                            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                            if ( q - > attempts )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                q - > iv - > radio - > sendCmdPacket ( q - > iv ,  TX_REQ_INFO ,  ( ALL_FRAMES  +  i ) ,  true ) ;  
					 
					 
					                                q - > iv - > radio - > sendCmdPacket ( q - > iv ,  TX_REQ_INFO ,  ( ALL_FRAMES  +  i ) ,  true ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                q - > iv - > radioStatistics . retransmits + + ;  
					 
					 
					                                q - > iv - > radioStatistics . retransmits + + ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                            mWaitTimeout  =  millis ( )  +  500 ;  
					 
					 
					                                 mWaitTimeout  =  millis ( )  +  lcl_tmo ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                                mState  =  States : : WAIT ;  
					 
					 
					                                mState  =  States : : WAIT ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                            break ;  
					 
					 
					                            }  else  {  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                add ( q ,  true ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                cmdDone ( q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                mState  =  States : : RESET ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                            return ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        }  
					 
					 
					                        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                        for ( uint8_t  i  =  0 ;  i  <  mMaxFrameId ;  i + + )  {  
					 
					 
					                        for ( uint8_t  i  =  0 ;  i  <  mMaxFrameId ;  i + + )  {  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -204,10 +186,16 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                                DBGPRINT ( String ( q - > attempts ) ) ;  
					 
					 
					                                DBGPRINT ( String ( q - > attempts ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                DBGPRINTLN ( F ( "  attempts left) " ) ) ;  
					 
					 
					                                DBGPRINTLN ( F ( "  attempts left) " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                if ( q - > attempts )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    q - > iv - > radio - > sendCmdPacket ( q - > iv ,  TX_REQ_INFO ,  ( ALL_FRAMES  +  i ) ,  true ) ;  
					 
					 
					                                    q - > iv - > radio - > sendCmdPacket ( q - > iv ,  TX_REQ_INFO ,  ( ALL_FRAMES  +  i ) ,  true ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                    q - > iv - > radioStatistics . retransmits + + ;  
					 
					 
					                                    q - > iv - > radioStatistics . retransmits + + ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                                mWaitTimeout  =  millis ( )  +  500 ;  
					 
					 
					                                     mWaitTimeout  =  millis ( )  +  lcl_tmo ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                                    mState  =  States : : WAIT ;  
					 
					 
					                                    mState  =  States : : WAIT ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                }  else  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                    add ( q ,  true ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                    cmdDone ( q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                    mState  =  States : : RESET ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					                                return ;  
					 
					 
					                                return ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                            }  
					 
					 
					                            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					                        }  
					 
					 
					                        }  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					@ -264,47 +252,167 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					            f - > rssi  =  p - > rssi ;  
					 
					 
					            f - > rssi  =  p - > rssi ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					        }  
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					        inline  void  parseDevCtrl ( packet_t  * p ,  const  queue_s  * q )  {  
					 
					 
					        inline  void  parseMiFrame ( packet_t  * p ,  const  queue_s  * q )  {  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            if ( ( p - > packet [ 12 ]  ! =  ActivePowerContr )  | |  ( p - > packet [ 13 ]  ! =  0x00 ) )  
					 
					 
					            if  ( ( p - > packet [ 0 ]  = =  MI_REQ_CH1  +  ALL_FRAMES )  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                return ;  
					 
					 
					                | |  ( p - > packet [ 0 ]  = =  MI_REQ_CH2  +  ALL_FRAMES )  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            bool  accepted  =  true ;  
					 
					 
					                | |  ( ( p - > packet [ 0 ]  > =  ( MI_REQ_4CH  +  ALL_FRAMES ) )  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            if ( ( p - > packet [ 10 ]  = =  0x00 )  & &  ( p - > packet [ 11 ]  = =  0x00 ) )  
					 
					 
					                    & &  ( p - > packet [ 0 ]  <  ( 0x39  +  SINGLE_FRAME ) )  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                q - > iv - > powerLimitAck  =  true ;  
					 
					 
					                    & &  ( q - > cmd  ! =  0x0f ) ) )  {  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            else  
					 
					 
					                // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39
  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                accepted  =  false ;  
					 
					 
					                //mPayload[iv->id].txId = p->packet[0];
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                miDataDecode ( p ,  q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					            DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            DBGPRINT ( F ( "  has  " ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            if ( ! accepted )  DBGPRINT ( F ( " not  " ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            DBGPRINT ( F ( " accepted power limit set point  " ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            DBGPRINT ( String ( q - > iv - > powerLimit [ 0 ] ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            DBGPRINT ( F ( "  with PowerLimitControl  " ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            DBGPRINTLN ( String ( q - > iv - > powerLimit [ 1 ] ) ) ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            q - > iv - > actPowerLimit  =  0xffff ;  // unknown, readback current value
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            }  
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            else  if  ( p - > packet [ 0 ]  = =  0x0f  +  ALL_FRAMES )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                miHwDecode ( p ,  q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					        inline  void  parseMiFrame ( packet_t  * p ,  const  queue_s  * q )  {  
					 
					 
					            else  if  ( ( p - > packet [ 0 ]  = =  0x88 )  | |  ( p - > packet [ 0 ]  = =  0x92 ) )  {  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            if ( ( p - > packet [ 12 ]  ! =  ActivePowerContr )  | |  ( p - > packet [ 13 ]  ! =  0x00 ) )  
					 
					 
					                record_t < >  * rec  =  q - > iv - > getRecordStruct ( RealTimeRunData_Debug ) ;   // choose the record structure
  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                return ;  
					 
					 
					                rec - > ts  =  q - > ts ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            bool  accepted  =  true ;  
					 
					 
					                miStsConsolidate ( q ,  p - > packet [ 0 ]  = =  0x88  ?  1  :  2 ,  rec ,  p - > packet [ 10 ] ,  p - > packet [ 12 ] ,  p - > packet [ 9 ] ,  p - > packet [ 11 ] ) ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            if ( ( p - > packet [ 10 ]  = =  0x00 )  & &  ( p - > packet [ 11 ]  = =  0x00 ) )  
					 
					 
					            }  
				
			 
			
				
				
			
		
	
		
		
			
				
					 
					 
					                q - > iv - > powerLimitAck  =  true ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					            else  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                accepted  =  false ;  
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        inline  void  miHwDecode ( packet_t  * p ,  const  queue_s  * q )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            record_t < >  * rec  =  q - > iv - > getRecordStruct ( InverterDevInform_All ) ;   // choose the record structure
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            rec - > ts  =  q - > ts ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //mPayload[iv->id].gotFragment = true;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            uint8_t  multi_parts  =  0 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					/*
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					Polling  the  device  software  and  hardware  version  number  command  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					start  byte 	Command  word 	 routing  address 				 target  address 				 User  data 	 check 	 end  byte  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					byte [ 0 ] 	 byte [ 1 ] 	 byte [ 2 ] 	 byte [ 3 ] 	 byte [ 4 ] 	 byte [ 5 ] 	 byte [ 6 ] 	 byte [ 7 ] 	 byte [ 8 ] 	 byte [ 9 ] 	 byte [ 10 ] 	 byte [ 11 ] 	 byte [ 12 ]  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					0x7e 	 0x0f 	 xx 	 xx 	 xx 	 xx 	 YY 	 YY 	 YY 	 YY 	 0x00 	 CRC 	 0x7f  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					Command  Receipt  -  First  Frame  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					start  byte 	Command  word 	 target  address 				 routing  address 				 Multi - frame  marking 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 check 	 end  byte  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					byte [ 0 ] 	 byte [ 1 ] 	 byte [ 2 ] 	 byte [ 3 ] 	 byte [ 4 ] 	 byte [ 5 ] 	 byte [ 6 ] 	 byte [ 7 ] 	 byte [ 8 ] 	 byte [ 9 ] 	 byte [ 10 ] 	 byte [ 11 ] 	 byte [ 12 ] 	 byte [ 13 ] 	 byte [ 14 ] 	 byte [ 15 ] 	 byte [ 16 ] 	 byte [ 17 ] 	 byte [ 18 ] 	 byte [ 19 ] 	 byte [ 20 ] 	 byte [ 21 ] 	 byte [ 22 ] 	 byte [ 23 ] 	 byte [ 24 ] 	 byte [ 25 ] 	 byte [ 26 ] 	 byte [ 27 ] 	 byte [ 28 ]  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					0x7e 	 0x8f 	 YY 	 YY 	 YY 	 YY 	 xx 	 xx 	 xx 	 xx 	 0x00 	 USFWBuild_VER 		 APPFWBuild_VER 		 APPFWBuild_YYYY 		 APPFWBuild_MMDD 		 APPFWBuild_HHMM 		 APPFW_PN 				 HW_VER 		 CRC 	 0x7f  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					Command  Receipt  -  Second  Frame  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					start  byte 	Command  word 	 target  address 				 routing  address 				 Multi - frame  marking 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 check 	 end  byte  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					byte [ 0 ] 	 byte [ 1 ] 	 byte [ 2 ] 	 byte [ 3 ] 	 byte [ 4 ] 	 byte [ 5 ] 	 byte [ 6 ] 	 byte [ 7 ] 	 byte [ 8 ] 	 byte [ 9 ] 	 byte [ 10 ] 	 byte [ 11 ] 	 byte [ 12 ] 	 byte [ 13 ] 	 byte [ 14 ] 	 byte [ 15 ] 	 byte [ 16 ] 	 byte [ 17 ] 	 byte [ 18 ] 	 byte [ 19 ] 	 byte [ 20 ] 	 byte [ 21 ] 	 byte [ 22 ] 	 byte [ 23 ] 	 byte [ 24 ] 	 byte [ 25 ] 	 byte [ 26 ] 	 byte [ 27 ] 	 byte [ 28 ]  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					0x7e 	 0x8f 	 YY 	 YY 	 YY 	 YY 	 xx 	 xx 	 xx 	 xx 	 0x01 	 HW_PN 				 HW_FB_TLmValue 		 HW_FB_ReSPRT 		 HW_GridSamp_ResValule 		 HW_ECapValue 		 Matching_APPFW_PN 				 CRC 	 0x7f  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					Command  receipt  -  third  frame  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					start  byte 	Command  word 	 target  address 				 routing  address 				 Multi - frame  marking 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 User  data 	 check 	 end  byte  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					byte [ 0 ] 	 byte [ 1 ] 	 byte [ 2 ] 	 byte [ 3 ] 	 byte [ 4 ] 	 byte [ 5 ] 	 byte [ 6 ] 	 byte [ 7 ] 	 byte [ 8 ] 	 byte [ 9 ] 	 byte [ 10 ] 	 byte [ 11 ] 	 byte [ 12 ] 	 byte [ 13 ] 	 byte [ 14 ] 	 byte [ 15 ] 	 byte [ 16 ] 	 byte [ 15 ] 	 byte [ 16 ] 	 byte [ 17 ] 	 byte [ 18 ]  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					0x7e 	 0x8f 	 YY 	 YY 	 YY 	 YY 	 xx 	 xx 	 xx 	 xx 	 0x12 	 APPFW_MINVER 		 HWInfoAddr 		 PNInfoCRC_gusv 		 PNInfoCRC_gusv 		 CRC 	 0x7f  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					*/  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					/*
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					case  InverterDevInform_All :  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            rec - > length   =  ( uint8_t ) ( HMINFO_LIST_LEN ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            rec - > assign   =  ( byteAssign_t  * ) InfoAssignment ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            rec - > pyldLen  =  HMINFO_PAYLOAD_LEN ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            break ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					const  byteAssign_t  InfoAssignment [ ]  =  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					{  FLD_FW_VERSION ,            UNIT_NONE ,    CH0 ,   0 ,  2 ,  1  } ,  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					{  FLD_FW_BUILD_YEAR ,         UNIT_NONE ,    CH0 ,   2 ,  2 ,  1  } ,  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					{  FLD_FW_BUILD_MONTH_DAY ,    UNIT_NONE ,    CH0 ,   4 ,  2 ,  1  } ,  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					{  FLD_FW_BUILD_HOUR_MINUTE ,  UNIT_NONE ,    CH0 ,   6 ,  2 ,  1  } ,  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					{  FLD_BOOTLOADER_VER ,        UNIT_NONE ,    CH0 ,   8 ,  2 ,  1  }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					} ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					*/  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  (  p - > packet [ 9 ]  = =  0x00  )  { //first frame
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //FLD_FW_VERSION
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                for  ( uint8_t  i  =  0 ;  i  <  5 ;  i + + )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    q - > iv - > setValue ( i ,  rec ,  ( float )  ( ( p - > packet [ ( 12 + 2 * i ) ]  < <  8 )  +  p - > packet [ ( 13 + 2 * i ) ] ) / 1 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > isConnected  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //if(mSerialDebug) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                    DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
					 
					 
					                    DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            DBGPRINT ( F ( " has  " ) ) ;  
					 
					 
					                    DPRINT ( DBG_INFO , F ( " HW_VER is  " ) ) ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            if ( ! accepted )  DBGPRINT ( F ( " not  " ) ) ;  
					 
					 
					                    DBGPRINTLN ( String ( ( p - > packet [ 24 ]  < <  8 )  +  p - > packet [ 25 ] ) ) ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            DBGPRINT ( F ( " accepted power limit set point  " ) ) ;  
					 
					 
					                //}
  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            DBGPRINT ( String ( q - > iv - > powerLimit [ 0 ] ) ) ;  
					 
					 
					                record_t < >  * rec  =  q - > iv - > getRecordStruct ( InverterDevInform_Simple ) ;   // choose the record structure
  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            DBGPRINT ( F ( "  with PowerLimitControl  " ) ) ;  
					 
					 
					                rec - > ts  =  q - > ts ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            DBGPRINTLN ( String ( q - > iv - > powerLimit [ 1 ] ) ) ;  
					 
					 
					                q - > iv - > setValue ( 1 ,  rec ,  ( uint32_t )  ( ( p - > packet [ 24 ]  < <  8 )  +  p - > packet [ 25 ] ) / 1 ) ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					            q - > iv - > actPowerLimit  =  0xffff ;  // unknown, readback current value
  
					 
					 
					                //mPayload[iv->id].multi_parts +=4;
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                multi_parts  + = 4 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  else  if  (  p - > packet [ 9 ]  = =  0x01  | |  p - > packet [ 9 ]  = =  0x10  )  { //second frame for MI, 3rd gen. answers in 0x10
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  (  p - > packet [ 9 ]  = =  0x01  )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( F ( " got 2nd frame (hw info) " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    /* according to xlsx (different start byte -1!)
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 11 ]  to 	 byte [ 14 ]  HW_PN  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 15 ] 	 byte [ 16 ]  HW_FB_TLmValue  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 17 ] 	 byte [ 18 ]  HW_FB_ReSPRT  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 19 ] 	 byte [ 20 ]  HW_GridSamp_ResValule  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 21 ] 	 byte [ 22 ]  HW_ECapValue  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 23 ]  to 	 byte [ 26 ]  Matching_APPFW_PN */  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DPRINT ( DBG_INFO , F ( " HW_PartNo  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( String ( ( uint32_t )  ( ( ( p - > packet [ 10 ]  < <  8 )  |  p - > packet [ 11 ] )  < <  8  |  p - > packet [ 12 ] )  < <  8  |  p - > packet [ 13 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    record_t < >  * rec  =  q - > iv - > getRecordStruct ( InverterDevInform_Simple ) ;   // choose the record structure
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    rec - > ts  =  q - > ts ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    q - > iv - > setValue ( 0 ,  rec ,  ( uint32_t )  ( ( ( ( p - > packet [ 10 ]  < <  8 )  |  p - > packet [ 11 ] )  < <  8  |  p - > packet [ 12 ] )  < <  8  |  p - > packet [ 13 ] ) / 1 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    //if(mSerialDebug) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DPRINT ( DBG_INFO , F ( " HW_FB_TLmValue  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DBGPRINTLN ( String ( ( p - > packet [ 14 ]  < <  8 )  +  p - > packet [ 15 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DPRINT ( DBG_INFO , F ( " HW_FB_ReSPRT  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DBGPRINTLN ( String ( ( p - > packet [ 16 ]  < <  8 )  +  p - > packet [ 17 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DPRINT ( DBG_INFO , F ( " HW_GridSamp_ResValule  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DBGPRINTLN ( String ( ( p - > packet [ 18 ]  < <  8 )  +  p - > packet [ 19 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DPRINT ( DBG_INFO , F ( " HW_ECapValue  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DBGPRINTLN ( String ( ( p - > packet [ 20 ]  < <  8 )  +  p - > packet [ 21 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DPRINT ( DBG_INFO , F ( " Matching_APPFW_PN  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        DBGPRINTLN ( String ( ( uint32_t )  ( ( ( p - > packet [ 22 ]  < <  8 )  |  p - > packet [ 23 ] )  < <  8  |  p - > packet [ 24 ] )  < <  8  |  p - > packet [ 25 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    //}
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    //notify(InverterDevInform_Simple, iv);
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    //mPayload[iv->id].multi_parts +=2;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    multi_parts  + = 2 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    //notify(InverterDevInform_All, iv);
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  else  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( F ( " 3rd gen. inverter! " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  else  if  (  p - > packet [ 9 ]  = =  0x12  )  { //3rd frame
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                DBGPRINTLN ( F ( " got 3rd frame (hw info) " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                /* according to xlsx (different start byte -1!)
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 11 ] 	 byte [ 12 ]  APPFW_MINVER  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 13 ] 	 byte [ 14 ]  HWInfoAddr  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 15 ] 	 byte [ 16 ]  PNInfoCRC_gusv  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    byte [ 15 ] 	 byte [ 16 ]  PNInfoCRC_gusv  ( this  really  is  double  mentionned  in  xlsx . . . )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                */  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //if(mSerialDebug) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DPRINT ( DBG_INFO , F ( " APPFW_MINVER  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( String ( ( p - > packet [ 10 ]  < <  8 )  +  p - > packet [ 11 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DPRINT ( DBG_INFO , F ( " HWInfoAddr  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( String ( ( p - > packet [ 12 ]  < <  8 )  +  p - > packet [ 13 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DPRINT ( DBG_INFO , F ( " PNInfoCRC_gusv  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( String ( ( p - > packet [ 14 ]  < <  8 )  +  p - > packet [ 15 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //}
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //mPayload[iv->id].multi_parts++;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                multi_parts + + ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if ( multi_parts  >  5 )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                cmdDone ( q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mState  =  States : : RESET ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > radioStatistics . rxSuccess + + ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            /*if (mPayload[iv->id].multi_parts > 5) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                iv - > setQueuedCmdFinished ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mPayload [ iv - > id ] . complete  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mPayload [ iv - > id ] . rxTmo     =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mPayload [ iv - > id ] . requested =  false ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                iv - > radioStatistics . rxSuccess + + ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  ( mHighPrioIv  = =  NULL )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mHighPrioIv  =  iv ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                */  
				
			 
			
		
	
		
		
			
				
					 
					 
					        }  
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					        inline  void  miDataDecode ( packet_t  * p ,  const  queue_s  * q )  {  
					 
					 
					        inline  void  miDataDecode ( packet_t  * p ,  const  queue_s  * q )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					            record_t < >  * rec  =  q - > iv - > getRecordStruct ( RealTimeRunData_Debug ) ;   // choose the parser
  
					 
					 
					            record_t < >  * rec  =  q - > iv - > getRecordStruct ( RealTimeRunData_Debug ) ;   // choose the parser
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            //rec->ts = mPayload[iv->id].ts;
  
					 
					 
					            rec - > ts  =  q - > ts ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            q - > iv - > radioStatistics . rxSuccess + + ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            mState  =  States : : RESET ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					            //mPayload[iv->id].gotFragment = true;
  
					 
					 
					            //mPayload[iv->id].gotFragment = true;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					            //mPayload[iv->id].multi_parts += 4;
  
					 
					 
					            //mPayload[iv->id].multi_parts += 4;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -314,19 +422,22 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                           CH4 ;  
					 
					 
					                           CH4 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					            // count in RF_communication_protocol.xlsx is with offset = -1
  
					 
					 
					            // count in RF_communication_protocol.xlsx is with offset = -1
  
				
			 
			
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_UDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 9 ]  < <  8 )  +  p - > packet [ 10 ] ) / 10 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_UDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 9 ]  < <  8 )  +  p - > packet [ 10 ] ) / 10 ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            yield ( ) ;   
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_IDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 11 ]  < <  8 )  +  p - > packet [ 12 ] ) / 10 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_IDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 11 ]  < <  8 )  +  p - > packet [ 12 ] ) / 10 ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            yield ( ) ;   
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_UAC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 13 ]  < <  8 )  +  p - > packet [ 14 ] ) / 10 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_UAC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 13 ]  < <  8 )  +  p - > packet [ 14 ] ) / 10 ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            yield ( ) ;   
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_F ,  rec ) ,  rec ,  ( float )  ( ( p - > packet [ 15 ]  < <  8 )  +  p - > packet [ 16 ] ) / 100 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_F ,  rec ) ,  rec ,  ( float )  ( ( p - > packet [ 15 ]  < <  8 )  +  p - > packet [ 16 ] ) / 100 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_PDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 17 ]  < <  8 )  +  p - > packet [ 18 ] ) / 10 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_PDC ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 17 ]  < <  8 )  +  p - > packet [ 18 ] ) / 10 ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            yield ( ) ;   
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_YD ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 19 ]  < <  8 )  +  p - > packet [ 20 ] ) / 1 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( datachan ,  FLD_YD ,  rec ) ,  rec ,  ( float ) ( ( p - > packet [ 19 ]  < <  8 )  +  p - > packet [ 20 ] ) / 1 ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            yield ( ) ;   
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_T ,  rec ) ,  rec ,  ( float )  ( ( int16_t ) ( p - > packet [ 21 ]  < <  8 )  +  p - > packet [ 22 ] ) / 10 ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_T ,  rec ) ,  rec ,  ( float )  ( ( int16_t ) ( p - > packet [ 21 ]  < <  8 )  +  p - > packet [ 22 ] ) / 10 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_IRR ,  rec ) ,  rec ,  ( float )  ( calcIrradiation ( q - > iv ,  datachan ) ) ) ;  
					 
					 
					            q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_IRR ,  rec ) ,  rec ,  ( float )  ( calcIrradiation ( q - > iv ,  datachan ) ) ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi;
  
					 
					 
					            if  ( datachan  = =  1 )  //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi;
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > rssi  =  p - > rssi ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            else  if ( q - > iv - > rssi  >  p - > rssi )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > rssi  =  p - > rssi ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					            /*if ( datachan < 3 ) {
  
					 
					 
					            /*if ( datachan < 3 ) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					                mPayload [ q - > iv - > id ] . dataAB [ datachan ]  =  true ;  
					 
					 
					                mPayload [ q - > iv - > id ] . dataAB [ datachan ]  =  true ;  
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -342,19 +453,164 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                  FCNT  =  ( uint8_t ) ( p - > packet [ 26 ] ) ;  
					 
					 
					                  FCNT  =  ( uint8_t ) ( p - > packet [ 26 ] ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                  FCODE  =  ( uint8_t ) ( p - > packet [ 27 ] ) ;  
					 
					 
					                  FCODE  =  ( uint8_t ) ( p - > packet [ 27 ] ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                } */  
					 
					 
					                } */  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                //miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]);
  
					 
					 
					                miStsConsolidate ( q ,  datachan ,  rec ,  p - > packet [ 23 ] ,  p - > packet [ 24 ] ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					                if  ( p - > packet [ 0 ]  <  ( 0x39  +  ALL_FRAMES )  )  {  
					 
					 
					                if  ( p - > packet [ 0 ]  <  ( 0x39  +  ALL_FRAMES )  )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                    addImportant ( q - > iv ,  ( q - > cmd  +  1 ) ) ;  
					 
					 
					                    miNextRequest ( ( p - > packet [ 0 ]  -  ALL_FRAMES  +  1 ) ,  q ) ;  
				
			 
			
				
				
			
		
	
		
		
			
				
					 
					 
					                    //mPayload[iv->id].txCmd++;
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                    //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response
  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					                    //mPayload[iv->id].complete = false;
  
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					 
					 
					                }  else  {  
					 
					 
					                }  else  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                    //miComplete(iv);
  
					 
					 
					                    miComplete ( q - > iv ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                }  
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					            }  else  if ( ( p - > packet [ 0 ]  = =  ( MI_REQ_CH1  +  ALL_FRAMES ) )  & &  q - > iv - > type  = =  INV_TYPE_2CH  )  {  
					 
					 
					            }  else  if ( ( p - > packet [ 0 ]  = =  ( MI_REQ_CH1  +  ALL_FRAMES ) )  & &  q - > iv - > type  = =  INV_TYPE_2CH  )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                addImportant ( q - > iv ,  MI_REQ_CH2 ) ;  
					 
					 
					                miNextRequest ( MI_REQ_CH2 ,  q ) ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  else  {                                     // first data msg for 1ch, 2nd for 2ch
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                miComplete ( q - > iv ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            cmdDone ( q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        inline  void  miNextRequest ( uint8_t  cmd ,  const  queue_s  * q )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //setAttempt();
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DPRINT_IVID ( DBG_WARN ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( F ( " next request ( " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( String ( q - > attempts ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( F ( "  attempts left): 0x " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGHEXLN ( cmd ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if ( q - > attempts )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > radio - > sendCmdPacket ( q - > iv ,  cmd ,  0x00 ,  true ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > radioStatistics . retransmits + + ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mWaitTimeout  =  millis ( )  +  MI_TIMEOUT ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mState  =  States : : WAIT ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  else  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                add ( q ,  true ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                cmdDone ( q ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mState  =  States : : RESET ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					/*        inline void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t stschan = CH1) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            record_t < >  * rec  =  iv - > getRecordStruct ( RealTimeRunData_Debug ) ;   // choose the record structure
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            rec - > ts  =  mPayload [ iv - > id ] . ts ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            mPayload [ iv - > id ] . gotFragment  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            mPayload [ iv - > id ] . multi_parts  + =  3 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            mPayload [ iv - > id ] . txId  =  p - > packet [ 0 ] ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            miStsConsolidate ( iv ,  stschan ,  rec ,  p - > packet [ 10 ] ,  p - > packet [ 12 ] ,  p - > packet [ 9 ] ,  p - > packet [ 11 ] ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            mPayload [ iv - > id ] . stsAB [ stschan ]  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  ( mPayload [ iv - > id ] . stsAB [ CH1 ]  & &  mPayload [ iv - > id ] . stsAB [ CH2 ] )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					           */  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        inline  void  miStsConsolidate ( const  queue_s  * q ,  uint8_t  stschan ,   record_t < >  * rec ,  uint8_t  uState ,  uint8_t  uEnum ,  uint8_t  lState  =  0 ,  uint8_t  lEnum  =  0 )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //uint8_t status  = (p->packet[11] << 8) + p->packet[12];
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            uint16_t  statusMi  =  3 ;  // regular status for MI, change to 1 later?
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  (  uState  = =  2  )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                statusMi  =  5050  +  stschan ;  //first approach, needs review!
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  ( lState )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    statusMi  + =   lState * 10 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  else  if  (  uState  >  3  )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                statusMi  =  uState * 1000  +  uEnum * 10 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  ( lState )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    statusMi  + =   lState * 100 ;  //needs review, esp. for 4ch-8310 state!
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //if (lEnum)
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                statusMi  + =   lEnum ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  ( uEnum  <  6 )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    statusMi  + =  stschan ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  ( statusMi  = =  8000 )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    statusMi  =  8310 ;        //trick?
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            uint16_t  prntsts  =  statusMi  = =  3  ?  1  :  statusMi ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            bool  stsok  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  (  prntsts  ! =  rec - > record [ q - > iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ]  )  {  //sth.'s changed?
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > alarmCnt  =  1 ;  // minimum...
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //sth is or was wrong?
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  (  ( q - > iv - > type  ! =  INV_TYPE_1CH )  & &  (  ( statusMi  ! =  3 )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                                                | |  ( ( q - > iv - > lastAlarm [ stschan ] . code )  & &  ( statusMi  = =  3 )  & &  ( q - > iv - > lastAlarm [ stschan ] . code  ! =  1 ) ) )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                   )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    q - > iv - > lastAlarm [ stschan ]  =  alarm_t ( prntsts ,  q - > ts , 0 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    q - > iv - > alarmCnt  =  q - > iv - > type  = =  INV_TYPE_2CH  ?  3  :  5 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > alarmLastId  =  prntsts ;  //iv->alarmMesIndex;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                stsok  =  false ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  ( q - > iv - > alarmCnt  >  1 )  {  //more than one channel
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    for  ( uint8_t  ch  =  0 ;  ch  <  ( q - > iv - > alarmCnt ) ;  + + ch )  {  //start with 1
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        if  ( q - > iv - > lastAlarm [ ch ] . code  = =  1 )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                            stsok  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                            break ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //if (mSerialDebug) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DPRINT ( DBG_WARN ,  F ( " New state on CH " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINT ( String ( stschan ) ) ;  DBGPRINT ( F ( "  ( " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINT ( String ( prntsts ) ) ;  DBGPRINT ( F ( " ):  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( q - > iv - > getAlarmStr ( prntsts ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //}
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  ( ! stsok )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > setValue ( q - > iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ,  rec ,  prntsts ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > lastAlarm [ 0 ]  =  alarm_t ( prntsts ,  q - > ts ,  0 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  ( q - > iv - > alarmMesIndex  <  rec - > record [ q - > iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ] )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > alarmMesIndex  =  rec - > record [ q - > iv - > getPosByChFld ( 0 ,  FLD_EVT ,  rec ) ] ;  // seems there's no status per channel in 3rd gen. models?!?
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //if (mSerialDebug) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINT ( F ( " alarm ID incremented to  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    DBGPRINTLN ( String ( q - > iv - > alarmMesIndex ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                //}
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        inline  void  miComplete ( Inverter < >  * iv )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //if ( mPayload[iv->id].complete )
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //    return; //if we got second message as well in repreated attempt
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //mPayload[iv->id].complete = true;
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //if (mSerialDebug) {
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                DPRINT_IVID ( DBG_INFO ,  iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                DBGPRINTLN ( F ( " got all data msgs " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //}
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            record_t < >  * rec  =  iv - > getRecordStruct ( RealTimeRunData_Debug ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_YD ,  rec ) ,  rec ,  calcYieldDayCh0 ( iv , 0 ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            //preliminary AC calculation...
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            float  ac_pow  =  0 ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            for ( uint8_t  i  =  1 ;  i  < =  iv - > channels ;  i + + )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                if  ( ( ! iv - > lastAlarm [ i ] . code )  | |  ( iv - > lastAlarm [ i ] . code  = =  1 ) )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    uint8_t  pos  =  iv - > getPosByChFld ( i ,  FLD_PDC ,  rec ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                    ac_pow  + =  iv - > getValue ( pos ,  rec ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            ac_pow  =  ( int )  ( ac_pow * 9.5 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            iv - > setValue ( iv - > getPosByChFld ( 0 ,  FLD_PAC ,  rec ) ,  rec ,  ( float )  ac_pow / 10 ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            iv - > doCalculations ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            // update status state-machine,
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            iv - > isProducing ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					        }  
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        inline  void  parseDevCtrl ( packet_t  * p ,  const  queue_s  * q )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if ( ( p - > packet [ 12 ]  ! =  ActivePowerContr )  | |  ( p - > packet [ 13 ]  ! =  0x00 ) )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                return ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            bool  accepted  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if ( ( p - > packet [ 10 ]  = =  0x00 )  & &  ( p - > packet [ 11 ]  = =  0x00 ) )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                q - > iv - > powerLimitAck  =  true ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            else  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                accepted  =  false ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DPRINT_IVID ( DBG_INFO ,  q - > iv - > id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( F ( " has  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if ( ! accepted )  DBGPRINT ( F ( " not  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( F ( " accepted power limit set point  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( String ( q - > iv - > powerLimit [ 0 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINT ( F ( "  with PowerLimitControl  " ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            DBGPRINTLN ( String ( q - > iv - > powerLimit [ 1 ] ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            q - > iv - > actPowerLimit  =  0xffff ;  // unknown, readback current value
  
				
			 
			
		
	
		
		
			
				
					 
					 
					        }  
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					        inline  void  compilePayload ( const  queue_s  * q )  {  
					 
					 
					        inline  void  compilePayload ( const  queue_s  * q )  {  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					@ -396,7 +652,7 @@ class Communication : public CommQueue<> { 
				
			 
			
		
	
		
		
			
				
					 
					 
					                }  
					 
					 
					                }  
				
			 
			
		
	
		
		
			
				
					 
					 
					                memcpy ( & mPayload [ len ] ,  mLocalBuf [ i ] . buf ,  mLocalBuf [ i ] . len ) ;  
					 
					 
					                memcpy ( & mPayload [ len ] ,  mLocalBuf [ i ] . buf ,  mLocalBuf [ i ] . len ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                len  + =  mLocalBuf [ i ] . len ;  
					 
					 
					                len  + =  mLocalBuf [ i ] . len ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					                // get wor st RSSI
  
					 
					 
					                // get be st RSSI
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                if ( mLocalBuf [ i ] . rssi  >  rssi )  
					 
					 
					                if ( mLocalBuf [ i ] . rssi  >  rssi )  
				
			 
			
		
	
		
		
			
				
					 
					 
					                    rssi  =  mLocalBuf [ i ] . rssi ;  
					 
					 
					                    rssi  =  mLocalBuf [ i ] . rssi ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					            }  
					 
					 
					            }