430 likes | 645 Views
QT State Machine Framework: presentazione ed utilizzo in un sistema embedded. Ceruti Simone Matteo Delcon S rl. Sommario. Definizione ed utilizzo di macchina a stati finiti Rappresentazione grafica Concetti e caratteristiche del framework Presentazione del sistema embedded
E N D
QT State Machine Framework: presentazione ed utilizzo in un sistema embedded Ceruti Simone Matteo DelconSrl Ceruti Simone Matteo
Sommario • Definizione ed utilizzo di macchina a stati finiti • Rappresentazione grafica • Concetti e caratteristiche del framework • Presentazione del sistema embedded • Utilizzo di macchine a stati nel firmware Ceruti Simone Matteo
Macchina stati finiti: distributore bibite 0 cent 0c 10 cents 0 cent 10c 30c 0 cent 10 cents 10 cents 20c 10 cents 0 cent Ceruti Simone Matteo
Macchina stati finiti • Sistema composto da un numero finiti di stati S • Insieme finito di simboli di ingresso I • Uno stato iniziale S0 • Insieme stati finali O (eventualmente vuoto) • Funzionedi transizione associa lo stato successivo allo stato attuale e all’ingresso • f : S x I → S • S(t+1) = f(S(t),I(t)) Ceruti Simone Matteo
Macchina stati finiti: esempi • Protocolli di comunicazione • Software per progettazione di circuiti digitali • Unità di controllo digitale • Ricerca di parole chiave in un file o su web • Analizzatori di testo • Compilatori di linguaggi • Interpreti di linguaggi Ceruti Simone Matteo
Macchina stati finiti: riconoscitore di linguaggi • Problema: decidere se una stringa s appartiene o meno ad un linguaggio L • Esempi: • verificare se una stringa è un identificatore C • verificare se un numero binario è dispari Ceruti Simone Matteo
Macchina stati finiti: riconoscitore di linguaggi • Insieme finito di stati S • Insieme finito (alfabeto) di ingressi I • Insieme finito di stati di finali O • Funzione di transizione f: S x I S • Si applica la f a tutti i simboli della stringa da riconoscere • Se termina in uno stato finale la stringa è riconosciuta Ceruti Simone Matteo
Macchina stati finiti: riconoscitore di linguaggi Riconoscitore di identificatori: riconosce una stringa alfanumerica che inizia con una lettera lettera S0 lettera S1 cifra S2 cifra/lettera cifra Ceruti Simone Matteo
Macchina stati finiti: riconoscitore di linguaggi Riconoscitore di numeri binari dispari: riconosce numero binari che finiscono con un 1 1 1 S0 S1 0 0 Ceruti Simone Matteo
Rappresentazione grafica • Si utilizza un grafo orientato • Agli stati sono associati i nodi • Ad ogni coppia (S,I) in cui è definita t si associa un arco • Lo stato iniziale viene caratterizzato dal nodo con un arco entrante che non proviene da nodi • Lo stato finale da un nodo doppio Ceruti Simone Matteo
Macchina stati finiti gerarchica • Macchina a stati finiti • Uno stato può avere uno o più stati figli • Ogni stato figlio può avere stati figli… • Lo stato corrente è un insieme di stati • Se uno stato non può gestire la transizione la può gestire il padre Ceruti Simone Matteo
Macchina stati finiti gerarchica WaitConnect lpTcpSocket->newConnection Connected lpTcpSocket->disconnected lpTcpSocket->error lpTcpSocket->readyRead ReadData ManageRxData Ceruti Simone Matteo
Macchina stati finiti gerarchica WaitConnect lpTcpSocket->newConnection lpTcpSocket->disconnected lpTcpSocket->error Normal Connected lpTcpSocket->readyRead ReadData ManageRxData Ceruti Simone Matteo
Macchina stati finiti gerarchica: dichiarazione QStateMachine* lpSM = new QStateMachine(); QState* lpWaitConnect = new QState(lpSM); QState* lpNormal = new QState(lpSM); QState* lpConnected = newQState(lpNormal); QState* lpReadData = new QState(lpNormal); QState* lpManageRxData = new QState(lpNormal); … lpNormal->addTransition(lpSocket,SIGNAL(disconnected()),lpWaitConnect); lpNormal->addTransition(lpSocket,SIGNAL(error()),lpWaitConnect); Ceruti Simone Matteo
Macchina stati finiti gerarchica D b A a A a B b B g g d b C C d Ceruti Simone Matteo
State Machine Framework: classi principali • QStateMachine: macchina a stati finiti gerarchica • QState:stato generico per QStateMachine • QAbstractTransition: transizione tra QState • QSignalTransition: basata su Qtsignal • QEventTransition: basata su Qtevent • QMouseEventTransition • QKeyEventTransition Ceruti Simone Matteo
Definizione di transizione • Funzione di transizione t : S x I → S • QState* di ingresso (stato sorgente) • QState* di uscita (stato destinazione) • QAbstractTransition • QEventTransition • QSignalTransition • QKeyEventTransition • QMouseEventTransition Ceruti Simone Matteo
State Machine Framework: classi principali • S1 emette segnale exitedquando avviene transizione • S2emette segnale enteredquando avviene transizione • connect(S2,SIGNAL(entered()),this,SLOT(S2Entered())); S1 S2 tr Ceruti Simone Matteo
Interazione tra macchine a stati • Si utilizzano QSignalTransition • Stato iniziale • Statofinale • Emettitore segnale • Segnale stesso • Emettitore è figlio QObject S1 -> addTransition( Socket ,SIGNAL(error()) , S2 ) Ceruti Simone Matteo
Interazione tra macchine a stati Emettitore QStateMachine • QObject • QAbstractState • QState • QStateMachine Ceruti Simone Matteo
Interazione tra macchine a stati Medical Device Server Eth/rs485/WiFi Ceruti Simone Matteo
Interazione tra macchine a stati Connected->addTransition(MSExec,SIGNAL(SendCodeS()),ParseCode)) ReadCode->addTransition(MSComm,SIGNAL(StartPrgS()),StartPrg)) MSExec MSComm Init WaitConnect EndInitS ConnectedS emitSendCodeS() ReadCode Connected EndPrgS StartPrgS EndParseS SendCodeS emitStartPrgS() StartPrg ParseCode Ceruti Simone Matteo
Salvataggio e ripristino stato corrente (QHistoryState) • MS esecuzione su sistema embedded • Stato inizializzazione • Stato lettura codice • Stato di esecuzione programma • In tutti gli stati è richiesta interazione utente • Sistema può restare in attesa Standby • Uscito dallo standby deve tornare ultimo stato Ceruti Simone Matteo
Salvataggio e ripristino stato corrente (QHistoryState) StandbyS Init S1 EndInitS StandbyS Standby ReadCode S2 EndPrgS StartPrgS S3 StartPrg StandbyS Ceruti Simone Matteo
Salvataggio e ripristino stato corrente (QHistoryState) QHistoryState è uno pseudo-stato che rappresenta lo stato figlio in cui era il padre prima dell’esecuzione della transizione che fa uscire da tale stato padre. Ceruti Simone Matteo
Salvataggio e ripristino stato corrente (QHistoryState) Normal Init EndInitS StandbyS Standby ReadCode ExitStandbyS H EndPrgS StartPrgS StartPrg Ceruti Simone Matteo
Salvataggio e ripristino stato corrente: dichiarazione lpInit = new QState(lpStateNormal); lpReadCode= new QState(lpStateNormal); lpStartPrg= new QState(lpStateNormal); lpStandby = new QState(this); lpStandbySave = new QHistoryState(lpStateNormal); lpInit->addTransition(this,SIGNAL(EndInitS()),lpReadCode) lpReadCode->addTransition(this,SIGNAL(StartPrgS()),lpStartPrg) lpStartPrg->addTransition(this,SIGNAL(EndPrgS()),lpReadCode) lpStateNormal->addTransition(this,SIGNAL(StandbyS()),lpStandby) lpStandby->addTransition(this,SIGNAL(ExitStandbyS()),lpStandbySave) Ceruti Simone Matteo
Macchine a stati e Proprietà • Esempio "Find" • Ad ogni stato si può assegnare un insieme di triple (QObject, proprietà, valore) • Quando entra nello stato la proprietà del QObject assume il valore assegnato Ceruti Simone Matteo
Macchine a stati e Proprietà buttonNext:enabled false buttonPrev:enabled false NoFindState NoEmptyText EmptyText FindState buttonNext:enabled true buttonPrev:enabled true Ceruti Simone Matteo
Macchine a stati e Proprietà ... lpNoFindState = new QState(findStateMachine); lpNoFindState->assignProperty(buttonNext, "enabled", false); lpNoFindState->assignProperty(buttonPrev, "enabled", false); lpToFindState = new QState(findStateMachine); lpToFindState->assignProperty(buttonNext, "enabled", true); lpToFindState->assignProperty(buttonPrev, "enabled", true); lpNoFindState->addTransition(this,SIGNAL(NoEmptyText()),lpToFindState); lpToFindState->addTransition(this,SIGNAL(EmptyText()),lpNoFindState); ... Ceruti Simone Matteo
Macchine a stati e Proprietà ... connect(lineEdit,SIGNAL(textEdited(constQString&)), lpFindDialog,SLOT(textChanged(constQString&))); ... voidFindDialog::textChanged(constQString& text) { if (text.isEmpty()) emitNoEmptyText(); else emitEmptyText(); } Ceruti Simone Matteo
Macchine a stati e Proprietà:es. calcolatrice Standard Std_S Sc_S Scientifica decimale gradi Dec_S Gradi_S Radianti_S Scientifica decimale radianti Bin_S Hex_S Binaria Esadecimale Ceruti Simone Matteo
Macchine a stati e Animazioni • Transizione Animazione • QAbstractTransition QAbstractAnimation • QAbstractAnimation • QVariantAnimation • QAnimationGroup • QPropertyAnimation • QParallelAnimationGroup • QSequentialAnimationGroup Ceruti Simone Matteo
Macchine a stati e Animazioni • QPropertyAnimation • Gestisce l’animazione della proprietà di un QObject • [Valore iniziale] (valore attuale) • Valore finale [valori intermedi] • [Durata animazione] (250 msec) • [Curva di animazione] (lineare) Ceruti Simone Matteo
Macchine a stati e Animazioni • Start "Find" widget:size (w,h) … hideExtraWidgetsState showExtra hideExtra widget:size (w,h * 2) … showExtraWidgetsState Ceruti Simone Matteo
Macchine a stati e Animazioni ... QSignalTransition* tr1 = hideExtraWidgetsState->addTransition( this,SIGNAL(showExtra()),showExtraWidgetsState); QSignalTransition* tr2 = showExtraWidgetsState->addTransition( this,SIGNAL(hideExtra()),hideExtraWidgetsState); QPropertyAnimation* animSize = new QPropertyAnimation(widget,"size"); animSize->setDuration(3000); intw = size().width(); inth = size().height()*2; animSize->setEndValue(QSize(w,h)); tr1->addAnimation(animSize); connect(moreButton,SIGNAL(toggled(bool)),this,SLOT(showOrHide(bool))); ... Ceruti Simone Matteo
Macchine a stati e Animazioni voidFindDialog::showOrHide(boolon) { if(on) emitshowExtra(); else emithideExtra(); } Ceruti Simone Matteo
Sistema embedded • Dispositivi embedded con Linux embedded • Server gestione dati (Linux / Windows) • Clients collegati con server (Linux /Windows) • Dispositivi connessi con Server tramite Rs485-Ethernet-WiFi • Clients connessi con server tramite ethernet Ceruti Simone Matteo
Sistema embedded Ethernet Applicazione Client 1 Dispositivo 1 Applicazione Server Applicazione Client 2 RS485 / Ethernet / Wi-Fi Dispositivo 2 Servizio Demone Applicazione Client 3 Dispositivo 3 DBMS ……. ...... Dispositivo n Applicazione Client m SERVER Ceruti Simone Matteo
Sistema embedded: utilizzo di macchine a stati finiti • Su ogni dispositivo due macchine a stati • MS-Comm per comunicazione con server • MS-Exec per esecuzione lavorazione • Comunicazione tra le due MS tramite segnali • MS-Comm: utilizzo del concetto di gerarchia per gestire errore connessione Ceruti Simone Matteo
Sistema embedded: utilizzo di macchine a stati finiti • Utilizzo QHistoryState • Gestione Stand-by • Modifiche run-time di alcuni parametri ricevuti dal server Exec1 UpdVar Update Exec2 EndUpd H Exec3 Ceruti Simone Matteo
Sistema embedded: utilizzo di macchine a stati finiti • Utilizzo QProperty e QPropertyAnimation • Widget "animati" durante tx/rx dati • Gestione stato abilitazioni widget input • Suddivisione gestione interfaccia grafica da logica di funzionamento Ceruti Simone Matteo
Grazie a tutti • Ceruti Simone Matteo • matteo.ceruti@delcon.it • teo.cer@tiscali.it Ceruti Simone Matteo