Browse Source

order questions and add setup for random and delta

feature/upgrade_sdk
Carmine De Rosa 5 years ago
parent
commit
193aabb7dc
  1. 32
      scripts/delta
  2. 27
      vds-app/App/components/ExamQuestions.js
  3. 4
      vds-app/App/components/Variables.js
  4. 1
      vds-app/App/data/aerodynamics.js
  5. 6
      vds-app/App/data/flightSafety.js
  6. 6
      vds-app/App/data/materials.js
  7. 18
      vds-app/App/data/pilotingTechniques.js
  8. 7
      vds-app/App/index.js
  9. 34
      vds-app/App/screens/Exam.js
  10. 19
      vds-app/App/screens/Quiz.js
  11. 165
      vds-app/App/screens/QuizIndex.js
  12. 217
      vds-app/App/screens/Setup.js
  13. 9
      vds-app/App/screens/Splash.js
  14. 5
      vds-app/package.json

32
scripts/delta

@ -0,0 +1,32 @@
quiz_id,sezione,domanda,opz1,opz2,opz3,soluzione,punti,hang_para
2147,AERODINAMICA,"Volando in prossimità del terreno il deltaplano acquista prestazioni. Ciò è dovuto:","al fatto che vicino a terra il pilota istintivamente aumenta l'incidenza.","a un fenomeno detto ""effetto suolo"".","solo al fatto che molto vicino al terreno sovente vi sono piccole termiche.",2,3,hang
7062,"TECNICA DI PILOTAGGIO","Decollo in deltaplano. Tra i controlli di sicurezza pre-decollo, uno in particolare risulta essenziale e deve essere eseguito con una tecnica ed una cura particolare perché ha causato svariati e gravi incidenti:","il controllo del posizionamento del deltaplano.","il controllo dell’avvenuto aggancio del pilota al deltaplano.","il controllo del corretto ripiegamento del paracadute di emergenza.",2,4,hang
7063,"TECNICA DI PILOTAGGIO","Come è necessario verificare nel miglior modo l’avvenuto corretto aggancio del pilota al deltaplano?","Facendo sorreggere la chiglia del deltaplano da un assistente, disponendosi in posizione orizzontale di volo sospesi all’aggancio, verificando oltre all’aggancio stesso la posizione del corpo rispetto alla barra.","Agganciando il moschettone e verificando attentamente con un controllo visivo che l’aggancio stesso sia correttamente avvenuto.","Facendo verificare dall’assistente che l’aggancio sia stato correttamente effettuato.",1,4,hang
7064,"TECNICA DI PILOTAGGIO","Quali precauzioni si devono adottare se si intende decollare in deltaplano con vento sostenuto?","Durante la fase immediatamente precedente il decollo far tenere l’estremità alare da un solo assistente.","Accertarsi che durante il decollo nessuno degli assistenti trattenga l’ala.","Provvedere a che gli assistenti spingano adeguatamente la chiglia in fase di decollo.",2,4,hang
7065,"TECNICA DI PILOTAGGIO","Se il vento è angolato entro i 45° rispetto alla direzione di decollo, è possibile decollare in deltaplano e come?","No, anche se la componente è moderata.","Si, se la componente è limitata, correndo lungo la linea di massima pendenza con la prua parzialmente orientata contro vento.","Si, anche se la componente è sostenuta, purché si corra contro vento.",2,4,hang
7066,"TECNICA DI PILOTAGGIO","Se il pilota intraprende la corsa di decollo con il deltaplano molto cabrato:","il decollo avviene prima ed è possibile sorvolare con più margine eventuali ostacoli sulla traiettoria.","il decollo avviene a velocità più bassa ed è più semplice il controllo del deltaplano dopo il decollo.","il decollo avviene con incidenza troppo elevata, la traiettoria che ne risulta è ripida ed è alto il rischio di stallo.",3,4,hang
7067,"TECNICA DI PILOTAGGIO","È possibile l’interruzione di decollo in deltaplano e quali rischi comporta eventualmente?","Si, solo in caso di estrema necessità, con alta probabilità di danni alla struttura e conseguenze per il pilota.","Si, ogniqualvolta lo si ritenga necessario senza particolari problematiche se si conosce e si applica la tecnica corretta.","Si, purché non la si effettui quando si è prossimi allo stacco e si abbia una discreta esperienza.",1,4,hang
7068,"TECNICA DI PILOTAGGIO","Quando è opportuno che il pilota si sistemi nell’imbrago dopo il decollo in deltaplano?","Il più presto possibile dopo lo stacco.","Acquisito il completo controllo della velocità e della direzione, lontano dal pendio.","Non esistono limitazioni o tecniche particolari per sistemarsi nell’imbrago.",2,4,hang
7069,"TECNICA DI PILOTAGGIO","Come si può variare l’angolo d’incidenza in volo con il deltaplano?","Solo agendo sul dispositivo chiamato “overdrive”.","Appoggiando il peso del pilota sulla barra, indi spingendola o trazionandola.","Agendo sulla barra di controllo con movimenti di spinta o trazione.",3,4,hang
7070,"TECNICA DI PILOTAGGIO","Individuare la corretta sequenza per effettuare una virata in deltaplano:","presa di velocità, spostamento laterale del corpo rispetto alla barra parallelamente alla chiglia, spinta sulla barra per coordinare la virata, riposizionamento del corpo in posizione centrata rispetto alla barra.","presa di velocità, spostamento laterale del corpo rispetto alla barra parallelamente alla chiglia, riposizionamento del corpo in posizione centrata rispetto alla barra.","presa di velocità, spinta asimmetrica per ottenere una rotazione del deltaplano attorno all’asse verticale, contemporaneo spostamento laterale del corpo rispetto alla barra, riposizionamento del corpo in posizione centrata rispetto alla barra.",1,4,hang
7071,"TECNICA DI PILOTAGGIO","Quale errore di manovra causa generalmente una scivolata d’ala del deltaplano?","Mancata coordinazione dei movimenti durante l’esecuzione di una virata.","Mancata coordinazione dei movimenti ed insufficiente spinta sulla barra durante l’esecuzione di una virata.","Eccessiva spinta sulla barra durante una virata.",2,4,hang
7072,"TECNICA DI PILOTAGGIO","Come si esegue il controllo di rollio in deltaplano?","Facendo semplicemente ruotare l’asse del corpo rispetto alla barra.","Spostando lateralmente il corpo e facendo nello stesso tempo ruotare il suo asse rispetto alla barra.","Spostando lateralmente il corpo rispetto alla barra, sempre mantenendolo parallelo alla chiglia.",3,4,hang
7073,"TECNICA DI PILOTAGGIO","Un ala rigida vira:","grazie all’azione di comandi aerodinamici oltreché allo spostamento del peso.","grazie all’azione dei comandi aerodinamici.","grazie allo spostamento del peso.",1,4,hang
7074,"TECNICA DI PILOTAGGIO","A distanza di sicurezza dal terreno, come si esegue correttamente una prova di stallo in deltaplano?","Si spinge dolcemente e gradualmente sulla barra per aumentare l’angolo di incidenza sino allo stallo ed a stallo avvenuto si ottiene la rimessa riaumentando la velocità al mezzo.","Si spinge in avanti sui montanti per ottenere angoli d’incidenza più elevati, e si mantiene questa posizione per almeno 30 secondi.","Dopo adeguata presa di velocità si spinge sulla barra con decisione e rapidità per ottenere un brusco aumento dell’incidenza.",1,4,hang
7075,"TECNICA DI PILOTAGGIO","Come deve comportarsi il pilota di deltaplano una volta entrato in termica se vuole sfruttarla?","Mantenere il regime di minimo tasso di caduta ed effettuare delle virate di 360° per rimanere in termica.","Mantenere il regime di massima efficienza ed effettuare delle virate di 360° per rimanere in termica.","Mantenere sempre la minima velocità possibile ed effettuare delle virate accentuate di 360° per rimanere in termica.",1,4,hang
7076,"TECNICA DI PILOTAGGIO","Cosa è il tumbling?","È un manovra acrobatica.","È una manovra di discesa rapida.","È un rovesciamento in avanti del delta che si ha a seguito di fortissime turbolenze quali quelle dovute ai rotori.",3,4,hang
7077,"TECNICA DI PILOTAGGIO","Come è possibile intervenire per aumentare la velocità di trim del deltaplano?","Spostando indietro il punto di aggancio del pilota rispetto alla struttura.","Spostando in avanti il punto di aggancio del pilota rispetto alla struttura.","Spostando in alto il punto di aggancio del pilota rispetto alla struttura.",2,4,hang
7078,"TECNICA DI PILOTAGGIO","La corretta sequenza in finale per l’atterraggio con il deltaplano in condizioni di vento moderato è:","raccordare adeguatamente in prossimità del suolo, mantenendo una traiettoria orizzontale sino al momento di “aprire” per stallare il deltaplano alla minima velocità di sostentamento possibile.","raccordare adeguatamente a 4 o 5 metri dal suolo, mantenendo poi una traiettoria lievemente picchiata sino al momento di “aprire” per stallare il deltaplano ad una velocità ancora ben superiore alla minima di sostentamento.","raccordare adeguatamente in prossimità del suolo, mantenendo una traiettoria orizzontale sino in prossimità del punto di contatto prestabilito quindi “aprire” con decisione per stallare il deltaplano, indipendentemente dalla velocità raggiunta.",1,4,hang
7079,"TECNICA DI PILOTAGGIO","In quale momento ci si porta in posizione verticale per atterrare in deltaplano?","Appena si avverte che il deltaplano risente dell’effetto suolo dopo aver raccordato in finale per l’atterraggio.","In finale per l’atterraggio, durante la fase di raccordo in prossimità del suolo, prima di “aprire” per stallare il deltaplano.","Più tardi possibile durante l’apertura per stallare il deltaplano.",2,4,hang
8011,MATERIALI,"Che cosa è necessario verificare in corrispondenza di piombature di cavi e tiranti del deltaplano?","Che i cavi ed i tiranti non siano rotti sotto la piombatura.","Che le piombature siano semplicemente in buono stato.","Che le piombature siano in buono stato ed i cavi o tiranti non presentino segni di logoramento in vicinanza delle piombature stesse.",3,2,hang
8012,MATERIALI,"Se ci accorgiamo che qualche tirante del deltaplano è sfilacciato o logoro:","lo sostituiamo immediatamente prima di riandare in volo.","lo ripariamo alla meglio non potendolo sostituire immediatamente.","andiamo in volo facendo attenzione a non sollecitare la struttura con particolari manovre.",1,2,hang
8013,MATERIALI,"Durante l’ultimo volo in deltaplano abbiamo effettuato un atterraggio pesante. Il cross bar ed un montante si sono piegati:","riandiamo in volo avendo sostituito il montante e raddrizzato perfettamente il cross bar.","riandiamo in volo solo dopo aver sostituito il montante ed il cross bar con ricambi originali.","riandiamo in volo avendo raddrizzato perfettamente montante e cross bar.",2,2,hang
8014,MATERIALI,"Il materiale di cui sono rivestite le superfici di un deltaplano si deteriora particolarmente se esposto a lungo a:","raggi infrarossi.","raggi ultravioletti.","clima particolarmente secco.",2,2,hang
8015,MATERIALI,"Se si deve riporre il deltaplano per un lungo periodo dovremo aver cura di:","farlo in apposita sacca quando siamo certi che è perfettamente asciutto, sistemandolo in luogo meno umido possibile, lontano dalla luce del sole e da fonti di calore.","sistemarlo in apposita sacca dopo aver effettuato l’ultimo volo, riporlo su appositi supporti fissati alle pareti di uno scantinato dove non può essere raggiunto dalla luce del sole.","lasciarlo ripiegato senza sacca, sistemandolo possibilmente in uno scantinato o in garage dove non può essere raggiunto dalla luce del sole, possibilmente su appositi supporti fissati alle pareti.",1,2,hang
8016,MATERIALI,"Se in corrispondenza di qualche elemento costituente il corredo di tiranteria o bulloneria del deltaplano si riscontra presenza di ruggine:","è necessario prima di volare rimuoverla prontamente usando appositi prodotti antiruggine sul particolare interessato.","è possibile comunque intraprendere il volo purché si sia accertata l’integrità del particolare interessato.","è indispensabile sostituire il particolare in questione con altro idoneo di identiche caratteristiche, prima di intraprendere qualsiasi tipo di volo.",3,2,hang
9037,"SICUREZZA DEL VOLO","Decollo in deltaplano con vento sostenuto. L’utilizzo di un assistente che tocchi il delta all’inizio della rincorsa è rischioso perché:","l’assistente può essere trascinato giù dalla rampa o addirittura essere portato in volo.","non tutti gli assistenti danno adeguate garanzie di comportamento anche se ben istruiti dal pilota.","l’assistente, anche se esperto non può avere la sensibilità rispetto al mezzo che invece ha il pilota e quindi può imprimergli un assetto e una posizione non ottimali.",3,4,hang
9038,"SICUREZZA DEL VOLO","Il mancato o non corretto aggancio del pilota al deltaplano comporta:","gravissime conseguenze sempre.","la necessità di atterrare al più presto.","la necessità di ridurre le manovre allo stretto indispensabile per non precipitare.",1,4,hang
9039,"SICUREZZA DEL VOLO","Se per avaria strutturale il dispositivo antidrappo non dovesse entrare in funzione quando necessario, una volta innescata la caduta a drappo:","è bene cercare prima di uscirne con l’uso dei comandi e del peso, non c’è fretta per l’uso del paracadute di soccorso.","è bene fare uso immediato del paracadute di soccorso, prima che la velocità verticale sia troppo elevata.","è bene attendere che la velocità di caduta sia molto elevata prima di aprire il paracadute di soccorso, al fine di ottenerne l’immediata apertura.",2,4,hang
9040,"SICUREZZA DEL VOLO","Le sollecitazioni che rendono pericoloso il looping eseguito con il deltaplano sono indotte:","solo dalla velocità che è necessaria assumere prima di iniziare la manovra di cabrata.","solo dalle accelerazioni cui è sottoposto il mezzo durante tutta la manovra.","dalla velocità elevata che è necessario assumere prima di iniziare la manovra di cabrata e dalle accelerazioni cui è sottoposto il deltaplano durante tutta la manovra.",3,4,hang
9041,"SICUREZZA DEL VOLO","Che cosa s’intende per tumbling del deltaplano?","Una brusca rotazione incontrollata attorno all’asse d’imbardata.","Una brusca rotazione incontrollata attorno all’asse trasversale.","Una brusca rotazione incontrollata attorno all’asse longitudinale.",2,4,hang
9042,"SICUREZZA DEL VOLO","Quali elementi, tra i seguenti, contribuiscono a provocare il tumbling del deltaplano?","Un angolo d’incidenza troppo elevato associato a condizioni di turbolenza.","Una velocità troppo elevata in condizioni di forte turbolenza.","Virate in condizioni di ascendenza.",1,4,hang

27
vds-app/App/components/ExamQuestions.js

@ -1,3 +1,6 @@
import React from "react"
import { AsyncStorage } from "react-native"
import aerodynamicsQuestions from "../data/aerodynamics" import aerodynamicsQuestions from "../data/aerodynamics"
import firstAidQuestions from "../data/firstAid" import firstAidQuestions from "../data/firstAid"
import flightSafetyQuestions from "../data/flightSafety" import flightSafetyQuestions from "../data/flightSafety"
@ -25,14 +28,22 @@ const allQuestions = {
} }
const generateQuestions = () => { const generateQuestions = () => {
examScheme.forEach( (elem) => {
let currentSection = allQuestions[elem.section]
for(let i=0; i<elem.questions; i++) {
const currentIndex = Math.floor(Math.random() * currentSection.length)
tmpQuestions.push(currentSection[currentIndex])
currentSection = currentSection.filter( (item, index) => index != currentIndex)
}
})
AsyncStorage.getItem('setupData').then((value) => {
let setupData = JSON.parse(value)
console.log('generateQuestions setupData',setupData)
examScheme.forEach( (elem) => {
let currentSection = setupData.excludeDelta ? allQuestions[elem.section].filter(item => !item.delta) : allQuestions[elem.section]
for(let i=0; i<elem.questions; i++) {
const currentIndex = Math.floor(Math.random() * currentSection.length)
tmpQuestions.push(currentSection[currentIndex])
currentSection = currentSection.filter( (item, index) => index != currentIndex)
}
})
}).done()
} }
generateQuestions() generateQuestions()

4
vds-app/App/components/Variables.js

@ -49,6 +49,7 @@ export const texts = {
recap: "Visualizza errori", recap: "Visualizza errori",
recapTitle: "Riepilogo risposte sbagliate", recapTitle: "Riepilogo risposte sbagliate",
infoTitle: "Informazioni App", infoTitle: "Informazioni App",
setupTitle: "Setup",
dictionaryTitle: "Terminologia", dictionaryTitle: "Terminologia",
dictionarySubtitle: "Dizionario ICAO e abbreviazioni", dictionarySubtitle: "Dizionario ICAO e abbreviazioni",
alphabethTitle: "Alfabeto ICAO", alphabethTitle: "Alfabeto ICAO",
@ -72,6 +73,9 @@ export const texts = {
materials: "Materiali", materials: "Materiali",
flightSafety: "Sicurezza del volo", flightSafety: "Sicurezza del volo",
examScheme: "Schema domande d'esame", examScheme: "Schema domande d'esame",
setupScheme: "Setup dell'applicazione",
setupRandomCheck: "Visualizza le domande per argomento in ordine casuale",
setupExcludeDelta: "Escludi le domande relative all'esame per deltaplano",
resultsScheme: "Calcolo risultati", resultsScheme: "Calcolo risultati",
true: "Vero", true: "Vero",
false: "Falso", false: "Falso",

1
vds-app/App/data/aerodynamics.js

@ -2921,6 +2921,7 @@ const questions = [
}, },
{ {
"id": "2147", "id": "2147",
"delta": true,
"question": "Volando in prossimità del terreno il deltaplano acquista prestazioni. Ciò è dovuto:", "question": "Volando in prossimità del terreno il deltaplano acquista prestazioni. Ciò è dovuto:",
"points": "3", "points": "3",
"answers": [ "answers": [

6
vds-app/App/data/flightSafety.js

@ -721,6 +721,7 @@ const questions = [
}, },
{ {
"id": "9037", "id": "9037",
"delta": true,
"question": "Decollo in deltaplano con vento sostenuto. L’utilizzo di un assistente che tocchi il delta all’inizio della rincorsa è rischioso perché:", "question": "Decollo in deltaplano con vento sostenuto. L’utilizzo di un assistente che tocchi il delta all’inizio della rincorsa è rischioso perché:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -741,6 +742,7 @@ const questions = [
}, },
{ {
"id": "9038", "id": "9038",
"delta": true,
"question": "Il mancato o non corretto aggancio del pilota al deltaplano comporta:", "question": "Il mancato o non corretto aggancio del pilota al deltaplano comporta:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -761,6 +763,7 @@ const questions = [
}, },
{ {
"id": "9039", "id": "9039",
"delta": true,
"question": "Se per avaria strutturale il dispositivo antidrappo non dovesse entrare in funzione quando necessario, una volta innescata la caduta a drappo:", "question": "Se per avaria strutturale il dispositivo antidrappo non dovesse entrare in funzione quando necessario, una volta innescata la caduta a drappo:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -781,6 +784,7 @@ const questions = [
}, },
{ {
"id": "9040", "id": "9040",
"delta": true,
"question": "Le sollecitazioni che rendono pericoloso il looping eseguito con il deltaplano sono indotte:", "question": "Le sollecitazioni che rendono pericoloso il looping eseguito con il deltaplano sono indotte:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -801,6 +805,7 @@ const questions = [
}, },
{ {
"id": "9041", "id": "9041",
"delta": true,
"question": "Che cosa s’intende per tumbling del deltaplano?", "question": "Che cosa s’intende per tumbling del deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -821,6 +826,7 @@ const questions = [
}, },
{ {
"id": "9042", "id": "9042",
"delta": true,
"question": "Quali elementi, tra i seguenti, contribuiscono a provocare il tumbling del deltaplano?", "question": "Quali elementi, tra i seguenti, contribuiscono a provocare il tumbling del deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [

6
vds-app/App/data/materials.js

@ -201,6 +201,7 @@ const questions = [
}, },
{ {
"id": "8011", "id": "8011",
"delta": true,
"question": "Che cosa è necessario verificare in corrispondenza di piombature di cavi e tiranti del deltaplano?", "question": "Che cosa è necessario verificare in corrispondenza di piombature di cavi e tiranti del deltaplano?",
"points": "2", "points": "2",
"answers": [ "answers": [
@ -221,6 +222,7 @@ const questions = [
}, },
{ {
"id": "8012", "id": "8012",
"delta": true,
"question": "Se ci accorgiamo che qualche tirante del deltaplano è sfilacciato o logoro:", "question": "Se ci accorgiamo che qualche tirante del deltaplano è sfilacciato o logoro:",
"points": "2", "points": "2",
"answers": [ "answers": [
@ -241,6 +243,7 @@ const questions = [
}, },
{ {
"id": "8013", "id": "8013",
"delta": true,
"question": "Durante l’ultimo volo in deltaplano abbiamo effettuato un atterraggio pesante. Il cross bar ed un montante si sono piegati:", "question": "Durante l’ultimo volo in deltaplano abbiamo effettuato un atterraggio pesante. Il cross bar ed un montante si sono piegati:",
"points": "2", "points": "2",
"answers": [ "answers": [
@ -261,6 +264,7 @@ const questions = [
}, },
{ {
"id": "8014", "id": "8014",
"delta": true,
"question": "Il materiale di cui sono rivestite le superfici di un deltaplano si deteriora particolarmente se esposto a lungo a:", "question": "Il materiale di cui sono rivestite le superfici di un deltaplano si deteriora particolarmente se esposto a lungo a:",
"points": "2", "points": "2",
"answers": [ "answers": [
@ -281,6 +285,7 @@ const questions = [
}, },
{ {
"id": "8015", "id": "8015",
"delta": true,
"question": "Se si deve riporre il deltaplano per un lungo periodo dovremo aver cura di:", "question": "Se si deve riporre il deltaplano per un lungo periodo dovremo aver cura di:",
"points": "2", "points": "2",
"answers": [ "answers": [
@ -301,6 +306,7 @@ const questions = [
}, },
{ {
"id": "8016", "id": "8016",
"delta": true,
"question": "Se in corrispondenza di qualche elemento costituente il corredo di tiranteria o bulloneria del deltaplano si riscontra presenza di ruggine:", "question": "Se in corrispondenza di qualche elemento costituente il corredo di tiranteria o bulloneria del deltaplano si riscontra presenza di ruggine:",
"points": "2", "points": "2",
"answers": [ "answers": [

18
vds-app/App/data/pilotingTechniques.js

@ -1221,6 +1221,7 @@ const questions = [
}, },
{ {
"id": "7062", "id": "7062",
"delta": true,
"question": "Decollo in deltaplano. Tra i controlli di sicurezza pre-decollo, uno in particolare risulta essenziale e deve essere eseguito con una tecnica ed una cura particolare perché ha causato svariati e gravi incidenti:", "question": "Decollo in deltaplano. Tra i controlli di sicurezza pre-decollo, uno in particolare risulta essenziale e deve essere eseguito con una tecnica ed una cura particolare perché ha causato svariati e gravi incidenti:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1241,6 +1242,7 @@ const questions = [
}, },
{ {
"id": "7063", "id": "7063",
"delta": true,
"question": "Come è necessario verificare nel miglior modo l’avvenuto corretto aggancio del pilota al deltaplano?", "question": "Come è necessario verificare nel miglior modo l’avvenuto corretto aggancio del pilota al deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1261,6 +1263,7 @@ const questions = [
}, },
{ {
"id": "7064", "id": "7064",
"delta": true,
"question": "Quali precauzioni si devono adottare se si intende decollare in deltaplano con vento sostenuto?", "question": "Quali precauzioni si devono adottare se si intende decollare in deltaplano con vento sostenuto?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1281,6 +1284,7 @@ const questions = [
}, },
{ {
"id": "7065", "id": "7065",
"delta": true,
"question": "Se il vento è angolato entro i 45° rispetto alla direzione di decollo, è possibile decollare in deltaplano e come?", "question": "Se il vento è angolato entro i 45° rispetto alla direzione di decollo, è possibile decollare in deltaplano e come?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1301,6 +1305,7 @@ const questions = [
}, },
{ {
"id": "7066", "id": "7066",
"delta": true,
"question": "Se il pilota intraprende la corsa di decollo con il deltaplano molto cabrato:", "question": "Se il pilota intraprende la corsa di decollo con il deltaplano molto cabrato:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1321,6 +1326,7 @@ const questions = [
}, },
{ {
"id": "7067", "id": "7067",
"delta": true,
"question": "È possibile l’interruzione di decollo in deltaplano e quali rischi comporta eventualmente?", "question": "È possibile l’interruzione di decollo in deltaplano e quali rischi comporta eventualmente?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1341,6 +1347,7 @@ const questions = [
}, },
{ {
"id": "7068", "id": "7068",
"delta": true,
"question": "Quando è opportuno che il pilota si sistemi nell’imbrago dopo il decollo in deltaplano?", "question": "Quando è opportuno che il pilota si sistemi nell’imbrago dopo il decollo in deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1361,6 +1368,7 @@ const questions = [
}, },
{ {
"id": "7069", "id": "7069",
"delta": true,
"question": "Come si può variare l’angolo d’incidenza in volo con il deltaplano?", "question": "Come si può variare l’angolo d’incidenza in volo con il deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1381,6 +1389,7 @@ const questions = [
}, },
{ {
"id": "7070", "id": "7070",
"delta": true,
"question": "Individuare la corretta sequenza per effettuare una virata in deltaplano:", "question": "Individuare la corretta sequenza per effettuare una virata in deltaplano:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1401,6 +1410,7 @@ const questions = [
}, },
{ {
"id": "7071", "id": "7071",
"delta": true,
"question": "Quale errore di manovra causa generalmente una scivolata d’ala del deltaplano?", "question": "Quale errore di manovra causa generalmente una scivolata d’ala del deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1421,6 +1431,7 @@ const questions = [
}, },
{ {
"id": "7072", "id": "7072",
"delta": true,
"question": "Come si esegue il controllo di rollio in deltaplano?", "question": "Come si esegue il controllo di rollio in deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1441,6 +1452,7 @@ const questions = [
}, },
{ {
"id": "7073", "id": "7073",
"delta": true,
"question": "Un ala rigida vira:", "question": "Un ala rigida vira:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1461,6 +1473,7 @@ const questions = [
}, },
{ {
"id": "7074", "id": "7074",
"delta": true,
"question": "A distanza di sicurezza dal terreno, come si esegue correttamente una prova di stallo in deltaplano?", "question": "A distanza di sicurezza dal terreno, come si esegue correttamente una prova di stallo in deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1481,6 +1494,7 @@ const questions = [
}, },
{ {
"id": "7075", "id": "7075",
"delta": true,
"question": "Come deve comportarsi il pilota di deltaplano una volta entrato in termica se vuole sfruttarla?", "question": "Come deve comportarsi il pilota di deltaplano una volta entrato in termica se vuole sfruttarla?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1501,6 +1515,7 @@ const questions = [
}, },
{ {
"id": "7076", "id": "7076",
"delta": true,
"question": "Cosa è il tumbling?", "question": "Cosa è il tumbling?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1521,6 +1536,7 @@ const questions = [
}, },
{ {
"id": "7077", "id": "7077",
"delta": true,
"question": "Come è possibile intervenire per aumentare la velocità di trim del deltaplano?", "question": "Come è possibile intervenire per aumentare la velocità di trim del deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1541,6 +1557,7 @@ const questions = [
}, },
{ {
"id": "7078", "id": "7078",
"delta": true,
"question": "La corretta sequenza in finale per l’atterraggio con il deltaplano in condizioni di vento moderato è:", "question": "La corretta sequenza in finale per l’atterraggio con il deltaplano in condizioni di vento moderato è:",
"points": "4", "points": "4",
"answers": [ "answers": [
@ -1561,6 +1578,7 @@ const questions = [
}, },
{ {
"id": "7079", "id": "7079",
"delta": true,
"question": "In quale momento ci si porta in posizione verticale per atterrare in deltaplano?", "question": "In quale momento ci si porta in posizione verticale per atterrare in deltaplano?",
"points": "4", "points": "4",
"answers": [ "answers": [

7
vds-app/App/index.js

@ -11,6 +11,7 @@ import ResultsTrueFalse from "./screens/ResultsTrueFalse"
import Recap from "./screens/Recap" import Recap from "./screens/Recap"
import RecapTrueFalse from "./screens/RecapTrueFalse" import RecapTrueFalse from "./screens/RecapTrueFalse"
import Info from "./screens/Info" import Info from "./screens/Info"
import Setup from "./screens/Setup"
import Dictionary from "./screens/Dictionary" import Dictionary from "./screens/Dictionary"
import { colors, texts} from "./components/Variables" import { colors, texts} from "./components/Variables"
@ -92,6 +93,12 @@ const MainStack = createStackNavigator({
navigationOptions: ({ navigation }) => ({ navigationOptions: ({ navigation }) => ({
header: null header: null
}) })
},
Setup: {
screen: Setup,
navigationOptions: ({ navigation }) => ({
header: null
})
} }
}) })

34
vds-app/App/screens/Exam.js

@ -1,5 +1,5 @@
import React from "react" import React from "react"
import { View, ScrollView, StyleSheet, StatusBar, Text, SafeAreaView, ImageBackground, BackHandler } from "react-native"
import { View, ScrollView, StyleSheet, StatusBar, Text, SafeAreaView, ImageBackground, BackHandler, AsyncStorage } from "react-native"
import { Button, ButtonContainer } from "../components/Button" import { Button, ButtonContainer } from "../components/Button"
import { colors, texts, examScheme } from "../components/Variables" import { colors, texts, examScheme } from "../components/Variables"
@ -106,19 +106,27 @@ class Exam extends React.Component {
handleBackButton = () => { handleBackButton = () => {
let tmpQuestions = [] let tmpQuestions = []
examScheme.forEach( (elem) => {
let currentSection = allQuestions[elem.section]
for(let i=0; i<elem.questions; i++) {
const currentIndex = Math.floor(Math.random() * currentSection.length)
tmpQuestions.push(currentSection[currentIndex])
currentSection = currentSection.filter( (item, index) => index != currentIndex)
}
})
this.props.navigation.navigate("Splash", {
examQuestions: tmpQuestions
})
return true
AsyncStorage.getItem('setupData').then((value) => {
let setupData = JSON.parse(value)
console.log('handleBackButton setupData',setupData)
examScheme.forEach( (elem) => {
let currentSection = setupData.excludeDelta ? allQuestions[elem.section].filter(item => !item.delta) : allQuestions[elem.section]
for(let i=0; i<elem.questions; i++) {
const currentIndex = Math.floor(Math.random() * currentSection.length)
tmpQuestions.push(currentSection[currentIndex])
currentSection = currentSection.filter( (item, index) => index != currentIndex)
}
})
this.props.navigation.navigate("Splash", {
examQuestions: tmpQuestions
})
return true
}).done()
} }
showResults = () => { showResults = () => {

19
vds-app/App/screens/Quiz.js

@ -1,5 +1,5 @@
import React from "react" import React from "react"
import { View, ScrollView, StyleSheet, StatusBar, Text, SafeAreaView, Dimensions, ImageBackground, BackHandler } from "react-native"
import { View, ScrollView, StyleSheet, StatusBar, Text, SafeAreaView, Dimensions, ImageBackground, BackHandler, AsyncStorage } from "react-native"
import { AdMobBanner } from "expo-ads-admob" import { AdMobBanner } from "expo-ads-admob"
import { Button, ButtonContainer } from "../components/Button" import { Button, ButtonContainer } from "../components/Button"
@ -71,11 +71,14 @@ class Quiz extends React.Component {
totalCount: this.props.navigation.getParam("questions", []).length, totalCount: this.props.navigation.getParam("questions", []).length,
availableIds: this.props.navigation.getParam("questions", []).map(a => a.id), availableIds: this.props.navigation.getParam("questions", []).map(a => a.id),
activeQuestionId: this.props.navigation.getParam("questions", [])[ activeQuestionId: this.props.navigation.getParam("questions", [])[
Math.floor(Math.random() * this.props.navigation.getParam("questions", []).length)
this.props.navigation.getParam("randomQuestions") ?
Math.floor(Math.random() * this.props.navigation.getParam("questions", []).length) : 0
].id, ].id,
answered: false, answered: false,
answerCorrect: false, answerCorrect: false,
results: false
results: false,
setupData: {}
} }
bannerError = (e) => { bannerError = (e) => {
@ -84,6 +87,14 @@ class Quiz extends React.Component {
componentDidMount() { componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackButton) BackHandler.addEventListener('hardwareBackPress', this.handleBackButton)
AsyncStorage.getItem('setupData').then((value) => {
this.setState( (state) => {
return {
setupData: JSON.parse(value)
}
})
})
} }
componentWillUnmount() { componentWillUnmount() {
@ -128,7 +139,7 @@ class Quiz extends React.Component {
nextQuestion = () => { nextQuestion = () => {
const updatedIndexes = this.state.availableIds.filter( item => item != this.state.activeQuestionId) const updatedIndexes = this.state.availableIds.filter( item => item != this.state.activeQuestionId)
const nextId = updatedIndexes[Math.floor(Math.random() * updatedIndexes.length)]
const nextId = this.props.navigation.getParam("randomQuestions") ? updatedIndexes[Math.floor(Math.random() * updatedIndexes.length)] : updatedIndexes[0]
let resultsShow = (this.state.timer <= 1 || (this.state.correctCount+this.state.wrongCount) == this.state.totalCount) ? true : false let resultsShow = (this.state.timer <= 1 || (this.state.correctCount+this.state.wrongCount) == this.state.totalCount) ? true : false
if (!updatedIndexes.length) { if (!updatedIndexes.length) {

165
vds-app/App/screens/QuizIndex.js

@ -40,19 +40,29 @@ const styles = StyleSheet.create({
class QuizIndex extends React.Component { class QuizIndex extends React.Component {
state = { state = {
storeWrongAnswers: []
storeWrongAnswers: [],
randomQuestions: false,
excludeDelta: false
} }
componentDidMount() { componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackButton) BackHandler.addEventListener('hardwareBackPress', this.handleBackButton)
AsyncStorage.getItem('storeWrongAnswers').then((value) => { AsyncStorage.getItem('storeWrongAnswers').then((value) => {
//console.log('storeWrongAnswers: ', JSON.parse(value))
this.setState( (state) => { this.setState( (state) => {
return { return {
storeWrongAnswers: JSON.parse(value) storeWrongAnswers: JSON.parse(value)
} }
}) })
}).done() }).done()
AsyncStorage.getItem('setupData').then((value) => {
this.setState( (state) => {
return {
randomQuestions: JSON.parse(value).randomQuestions,
excludeDelta: JSON.parse(value).excludeDelta
}
})
}).done()
} }
componentWillUnmount() { componentWillUnmount() {
@ -70,68 +80,95 @@ class QuizIndex extends React.Component {
<ScrollView > <ScrollView >
<View style={{marginVertical: 60}}> <View style={{marginVertical: 60}}>
<RowItem name={texts.aerodynamics} subtitle={aerodynamicsQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.aerodynamics,
questions: aerodynamicsQuestions,
color: colors.blue
})}/>
<RowItem name={texts.first_aid} subtitle={firstAidQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.first_aid,
questions: firstAidQuestions,
color: colors.blue
})}/>
<RowItem name={texts.flight_safety} subtitle={flightSafetyQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.flight_safety,
questions: flightSafetyQuestions,
color: colors.blue
})}/>
<RowItem name={texts.instruments} subtitle={instrumentsQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.instruments,
questions: instrumentsQuestions,
color: colors.blue
})}/>
<RowItem name={texts.legislation} subtitle={legislationQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.legislation,
questions: legislationQuestions,
color: colors.blue
})}/>
<RowItem name={texts.materials} subtitle={materialsQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.materials,
questions: materialsQuestions,
color: colors.blue
})}/>
<RowItem name={texts.meteorology} subtitle={meteorologyQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.meteorology,
questions: meteorologyQuestions,
color: colors.blue
})}/>
<RowItem name={texts.physiopathology} subtitle={physiopathologyQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.physiopathology,
questions: physiopathologyQuestions,
color: colors.blue
})}/>
<RowItem name={texts.piloting_techniques} subtitle={pilotingTechniquesQuestions.length} textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.piloting_techniques,
questions: pilotingTechniquesQuestions,
color: colors.blue
})}/>
<RowItem name={texts.aerodynamics} subtitle={this.state.excludeDelta ? aerodynamicsQuestions.filter(item => !item.delta).length : aerodynamicsQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.aerodynamics,
questions: aerodynamicsQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.first_aid} subtitle={this.state.excludeDelta ? firstAidQuestions.filter(item => !item.delta).length : firstAidQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.first_aid,
questions: firstAidQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.flight_safety} subtitle={this.state.excludeDelta ? flightSafetyQuestions.filter(item => !item.delta).length : flightSafetyQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.flight_safety,
questions: flightSafetyQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.instruments} subtitle={this.state.excludeDelta ? instrumentsQuestions.filter(item => !item.delta).length : instrumentsQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.instruments,
questions: instrumentsQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.legislation} subtitle={this.state.excludeDelta ? legislationQuestions.filter(item => !item.delta).length : legislationQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.legislation,
questions: legislationQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.materials} subtitle={this.state.excludeDelta ? materialsQuestions.filter(item => !item.delta).length : materialsQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.materials,
questions: materialsQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.meteorology} subtitle={this.state.excludeDelta ? meteorologyQuestions.filter(item => !item.delta).length : meteorologyQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.meteorology,
questions: meteorologyQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.physiopathology} subtitle={this.state.excludeDelta ? physiopathologyQuestions.filter(item => !item.delta).length : physiopathologyQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.physiopathology,
questions: physiopathologyQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
<RowItem name={texts.piloting_techniques} subtitle={this.state.excludeDelta ? pilotingTechniquesQuestions.filter(item => !item.delta).length : pilotingTechniquesQuestions.length}
textColor={colors.white} onPress={()=>
this.props.navigation.navigate("Quiz", {
title: texts.piloting_techniques,
questions: pilotingTechniquesQuestions.filter(item => !item.delta),
randomQuestions: this.state.randomQuestions,
color: colors.blue
})
}/>
</View> </View>
</ScrollView> </ScrollView>

217
vds-app/App/screens/Setup.js

@ -0,0 +1,217 @@
import React from "react"
import { View, ScrollView, StyleSheet, StatusBar, Text, CheckBox, SafeAreaView, Dimensions, Image, BackHandler, AsyncStorage} from "react-native"
import { Button, ButtonContainer } from "../components/Button"
import { colors, texts, examScheme, resultsScheme} from "../components/Variables"
const screen = Dimensions.get("window")
const header = require("../assets/header.png")
const pkg = require('../../app.json')
const styles = StyleSheet.create({
container: {
backgroundColor: colors.dark_blue,
flex: 1
},
safearea: {
flex: 1,
marginTop: 25,
justifyContent: "space-between",
paddingHorizontal: 10
},
box: {
width: screen.width-20,
paddingHorizontal: 10
},
text: {
color: colors.white,
fontSize: 16,
textAlign: "center",
fontWeight: "400",
lineHeight: 20,
textShadowColor: 'rgba(0, 0, 0, 0.75)',
textShadowOffset: {width: -1, height: 1},
textShadowRadius: 5
},
title: {
paddingTop: 30,
color: colors.white,
fontSize: 18,
textTransform: "uppercase",
textAlign: "center",
fontWeight: "400",
lineHeight: 20,
textShadowColor: 'rgba(0, 0, 0, 0.75)',
textShadowOffset: {width: -1, height: 1},
textShadowRadius: 5
},
textSmall: {
lineHeight: 23,
marginTop: 15,
borderRadius: 20,
backgroundColor: colors.white,
borderWidth: 0,
borderColor: colors.white_alpha,
fontSize: 16,
color: colors.white,
fontWeight: "400",
textAlign: "center",
paddingHorizontal: 20,
paddingVertical: 20,
textShadowColor: 'rgba(0, 0, 0, 0.75)',
textShadowOffset: {width: -1, height: 1},
textShadowRadius: 5
},
textItems: {
fontSize: 16,
fontWeight: "400",
lineHeight: 23,
color: colors.white,
textAlign: "center",
paddingBottom: 10,
marginBottom: 10,
borderBottomColor: colors.white_alpha,
borderBottomWidth: 1,
textShadowColor: 'rgba(0, 0, 0, 0.55)',
textShadowOffset: {width: -1, height: 1},
textShadowRadius: 2
},
noBorder: {
borderBottomWidth: 0
},
item: {
width: "100%"
},
noPadding: {
paddingVertical: 0,
},
textLabel: {
paddingHorizontal: 20,
paddingVertical: 20
},
bold: {
lineHeight: 30,
fontSize: 26,
fontWeight: "600"
},
checkboxContainer: {
flexDirection: "row",
paddingBottom: 10,
marginBottom: 10,
borderBottomColor: colors.black_alpha,
borderBottomWidth: 1,
},
checkbox: {
alignSelf: "center",
color: "white"
},
checkboxLabel: {
marginLeft: 8,
marginRight: 8
}
})
const B = (props) => <Text style={{fontWeight: 'bold'}}>{props.children}</Text>
class Setup extends React.Component {
state = {
setupData: {}
}
componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackButton)
AsyncStorage.getItem('setupData').then((value) => {
let setupData = {}
if(!value) {
setupData = {
randomQuestions: true,
excludeDelta: false
}
AsyncStorage.setItem('setupData', JSON.stringify(setupData))
} else {
setupData = JSON.parse(value)
}
this.setState( (state) => {
return {
setupData: setupData
}
})
}).done()
}
componentWillUnmount() {
BackHandler.removeEventListener('hardwareBackPress', this.handleBackButton)
}
handleBackButton = () => {
this.props.navigation.navigate("Splash")
return true
}
changeSetup = (item) => {
setupData = this.state.setupData
setupData[item] = !this.state.setupData[item]
this.setState( (state) => {
return {
setupData: setupData
}
})
AsyncStorage.setItem('setupData', JSON.stringify(setupData))
}
render() {
return (
<View style={styles.container} >
<SafeAreaView style={styles.safearea}>
<ScrollView>
<View style={styles.box}>
<Text style={styles.title}>
{texts.setupScheme}
</Text>
<View style={styles.textSmall}>
<View style={styles.checkboxContainer}>
<CheckBox
value={this.state.setupData.randomQuestions}
onValueChange={() => this.changeSetup('randomQuestions')}
style={styles.checkbox}
/>
<Text style={styles.checkboxLabel}>{texts.setupRandomCheck}</Text>
</View>
<View style={styles.checkboxContainer}>
<CheckBox
value={this.state.setupData.excludeDelta}
onValueChange={() => this.changeSetup('excludeDelta')}
style={styles.checkbox}
/>
<Text style={styles.checkboxLabel}>{texts.setupExcludeDelta}</Text>
</View>
</View>
</View>
</ScrollView>
</SafeAreaView>
</View>
)
}
}
export default Setup

9
vds-app/App/screens/Splash.js

@ -243,6 +243,15 @@ class Splash extends React.Component {
color={colors.white_alpha} color={colors.white_alpha}
onPress={() => this.props.navigation.navigate("Info", {})} onPress={() => this.props.navigation.navigate("Info", {})}
/> />
<Button
text={texts.setupTitle}
isBig={false}
hasBg={true}
noPadding={true}
hasShadow={true}
color={colors.white_alpha}
onPress={() => this.props.navigation.navigate("Setup", {})}
/>
<Button <Button
text={texts.exit} text={texts.exit}
isBig={false} isBig={false}

5
vds-app/package.json

@ -16,8 +16,9 @@
"react": "16.8.3", "react": "16.8.3",
"react-native": "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz", "react-native": "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
"react-native-admob": "1.3.2", "react-native-admob": "1.3.2",
"react-native-gesture-handler": "~1.3.0",
"react-native-reanimated": "~1.2.0",
"react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.2.0",
"react-native-screens": "^2.9.0",
"react-navigation": "^3.6.1" "react-navigation": "^3.6.1"
}, },
"devDependencies": { "devDependencies": {

Loading…
Cancel
Save