Comments
Description
Transcript
Macchina stati finiti
QT State Machine Framework: presentazione ed utilizzo in un sistema embedded Ceruti Simone Matteo Delcon Srl Better Embedded 2013 Ceruti Simone Matteo 1 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 Better Embedded 2013 Ceruti Simone Matteo 2 Macchina stati finiti: distributore bibite 0 cent 0c 10 cents 0 cent 0 cent 10c 30c 10 cents 10 cents 20c 10 cents 0 cent Better Embedded 2013 Ceruti Simone Matteo 3 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) Funzione di transizione associa lo stato successivo allo stato attuale e all’ingresso f:SxI→S S(t+1) = f(S(t),I(t)) Better Embedded 2013 Ceruti Simone Matteo 4 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 Better Embedded 2013 Ceruti Simone Matteo 5 Macchina stati finiti: riconoscitore di linguaggi • Problema: decidere se una stringa appartiene o meno ad un linguaggio L • Esempi: s – verificare se una stringa è un identificatore C – verificare se un numero binario è dispari Better Embedded 2013 Ceruti Simone Matteo 6 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 Better Embedded 2013 Ceruti Simone Matteo 7 Macchina stati finiti: riconoscitore di linguaggi Riconoscitore di identificatori: riconosce una stringa alfanumerica che inizia con una lettera lettera S0 lettera cifra cifra/lettera S1 S2 cifra Better Embedded 2013 Ceruti Simone Matteo 8 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 Better Embedded 2013 Ceruti Simone Matteo 9 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 Better Embedded 2013 Ceruti Simone Matteo 10 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 Better Embedded 2013 Ceruti Simone Matteo 11 Macchina stati finiti gerarchica WaitConnect lpTcpSocket->newConnection Connected lpTcpSocket->readyRead lpTcpSocket->disconnected lpTcpSocket->error ReadData ManageRxData Better Embedded 2013 Ceruti Simone Matteo 12 Macchina stati finiti gerarchica WaitConnect lpTcpSocket->newConnection Normal Connected lpTcpSocket->disconnected lpTcpSocket->error lpTcpSocket->readyRead ReadData ManageRxData Better Embedded 2013 Ceruti Simone Matteo 13 Macchina stati finiti gerarchica: dichiarazione QStateMachine* lpSM = new QStateMachine(); QState* lpWaitConnect = new QState(lpSM); QState* lpNormal = new QState(lpSM); QState* lpConnected = new QState(lpNormal); QState* lpReadData = new QState(lpNormal); QState* lpManageRxData = new QState(lpNormal); … lpNormal->addTransition(lpSocket,SIGNAL(disconnected()),lpWaitConnect); lpNormal->addTransition(lpSocket,SIGNAL(error()),lpWaitConnect); Better Embedded 2013 Ceruti Simone Matteo 14 Macchina stati finiti gerarchica D b A a A a g B d C Better Embedded 2013 b g B b C Ceruti Simone Matteo d 15 State Machine Framework: classi principali • QStateMachine: macchina a stati finiti gerarchica • QState: stato generico per QStateMachine • QAbstractTransition: transizione tra QState – QSignalTransition: basata su Qt signal – QEventTransition: basata su Qt event • QMouseEventTransition • QKeyEventTransition Better Embedded 2013 Ceruti Simone Matteo 16 Definizione di transizione • Funzione di transizione t : S x I → S • QState* di ingresso (stato sorgente) • QState* di uscita (stato destinazione) QAbstractTransition QEventTransition QKeyEventTransition Better Embedded 2013 QSignalTransition QMouseEventTransition Ceruti Simone Matteo 17 State Machine Framework: classi principali S1 tr S2 • S1 emette segnale exited quando avviene transizione • S2 emette segnale entered quando avviene transizione • connect(S2,SIGNAL(entered()),this,SLOT(S2Entered())); Better Embedded 2013 Ceruti Simone Matteo 18 Interazione tra macchine a stati • • • • • • • Si utilizzano QSignalTransition S1-> addTransition(Socket,SIGNAL(error()), S2) Stato iniziale Stato finale Emettitore segnale Segnale stesso Emettitore è figlio QObject Better Embedded 2013 Ceruti Simone Matteo 19 Interazione tra macchine a stati QObject QAbstractState QState QStateMachine Emettitore QStateMachine Better Embedded 2013 Ceruti Simone Matteo 20 Interazione tra macchine a stati Medical Device Server Eth/rs485/WiFi Better Embedded 2013 Ceruti Simone Matteo 21 Interazione tra macchine a stati Connected->addTransition(MSExec,SIGNAL(SendCodeS()),ParseCode)) ReadCode->addTransition(MSComm,SIGNAL(StartPrgS()),StartPrg)) MSExec MSComm Init WaitConnect EndInitS ReadCode EndPrgS ConnectedS emit SendCodeS() StartPrgS StartPrg Better Embedded 2013 Connected EndParseS emit StartPrgS() Ceruti Simone Matteo SendCodeS ParseCode 22 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 Better Embedded 2013 Ceruti Simone Matteo 23 Salvataggio e ripristino stato corrente (QHistoryState) StandbyS Init EndInitS ReadCode S1 StandbyS S2 Standby EndPrgS StartPrgS StartPrg S3 StandbyS Better Embedded 2013 Ceruti Simone Matteo 24 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. Better Embedded 2013 Ceruti Simone Matteo 25 Salvataggio e ripristino stato corrente (QHistoryState) Normal Init EndInitS StandbyS ReadCode EndPrgS StartPrgS H Standby ExitStandbyS StartPrg Better Embedded 2013 Ceruti Simone Matteo 26 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) Better Embedded 2013 Ceruti Simone Matteo 27 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 Better Embedded 2013 Ceruti Simone Matteo 28 Macchine a stati e Proprietà NoFindState NoEmptyText EmptyText FindState Better Embedded 2013 buttonNext: enabled false buttonPrev: enabled false buttonNext: enabled true buttonPrev: enabled true Ceruti Simone Matteo 29 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); ... Better Embedded 2013 Ceruti Simone Matteo 30 Macchine a stati e Proprietà ... connect(lineEdit,SIGNAL(textEdited(const QString&)), lpFindDialog,SLOT(textChanged(const QString&))); ... void FindDialog::textChanged(const QString& text) { if (text.isEmpty()) emit NoEmptyText(); else emit EmptyText(); } Better Embedded 2013 Ceruti Simone Matteo 31 Macchine a stati e Proprietà: es. calcolatrice Standard Std_S Sc_S Scientifica decimale gradi Dec_S Gradi_S Bin_S Radianti_S Scientifica decimale radianti Binaria Better Embedded 2013 Hex_S Esadecimale Ceruti Simone Matteo 32 Macchine a stati e Animazioni • Transizione Animazione • QAbstractTransition QAbstractAnimation QAbstractAnimation QVariantAnimation QPropertyAnimation Better Embedded 2013 QAnimationGroup QParallelAnimationGroup Ceruti Simone Matteo QSequentialAnimationGroup 33 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) Better Embedded 2013 Ceruti Simone Matteo 34 Macchine a stati e Animazioni • Start "Find" hideExtraWidgetsState showExtra hideExtra showExtraWidgetsState Better Embedded 2013 widget: size (w,h) … Ceruti Simone Matteo widget: size (w,h * 2) … 35 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); int w = size().width(); int h = size().height()*2; animSize->setEndValue(QSize(w,h)); tr1->addAnimation(animSize); connect(moreButton,SIGNAL(toggled(bool)),this,SLOT(showOrHide(bool))); ... Better Embedded 2013 Ceruti Simone Matteo 36 Macchine a stati e Animazioni void FindDialog::showOrHide(bool on) { if (on) emit showExtra(); else emit hideExtra(); } Better Embedded 2013 Ceruti Simone Matteo 37 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 Better Embedded 2013 Ceruti Simone Matteo 38 Sistema embedded Ethernet Dispositivo 1 Dispositivo 3 Servizio Demone ...... DBMS Dispositivo n SERVER Better Embedded 2013 Ceruti Simone Matteo Applicazione Client 2 Applicazione Client 3 ……. RS485 / Ethernet / Wi-Fi Dispositivo 2 Applicazione Server Applicazione Client 1 Applicazione Client m 39 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 Better Embedded 2013 Ceruti Simone Matteo 40 Sistema embedded: utilizzo di macchine a stati finiti • Utilizzo QHistoryState – Gestione Stand-by – Modifiche run-time di alcuni parametri ricevuti dal server Exec1 UpdVar Exec2 H Update EndUpd Exec3 Better Embedded 2013 Ceruti Simone Matteo 41 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 Better Embedded 2013 Ceruti Simone Matteo 42 Grazie a tutti • Ceruti Simone Matteo • [email protected] • [email protected] Better Embedded 2013 Ceruti Simone Matteo 43