-------------------------------------------------------------------- -- lib/conf.lua : configuration (drone.conf), cree avec des valeurs -- par defaut commentees. Les surcharges de la page PARAM (persistees -- dans drone.etat) PRIMENT sur ce fichier sans l'ecraser. -------------------------------------------------------------------- local Conf = {} local DEFAUT = [[ -- drone.conf : configuration du drone V2. Relire puis passer -- verifie a true pour supprimer l'alerte au demarrage. { verifie = false, DIST_SOL = 1.6, -- optical: distance "au sol" (blocs) ANGLE_MAX = 1.5, -- inclinaison max toleree (degres) VITESSE_ATTERRISSAGE = 1.0,-- descente du mode atterrissage (b/s) V_MONTEE_MAX = 3.0, -- vitesse verticale max montee (b/s) V_DESCENTE_MAX = 2.0, -- vitesse verticale max descente (b/s) RAMPE = 3.0, -- rampe de consigne d'altitude (b/s) VMAX = 256, -- borne des RSC ASSIETTE_PLAFOND = 0.5, -- autorite assiette: fraction du rpm -- de sustentation -- gains par defaut; les calibrations altitude / inclinaison les -- remplacent (persistes en surcharges, retouchables page PARAM) PID = { alt = { kp = 1.0 }, -- err alt -> v cible (1/s) vitesse = { kp = 4, ki = 4, kd = 1 }, -- v -> delta rpm tangage = { kp = 1.5, ki = 0.1, kd = 2 }, roulis = { kp = 1.5, ki = 0.1, kd = 2 }, }, -- garde-fous de la regulation (anti claquage 0 <-> max) REGUL = { DELTA_MAX = 0.6, -- sortie de la boucle de vitesse bornee a -- +- fraction du rpm de sustentation PENTE = 2.0, -- pente max de la base: fraction de la -- sustentation PAR SECONDE (les helices ont -- un temps de transition reel) FILTRE_V = 0.5, -- lissage de la vitesse verticale (1 = brut) V_ABERRANT = 15, -- |v| au-dela: mesure rejetee (b/s) }, MOTEUR = { MARGE = 0.15, -- adaptatif: capacite >= besoin*(1+m) SECURITE = 0.95, -- garde: besoin borne a capacite*s }, CARBURANT = { LISSAGE = 0.1, -- EMA de la consommation PERIODE = 5, -- periode de mesure (s) SEUIL_ALERTE = 0.15, -- alerte sous 15%% }, BOITE = { RSC_CIBLE = 180, -- calib: rpm RSC vise en sustentation RSC_HAUT = 200, -- vol: au-dela -> rapport suivant (k+1) RSC_BAS = 90, -- vol: en-deca -> rapport precedent -- (k-1, meilleure resolution) ATTENTE = 3.0, -- temps mort entre deux changements (s) }, CALIB = { RPM_MANUEL = 10, -- rscman: rpm de reperage SEUIL_JOYSTICK = 8, -- niveau declarant une face (0..15) ATTENTE_NIVEAU = 0.6, -- balayage moteur: attente par niveau RAMPE_DECOLLAGE = 2, -- calib altitude: rpm/s de la rampe RELAIS_DUREE = 25, -- relais: duree max d'un essai (s) RELAIS_FRACTION = 0.15, -- relais: d = fraction du rpm hover }, } ]] -- fusion recursive: les valeurs de l'utilisateur PRIMENT, les cles -- absentes (nouvelles versions) sont completees par les defauts local function fusionner(defauts, utilisateur, manquantes, prefixe) local resultat = {} for cle, valeur in pairs(defauts) do local sienne = utilisateur[cle] if type(valeur) == "table" and type(sienne) == "table" then resultat[cle] = fusionner(valeur, sienne, manquantes, prefixe .. cle .. ".") elseif sienne ~= nil then resultat[cle] = sienne else resultat[cle] = valeur table.insert(manquantes, prefixe .. tostring(cle)) end end for cle, valeur in pairs(utilisateur) do if resultat[cle] == nil then resultat[cle] = valeur end end return resultat end function Conf.charger(journal) if not fs.exists("drone.conf") then local f = fs.open("drone.conf", "w") f.write(DEFAUT) f.close() journal.alerte("drone.conf cree avec les valeurs par defaut: " .. "A PERSONNALISER") end local f = fs.open("drone.conf", "r") local contenu = f.readAll() f.close() local conf = textutils.unserialize(contenu) if not conf then error("drone.conf illisible: corriger ou supprimer le fichier", 0) end -- MIGRATION: un drone.conf d'une version anterieure peut manquer -- de sections (ex: REGUL): elles sont completees par les defauts local defauts = textutils.unserialize(DEFAUT) local manquantes = {} conf = fusionner(defauts, conf, manquantes, "") if #manquantes > 0 then journal.alerte(("drone.conf: %d parametre(s) absent(s) " .. "complete(s) par defaut (%s%s)"):format(#manquantes, table.concat(manquantes, ", ", 1, math.min(4, #manquantes)), #manquantes > 4 and ", ..." or "")) end if not conf.verifie then journal.alerte("drone.conf non verifie: relire les parametres " .. "puis passer verifie a true") end return conf end return Conf