Firefly Synch

Introduction

Realizzazione di un sistema firefly che simula il comportamento di 3 lucciole, gestendo inoltre la sincronizzazione tra queste attraverso un sonar.

Requirements

  1. Costruire il simulatore di un sistema costituito da 3 lucciole
  2. Le lucciole lampeggiano ciascuna con una frequenza propria e costante
  3. Il sistema integra un sonar in grado di misurare la distanza da eventuali ostacoli
  4. Esiste una soglia di distanza prefissata, denominata DMIN, configurabile nel sistema.
  5. Il sonar monitora continuamente la distanza dall'ostacolo e notifica il sistema quando tale valore cambia.
  6. Quando la distanza rilevata dal sonar scende al di sotto di DMIN, tutte le lucciole devono passare alla modalità sincronizzata,
  7. Quando la distanza rilevata dal sonar supera nuovamente DMIN, tutte le lucciole devono tornare alla modalità random,

Requirement analysis

Problem analysis

  • 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
                            }
    
                       
  • Test plans

    Project

    Testing

    Deployment

    Maintenance



    By studentName email: gregorio.bussolari@studio.unibo.it, greg GIT repo: https://github.com/GregorioBussolari/iss2026Unibo.git