Qt::CheckState state = checkBox1->checkState();
if (checkBox1->isTristate())
{
checkBox1->setCheckState((state+1)%3); //чеким по-кругу 0,1,2,0,1,2...n
}
else
{
checkBox1->setCheckState(state^Qt::Checked); //xor'им 0 или 2 с 2 (Qt::Checked).
}
enum EStation {e_NOPALY,e_PLAY,e_PAUSE} m_station;
QStateMachine machine;
QState *s1 = new QState(machine.rootState());
s1->setPropertyOnEntry(&button, ”text”, ”In s1?);
QState *s2 = new QState(machine.rootState());
s2->setPropertyOnEntry(&button, ”text”, ”In s2?);
QState *s3 = new QState(machine.rootState());
s3->setPropertyOnEntry(&button, ”text”, ”In s3?);
s1->addTransition(&button, SIGNAL(clicked()), s2);
s2->addTransition(&button, SIGNAL(clicked()), s3);
s3->addTransition(&button, SIGNAL(clicked()), s1);
machine.setInitialState(s1);
machine.start();
Т.е. реализовано добавление переходов (addTransition) и используются сигналы, такое мне в голову не приходило. Qt::CheckState state = checkBox1->checkState();
if (checkBox1->isTristate())
{
checkBox1->setCheckState((state+1)%3); //чеким по-кругу 0,1,2,0,1,2...n
}
else
{
checkBox1->setCheckState(state^Qt::Checked); //xor'им 0 или 2 с 2 (Qt::Checked).
}
void HModBus (void)
{
static byte fase=0;
volatile UINT clcCRC;
volatile UINT pakCRC;
//фазы состояний движка ModBus
enum fase
{
FASE_START_RX, /* запускаем прием */
FASE_END_RX, /* ждем завершения приема */
FASE_NODE_CHK, /* проверяем номер узла в сети */
FASE_CRC16_CHK, /* проверяем CRC16 */
FASE_FUNK_CHK, /* проверяем номер номер функции */
//FASE_FUNK_WRK, /* */
FASE_START_TX, /* передаем обратно */
FASE_END_TX /* ждем завершения передачи */
};
switch (fase)
{
//====== ЗАПУСК ПРИЕМА ======
case FASE_START_RX:
{
MbusRxRun();
fase=FASE_END_RX;
break;
};
//====== ЖДЕМ ЗАВЕРШЕНИЯ ПРИЕМА ======
case FASE_END_RX:
{
if (mbus_f_rxend)
{
fase=FASE_NODE_CHK;
}
break;
};
//====== ПРОВЕРЯЕМ ПРИНЯТОЕ - НОМЕР УЗЛА ======
case FASE_NODE_CHK:
{
BYTE temp;
temp=*(mbus_buff.buff+MBUS_FIELD_NODE);
if ((temp!=mbus_cfg.node)&&(temp!=MMBUS_ALL_NODE)&&(temp!=MMBUS_PRG_NODE))
{
fase=FASE_START_RX; // Пакет не нам, в любом случае
}
else
{
fase=FASE_CRC16_CHK;
}
break;
};
//====== ПРОВЕРЯЕМ ПРИНЯТОЕ - CRC16 ======
case FASE_CRC16_CHK:
{
BYTE *pbuff=mbus_buff.buff;
// вызвать функцию проверки CRC16
clcCRC=CalcCRC16(pbuff, rxcnt-2);
pakCRC=pbuff[rxcnt-2]; // младший байт
pakCRC|=((UINT)pbuff[rxcnt-1])<<8; // старший байт 03 04 83 00
if (clcCRC!=pakCRC)
{
fase=FASE_START_RX;
}
else /**/
{
fase=FASE_FUNK_CHK;
}
break;
};
//====== ПРОВЕРЯЕМ/ИСПОЛНЯЕМ ПРИНЯТУЮ ФУНКЦИЮ =====
case FASE_FUNK_CHK:
{
/* если определена функция проверки/исполнения
ModBus'овских функций, то исполняем ее */
if(modbusFunc)
{
if (modbusFunc()) fase=FASE_START_RX; //функция вернула не нуль->передавать не надо
else fase=FASE_START_TX; // иначе передаем ответ
}
else
{
#ifdef DBG_MBUS_ON
fase=FASE_START_TX;
#else // !DBG_MBUS_ON
fase=FASE_START_RX;
#endif // DBG_MBUS_ON
}
break;
};
//====== ПЕРЕДАЕМ ОТВЕТ ======
case FASE_START_TX:
{
MbusTxRun();
fase=FASE_END_TX;
break;
};
//====== ЖДЕМ ЗАВЕРШЕНИЯ ПЕРЕДАЧИ ======
case FASE_END_TX:
{
if (mbus_f_txend)
{
fase=FASE_START_RX;
}
break;
};
}
} // END OF HModBus()
void MyClass::createMachine()
{
_meassureMachine = new QStateMachine(this);
// Список состояний и связь их со слотами полезной работы
QState *meassurePrepareState = new QState();
meassurePrepareState->setObjectName("_meassure_meassurePrepareState");
connect(meassurePrepareState, SIGNAL(entered()), this, SLOT(meassurePrepareStateSlot()));
_meassureMachine->addState(meassurePrepareState);
_meassureMachine->setInitialState(meassurePrepareState);
QState *measureState = new QState();
measureState->setObjectName("_meassure_measureState");
connect(measureState, SIGNAL(entered()), this, SLOT(measureRunStateSlot()));
_meassureMachine->addState(measureState);
QState *repeatState = new QState();
repeatState->setObjectName("_meassure_repeatState");
connect(repeatState, SIGNAL(entered()), this, SLOT(meassureRepeatStateSlot()));
_meassureMachine->addState(repeatState);
QState *twuErrorState = new QState();
twuErrorState->setObjectName("_meassure_twuErrorState");
connect(twuErrorState, SIGNAL(entered()), this, SLOT(meassureTwuErrorStateSlot()));
_meassureMachine->addState(twuErrorState);
// переходы между состояниями
meassurePrepareState->addTransition(_timerNext, SIGNAL(timeout()), measureState);
measureState->addTransition(measureState, SIGNAL(finished()), repeatState);
measureState->addTransition(this, SIGNAL(twuFailed()), twuErrorState);
}
void MyClass::meassurePrepareStateSlot()
{
...
}
void MyClass::measureRunStateSlot()
{
...
}
void MyClass::meassureRepeatStateSlot()
{
...
}
void MyClass::meassureTwuErrorStateSlot()
{
...
}