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.