#include #include #include #include "stm32f7xx_hal.h" #include "nokia.h" #define NUMBER_OF_LINES 20 typedef struct // LINE STRUCTURE { int8_t x1; ///< first point X pos int8_t y1; ///< first point y pos int8_t x2; ///< second point X pos int8_t y2; ///< second point Y pos } LINE; LINE lines[NUMBER_OF_LINES]; // the lines uint32_t toClear,toDraw; LINE directions = { 1, 2, 3, 4 }; // the point of lines directions /////////////////////////////////////////////////////////////////////////////// /// \brief Calculate the new line X position /// \param pos the pointer to new position /// \param dir the pointer to the new direction /////////////////////////////////////////////////////////////////////////////// static void CalcNewLineX(int8_t * pos, int8_t * dir) { int8_t temp; temp = *pos + *dir; // new position calcul if ((temp > 83) || (temp < 0)) // check limit bounds { if (*dir > 0) // was going left to right { *dir = 0 - ((rand() * 3 / RAND_MAX) + 1); // change direction } else // was going right to left { *dir = (rand() * 3 / RAND_MAX) + 1; // change direction } temp = *pos + *dir; // recalculate new position } *pos = temp; // change position } /////////////////////////////////////////////////////////////////////////////// /// \brief Calculate the new line Y position /// \param pos the pointer to new position /// \param dir the pointer to the new direction /////////////////////////////////////////////////////////////////////////////// static void CalcNewLineY(int8_t * pos, int8_t * dir) { int8_t temp; temp = *pos + *dir; // new position calcul if ((temp > 47) || (temp < 0)) // check limit bounds { if (*dir > 0) // was going top to bottom { *dir = 0 - ((rand() * 1 / RAND_MAX) + 1); // change direction } else // was going bottom to top { *dir = (rand() * 1 / RAND_MAX) + 1; // change direction } temp = *pos + *dir; // recalculate new position } *pos = temp; // change position } void ScreenSaver(void) { toClear = (toDraw + 1)%NUMBER_OF_LINES; // next line to clear //-------------------------------------------------------------------- // clear oldest line NokiaDrawLine(lines[toClear].x1,lines[toClear].y1, lines[toClear].x2,lines[toClear].y2,0); //-------------------------------------------------------------------- // draw newest line NokiaDrawLine(lines[toDraw].x1,lines[toDraw].y1, lines[toDraw].x2,lines[toDraw].y2,1); //-------------------------------------------------------------------- lines[toClear] = lines[toDraw]; // for calculation of new line CalcNewLineX(&lines[toClear].x1,&directions.x1); CalcNewLineX(&lines[toClear].x2,&directions.x2); CalcNewLineY(&lines[toClear].y1,&directions.y1); CalcNewLineY(&lines[toClear].y2,&directions.y2); toDraw = toClear; // next line to draw }