zdeno píše:vis, ze existuji stanice, kde je dovolen jen jeden pohyb na zhlavi ??
Proste kraceni provozniho casu a problematicky grafikon nemuze byt duvod porusovat pravidla.
Neni problem to opravit, ale nechcem.
Tak teraz si tomu nasadil korunu.Áno, také stanice naozaj existujú. Ale ten jeden pohyb na zhlaví je dovolený na základe toho, že tam je (alebo skôr nie je) zabezpečovacie zariadenie, ktoré neumožňuje pohybov viac. Takže si kľudne môžeme položiť otázku, či viac modelovosť naopak nekazí ten, čo si do takej stanice namontuje zariadenie, ktoré vyzerá ako releovka, obsluhuje sa ako releovka, ale neumožňuje to, čo releovka
![Wink :wink:](./images/smilies/icon_wink.gif)
K mapovaniu funkcí: Ovládač som nad Loconetom ešte naozaj nestaval. Rád by som (chcel by som z panelu na Nemšovej vedieť aspoň na našom jazdení obsluhovať aj posunovaciu loko, na cudzom stretnutí by sa na mňa asi s notebookom strčeným do X3 dívali dosť nevraživo), ale naozaj nie je čas. Čo sa týka kódu, základ si necháme a len si ho rozšírime - ten uint8 nahradíme štruktúrou. Pre funkciu sa nadefinuje
- Kód: Vybrat vše
struct TFunkciaData {
Cislo: uint8; //cislo vyslednej funkcie, ktora sa bude vysielat
JeTlacitko: bool; //šlo by kľudne nahradiť enumom s hodnotami FT_TLACITKO a FT_PREPINAC, väčšina prekladačov pre jednočipy pochopí, že to je jednobitová hodnota
PoslStav: bool;
OdosStav: bool; //ak potrebuješ uložiť odoslaný stav do doby prijatia ACK (fakt neviem, čo sa pri poveloch pre loko ACKuje a čo nie)
}
uint8 max_funkcia = 28; //F0 až F28, dá sa tiež dať trebársdo EEPROM
TFunkciaData *data_funkcii; //pole tých štruktúr s informáciami
uint8 *mapa_funkcii //ak potrebujem volať funkcie aj podľa ich poradia, nielen prehádzané, inak toto nepotrebujem a prehádžem si ich rovno pri inicializácii data_funkcii
addr_t funkcie_eeprom //odkaz na miesto v EEPROM, kde sú tie údaje potom uložené
Neviem čo presne si predstavuješ pod balíčkami, či loconetové packety, alebo porty alebo niečo iné, ale určite by šlo informáciu pridať do tej štruktúry. Keď ju chcem dať do EEPROM, väčšinou postupujem tak, že si ju zrkadlím v RAMke a každý zápis do nej prepisujem do EEPROM. Pri štarte apod. si ju potom naťahujem z EEPROM do RAM. Inicializáciu opäť preskočím, v prípade XC od Microchip si cez #segment nadefinuješ, kde ju chceš mať v RAMke a kde v EEPROMe a potom si to z EEPROM načítaš do RAM.
No a potom vyrobím niečo ako
- Kód: Vybrat vše
void SpracujTlacitko(uint8 p_funkcia) {
if(p_funkca<=max_funkcia) //ak som paranoidny, nemusi to tu byt
{
TFunkciaData funkcia=data_funkcii[mapa_funkcii[p_funkcia]];
if(funkcia.JeTlacitko) {
//poslem si trebars dva prikazy na ZAP/VYP
PosliFunkciuNaLoconet(funkcia.Cislo,True);
PosliFunkciuNaLoconet(funkcia.Cislo,False);
}
else
{
PosliFunkciuNaLoconet(funkcia.Cislo,!funkcia.PoslStav); //poslem novy stav na LocoNet
funkcia.OdosStav=!funkcia.PoslStav; //poznamenam si, ze som to poslal, kvoli ACK (ak to tam fakt treba)
funkcia.PoslStav=!funkcia.PoslStav; //ak nie, rovno pozmenim vnutorny stav
}
ZapisNovyStav(funkcia);
}
void ZapisNovyStav(TFunkciaData p_funkcia const) {
data_funkcii[p_funkcia.Cislo]=p_funkcia;
eeprom_write(data_funkcii+p_funkcia.Cislo*sizeof(TFunkciaData),funkcie_eeprom+p_funkcia.Cislo*sizeof(TFunkciaData,sizeof(TFunkciaData));
}
Chýbajú tam detaily ako adresa lokomotívy, ale tá sa strčí trebárs do ďalšej globálnej premennej, a potom sa len použije pri volaní PosliFunkciuNaLoconet. Tú som tam tiež schválne nepísal, ale je to len načasovanie a odoslanie dát.