Firestore
User
{
name: string,
username: string,
reviews: arrayof({
rating: num,
desc: string
}),
orderedProducts: arrayof(Product)
}ID: username
Locker
{
name: string,
position: Geolocation,
slots: arrayof({
product: Product?
})
}ID: name
Product
{
name: string,
desc: string,
images: arrayof(string),
price: num,
category: string,
condition: "buono" | "ottimo" | "come nuovo" | "usato",
vendor: User
}ID: automatico
Booking
{
user: User,
type: "buy" | "sell",
expiration: datetime,
consumed: bool,
product: Product?,
locker: Locker?,
slot: num?
}ID: automatico
Questo può essere di buy o di sell, nel caso di buy product != null, nel caso di sell locker != null && slot != null.
Iinfo
I tipi con ? sono annullabili, quindi possono essere anche null.
Firebase
{
doors: arrayof({
isOpen: bool, // Segnala se la porta è aperta o no
hasProduct: bool, // Infrarossi vede un oggetto
isTimerRunning: bool, // Il timer è attivo?
isDirty: bool // Aggiorna android
}),
timerDuration: num // Durata del timer
}L’autorità dei dati è di arduino. Questo vuol dire che android è in sola lettura tranne per isDirty
- Android ascolta isDirty. Quando isDirty == true, aggiorna tutti i dati in lettura e scrive isDirty = false.
- Arduino è il provider di dati, Android è il consumer.
- Android dialoga con arduino soltanto tramite il suono.
Android invia codice numerico via suono *0F39#ID dove ID è l’id della porta (0 o 1 nel nostro caso).
Arduino attende il suono, dopo di ché:
- Apre la porta, isOpen = true
- Fa partire il timer, isTimerRunning = true
Alla fine del timer:
- Porta si chiude ⇒ isOpen == false
- IsTimerRunning = false
A questo punto viene settato hasProduct in base a se il sensore rileva un prodotto dentro, e poi viene impostato isDirty (flag di sincronizzazione).
Android, conscio del fatto che in consegna, a fine operazione hasProduct dev’essere true, o che in ritiro hasProduct dev’essere false, mostrerà all’utente una schermata di “OK” oppure un “ehi, perché non hai fatto quello che dovevi fare? rimanda il segnale audio e riprova”.
Differenza tra consegna e ritiro
Nella consegna viene controllato che NON ci sia un prodotto per fare ripartire il ciclo, nel ritiro viene controllato che CI SIA un prodotto per farlo ripartire.