Realizzazione di un
sistema firefly che simula
il comportamento di 3 lucciole, gestendo inoltre la sincronizzazione tra queste attraverso un sonar.
Si specifica ulteriormente il QActor sonarsimulator:
Vengono definiti 2 eventi che si alternano periodicamente tramite l'alternanza di due stati handleSync e handleUnsync.
Il primo evento permette di segnalare la distanza dall'ostacolo (unsync), il secondo invece
impone la sincronizzazione in corrispondenza di una distanza minore di DMIN (sync).
System fireflysync
Event sync : args(X)
Event unsync : args(X)
// Simula il sonar: alterna emissione di sync e unsync con tempi casuali
QActor sonarsimulator context ctxfirefly {
State handleUnsync {
emit unsync : args(Timer) // ostacolo lontano → lampeggio random
}
Transition t0 whenTimeVar TimerEvent1 -> handleSync
State handleSync {
emit sync : args(Timer) // ostacolo vicino → lampeggio sincronizzato
}
Transition t0 whenTimeVar TimerEvent2 -> handleUnsync
}
La crezione delle lucciole avviene dinamicamente tramite il QActor creator, cui unico scopo è creare le lucciole, etichettate come
dinamicOnly.
Context ctxfirefly ip [ host="localhost" port=8040 ]
//QActor responsabile della creazione delle firefly
QActor creator context ctxfirefly{
State s0 initial{
//initial state:
//Create 3 firefly inst.
}
}
Si specifica ulteriormente il comportamento del QActor firefly: si specifica ulteriormente il comportamento del QActor firefly, il quale per gestire la sincronizzazione,
deve elaborare gli eventi di sincronizzazione periodici e prioritari che manda sonarsimulator
Scenario 1: sonarsimulator emette unsync; tutte le firefly passano a flash
Scenario 2: sonarsimulator emette sync; tutte le firefly passano a syncflash
In questo caso è necessario che tutte le firefly si sincronizzino ad un unico timer, fornito dall'evento di sincronizzazione.
Si specifica ulteriormente lo stato syncflash di firefly, andando a modificare il nuovo Timer di sincronizzazione:
// Ogni lucciola lampeggia e notifica la propria cella alla griglia
QActor firefly context ctxfirefly dynamicOnly {
State flash { // modalità random
[#
Timer = TimerUnsync
#]
//TURN ON
delay 500
//TURN OFF
}
Transition t0
whenTimeVar Timer -> flash
whenEvent sync -> syncflash
State syncflash { // modalità sincronizzata
onMsg(sync: args(Time)){
[#
Timer = payloadArg(0).toLong()
#]
println("$name | Timer updated to $Timer") color cyan
}
//TURN ON SYNC
delay 500
//TURN OFF SYNC
}
Transition t0
whenTimeVar Timer -> syncflash
whenEvent unsync -> flash
}