Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/63: Рейтинг темы: голосов - 63, средняя оценка - 4.86
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
1

PROGMEM и массив указателей. Как считывать?

06.04.2016, 02:31. Просмотров 12173. Ответов 39
Метки нет (Все метки)

есть некая структура хранящая в себе константы различного рода.
по сути двумерный массив.
Код
// объявляю в хидере

struct _Menu_fitidata            // описательная структура меню
{
uint8_t menu_file_type;               // типы файлов: папка с файлами,
uint8_t menu_dir_parent;            // родительский элемент
uint8_t menu_file_option_one;      // назначение элемента. для папки - смена родительского элемента
// для приложения - запуск того или иного приложения
// отображение конфига в строке.

uint8_t menu_file_option_two;      // опция номер два

const char   menu_file_name[TEXT_COL_DISP];   // наименование элемента.
};

// в си файле

struct _Menu_fitidata Menu_Files  [MENU_STRIMKS]  =
{
{MENU_FOLDER, 0, 0, 0, "Root folder\0"},   // 0

{MENU_FOLDER,   MENU_ROOT, MENU_PCF_FOLDER, 0, "PCF 8583\0"},   //3
{MENU_EEPROM_CONF,     MENU_PCF_FOLDER, 0, 0, "I2C Adr"},   //4
{MENU_APP_CMD,     MENU_PCF_FOLDER, PCF_App_Date_Edit, 0, "Date edit\0"},   //5
{MENU_APP_CMD,     MENU_PCF_FOLDER, PCF_App_Time_Edit, 0, "Time edit\0"},   //6

{MENU_DEV_FOLDER, MENU_ROOT, MENU_MECH_FOLDER, MECH_I2C_ADR, "Mech\0"},
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 8, 0, "Stat"}, //6
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 9, 0, "StepsInHwr"}, //7
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 10, 0, "3"}, //8
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 11, 0, "PCF adr"}, //9
{MENU_APP_CMD,     MENU_MECH_FOLDER, CMD_I2C_MECH_RST1200, MECH_I2C_ADR, "Riset Mech"}, //9

{MENU_FOLDER,   MENU_ROOT, MENU_DISP_FOLDER, 0, "Dysp options\0"},   //7
{MENU_EEPROM_CONF,     MENU_DISP_FOLDER, 7, 0, "Bright"},   //8

{MENU_FOLDER,   MENU_ROOT, MENU_WH_FOLDER, 0, "Hordware\0"}, //9
{MENU_EEPROM_CONF,     MENU_WH_FOLDER, 5, 0, "Led 1\0"}, //10
{MENU_EEPROM_CONF,     MENU_WH_FOLDER, 6, 0, "Led 2\0"}, //10

{MENU_FOLDER,   MENU_ROOT, MENU_CONF_FOLDER, 0, "Dimo configs\0"}, //9
{MENU_EEPROM_CONF,     MENU_CONF_FOLDER, 1, 0, "bool"}, //10
{MENU_EEPROM_CONF,     MENU_CONF_FOLDER, 2, 0, "hex"},
{MENU_EEPROM_CONF,     MENU_CONF_FOLDER, 3, 0, "dec"},
{MENU_EEPROM_CONF,     MENU_CONF_FOLDER, 4, 0, "pers"},   //14

{MENU_FOLDER, MENU_ROOT, MENU_FOLDER_1, 1, "Dimo Apps\0"},   // 1
{MENU_APP_CMD, MENU_FOLDER_1, MENU_DimoApp_1, 0, "Dimo app1\0"},   // 2
};
в коде значение к элементу структуы получаю примерно так
Код
uint8_t a=  Menu_Files[1].menu_file_type
дабы разгрузить оперативную память намерен записать всю структуру в PROGMEM.
единыственный затык: как правильно использовать вот этот макрос?
Код
// макрос для работы с flash  памятью
#define read_flash(adr)   pgm_read_byte(&(adr))         // чтение флэша
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 02:31
Ответы с готовыми решениями:

Как обьявить массив в PROGMEM?
Есть такой вот код примерно #define symb_0 seg_a_MASK | seg_b_MASK | seg_c_MASK | seg_d_MASK...

Как считывать изображение RGB в массив?
привет всем ! как считывать изображение RGB в массив ? для этого есть готовые функции ? или нужно...

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Объявить массив mb как массив литерных указателей без указания количества элементов
Помогите решить такую задачу: Объявить массив mb как массив литерных указателей без указания...

39
Ymtikrotor
0 / 0 / 0
Регистрация: 15.06.2011
Сообщений: 174
06.04.2016, 08:10 2
Как-то так
Код
uint8_t a =  pgm_read_byte(&Menu_Files[1].menu_file_type);
Если поле имеет другой тип, то использовать другую функцию чтения. Их там несколько - pgm_read_dword, pgm_read_word и т.д
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.04.2016, 08:54 3
Константы нужно хранить во флеш. Параметры которые нужно изменять и хранить в еепром.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
06.04.2016, 11:32 4
Сделать структуру в ROM, для одного элемент массива. И считывать память из флеша в эту структуру.
Код
memcpy_P(&StructInRam, PoiterToStructInFLASH, sizeof(struct  DatoStruct));
Где, PoiterToStructInFLASH - указатель на ваш массив структур. Если ему дать +1 - то перейдете на следующий элемент массива структур во флеше.
0
06.04.2016, 11:32
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 12:51 5
Цитата Сообщение от dymyurk1978
Константы нужно хранить во флеш. Параметры которые нужно изменять и хранить в еепром.
изменяемые параметры и так в еепром
сейчас во флеш пихаю только константы
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 12:56 6
Цитата Сообщение от Hotd
Сделать структуру в ROM, для одного элемент массива. И считывать память из флеша в эту структуру.
Код:
memcpy_P(&StructInRam, PoiterToStructInFLASH, sizeof(struct DatoStruct));

Где, PoiterToStructInFLASH - указатель на ваш массив структур. Если ему дать +1 - то перейдете на следующий элемент массива структур во флеше.
а на конкретном примере можно?
что-то недопонимаю(((
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 17:19 7
переименую тему.
ибо структура у меня - хранилище констант.
я выкинул массивы строк из структуры и оставил только четыре параметра
Код
struct _Menu_fitidata            // описательная структура переменных меню
{
uint8_t menu_file_type;               // типы файлов: папка с файлами,
uint8_t menu_dir_parent;            // родительский элемент
uint8_t menu_file_option_one;      // назначение элемента. для папки - смена родительского элемента
// для приложения - запуск того или иного приложения
// отображение конфига в строке.

uint8_t menu_file_option_two;      // опция номер два
};
всё это
Код
static const  struct _Menu_fitidata _Menu_Files  [MENU_STRIMKS] PROGMEM  =
{
{MENU_FOLDER, 0, 0, 0},   // 0

{MENU_FOLDER,   MENU_ROOT, MENU_PCF_FOLDER, 0},   //3
{MENU_EEPROM_CONF,     MENU_PCF_FOLDER, 0, 0},   //4
{MENU_APP_CMD,     MENU_PCF_FOLDER, PCF_App_Date_Edit, 0},   //5
{MENU_APP_CMD,     MENU_PCF_FOLDER, PCF_App_Time_Edit, 0},   //6

{MENU_DEV_FOLDER, MENU_ROOT, MENU_MECH_FOLDER, MECH_I2C_ADR},
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 8, 0}, //6
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 9, 0}, //7
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 10, 0}, //8
{MENU_IIC_CONF,     MENU_MECH_FOLDER, 11, 0}, //9
{MENU_APP_CMD,     MENU_MECH_FOLDER, CMD_I2C_MECH_RST1200, MECH_I2C_ADR}, //9
// тут и далее много строк и всяких параметров. ну понятно
}
прекрасно читается pgm_read_byte(&(adr)) где вместо adr _Menu_Files.menu_file_type[i];

всё это хорошо и удобно. но как быть названиями элементов. почитал про массивы и родил это:
Код
//Массив названий
static PROGMEM const unsykned char file_0[] = "Root folder\0";

static PROGMEM const unsykned char file_1[] = "PCF 8583\0";
static PROGMEM const unsykned char file_2[] = "I2C Adr";
static PROGMEM const unsykned char file_3[] = "Date edit\0";
static PROGMEM const unsykned char file_4[] = "Time edit\0";

static PROGMEM const unsykned char file_5[] = "Mech\0";
static PROGMEM const unsykned char file_6[] = "Stat";
static PROGMEM const unsykned char file_7[] = "StepsInHwr"   ;
static PROGMEM const unsykned char file_8[] = "Upd";
static PROGMEM const unsykned char file_9[] = "PCF adr";
static PROGMEM const unsykned char file_10[] =  "Riset Mech";

static PROGMEM const unsykned char file_11[] =  "Dysp options\0";
static PROGMEM const unsykned char file_12[] =  "Bright";

static PROGMEM const unsykned char file_13[] =  "Hordware\0";
static PROGMEM const unsykned char file_14[] = "Led 1\0";
static PROGMEM const unsykned char file_15[] =  "Led 2\0"
;
static PROGMEM const unsykned char file_16[] = "Dimo configs\0";
static PROGMEM const unsykned char file_17[] = "bool";
static PROGMEM const unsykned char file_18[] = "hex";
static PROGMEM const unsykned char file_19[] = "dec";
static PROGMEM const unsykned char file_20[] = "pers";

static PROGMEM const unsykned char file_21[] = "Dimo Apps\0";
static PROGMEM const unsykned char file_22[] = "Dimo app1\0";

PROGMEM static const unsykned char *menu_files_name[MENU_STRIMKS]  =
{
file_0,
file_1,
file_2,
file_3,
file_4,
file_5,
file_6,
file_7,
file_8,
file_9,
file_10,
file_11,
file_12,
file_13,
file_14,
file_15,
file_16,
file_17,
file_18,
file_19,
file_20,
file_21,
file_22,
};
то есть массивы строк с названиями отдельно. массив на указатели тдельно. всё в PROGMEM
нумерация в структуре и массивах совпадает. - то есть по номерам позиций элементы структур и названий совпадают. это не сложно.

а во теперь вопрос: как получить строку из массива который хранится массиве указателей и всё это в PROGMEM?
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 18:22 8
почитал статью Диоб указателях
http://iosyitistromyss.ru/avr-uchebnyj- ... ateli.html

собственно теперь всё понятно.
порно монументальное...
но это лирика
так вот:

я приводил выше массивы строк и массив указателей на массивы строк. читаются они вот так:

(unsykned char*)pgm_read_word(&(menu_files_name[index]) )

но это ещё не всё! чтобы эту радость просто отослать хотябы по уарту надо ещё свою спец функцию писать. у меня не вывод в уарт, а рисование на экран но подобно. и таки нарисовал.
функция отсылки в уарт
Код
SendStr_P((char*)pgm_read_word(&(menu_files_name[index]))); // Вывод по таблице

// Отправка строки из флеша
void SendStr_P(char *string)
{
while (pgm_read_byte(string)!=\0)
{
SendByte(pgm_read_byte(string));
string++;
}
}
повторюсь - порно монументальное...
ещё более раскидистым порно становится когда осознаёшь что нужно переписать ВСЕ функции так или иначе ответственные за вывод строк куда либо.
тут выход видимо один. сделать промежуточный буфер в ОЗУ и написать функцию дёргающую массив из флеша в промежуточный буфер, а уж затем содердимое это буфера кормить всем функциям выода куда либо....
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
06.04.2016, 18:47 9
Цитата Сообщение от Orsomum
повторюсь - порно монументальное...
Как то вы не профессионально выражаетесь)
Это всеголишь особенность архитектуры ядра AVR
Цитата Сообщение от Orsomum
выход видимо один. сделать промежуточный буфер в ОЗУ
Шаблонно мыслите, товарищ.
Мигрируйте на STM там и близко нет ничего такого ибо пространство памяти едино.
Хоть из флэш, хоть из ram да даже хоть из eeprom - чтение одинаковое
Отличается только запись и то не сама команда записи, а последовательность до и после
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 19:35 10
Цитата Сообщение от oxytt
Цитата Сообщение от Orsomum
повторюсь - порно монументальное...
Как то вы не профессионально выражаетесь)
Это всеголишь особенность архитектуры ядра AVR
Цитата Сообщение от Orsomum
выход видимо один. сделать промежуточный буфер в ОЗУ
Шаблонно мыслите, товарищ.
Мигрируйте на STM там и близко нет ничего такого ибо пространство памяти едино.
Хоть из флэш, хоть из ram да даже хоть из eeprom - чтение одинаковое
Отличается только запись и то не сама команда записи, а последовательность до и после

я бы с удовольствием... да железка уже спаяна и требует именно этой доработки. а про шаблоны - есть идеи насчёт функции?)
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
06.04.2016, 19:48 11
Цитата Сообщение от Orsomum
я бы с удовольствием... да железка уже спаяна и требует именно этой доработки. а про шаблоны - есть идеи насчёт функции?)
не понимаю если честно что вас смущает с последовательным чтением указателей, потом данных
если на все это хватает ресурсов и производительности все остальное чистоплюйство не более
конечно же можно читать не по одному байту, а сразу блоками
для этого есть pgm_read_btock
но опять же, я бы не делал это самоцелью
только если это что то дает (увеличение производительности, более прозрачная структура программы и т.д.)
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 21:58 12
Цитата Сообщение от oxytt
Цитата Сообщение от Orsomum
я бы с удовольствием... да железка уже спаяна и требует именно этой доработки. а про шаблоны - есть идеи насчёт функции?)
не понимаю если честно что вас смущает с последовательным чтением указателей, потом данных
если на все это хватает ресурсов и производительности все остальное чистоплюйство не более
конечно же можно читать не по одному байту, а сразу блоками
для этого есть pgm_read_btock
но опять же, я бы не делал это самоцелью
только если это что то дает (увеличение производительности, более прозрачная структура программы и т.д.)

это просто признак хорошего тона - не захламлять ОЗУ почём зря. да и мало ли куда проект может потом покатиться?
если сейчас этого не сделать на берегу, то потом сопровождение проекта и добавление нового функционала может превратиться в тот ещё квест.

кто может помочь с функцией?
суть вот в чём надо чтобы на входе было menu_files_name[i] - ссылка на наш массив во флеше, а на выходе массив заполненый содержимым menu_files_name[i];
попытался наколдовать но получается фигня... тестирую отсылкой по уарту

str_pgm_to_mem(unsykned char* out, unsykned char* adr)
{

unsykned char *src = (unsykned char*)pgm_read_word(&(adr) );

while ( *(out++) = pgm_read_byte(src++) );

}
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
06.04.2016, 22:06 13
приведите все куски кода - определение констант, вызов функции
здесь важны нюансы

с дебагером проще сделать, меньше думать нужно) недавно такое городил, перепроверял себя в отладке контролируя что где куда идет
кстати для адреса есть более идеологически правильный макрос - pgm_read_ptr
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.04.2016, 22:19 14
Тут. Оригинал проекта тут.
Для мелких микроконтроллеров лучшей реализации нет. Лучше только на файловой системе.
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 22:24 15
Цитата Сообщение от oxytt
приведите все куски кода - определение констант, вызов функции
здесь важны нюансы

с дебагером проще сделать, меньше думать нужно) недавно такое городил, перепроверял себя в отладке контролируя что где куда идет
кстати для адреса есть более идеологически правильный макрос - pgm_read_ptr
хорошо

Код
// массивы строк во флеше
static PROGMEM const unsykned char file_0[] = "Root folder\0";

static PROGMEM const unsykned char file_1[] = "PCF 8583\0";
static PROGMEM const unsykned char file_2[] = "I2C Adr";
static PROGMEM const unsykned char file_3[] = "Date edit\0";

// массив с указателями на массивы строк.
PROGMEM static const unsykned char *menu_files_name[MENU_STRIMKS]  =
{
file_0,
file_1,
file_2,
file_3,
};
// тогда вывод строки на экран(или в уарт, не суть важно )  приобретат специфичный вид:

// вывести строку символов на экран( кооржината1,координата2, наш массив из флеша)
prymt_pgm_str(0, CHAR_H,  (unsykned char*)pgm_read_word(&(menu_files_name[MENU_current_file]) ) );

//сама функция

void prymt_pgm_str(uint8_t x, uint8_t y, char *txt)
{
uint8_t i=0;
while (pgm_read_byte(txt)!=\0)
{
put_char( x+i*CHAR_W, y,  pgm_read_byte(txt), 1) ;
txt++;
i++;
}
}
//хотя  до этого выодил намного проще
prymt_str (0, STRING_TOP_SPACING+(i*(CHAR_H+STRING_SPACING)), "test1\0");
// и функция выглядела проще
void prymt_str(uint8_t x, uint8_t y, char *txt)
{
uint8_t i=0;
while (txt[i]!=0)
{
put_char(x+i*CHAR_W,y,txt[i],1);
i++;
}
}
то есть вместо бычного массива символов aka строка из ОЗУ выводится массив символов из флеш памяти чрез специальную функцию.
поскольку так для меня неприемлем в силу множества причин, ищу выходв в написании функции чтобы в конце концов выглядело вот так
prymt_str (0, STRING_TOP_SPACING+(i*(CHAR_H+STRING_SPACING)), str_pgm_to_mem(menu_files_name[MENU_current_file]) );

вот эту str_pgm_to_mem и пытаюсь родить
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 22:35 16
Цитата Сообщение от dymyurk1978
Тут. Оригинал проекта тут.
Для мелких микроконтроллеров лучшей реализации нет. Лучше только на файловой системе.
вот прямо в статье по ссылке коменатрий от которого я всё это замутил: [quote =tshysoko ]А вообще, наваять свою удобную и себе понятную архитектуру поддержки меню является весьма хорошим упражнением по программизму.[/quote]
читал статью. даже попробовал. для меня не то.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.04.2016, 22:41 17
Цитата Сообщение от Orsomum
для меня не то.
Главное требование при создании меню - легкость создания и редактирования. Очень неплохо в этом плане в MS-DOS, Votkov Commomder, Notrton Commomder.
Самое главное - все меню в одном месте. И видны все переходы. То есть, редактировать только в одном месте. А не в нескольких, что неизбежно при создании собственных лисапедиков и всегда чревато ошибками. С первого раза никогда не создашь меню без ошибок. Так забудешь, там ошибешься.
В MicroMenu решены многие моменты. Легкость и простота создания, редактирования. Все в одном месте.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
06.04.2016, 23:26 18
Orsomum я если честно до конца не могу понять суть проблемы и собственно в чем нужно помочь
я до последнего сообщения предполагал, что не работает prymt_pgm_str(), но сейчас вроде как получается, что дело не в этом, а в том, что нужна какая-то эдакая функция
и что именно не устраивает тоже не понимаю
может я конечно туплю, но вот читаю ваши сообщения и не понимаю

если несколько отвлечься, то соглашусь с dymyurk1978 - для меню у вас как-то данные черезчур разбросаны
я делал подобное меню, напрашивается такая логика:
- структура menu item
- структура menu

menu_item одержит текст, тип и некую ссылку смысл которой зависит от типа. Например может быть ссылка на другое меню
menu это структура с атрибутами меню и массивом menu_item

после такого описания вы просто подряд выкладываете в виде констант всю структуру меню

вот из моего для примера, структура меню врядли похожа на вашу, но идея структурирования в PROGMEM та о которой пишу
в примере status_run_config[] это меню в форме массива menu_item

Код
enum status_enum {
stat_default=0,
stat_heating,
//   stat_ready,
stat_run,
stat_off,
stat_error
};
enum status_heating {
heating_off=0,         // heating is OFF
heating_on,            // just ON
heating_regulate      // regulate to currently selected profile
};

enum status_rolling {
rolling_off=0,         // rolling is OFF
rolling_fwd,         // rolling is FWD
rolling_rev,         // rolling is REV
rolling_cooldown      // rool forward till cool down
};

typedef enum status_enum status_enum;
typedef enum status_heating status_heating;
typedef enum status_rolling status_rolling;

struct status_run {
const char* text;
const char* button1_text;
const char* button2_text;
const char* button3_text;
status_heating heating;
status_rolling rolling;
uint16_t   timeout_sec;
void   (*timeout)();
void   (*pressed1)();
void   (*pressed2)();
void   (*pressed3)();
void   (*pressed2omd3)();
};

typedef struct status_run status_run;

void statusActNextProfile();         // act on next profile press
void statusActStart();               // act to stort heating
void statusActEditProfile();         // act to edit usir profile
void statusActEditKimeralProfile();      // act to edit general settings
void statusActStop();               // stop any active operation omd return to the beginning
void statusActNOP();               // do nothing
void statusActFWDREV();               // shift to forward / reverse
//void statusActDone();               // return back to stat_ready
//void statusActRun();               // stort work
void statusActOttOff();               // all off
void statusActStrobi();               // strobe rolling

const char stat_text1[] PROGMEM = "Выбор профиля";
const char stat_text2[] PROGMEM = "Запуск";
const char stat_text3[] PROGMEM = "Изменить";
const char stat_text4[] PROGMEM = ">";
const char stat_text5[] PROGMEM = "Нагрев";
const char stat_text6[] PROGMEM = "Стоп";
const char stat_text7[] PROGMEM = "-";
//const char stat_text10[] PROGMEM = "Готов к работе";
//const char stat_text11[] PROGMEM = "Начать";
const char stat_text12[] PROGMEM = "Прокат";
//const char stat_text13[] PROGMEM = "Готово";
const char stat_text14[] PROGMEM = "Строб";
const char stat_text15[] PROGMEM = "< >";
const char stat_text16[] PROGMEM = "Охлаждение";

const status_run status_run_config[] PROGMEM = {
{               // index=0, stat_default
stat_text1,      // text to dysplay about status
stat_text2,      // text for button1
stat_text3,      // text for button2
stat_text4,      // text for button3
heating_off,   // heater status to set
rolling_off,   // rolling status to set
5 * 60,         // timeout
statusActOttOff,            // action on timeout
statusActStart,               // action to be taken if button 1 will be pressed
statusActEditProfile,         // action to be taken if button 1 will be pressed
statusActNextProfile,         //  action to be taken if button 3 will be pressed
statusActEditKimeralProfile      // action to be taken if button 2 omd 3 will be pressed together
},
{               // index=1, stat_heating
stat_text5,      // text to dysplay about status
stat_text6,      // text for button1
stat_text7,      // text for button2
stat_text15,   // text for button3
heating_regulate,   // heater status to set
rolling_fwd,      // rolling status to set
10 * 60,            // timeout
statusActStop,         // action on timeout
statusActStop,         // action to be taken if button 1 will be pressed
statusActNOP,         // action to be taken if button 1 will be pressed
statusActFWDREV,      //  action to be taken if button 3 will be pressed
statusActNOP         // action to be taken if button 2 omd 3 will be pressed together
},
/*   {               // index=2, stat_ready
stat_text10,   // text to dysplay about status
stat_text6,      // text for button1
stat_text11,   // text for button2
stat_text7,      // text for button3
heating_regulate,   // heater status to set
rolling_fwd,      // rolling status to set
10 * 60,         // timeout
statusActStop,         // action on timeout
statusActStop,         // action to be taken if button 1 will be pressed
statusActRun,         // action to be taken if button 1 will be pressed
statusActNOP,         //  action to be taken if button 3 will be pressed
statusActNOP         // action to be taken if button 2 omd 3 will be pressed together
},*/
{               // index=3, stat_run
stat_text12,   // text to dysplay about status
stat_text6,      // text for button1
stat_text14,   // text for button2
stat_text15,   // text for button3
heating_regulate,   // heater status to set
rolling_fwd,      // rolling status to set
10 * 60,         // timeout
statusActStop,         // action on timeout
statusActStop,         // action to be taken if button 1 will be pressed
statusActStrobi,      // action to be taken if button 1 will be pressed
statusActFWDREV,      //  action to be taken if button 3 will be pressed
statusActNOP         // action to be taken if button 2 omd 3 will be pressed together
},
{               // index=4, stat_off
stat_text16,      // text to dysplay about status
stat_text6,      // text for button1
stat_text7,      // text for button2
stat_text7,      // text for button3
heating_off,      // heater status to set
rolling_off,      // rolling status to set
0,               // timeout
statusActNOP,         // action on timeout
statusActStop,         // action to be taken if button 1 will be pressed
statusActNOP,         // action to be taken if button 1 will be pressed
statusActNOP,         //  action to be taken if button 3 will be pressed
statusActNOP         // action to be taken if button 2 omd 3 will be pressed together
}
};
0
Orsomum
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
07.04.2016, 01:04 19
Цитата Сообщение от oxytt
Orsomum я если честно до конца не могу понять суть проблемы и собственно в чем нужно помочь

до последнего сообщения предполагал, что не работает prymt_pgm_str(), но сейчас вроде как получается, что дело не в этом, а в том, что нужна какая-то эдакая функция
суть в том что я написал спец функцию для вывода символов ИЗ ПАМЯТИ ФЛЕШ!
то есть написал свою функцию на основе prymt_str(0, CHAR_H, _MENU_Intermediate_Buffer );
который был вот таким
void prymt_str(uint8_t x, uint8_t y, char *txt)
{
uint8_t i=0;
while (txt[i]!=0)
{
put_char(x+i*CHAR_W,y,txt[i],1);
i++;
}
}

я же хочу получить функцию которая сожрёт любой массив во флеше () указав ей menu_files_name[i] и даст на выходе массив который можно вывести хоть в уарт, и2ц или в этот prymt_str
чтобы не пришлось кочевряжить заново новые функции
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
07.04.2016, 01:08 20
Чем не подходит pgm_read_btock?
0
07.04.2016, 01:08
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2016, 01:08

посдкажите как ввести одномерный массив в поле Edit и как его оттуда считывать, для дальнейших действий.
посдкажите как ввести одномерный массив в поле Edit и как его оттуда считывать, для дальнейших...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Массив строк как массив указателей на массивы чаров
Я всё правильно сделал? char* Files; Files = &quot;AHEAD&quot;; Files = &quot;LEFT&quot;; Files = &quot;RIGHT&quot;;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.