...

Macchina stati finiti

by user

on
Category: Documents
10

views

Report

Comments

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
Fly UP