diff --git a/software/code/main.c b/software/code/main.c index 314abf102bc5e3ef352697de161910468efed641..c24abf34489b291e6299c0e117ad7b8c293be8cb 100644 --- a/software/code/main.c +++ b/software/code/main.c @@ -1,119 +1,217 @@ -#define __MAIN_C__ - -#include <stdint.h> -#include <stdio.h> -#include <stdbool.h> -#include<math.h> - -// Define the raw base address values for the i/o devices - -#define AHB_SW_BASE 0x40000000 -#define AHB_PIX_BASE 0x50000000 - -// Define pointers with correct type for access to 32-bit i/o devices -volatile uint32_t* SW_REGS = (volatile uint32_t*) AHB_SW_BASE; -volatile uint32_t* PIX_REGS = (volatile uint32_t*) AHB_PIX_BASE; - -#include <stdint.h> - -///////////////////////////////////////////////////////////////// -// Functions provided to access i/o devices -//////////////////////////////////////////////////////////////// - -void write_pix( int p_x, int p_y, int colour) { - int pix_address ; - pix_address = p_x + 640*p_y ; - PIX_REGS[pix_address] = colour; - } - -bool PointinTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y){ - - int L1_detT = ((y2-y3)*(x-x3))+((x3-x2)*(y-y3)) ; - int L2_detT = ((y3-y1)*(x-x3))+((x1-x3)*(y-y3)) ; - int detT = ((y2-y3)*(x1-x3))+((x3-x2)*(y1-y3)) ; - -if((L1_detT + L2_detT) > detT) - return true ; -else - return false ; - -} - -uint32_t read_switches(int addr) { - - return SW_REGS[addr]; - -} - -bool check_switches(int addr) { - - int status, switches_ready; - - status = SW_REGS[2]; - - // use the addr value to select one bit of the status register - switches_ready = (status >> addr) & 1; - - return (switches_ready == 1); - -} - -void wait_for_any_switch_data(void) { - - // this is a 'busy wait' - - // ( it should only be used if there is nothing - // else for the embedded system to do ) - - while ( SW_REGS[2] == 0 ); - - return; - -} - - -////////////////////////////////////////////////////////////////// -// Main Function -////////////////////////////////////////////////////////////////// -int main(void) { - - - -while(1) { - int x1 = 10; - int y1 = 30; - - - int x2 = 20; - int y2 = 40; - - int x3 = 20; - int y3 = 30; - - - int L1_detT ; - int L2_detT ; - int detT ; - - int L1_positive, L2_positive, L3_positive ; - - -for (int x = 0 ; x < 640 ; x++){ - for (int y = 0 ; y < 480 ; y++) { - - L1_detT = ((y2-y3) * (x-x3)) + ((x3-x2) * (y-y3)) ; - L2_detT = ((y3-y1) * (x-x3)) + ((x1-x3) * (y-y3)) ; - detT = ((y2-y3) * (x1-x3)) + ((x3-x2) * (y1-y3)) ; - - L1_positive = ((L1_detT >= 0) == (detT >= 0)) ; - L2_positive = ((L2_detT >= 0) == (detT >= 0)) ; - L3_positive = (((L1_detT + L2_detT) <= detT) == (detT >= 0)) ; - - - if(L1_positive && L2_positive && L3_positive) - write_pix(x,y,1); - - } - } - } -} +#define __MAIN_C__ + +#include <stdint.h> +#include <stdio.h> +#include <stdbool.h> +#include <math.h> + +// Define the raw base address values for the i/o devices + +#define AHB_SW_BASE 0x40000000 +#define AHB_PIX_BASE 0x50000000 + +// Define pointers with correct type for access to 32-bit i/o devices +volatile uint32_t* SW_REGS = (volatile uint32_t*) AHB_SW_BASE; +volatile uint32_t* PIX_REGS = (volatile uint32_t*) AHB_PIX_BASE; + +#include <stdint.h> + +///////////////////////////////////////////////////////////////// +// Functions provided to access i/o devices +//////////////////////////////////////////////////////////////// + +void write_pix( int p_x, int p_y, int colour) { + int pix_address ; + pix_address = p_x + 640*p_y ; + PIX_REGS[pix_address] = colour; +} + +bool PointinTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y){ + + int L1_detT = ((y2-y3)*(x-x3))+((x3-x2)*(y-y3)) ; + int L2_detT = ((y3-y1)*(x-x3))+((x1-x3)*(y-y3)) ; + int detT = ((y2-y3)*(x1-x3))+((x3-x2)*(y1-y3)) ; + + if((L1_detT + L2_detT) > detT) + return true ; + else + return false ; + +} + +uint32_t read_switches(int addr) { + + return SW_REGS[addr]; + +} + +bool check_switches(int addr) { + + int status, switches_ready; + + status = SW_REGS[2]; + + // use the addr value to select one bit of the status register + switches_ready = (status >> addr) & 1; + + return (switches_ready == 1); + +} + +void wait_for_any_switch_data(void) { + + // this is a 'busy wait' + + // ( it should only be used if there is nothing + // else for the embedded system to do ) + + while ( SW_REGS[2] == 0 ); + + return; + +} + + +////////////////////////////////////////////////////////////////// +// Main Function +////////////////////////////////////////////////////////////////// +int main(void) { + + struct Screen screen; + screen.width = 640; + screen.height = 480; + + + Mole moles[9]; + + + time_t seconds; + + + int moleRadius = 50; + int spacing = 5; + int maxHeight = 90; + for (int i = 0; i< 9; i++){ + int row = i/3; + int column = i%3; + + struct Mole m; + m.centerX = (screen.width/2 - moleRadius*1.5) + row*(moleRadius+spacing); + m.centerY = (screen.height/2 - moleRadius*1.5) + row*(moleRadius+spacing); + m.radius = moleRadius; + + + moles[i] = m; + } + + + while(1){ + + time(&seconds); + for (int i = 0; i< 9; i++){ + struct Mole m = moles[9]; + physics(m, maxHeight, seconds) + } + + + } + + +} + + + + + +void drawTriangle(int pos1, int pos2, int pos3){ + + + + +} + + + + + + + + +//////////////////////////// +///////// STRUCTURES /////// +//////////////////////////// + +struct Screen{ + int width; + int hright; +} + + + +struct Mole{ + int centerX; + int centerY; + int radius = 30; + int height = 0; + int oldTime = 0; + m.state = random; +} + + + + +void drawCircle(int centerX, int centerY, int radius, int thicknessMax, float angleMax, int color){ + for (int thickness = 0; thickness < thicknessMax; thickness++){ + for (float angle = 0; angle < angleMax; angle++){ + float posX = centerX + ((radius+thickness) * cos(angle*PI/180.0)); + float posY = centerY + ((radius+thickness) * sin(angle*PI/180)); + write_px((int) posX, (int) posY, color); + } + } +} + +void render(struct Mole mole, int color){ + + drawCircle(mole.centerX, mole.centerY, mole.radius, 5, 360, 1); + + + int newR = mole.radius-5; + + for (int i = mole.height; i>=0; i--){ + write_px((int) mole.centerX+newR, i + centerY, color) + write_px((int) mole.centerX-newR, i + centerY, color) + } + + drawCircle(mole.centerX, mole.centerY + mole.height, newR, 1, 180, 1); + + +} + + + +void physics(struct Mole m, int maxHeight, int time){ + if (time-m.oldTime < 200) + return; + + if(m.height < maxHeight && m.state == 0){ + m.height = m.height+1; + }else{ + m.state = 1; + } + + if (m.height > 0 && m.state == 1){ + m.height--; + }else{ + m.state = 0; + } + + +} + + + + + + + +