Initial commit
This commit is contained in:
95
lines_functions.c
Normal file
95
lines_functions.c
Normal file
@@ -0,0 +1,95 @@
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#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
|
||||
}
|
||||
Reference in New Issue
Block a user