mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
Cleaned up automatically added comments
This commit is contained in:
@@ -21,42 +21,42 @@ static bool frame_timer_cb(repeating_timer_t* t) // Callback аппаратно
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void wait_for_irq(void) // Вспомогательная функция для энергосберегающего ожидания прерываний.
|
static inline void wait_for_irq(void) // Вспомогательная функция для энергосберегающего ожидания прерываний.
|
||||||
{ // Начало функции ожидания IRQ.
|
{
|
||||||
__asm volatile ("wfi"); // Инструкция ARM Wait For Interrupt: CPU спит до любого IRQ.
|
__asm volatile ("wfi"); // Инструкция ARM Wait For Interrupt: CPU спит до любого IRQ.
|
||||||
} // Конец функции ожидания IRQ.
|
}
|
||||||
|
|
||||||
static uint16_t text_width_px(const wchar_t* str) // Считаем фактическую ширину строки в пикселях через таблицу ширин глифов.
|
static uint16_t text_width_px(const wchar_t* str) // Считаем фактическую ширину строки в пикселях через таблицу ширин глифов.
|
||||||
{ // Начало функции расчета ширины строки.
|
{
|
||||||
uint16_t width = 0; // Накапливаем итоговую ширину строки.
|
uint16_t width = 0; // Накапливаем итоговую ширину строки.
|
||||||
while (*str) // Пока не дошли до нулевого терминатора строки.
|
while (*str) // Пока не дошли до нулевого терминатора строки.
|
||||||
{ // Начало цикла по символам.
|
{
|
||||||
width = (uint16_t)(width + get_char_width(*str)); // Добавляем ширину текущего символа.
|
width = (uint16_t)(width + get_char_width(*str)); // Добавляем ширину текущего символа.
|
||||||
str++; // Переходим к следующему символу.
|
str++; // Переходим к следующему символу.
|
||||||
} // Конец цикла по символам.
|
}
|
||||||
return width; // Возвращаем итоговую ширину строки.
|
return width; // Возвращаем итоговую ширину строки.
|
||||||
} // Конец функции расчета ширины строки.
|
}
|
||||||
|
|
||||||
static void update_axis_reflect(int* pos, int* dir, int min_pos, int max_pos) // Обновляем одну координату с зеркальным отражением от границ.
|
static void update_axis_reflect(int* pos, int* dir, int min_pos, int max_pos) // Обновляем одну координату с зеркальным отражением от границ.
|
||||||
{ // Начало функции обновления координаты.
|
{
|
||||||
if (max_pos <= min_pos) // Если объект больше доступного диапазона или диапазон вырожден.
|
if (max_pos <= min_pos) // Если объект больше доступного диапазона или диапазон вырожден.
|
||||||
{ // Начало обработки вырожденного диапазона.
|
{
|
||||||
*pos = min_pos; // Фиксируем позицию в единственной доступной точке.
|
*pos = min_pos; // Фиксируем позицию в единственной доступной точке.
|
||||||
*dir = 0; // Останавливаем движение по этой оси.
|
*dir = 0; // Останавливаем движение по этой оси.
|
||||||
return; // Завершаем обработку оси.
|
return; // Завершаем обработку оси.
|
||||||
} // Конец обработки вырожденного диапазона.
|
}
|
||||||
|
|
||||||
*pos += *dir; // Двигаем объект на 1 пиксель по текущему направлению.
|
*pos += *dir; // Двигаем объект на 1 пиксель по текущему направлению.
|
||||||
if (*pos < min_pos) // Проверяем удар о минимальную границу (верх/лево).
|
if (*pos < min_pos) // Проверяем удар о минимальную границу (верх/лево).
|
||||||
{ // Начало отражения от минимальной границы.
|
{
|
||||||
*pos = min_pos + (min_pos - *pos); // Зеркально отражаем координату внутрь диапазона.
|
*pos = min_pos + (min_pos - *pos); // Зеркально отражаем координату внутрь диапазона.
|
||||||
*dir = -*dir; // Инвертируем направление движения.
|
*dir = -*dir; // Инвертируем направление движения.
|
||||||
} // Конец отражения от минимальной границы.
|
}
|
||||||
else if (*pos > max_pos) // Проверяем удар о максимальную границу (низ/право).
|
else if (*pos > max_pos) // Проверяем удар о максимальную границу (низ/право).
|
||||||
{ // Начало отражения от максимальной границы.
|
{
|
||||||
*pos = max_pos - (*pos - max_pos); // Зеркально отражаем координату внутрь диапазона.
|
*pos = max_pos - (*pos - max_pos); // Зеркально отражаем координату внутрь диапазона.
|
||||||
*dir = -*dir; // Инвертируем направление движения.
|
*dir = -*dir; // Инвертируем направление движения.
|
||||||
} // Конец отражения от максимальной границы.
|
}
|
||||||
} // Конец функции обновления координаты.
|
}
|
||||||
|
|
||||||
static void on_frame_done(void) {} // Callback завершения DMA-кадра оставлен пустым (логика в main).
|
static void on_frame_done(void) {} // Callback завершения DMA-кадра оставлен пустым (логика в main).
|
||||||
|
|
||||||
@@ -100,19 +100,19 @@ int main()
|
|||||||
render_ctx_t rc; // Контекст рендера, который будет привязываться к текущему буферу кадра.
|
render_ctx_t rc; // Контекст рендера, который будет привязываться к текущему буферу кадра.
|
||||||
|
|
||||||
while (1) // Бесконечный основной цикл приложения.
|
while (1) // Бесконечный основной цикл приложения.
|
||||||
{ // Начало тела основного цикла.
|
{
|
||||||
display_poll(); // Обрабатываем внутренние события дисплейного движка (например, frame_done flag).
|
display_poll(); // Обрабатываем внутренние события дисплейного движка (например, frame_done flag).
|
||||||
if (!frame_tick_due) // Если тик таймера еще не пришел.
|
if (!frame_tick_due) // Если тик таймера еще не пришел.
|
||||||
{ // Начало ветки "тика нет".
|
{
|
||||||
wait_for_irq(); // Спим до прерывания, чтобы не крутить пустой busy-loop.
|
wait_for_irq(); // Спим до прерывания, чтобы не крутить пустой busy-loop.
|
||||||
continue; // Переходим к следующей итерации цикла.
|
continue; // Переходим к следующей итерации цикла.
|
||||||
} // Конец ветки "тика нет".
|
}
|
||||||
frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик.
|
frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик.
|
||||||
|
|
||||||
if (!display_ready()) // Если прошлый кадр все еще передается DMA на дисплей.
|
if (!display_ready()) // Если прошлый кадр все еще передается DMA на дисплей.
|
||||||
{ // Начало ветки "дисплей занят".
|
{
|
||||||
continue; // Пропускаем этот кадр, не накапливая задержку.
|
continue; // Пропускаем этот кадр, не накапливая задержку.
|
||||||
} // Конец ветки "дисплей занят".
|
}
|
||||||
|
|
||||||
uint16_t* buf = display_get_draw_buffer(); // Получаем буфер, в который разрешено рисовать текущий кадр.
|
uint16_t* buf = display_get_draw_buffer(); // Получаем буфер, в который разрешено рисовать текущий кадр.
|
||||||
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
|
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
|
||||||
@@ -133,10 +133,10 @@ int main()
|
|||||||
|
|
||||||
phase += 0.16f; // Продвигаем фазу синусоиды для плавной анимации.
|
phase += 0.16f; // Продвигаем фазу синусоиды для плавной анимации.
|
||||||
if (phase > 6.2831853f) // Если фаза превысила 2*pi.
|
if (phase > 6.2831853f) // Если фаза превысила 2*pi.
|
||||||
{ // Начало нормализации фазы.
|
{
|
||||||
phase -= 6.2831853f; // Возвращаем фазу в базовый диапазон без скачка формы.
|
phase -= 6.2831853f; // Возвращаем фазу в базовый диапазон без скачка формы.
|
||||||
} // Конец нормализации фазы.
|
}
|
||||||
|
|
||||||
display_submit(); // Отправляем подготовленный кадр на вывод через DMA.
|
display_submit(); // Отправляем подготовленный кадр на вывод через DMA.
|
||||||
} // Конец тела основного цикла.
|
}
|
||||||
} // Конец функции main.
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user