Вт мар 03, 2015 18:09:25
Ср июн 10, 2015 10:33:29
//class VLMenuItem;
//класс объекта меню дисплея
class VLMenuItem
{
//меню состоит из:
// - указателя на функцию, выводящую данных (заголовок данных и данные)
// - указателя на меню родителя; =0 только у VLMenuMain::rootMenu
// - массива дочерних меню; порядок "сверху вниз"
public:
VLMenuItem *menuItemParrent; //указатель на родителя; когда =0, значит в корне
TFunPtr FunctionShowInfo; //указатель на функцию вывода информации пункта меню на экран
VLMenuItem **subMenu; //массив дочерних меню
unsigned int subMenuCount; //выделяемый размер массива дочерних меню
int subMenuActiveIndex; //индекс активного меню
// какой индекс subMenu используем, родитель, связанная функция, размер subMenu
bool AddSubMenu( unsigned char fsubMenuIndex, VLMenuItem *fparentMenu, TFunPtr fFuncShowMenu, unsigned char fsubMenuCreateCount)
{
subMenu[fsubMenuIndex] = new VLMenuItem( fparentMenu, fFuncShowMenu, fsubMenuCreateCount);
if (subMenuActiveIndex<0)
subMenuActiveIndex=0;
return(true);
}
//конструктор родитель меню функция вывода меню размер массива дочерних меню
VLMenuItem( VLMenuItem *fparentMenu, TFunPtr fFuncShowMenu, unsigned char fsubMenuCreateCount)
{
//сохраняем принятые параметры
menuItemParrent = fparentMenu;
FunctionShowInfo = fFuncShowMenu;
//и задаём по умолчанию
subMenuCount = fsubMenuCreateCount;
if (subMenuCount>0)
{
subMenu = new VLMenuItem*[subMenuCount];
for (unsigned int i_temp=0; i_temp<subMenuCount; i_temp++)
subMenu[i_temp] = NULL;
}
subMenuActiveIndex = -1;
}
private:
};
typedef bool (*TFunPtr)(void);
TFunPtr pFun; // указатель на функцию, реализующую конкретную задачу
//пустая функция
bool NullFunc( void ) { return( true ); }
//пустая функция
bool NullFunc2( void ) { return( true ); }
//указатель на активное меню, объект типа класс MenuItem
VLMenuItem *currentMenu; //когда =NULL, показываем стартовую заставку
//указатель на корневое меню, содержит всю структуру меню
VLMenuItem *rootMenu;
//создаёт всё дерево меню
//rootMenu--->все входы АЦП12--->
// | |-> входы АЦП все
// | |-> вход АЦП 1
// | |-> вход АЦП 2
// | |-> вход АЦП 3
// | |-> вход АЦП 4
// | |-> вход АЦП 5
// |->дискр входы-------> дискр входы все
// |->UART-монитор------> монитор UART
//корневое меню
rootMenu = new VLMenuItem(NULL, NullFunc, 3);
//входы АЦП12 меню
rootMenu->AddSubMenu( 0, rootMenu, NullFunc, 6);
//входы все АЦП12
rootMenu->subMenu[0]->AddSubMenu( 0, rootMenu->subMenu[0], NullFunc, 0);
//вход1 АЦП12
rootMenu->subMenu[0]->AddSubMenu( 1, rootMenu->subMenu[0], NullFunc, 0);
//вход2 АЦП12
rootMenu->subMenu[0]->AddSubMenu( 2, rootMenu->subMenu[0], NullFunc, 0);
//вход3 АЦП12
rootMenu->subMenu[0]->AddSubMenu( 3, rootMenu->subMenu[0], NullFunc, 0);
//вход4 АЦП12
rootMenu->subMenu[0]->AddSubMenu( 4, rootMenu->subMenu[0], NullFunc, 0);
//вход5 АЦП12
rootMenu->subMenu[0]->AddSubMenu( 5, rootMenu->subMenu[0], NullFunc, 0);
//дискр входы меню
rootMenu->AddSubMenu( 1, rootMenu, NullFunc, 1);
//дискр входы
rootMenu->subMenu[1]->AddSubMenu( 0, rootMenu->subMenu[1], NullFunc, 0);
//монитор RS-485 меню
rootMenu->AddSubMenu( 2, rootMenu, NullFunc, 1);
//монитор RS-485
rootMenu->subMenu[2]->AddSubMenu( 0, rootMenu->subMenu[2], NullFunc2, 0);
//эксперимент
currentMenu = rootMenu->subMenu[2]->subMenu[0];
currentMenu->FunctionShowInfo(); //ok
Пн июн 15, 2015 14:01:40
Пн июн 15, 2015 14:52:40
Вт июн 16, 2015 12:36:21
prinv писал(а):imho, ООП на МК это не очень хорошая идея
Вт июн 16, 2015 12:37:56
Вт июн 16, 2015 12:41:14
prinv писал(а):Кроме меню МК чем-то ещё заниматься будет?
Вт июн 16, 2015 12:46:01
Вт июн 16, 2015 13:05:59
prinv писал(а):Даже интересно стало: сколько у вас в памяти занимает вся структура меню?
Вт июн 16, 2015 13:07:40
VLeshka писал(а):кода? IAR рапортует 14186 of code memory.
Вт июн 16, 2015 13:14:22
Psych писал(а):VLeshka писал(а):кода? IAR рапортует 14186 of code memory.
Каков уровень оптимизации?? И сколько ОЗУ приходится?
Вт июн 16, 2015 13:21:23
Вт июн 16, 2015 13:27:44
prinv писал(а):При каком размере стека стало работать без ошибок?
Сб окт 17, 2015 15:47:32
USISR = shiftreg;
USICTL1 = 0;
USICNT = USI16B | 16;
while (USICTL1 & USIIFG);
USICTL1 = 0;
USISR = shiftreg >> 16;
USICNT = USI16B | 16;
while (USICTL1 & USIIFG);
LE = 1;
__no_operation();
__no_operation();
__no_operation();
LE = 0;
#pragma vector=USI_VECTOR
__interrupt void send_other_word (void) {
USICTL1_bit.USIIFG = 0;
flag.frame_event = 1;
}
где-то в main()
flag.frame_event = 0;
USISR = shiftreg;
USICNT = USI16B | 16;
while (!flag.frame_event);
flag.frame_event = 0;
USISR = shiftreg >> 16;
USICNT = USI16B | 16;
while (!flag.frame_event);
LE = 1;
__no_operation();
__no_operation();
__no_operation();
LE = 0;
Чт дек 31, 2015 14:25:34
USBCNF |= USB_EN;
*((unsigned int*)(0x1C80)) = 0x1234;
Ср янв 20, 2016 08:04:59
Пт янв 29, 2016 09:44:01
Ср мар 16, 2016 08:51:53
Выкладываю заново. https://yadi.sk/d/Hfs9dZs8nPT4aafz писал(а):Тут вот мой товарищ в порядке восстановления своего владения "аглицкой мовой", как он сам выразился, перевел документ MSP430 IAR Assembler.
Пн май 09, 2016 18:37:37
Вт июн 28, 2016 16:03:29