Gilhad by to SAMOZŘEJMĚ napsal jinak, protože má za sebou jiný programátorský vývoj, jiné zvyky, zlozvyky, zkušenosti, četl jiné programy (a v mnoha jiných jazycích) a tak vůbec.
Navíc, když to četl, přišlo mu to takové nějak nevzhledné, upocené, nepřehledné ...
Takže ano, sice o pavoukovi a jeho systému nic nevím, ale nějak jinak by to bylo určitě. Těžko říct jak.
Rozhodně bych s těma millis zacházel jako v těch odkazech. Ono to sice prvních 45+ dní po spuštění nevadí a dost pochybuju, že letos ten pavouk bude bez restartu (nahrání programu taky znamená restart ) běžet tak dlouho v jednom kuse. Ale na druhou stranu ten správný postup není ani složitější, ani náročnější na zdroje, nesprávný postup nepřináší žádné zajímavé výhody, takže je lepší si zvyknout to dělat správně rovnou.
Rozhodně bych ten program zformoval - správná odsazení jsou základ, dobré komentáře tomu taky výrazně pomůžou. Ano, programoval jsem dlouhá léta v Pythonu a přišlo mi to pohodlné, protože i předtím jsem odsazoval správně (můj první, nebo druhý, větší program v Pascalu, ještě kdysi v minulém miléniu, byl PrittyPrinter, což byl kompilítor z Pascalu do Pascalu (postavený na LL1 gramatice s vyjímkou pro IF A THEN IF B THEN C ELSE D - ke kterému z těch IFů patří to ELSE? K tomu poslednímu, ale v LL1 gramatice toé nejde správně popsat.), který dělal správná odsazení kódu a případně i komentářů. A používal jsem ho pořád.
Ale ono skutečně zvedne přehlednost, když ty řádky jasně ukazují, co je do šeho zanořené a co naopak zanořené není, aniž by šlověk musel pokaždé číst celý řádek. (Srovnej s tvojí ukázkou -
Kód: Vybrat vše
void loop()
{
if (pocitadlo >= 5) // když je počet kroků 5 běž na kontrolu PIR senzoru
{
PIR();
}
sonar(); // hlavní vyhodnocování pohybu
}
Jak je na tom
PIR vůči
if? Jasně JE vnořený a tudíž JE odsazený.
Jak je na tom
sonar vůči
if? Jasně NENÍ vnořený a tudíž JE odsazený.
A tak dál každou chvilku všude.
Popisy, že case 1 je step 1 asi nejsou tak moc přínosné, naopak by se tam hodily popisy co ty jednotlivé případy/kroky znamenají.
Kód: Vybrat vše
timer = millis() + 300; // původně 300
Ostatně pro takováto magická čísla bych použil na začátku nějaké to
Kód: Vybrat vše
#define TIMEOUT 300 // cekani pred dalsi kontrolou
#define BLIZKO 350 // vzdalenosti
#define STREDNE 500
#define DALEKO 1000
Taky tíhnu k tomu mít to jednojazyčně, pokud to dává smysl
Kód: Vybrat vše
runActionGroup(RYCHLE,0);
static bool lastActionIsGoBack = false; //Statická proměnná - zaznamenat, zda je poslední akce zpět
Nijak moc jsem to nezkoumal (a teď na to nemám ani čas, ani necítím potřebu), takže nevím, jak je to rozdělené do menších částí - já se snažím mít rozumně malé samosttné celky a taky se snažím, abych viděl na jedné obrazovce celou relevantní část - což mi dělají jednak různé pomocné funkce, jednak foldování. (ve VIMu mám nastavené foldování na {{{ a }}}, občas to sem vyhřezne)
A vůbec, jako v té příručce k BBC Pascalu na tom doprovodném obrázku, kde se někdo ptá místního staříka, kudy odsud na nádraží a střík odpovídá, kdybych šel na nádraží, nezačínal bych tady ...
Například dokončení něčeho bych asi řešil přez callbacky, kdy bych do hlavního ovladače dal volání uživatelské funkce kdykoli se něco stane a pak měl ty funkce zvlášť bokem.
Možná bych řešil víc věcí paralelně, možná bych využíval volného času, kdy se na něco čeká, ke měření jiných věcí, plánování a tak podobně. (Obecně procesory stráví většinu doby čekáním na něco a reorganizací činností lze tato doba využít - viz stará gamesky, ktré běhaly na Spekterech a podobných, která by se na Arduinu dala emulovat v reálném čase, a přitom ty gamesky četly vstup od hráče, hýbali postavičkou, hýbaly nezávisle spoustou věcí na obrazovce, detekovaly střety a do toho hrály nepřerušovanou hudbu)
Ta tvoje poslední ukázka byla jenom zlomek toho, co se tam děje a co by se tam dít mohlo.
Tohle jsou hodně zmatené neutříděné poznámky o tom, co bych já dělal jinak (a místy i proč), nikoli kritika toho, co děláš ty - pokud ti to překladač sežere, pavouk dělá co chceš a máš z toho radost, tak to asi děláš správně
(A teď ještě docela vážně přemýšlím nad tím, že bych do ROMky svého nového počítače dal FORTH jako základní nástroj, nebo aspoň něco FORTHu dost podobného, a že bych si něco jako FORTH i implementoval na Arduino pro ty případy, kdy chci něco testovat a rád bych tahal za jednotlivé piny podle toho, co uvidím před sebou ... možná je to slepá cesta ale nejspíš to zkusím)
Ale je občas dobré i vidět, jak to dělají jiní (já teď opisuju z 6502.org a jen zírám, co lidi dovedou (něco jsem potřeboval, řešil jsem to 9 integrovanými obvody a 16 odpory a někdo tam z rukávu vysypal řešení se 3 integráči a bez odporů - s tím, že se to ještě navíc ovládá snáz - a navíc jsem se z toho naučil několik zajímavých triků, jen jsem to musel pěknou dobu dešifrovat do detailů - a tak to tam mám pořád
)