Вт авг 31, 2021 22:25:11
Ср сен 01, 2021 05:04:41
ну, так он же про это и написал:ARV писал(а):хранить это не в "чужой" структуре, а в своей собственной
RobSchneider писал(а):одно можно с уверенностью сказать что поле:
void *udata; /* User defined and accessible data. */
указатель типа воид, то есть для хранения пользователем адреса чего угодно.
и в библиотеке есть функция для обращения к этим данным, и туда я запишу адрес структуры, поля которой, в свою очередь,
будут хранить данные о позиции курсора, цвете символа и фона
Ср сен 01, 2021 06:27:11
Ср сен 01, 2021 06:49:10
Ср сен 01, 2021 08:01:50
Ср сен 01, 2021 08:46:59
а что, это обязательно?ARV писал(а):так каждый поток, по сути, требует свою функцию ввода-вывода
Ср сен 01, 2021 09:35:02
Чт сен 02, 2021 13:18:31
typedef struct { //указатель на символ, координаты курсора экрана lcd x, y, цвет символа, цвет фона
void *chr;
uint16_t px;
uint8_t py;
uint16_t ct;
uint16_t cb;
}lcd_char;
int main(void)
{
sei();
static FILE mystdout = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
static lcd_char cursor_param={NULL,0,0,WHITE,BLACK};
//структура с начальными координатами, цветом курсора(выводимого символа) и цветом фона.
fdev_set_udata(&mystdout, &cursor_param); // пользуемся представленным интерфейсом для инициализации
//mystdout.udata=&cursor_param; //передаем эти параметры в структуру типа FILE
stdout = &mystdout; //передача адреса структуры с указанием функции вывода символов в UART
//Не обращайте внимание на символ, адрес которого приходится помещать в эту же структуру.
//это атавизм, - так у меня функция вывода на экран символа параметры принимает
static int lcd_putchar(char c, FILE *stream) //функция вывода символов на экран
{
lcd_char *cursymbol= fdev_get_udata(stream); //берем адрес на структуру lcd_char из stream
if (c='\n')
{
if (cursymbol->py <= 199)
{
draw_winds(&clear,1); //очистим экран
cursymbol->px=0; //перевод каретки на новую строку
cursymbol->py+=20;
return 0;
}
else
{
cursymbol->px=0; //печать с начала страницы
cursymbol->py=0;
return 0;
}
}
cursymbol->chr=&c; //добавляем в ту структуру адрес текущего выводимого символа
lcd_print(cursymbol); //выводим этот символ на экран
if (cursymbol->px <= 287)//если есть еще где печатать по х (319 - 2*16) то двигаем курсор вправо
{
cursymbol->px+=16;
}else if (cursymbol->py <= 199)//если есть еще где печатать по y (239 - 2*20) то двигаем курсор на новую строку
{
cursymbol->px=0;
cursymbol->py+=20;
}else //иначе переводим курсор в начало экрана
{
cursymbol->px=0;
cursymbol->py=0;
}
return 0;
}
cursor_param.px=160;
cursor_param.py=120;
cursor_param.ct=RED;
cursor_param.cb=YELLOW;
printf ("Hello, world");
Чт сен 02, 2021 15:37:33
Имеется возможность связать с пото-
ком дополнительные пользовательские дан-
ные при помощи fdev_set_udata(), которые
затем могут быть извлечены в реализаци-
ях функций ввода-вывода символа при по-
мощи fdev_get_udata() и обработаны, как
требуется. Это, например, позволит реали-
зовать одну функцию ввода-вывода, рабо-
тающую с различными UART. В этом слу-
чае функции ввода-вывода сохраняют кон-
текст различных UART в области данных
пользователя между своими вызовами.
Чт сен 02, 2021 16:08:55
ARV писал(а):Конечно можно, и принципиально структура потока для этой цели и предназначена, но для МК категории AVR это, имхо, избыточно.
Мне трудно представить устройство, которое одновременно на два разных физически, но функционально однотипных (чтобы работать с ними одной функцией) терминала выводит разную информацию... Но если это и в самом деле нужно, подход с передаваемой в единую функцию структурой для потока представляется мне уместным.