bitfield v avr-gcc
Miroslav Sinko
sinkomiro@rocketmail.com
Úterý Červen 17 00:19:30 CEST 2008
Takze na zaciatok radsej priklad konkretneho menu, toto ma za ulohu spustat dalsie podmenu:
/******************************** Main menu *********************************************************/
//constant progmem strings of menuitem texts of menuMain
prog_char menuItemMain1[]="Setup";
prog_char menuItemMain2[]="Help";
prog_char menuItemMain3[]="About";
//the structure initialization doesn't accept the PROGMEM strings as initializers,
//so they should be defined above as progmem strings..
PROGMEM S_MenuItem menuMainItems[] = {
//-1: do not include \0
{ menuItemMain1, sizeof(menuItemMain1) - 1 , E_MENU_MAIN_SETUP },
{ menuItemMain2, sizeof(menuItemMain2) - 1 , E_MENU_MAIN_HELP },
{ menuItemMain3, sizeof(menuItemMain3) - 1 , E_MENU_MAIN_ABOUT },
};
PROGMEM S_Menu menuMain = {
menuMainItems, //pointer to menuItems
sizeof(menuMainItems) / sizeof(S_MenuItem), //number of items
NULL, //init function
fMenuMain, //menu item function
&rtInfo[E_INDEX_MENU_MAIN] //run time info
};
Nieco som dopisal aj nizsie:
--- On Mon, 6/16/08, Jan Waclawek <konfera@efton.sk> wrote:
> No ved to je aj moj ciel.
>
> Tak si pozrime, co treba spravit, ked chces pridat dalsiu
> polozku do menu:
> - musis inkrementovat pocet poloziek
nemusim, vid priklad
> - pridat polozku do pola - asi riadok niekam do
> inicializatora, ze?
ano
> - pridat string, ale tomu sa neda vyhnut; pridat explicitne
> jeho dlzku (sizeof - 1 alebo pocitas pismenka?)
nepocitam LOL
> - v tej polozke pridat dalsi DWORD parameter (preco DWORD -
> to ich chces mat tak vela? to je do jednocipu?) - generujes
> ich nejako aby boli v postupnosti, alebo si treba pozriet
> predchadzajuce aby nedoslo k duplicite?
Do jednocipu. DWORD je najuniverzalnejsi, nechcem sa citit v buducnosti obmedzeny. Struktury menu su v PROGMEM, tam je (zatial) miesta dost. Len aktivne menu sa vzdy prekopiruje do RAM - preto su stringy v PROGMEM, aby v RAM nezaberali miesto.
Generovanie: pisal som - enum, nestaram sa o hodnotu, jednoznacnost zarucena. Ale pisal som, ze _spravidla_ enum, t.j. ak menu ma sluzit na vyber BaudRate, tak si rovno posielam hodnotu a obsluzna funkcia tohto menu nepotrebuje switch/case, ale rovno pracuje s parametrom, ako cislom. Tu hned vidis vyhodu DWORD.
> - v tej spracovacej funkcii dopisat do toho switchu novy
> case (a neviem si presne predstavit obsah toho case)
Nasime to na polozky bitoveho pola. Realne som to nepouzil, ale robil by som to takto:
struct{
BYTE led1 :1; //ma svietit LED
BYTE bzuciak :1 //ma byt aktivny
}flags;
typedef enum{
E_LED1,
E_BZUCIAK
}ENUMS_FLAGS;
void fMenuFlags(DWORD param)
switch(param){
case E_LED1:
flags.led1 = ~flags.led1;
break;
case E_BZUCIAK:
flags.bzuciak = ~flags.bzuciak;
break;
}
}
> Neviem, mne sa to zda komplikovane; a po 3 rokoch nie som
> si isty ze spravim vsetky kroky spravne.
Mozme mat rozne pohlady, preco nie. Ani netvrdim, ze to mam najlepsie, ako sa da.
> V mojej verzii (predpokladajme, ze existuju kyzene
> pointre):
> - pole nema definovany pocet poloziek, mam ukoncovaci
> zaznam (nieco v nom je nulove - asi ten typ), staci pridat
> riadok do inicializatora
Ano, aj to je moznost. Nevyhoda - o polozku naviac. Vyhoda - oproti mojmu zapisu sizeof/sizeof jedine uspora 1 bytu v strukture (BYTE numItems).
> - nemam stringy v ramke, takze rovno pointer na string, ten
> samozrejme aj ja musim pridat
No ja mam pevne stringy v PROGMEM a do RAM ich nekopirujem. Mam moznost aj volitelnych stringov a tie su potom v RAM - vid komentar v predoslom maili pri prvej strukture. V jednom menu mozem tieto 2 typy stringov kombinovat. Povedzme ze pri BaudRate ponecham na uzivatela zvolit si 3 user rychlosti, ktore si nastavi a tie sa potom pouzivaju v menu (ukladanie nastaveni do EEPROM mu ich zapamata).
> - zadam typ ako "bit" (u mna je to konstanta a
> kedze som s tym dneska robil tak si to pamatam, je to 4 ;-)
> )
No toto nemam - riesil by som to univerzalne, cez tie funkcie/param/enum/switch/case.
> - rovno pointer na ten bit; funkciu na polozku menu kde sa
> manipuluje bit (do ktorej ten pointer vstupuje ako
> parameter) mam uz napisanu takze je vymalovane.
Ak by bol jednoducho ziskatelny pointer na bit, v tom zmysle, ze z mojho prikladu ziskam v uvodzovkach "&flags.bzuciak", tak by to bolo pekne :-)
> Sa mi to moje zda lepsie... Mozno som trosicka zaujaty...
> ;-)
Hadat sa nebudem :-) Len mierne zavrtam. Ako riesis menu, kde o ziadne bity nejde? Povedzme to nastavovanie BaudRate? Mas paralelne iny system menu, alebo ako povies, aku rychlost chces nastavit?
miro
>
> wek
>
Další informace o konferenci Hw-list