@ -28,6 +28,7 @@ typedef struct {
bool gotFragment ;
uint8_t rtrRes ; // for limiting resets
uint8_t multi_parts ; // for quality
bool rxTmo ;
} miPayload_t ;
@ -47,7 +48,7 @@ class MiPayload {
mMaxRetrans = maxRetransmits ;
mTimestamp = timestamp ;
for ( uint8_t i = 0 ; i < MAX_NUM_INVERTERS ; i + + ) {
reset ( i , true ) ;
reset ( i , false , true ) ;
mPayload [ i ] . limitrequested = true ;
}
mSerialDebug = false ;
@ -84,7 +85,7 @@ class MiPayload {
if ( ! mPayload [ iv - > id ] . complete )
process ( false ) ; // no retransmit
if ( ! mPayload [ iv - > id ] . complete ) {
if ( ! mPayload [ iv - > id ] . complete & & mPayload [ iv - > id ] . rxTmo ) {
if ( mSerialDebug )
DPRINT_IVID ( DBG_INFO , iv - > id ) ;
if ( ! mPayload [ iv - > id ] . gotFragment ) {
@ -100,13 +101,14 @@ class MiPayload {
DBGPRINTLN ( F ( " ) " ) ) ;
}
}
mPayload [ iv - > id ] . rxTmo = true ;
mPayload [ iv - > id ] . complete = true ;
iv - > setQueuedCmdFinished ( ) ; // command failed
}
}
}
reset ( iv - > id ) ;
reset ( iv - > id , ! iv - > isConnected ) ;
mPayload [ iv - > id ] . requested = true ;
yield ( ) ;
@ -125,12 +127,11 @@ class MiPayload {
DBGPRINTLN ( String ( iv - > powerLimit [ 0 ] ) ) ;
}
iv - > powerLimitAck = false ;
mRadio - > sendControlPacket ( iv - > radioId . u64 , iv - > devControlCmd , iv - > powerLimit , false , false ) ;
mRadio - > sendControlPacket ( iv - > radioId . u64 , iv - > devControlCmd , iv - > powerLimit , false , false , iv - > type = = INV_TYPE_4CH ) ;
mPayload [ iv - > id ] . txCmd = iv - > devControlCmd ;
mPayload [ iv - > id ] . limitrequested = true ;
iv - > clearCmdQueue ( ) ;
//iv->enqueCommand<InfoCommand>(SystemConfigPara); // read back power limit is not possible with MI
} else {
uint8_t cmd = iv - > getQueuedCmd ( ) ;
uint8_t cmd2 = cmd ;
@ -311,6 +312,7 @@ class MiPayload {
mPayload [ iv - > id ] . txCmd ! = 0x0f ) ) {
// no processing needed if txId is not one of 0x95, 0x88, 0x89, 0x91, 0x92 or response to 0x36ff
mPayload [ iv - > id ] . complete = true ;
mPayload [ iv - > id ] . rxTmo = true ;
continue ; // skip to next inverter
}
@ -324,6 +326,7 @@ class MiPayload {
DPRINT_IVID ( DBG_INFO , iv - > id ) ;
DBGPRINTLN ( F ( " Prevent retransmit on Restart / CleanState_LockAndAlarm... " ) ) ;
mPayload [ iv - > id ] . retransmits = mMaxRetrans ;
mPayload [ iv - > id ] . rxTmo = true ;
} else if ( iv - > devControlCmd = = ActivePowerContr ) {
DPRINT_IVID ( DBG_INFO , iv - > id ) ;
DBGPRINTLN ( F ( " retransmit power limit " ) ) ;
@ -332,10 +335,15 @@ class MiPayload {
uint8_t cmd = mPayload [ iv - > id ] . txCmd ;
if ( mPayload [ iv - > id ] . retransmits < mMaxRetrans ) {
mPayload [ iv - > id ] . retransmits + + ;
if ( ! mPayload [ iv - > id ] . gotFragment ) {
if ( ! mPayload [ iv - > id ] . gotFragment & & mPayload [ iv - > id ] . rxTmo ) {
DPRINT_IVID ( DBG_INFO , iv - > id ) ;
DBGPRINTLN ( F ( " nothing received " ) ) ;
mPayload [ iv - > id ] . retransmits = mMaxRetrans ;
} else if ( ! mPayload [ iv - > id ] . gotFragment & & ! mPayload [ iv - > id ] . rxTmo ) {
DPRINT_IVID ( DBG_INFO , iv - > id ) ;
DBGPRINTLN ( F ( " retransmit on failed first request " ) ) ;
mPayload [ iv - > id ] . rxTmo = true ;
mRadio - > sendCmdPacket ( iv - > radioId . u64 , cmd , cmd , true , false ) ;
} else if ( cmd = = 0x0f ) {
//hard/firmware request
mRadio - > sendCmdPacket ( iv - > radioId . u64 , 0x0f , 0x00 , true , false ) ;
@ -379,6 +387,8 @@ class MiPayload {
mRadio - > sendCmdPacket ( iv - > radioId . u64 , cmd , cmd , true , false ) ;
yield ( ) ;
}
} else {
mPayload [ iv - > id ] . rxTmo = true ;
}
}
}
@ -395,9 +405,14 @@ class MiPayload {
DBGHEXLN ( mPayload [ iv - > id ] . txCmd ) ;
}
mRadio - > sendCmdPacket ( iv - > radioId . u64 , mPayload [ iv - > id ] . txCmd , mPayload [ iv - > id ] . txCmd , false , false ) ;
} else {
mPayload [ iv - > id ] . rxTmo = true ;
}
} else {
if ( fastNext ) {
if ( ! fastNext ) {
mPayload [ iv - > id ] . rxTmo = true ;
} else {
/*iv->setQueuedCmdFinished();
uint8_t cmd = iv - > getQueuedCmd ( ) ;
if ( mSerialDebug ) {
DPRINT_IVID ( DBG_INFO , iv - > id ) ;
@ -406,11 +421,16 @@ class MiPayload {
DBGHEXLN ( cmd ) ;
}
mStat - > rxSuccess + + ;
mRadio - > prepareDevInformCmd ( iv - > radioId . u64 , cmd , mPayload [ iv - > id ] . ts , iv - > alarmMesIndex , false ) ;
mPayload [ iv - > id ] . txCmd = cmd ;
//mRadio->prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false);
mRadio - > prepareDevInformCmd ( iv - > radioId . u64 , iv - > getType ( ) ,
iv - > getNextTxChanIndex ( ) , cmd , mPayload [ iv - > id ] . ts , iv - > alarmMesIndex , false ) ;
mPayload [ iv - > id ] . txCmd = cmd ; */
if ( mHighPrioIv = = NULL )
mHighPrioIv = iv ;
}
}
} else {
mPayload [ iv - > id ] . rxTmo = true ;
}
yield ( ) ;
}
@ -456,6 +476,15 @@ class MiPayload {
uint16_t prntsts = statusMi = = 3 ? 1 : statusMi ;
if ( statusMi ! = mPayload [ iv - > id ] . sts [ stschan ] ) { //sth.'s changed?
iv - > alarmCnt = 1 ; // minimum...
if ( iv - > type ! = INV_TYPE_1CH & & ( statusMi ! = 3 //sth is or was wrong!
| | mPayload [ iv - > id ] . sts [ stschan ] & & statusMi = = 3 & & mPayload [ iv - > id ] . sts [ stschan ] ! = 3 )
) {
iv - > lastAlarm [ stschan ] = alarm_t ( prntsts , mPayload [ iv - > id ] . ts , mPayload [ iv - > id ] . ts ) ;
iv - > alarmCnt = iv - > type = = INV_TYPE_2CH ? 3 : 5 ;
iv - > alarmLastId = iv - > alarmMesIndex ;
}
mPayload [ iv - > id ] . sts [ stschan ] = statusMi ;
if ( mSerialDebug ) {
DPRINT ( DBG_WARN , F ( " New state on CH " ) ) ;
@ -477,6 +506,7 @@ class MiPayload {
DBGPRINT ( F ( " alarm ID incremented to " ) ) ;
DBGPRINTLN ( String ( iv - > alarmMesIndex ) ) ;
}
iv - > lastAlarm [ 0 ] = alarm_t ( prntsts , mPayload [ iv - > id ] . ts , mPayload [ iv - > id ] . ts ) ;
}
/*if(AlarmData == mPayload[iv->id].txCmd) {
uint8_t i = 0 ;
@ -584,6 +614,7 @@ class MiPayload {
uint8_t txCmd = mPayload [ iv - > id ] . txCmd ;
if ( ! * complete ) {
DPRINTLN ( DBG_VERBOSE , F ( " incomlete, txCmd is 0x " ) + String ( txCmd , HEX ) ) ;
//we got some delayed status msgs?!?
if ( ( txCmd = = 0x09 ) | | ( txCmd = = 0x11 ) ) {
if ( mPayload [ iv - > id ] . stsAB [ CH0 ] & & mPayload [ iv - > id ] . dataAB [ CH0 ] ) {
@ -592,8 +623,6 @@ class MiPayload {
}
return false ;
}
DPRINTLN ( DBG_VERBOSE , F ( " incomlete, txCmd is 0x " ) + String ( txCmd , HEX ) ) ;
if ( txCmd > = 0x36 & & txCmd < = 0x39 ) {
return false ;
}
@ -607,7 +636,7 @@ class MiPayload {
}
//check if we want the next request to be executed faster
if ( txCmd = = 0x0f )
if ( mPayload [ iv - > id ] . gotFragment & & txCmd = = 0x0f )
* fastNext = true ;
return true ;
}
@ -725,16 +754,18 @@ const byteAssign_t InfoAssignment[] = {
if ( mPayload [ iv - > id ] . multi_parts > 5 ) {
iv - > setQueuedCmdFinished ( ) ;
mPayload [ iv - > id ] . complete = true ;
mPayload [ iv - > id ] . rxTmo = true ;
mPayload [ iv - > id ] . requested = false ;
mStat - > rxSuccess + + ;
}
}
void reset ( uint8_t id , bool clrSts = false ) {
void reset ( uint8_t id , bool setTxTmo = true , bool clrSts = false ) {
memset ( mPayload [ id ] . len , 0 , MAX_PAYLOAD_ENTRIES ) ;
mPayload [ id ] . gotFragment = false ;
mPayload [ id ] . rxTmo = setTxTmo ; // design: don't start with complete retransmit
mPayload [ id ] . rtrRes = 0 ;
mPayload [ id ] . multi_parts = 0 ;
mPayload [ id ] . multi_parts = 0 ;
mPayload [ id ] . retransmits = 0 ;
mPayload [ id ] . complete = false ;
mPayload [ id ] . dataAB [ CH0 ] = true ; //required for 1CH and 2CH devices
@ -744,7 +775,6 @@ const byteAssign_t InfoAssignment[] = {
mPayload [ id ] . stsAB [ CH1 ] = true ; //required for 1CH and 2CH devices
mPayload [ id ] . stsAB [ CH2 ] = true ; //only required for 2CH devices
mPayload [ id ] . txCmd = 0 ;
//mPayload[id].skipfirstrepeat = 0;
mPayload [ id ] . requested = false ;
mPayload [ id ] . ts = * mTimestamp ;
mPayload [ id ] . sts [ 0 ] = 0 ;