Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "video_demo.h"
- #include "video_capture/video_capture.h"
- #include "display_ctrl/display_ctrl.h"
- #include "intc/intc.h"
- #include <stdio.h>
- #include "xuartps.h"
- #include "math.h"
- #include <ctype.h>
- #include <stdlib.h>
- #include "xil_types.h"
- #include "xil_cache.h"
- #include "timer_ps/timer_ps.h"
- #include "xparameters.h"
- #include <stdio.h>
- #include "xtime_l.h"
- #include "xgpio.h"
- #include "xscugic.h"
- #include <unistd.h>
- Farve red={255,0,0};
- Farve sort = {192,192,192};
- /*
- * XPAR redefines
- */
- #define DYNCLK_BASEADDR XPAR_AXI_DYNCLK_0_BASEADDR
- #define VGA_VDMA_ID XPAR_AXIVDMA_0_DEVICE_ID
- #define DISP_VTC_ID XPAR_VTC_0_DEVICE_ID
- #define VID_VTC_ID XPAR_VTC_1_DEVICE_ID
- #define VID_GPIO_ID XPAR_AXI_GPIO_VIDEO_DEVICE_ID
- #define VID_VTC_IRPT_ID XPS_FPGA3_INT_ID
- #define VID_GPIO_IRPT_ID XPS_FPGA4_INT_ID
- #define SCU_TIMER_ID XPAR_SCUTIMER_DEVICE_ID
- #define UART_BASEADDR XPAR_PS7_UART_1_BASEADDR
- #define BTNS_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
- #define LEDS_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID
- #define INTC_GPIO_INTERRUPT_ID XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
- #define INTC_TMR_INTERRUPT_ID XPAR_FABRIC_AXI_TIMER_0_INTERRUPT_INTR
- #define BTN_INT XGPIO_IR_CH1_MASK
- void Int_Handler(void *InstancePtr);
- /* ------------------------------------------------------------ */
- /* Global Variables */
- /* ------------------------------------------------------------ */
- char userInput = 0;
- int playeNewPos;
- int player_pos=220;
- int ra1;
- int ra2;
- int ra3;
- int r1 = 5;
- int r2 = 8;
- int r3 = 10;
- int enemySpeedCounter1;
- int enemySpeedCounter2;
- int enemySpeedCounter3;
- int Enemy_X3 = 600;
- int Enemy3_wGreen = 0;
- int Enemy3_wRed = 255;
- int Enemy3_wBlue = 0;
- int enemy_y3 = 260;
- int Enemy_X2 = 600;
- int Enemy2_wGreen = 0;
- int Enemy2_wRed = 255;
- int Enemy2_wBlue = 0;
- int enemy_y2 = 220;
- int Enemy_wGreen = 0;
- int Enemy_wRed = 255;
- int Enemy_wBlue = 0;
- int enemy_y = 180;
- int Enemy_X = 600;
- int Enemy_y_size = 10;
- int Enemy_x_size = 40;
- XGpio LEDInst, BTNInst;
- XScuGic INTCInst;
- int SpilStartet;
- int r;
- int r2;
- int x=5;
- int led_data;
- int btn_value;
- /*
- * Display and Video Driver structs
- */
- DisplayCtrl dispCtrl;
- XAxiVdma vdma;
- VideoCapture videoCapt;
- INTC intc;
- char fRefresh; //flag used to trigger a refresh of the Menu on video detect
- int randomCount;
- int count;
- /*
- * Framebuffers for video data
- */
- u8 frameBuf[DISPLAY_NUM_FRAMES][DEMO_MAX_FRAME];
- u8 *pFrames[DISPLAY_NUM_FRAMES]; //array of pointers to the frame buffers
- /*
- * Interrupt vector table
- */
- const ivt_t ivt[] = {
- videoGpioIvt(VID_GPIO_IRPT_ID, &videoCapt),
- videoVtcIvt(VID_VTC_IRPT_ID, &(videoCapt.vtc)),
- {66, (XInterruptHandler)Int_Handler, NULL, 0xA0, 0x3}
- };
- /* ------------------------------------------------------------ */
- /* PROTOTYPE Definitions */
- /* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
- /* Procedure Definitions */
- /* ------------------------------------------------------------ */
- int a=1;
- int main(void)
- {
- u8* frame = &frameBuf[0];
- DemoInitialize();
- PlayerBox(frame,50,220,40,10,1);
- DisplayChangeFrame(&dispCtrl, 0);
- while(1) {
- Input();
- EnemySpeed1();
- tegn_box(frame,Enemy_X,enemy_y,40,10,sort);
- MoveEnemy1();
- tegn_box(frame,Enemy_X,enemy_y,40,10,red);
- EnemySpeed3();
- tegn_box(frame,Enemy_X2,enemy_y2,40,10,sort);
- MoveEnemy2();
- tegn_box(frame,Enemy_X2,enemy_y2,40,10,red);
- EnemySpeed3();
- tegn_box(frame,Enemy_X3,enemy_y3,40,10,sort);
- MoveEnemy3();
- tegn_box(frame,Enemy_X3,enemy_y3,40,10,red);
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- //xil_printf("test\n\r");
- usleep(16000);
- }
- return 0;
- }
- void Int_Handler(void *InstancePtr){
- enemySpeedCounter1++;
- enemySpeedCounter2++;
- enemySpeedCounter3++;
- xil_printf("%d\n\r", enemySpeedCounter3);
- }
- void DemoInitialize()
- {
- int Status;
- XAxiVdma_Config *vdmaConfig;
- int i;
- /*
- * Initialize an array of pointers to the 3 frame buffers
- */
- for (i = 0; i < DISPLAY_NUM_FRAMES; i++)
- {
- pFrames[i] = frameBuf[i];
- }
- /*
- * Initialize a timer used for a simple delay
- */
- TimerInitialize(SCU_TIMER_ID);
- /*
- * Initialize VDMA driver
- */
- vdmaConfig = XAxiVdma_LookupConfig(VGA_VDMA_ID);
- if (!vdmaConfig)
- {
- xil_printf("No video DMA found for ID %d\r\n", VGA_VDMA_ID);
- return;
- }
- Status = XAxiVdma_CfgInitialize(&vdma, vdmaConfig, vdmaConfig->BaseAddress);
- if (Status != XST_SUCCESS)
- {
- xil_printf("VDMA Configuration Initialization failed %d\r\n", Status);
- return;
- }
- /*
- * Initialize the Display controller and start it
- */
- Status = DisplayInitialize(&dispCtrl, &vdma, DISP_VTC_ID, DYNCLK_BASEADDR, pFrames, DEMO_STRIDE);
- if (Status != XST_SUCCESS)
- {
- xil_printf("Display Ctrl initialization failed during demo initialization%d\r\n", Status);
- return;
- }
- Status = DisplayStart(&dispCtrl);
- if (Status != XST_SUCCESS)
- {
- xil_printf("Couldn't start display during demo initialization%d\r\n", Status);
- return;
- }
- /*
- * Initialize the Interrupt controller and start it.
- */
- Status = fnInitInterruptController(&intc);
- if(Status != XST_SUCCESS) {
- xil_printf("Error initializing interrupts");
- return;
- }
- fnEnableInterrupts(&intc, &ivt[0], sizeof(ivt)/sizeof(ivt[0]));
- /*
- * Initialize the Video Capture device
- */
- Status = VideoInitialize(&videoCapt, &intc, &vdma, VID_GPIO_ID, VID_VTC_ID, VID_VTC_IRPT_ID, pFrames, DEMO_STRIDE, DEMO_START_ON_DET);
- if (Status != XST_SUCCESS)
- {
- xil_printf("Video Ctrl initialization failed during demo initialization%d\r\n", Status);
- return;
- }
- /*
- * Set the Video Detect callback to trigger the menu to reset, displaying the new detected resolution
- */
- VideoSetCallback(&videoCapt, DemoISR, &fRefresh);
- StartSpil();
- return;
- }
- void DemoInvertFrame(u8 *srcFrame, u8 *destFrame, u32 width, u32 height, u32 stride)
- {
- u32 xcoi, ycoi;
- u32 lineStart = 0;
- for(ycoi = 0; ycoi < height; ycoi++)
- {
- for(xcoi = 0; xcoi < (width * 3); xcoi+=3)
- {
- destFrame[xcoi + lineStart] = ~srcFrame[xcoi + lineStart]; //Red
- destFrame[xcoi + lineStart + 1] = ~srcFrame[xcoi + lineStart + 1]; //Blue
- destFrame[xcoi + lineStart + 2] = ~srcFrame[xcoi + lineStart + 2]; //Green
- }
- lineStart += stride;
- }
- /*
- * Flush the framebuffer memory range to ensure changes are written to the
- * actual memory, and therefore accessible by the VDMA.
- */
- Xil_DCacheFlushRange((unsigned int) destFrame, DEMO_MAX_FRAME);
- }
- /*
- * Bilinear interpolation algorithm. Assumes both frames have the same stride.
- */
- void DemoScaleFrame(u8 *srcFrame, u8 *destFrame, u32 srcWidth, u32 srcHeight, u32 destWidth, u32 destHeight, u32 stride)
- {
- float xInc, yInc; // Width/height of a destination frame pixel in the source frame coordinate system
- float xcoSrc, ycoSrc; // Location of the destination pixel being operated on in the source frame coordinate system
- float x1y1, x2y1, x1y2, x2y2; //Used to store the color data of the four nearest source pixels to the destination pixel
- int ix1y1, ix2y1, ix1y2, ix2y2; //indexes into the source frame for the four nearest source pixels to the destination pixel
- float xDist, yDist; //distances between destination pixel and x1y1 source pixels in source frame coordinate system
- int xcoDest, ycoDest; // Location of the destination pixel being operated on in the destination coordinate system
- int iy1; //Used to store the index of the first source pixel in the line with y1
- int iDest; //index of the pixel data in the destination frame being operated on
- int i;
- xInc = ((float) srcWidth - 1.0) / ((float) destWidth);
- yInc = ((float) srcHeight - 1.0) / ((float) destHeight);
- ycoSrc = 0.0;
- for (ycoDest = 0; ycoDest < destHeight; ycoDest++)
- {
- iy1 = ((int) ycoSrc) * stride;
- yDist = ycoSrc - ((float) ((int) ycoSrc));
- /*
- * Save some cycles in the loop below by presetting the destination
- * index to the first pixel in the current line
- */
- iDest = ycoDest * stride;
- xcoSrc = 0.0;
- for (xcoDest = 0; xcoDest < destWidth; xcoDest++)
- {
- ix1y1 = iy1 + ((int) xcoSrc) * 3;
- ix2y1 = ix1y1 + 3;
- ix1y2 = ix1y1 + stride;
- ix2y2 = ix1y1 + stride + 3;
- xDist = xcoSrc - ((float) ((int) xcoSrc));
- /*
- * For loop handles all three colors
- */
- for (i = 0; i < 3; i++)
- {
- x1y1 = (float) srcFrame[ix1y1 + i];
- x2y1 = (float) srcFrame[ix2y1 + i];
- x1y2 = (float) srcFrame[ix1y2 + i];
- x2y2 = (float) srcFrame[ix2y2 + i];
- /*
- * Bilinear interpolation function
- */
- destFrame[iDest] = (u8) ((1.0-yDist)*((1.0-xDist)*x1y1+xDist*x2y1) + yDist*((1.0-xDist)*x1y2+xDist*x2y2));
- iDest++;
- }
- xcoSrc += xInc;
- }
- ycoSrc += yInc;
- }
- /*
- * Flush the framebuffer memory range to ensure changes are written to the
- * actual memory, and therefore accessible by the VDMA.
- */
- Xil_DCacheFlushRange((unsigned int) destFrame, DEMO_MAX_FRAME);
- return;
- }
- void RandomEnemies(){
- if (randomCount == 18) {
- r=rand()%2;
- if(r == 0){
- if(enemy_y2 == 180){
- enemy_y2 = enemy_y2 + 40 ;
- }
- else{
- enemy_y2 = enemy_y2 - 40 ;
- }
- }
- if(r == 1){
- if(enemy_y2 == 260){
- enemy_y2 = enemy_y2 - 40;
- }
- else{
- enemy_y2 = enemy_y2 + 40;
- }
- }
- randomCount = 0;
- }
- }
- void Input(){
- fRefresh = 0;
- /* Store the first character in the UART receive FIFO and echo it */
- if (XUartPs_IsReceiveData(UART_BASEADDR))
- {
- userInput = XUartPs_ReadReg(UART_BASEADDR, XUARTPS_FIFO_OFFSET);
- xil_printf("%c", userInput);
- }
- else //Refresh triggered by video detect interrupt
- {
- userInput = 'r';
- }
- if(userInput == '1'){
- PlayerMove(1);
- }
- if(userInput == '2'){
- PlayerMove(2);
- }
- }
- void MoveEnemy1(){
- Enemy_X = Enemy_X - r1;
- if (Enemy_X <= 0) {
- Enemy_X = 600;
- }
- }
- void MoveEnemy2(){
- Enemy_X2 = Enemy_X2 - r2;
- if (Enemy_X2 <= 0) {
- Enemy_X2 = 600;
- }
- }
- void MoveEnemy3(){
- Enemy_X3 = Enemy_X3 - r3;
- if (Enemy_X3 <= 0) {
- Enemy_X3 = 600;
- }
- }
- void EnemySpeed1(){
- if(enemySpeedCounter1 >= 100 && Enemy_X >= 580){
- ra1=rand()%3;
- if(ra1 == 0){
- r1 = 5;
- }
- if(ra1 == 1) {
- r1 = 8;
- }
- if(ra1 == 2) {
- r1 = 11;
- }
- enemySpeedCounter1 = 0;
- }
- }
- void EnemySpeed2(){
- if(enemySpeedCounter2 >= 100 && Enemy_X2 >= 580){
- ra2=rand()%3;
- if(ra2 == 0){
- r2 = 5;
- }
- if(ra2 == 1) {
- r2 = 8;
- }
- if(ra2 == 2) {
- r2 = 11;
- }
- enemySpeedCounter2 = 0;
- }
- }
- void EnemySpeed3(){
- if(enemySpeedCounter3 >= 100 && Enemy_X3 >= 580){
- ra3=rand()%3;
- if(ra3 == 0){
- r3 = 5;
- }
- if(ra3 == 1) {
- r3 = 8;
- }
- if(ra3 == 2) {
- r3 = 11;
- }
- enemySpeedCounter3 = 0;
- }
- }
- void tegn_box(u8* frame, u32 x, u32 y, u32 dx, u32 dy, Farve f){
- u32 x_tmp, y_tmp;
- u32 iPixelAddr;
- for(x_tmp = x ; x_tmp < x+dx; x_tmp++)
- {
- for(y_tmp=y; y_tmp < y+dy; y_tmp++)
- {
- iPixelAddr = 3*x_tmp + y_tmp*DEMO_STRIDE;
- frame[iPixelAddr] = f.g;
- frame[iPixelAddr + 1] = f.b;
- frame[iPixelAddr + 2] = f.r;
- }
- }
- }
- /*
- void ShowEnemy1(u8 *frame){
- u32 x_tmp, y_tmp, x_tmp2, y_tmp2;
- u32 iPixelAddr, iPixelAddr2;
- // Farve white = {255,255,255};
- tegn_box(frame,Enemy_X, enemy_y, 40, 10, red);
- }
- */
- void PlayerBox(u8 *frame, u32 x, u32 y, u32 x_size, u32 y_size, u32 color) {
- u32 iPixelAddr;
- u8 wRed, wBlue, wGreen;
- u32 x_tmp, y_tmp;
- //Hvid farve
- if(color == 1) {
- wGreen = 255;
- wRed = 255;
- wBlue = 255;
- }
- //Sort farve
- else {
- wGreen = 192;
- wRed = 192;
- wBlue = 192;
- }
- //Tegner boxen
- for(x_tmp=x; x_tmp < x+x_size; x_tmp++)
- {
- for(y_tmp=y; y_tmp < y+y_size; y_tmp++)
- {
- iPixelAddr = 3*x_tmp + y_tmp*DEMO_STRIDE;
- frame[iPixelAddr] = wGreen;
- frame[iPixelAddr + 1] = wBlue;
- frame[iPixelAddr + 2] = wRed;
- }
- }
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- }
- void PlayerMove(u32 playerNewPos){
- //playeNewPos = userInput;
- /*
- if(playeNewPos == 4){
- playeNewPos = 1;
- }
- if(playeNewPos == 5){
- playeNewPos = 2;
- }
- */
- int y;
- y = player_pos;
- // Flytter player op
- if(playerNewPos == 1 && player_pos == 260 ){
- PlayerBox(frameBuf[0],50,y,40,10,2);
- y = y-40;
- PlayerBox(frameBuf[0],50,y,40,10,1);
- //PlayerBox(frameBuf[0],50,y,40,10,0);
- }
- if(playerNewPos == 1 && player_pos == 220 ){
- PlayerBox(frameBuf[0],50,y,40,10,2);
- y = y-40;
- PlayerBox(frameBuf[0],50,y,40,10,1);
- //PlayerBox(frameBuf[0],50,y,40,10,0);
- }
- // Flytter player ned
- if(playerNewPos == 2 && player_pos == 180 ){
- PlayerBox(frameBuf[0],50,y,40,10,2);
- y = y+40;
- PlayerBox(frameBuf[0],50,y,40,10,1);
- //PlayerBox(frameBuf[0],50,y,40,10,0);
- }
- // Flytter player ned
- if(playerNewPos == 2 && player_pos == 220 ){
- PlayerBox(frameBuf[0],50,y,40,10,2);
- y = y+40;
- PlayerBox(frameBuf[0],50,y,40,10,1);
- //PlayerBox(frameBuf[0],50,y,40,10,0);
- }
- player_pos=y;
- }
- void StartSpil(){
- SpilStartet = 1;
- led_data=2;
- Background(pFrames[dispCtrl.curFrame], dispCtrl.vMode.width, dispCtrl.vMode.height, DEMO_STRIDE);
- Platform2(pFrames[dispCtrl.curFrame], dispCtrl.vMode.width, dispCtrl.vMode.height, DEMO_STRIDE);
- Platform(pFrames[dispCtrl.curFrame], dispCtrl.vMode.width, dispCtrl.vMode.height, DEMO_STRIDE);
- OpStribe(pFrames[dispCtrl.curFrame], dispCtrl.vMode.width, dispCtrl.vMode.height, DEMO_STRIDE);
- NedStribe(pFrames[dispCtrl.curFrame], dispCtrl.vMode.width, dispCtrl.vMode.height, DEMO_STRIDE);
- }
- void Platform2(u8 *frame, u32 width, u32 height, u32 stride){
- u32 xcoi, ycoi;
- u32 iPixelAddr;
- u8 wRed, wBlue, wGreen;
- wGreen = 255;
- wRed = 255;
- wBlue = 255;
- for(xcoi = 0; xcoi < (width*3); xcoi+=3)
- {
- iPixelAddr = xcoi + 280*stride;
- for(ycoi = 270; ycoi < height-200; ycoi++)
- {
- frame[iPixelAddr] = wGreen;
- frame[iPixelAddr + 1] = wBlue;
- frame[iPixelAddr + 2] = wRed;
- iPixelAddr += stride;
- }
- }
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- }
- void Platform(u8 *frame, u32 width, u32 height, u32 stride){
- u32 xcoi, ycoi;
- u32 iPixelAddr;
- u8 wRed, wBlue, wGreen;
- wGreen = 255;
- wRed = 255;
- wBlue = 255;
- for(xcoi = 0; xcoi < (width*3); xcoi+=3)
- {
- iPixelAddr = xcoi + 158*stride;
- for(ycoi = 270; ycoi < height-200; ycoi++)
- {
- frame[iPixelAddr] = wGreen;
- frame[iPixelAddr + 1] = wBlue;
- frame[iPixelAddr + 2] = wRed;
- iPixelAddr += stride;
- }
- }
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- }
- void Background(u8 *frame, u32 width, u32 height, u32 stride)
- {
- u32 xcoi, ycoi;
- u32 iPixelAddr;
- u8 wRed, wBlue, wGreen;
- wGreen = 192;
- wRed = 192;
- wBlue = 192;
- for(xcoi = 0; xcoi < (width*3)-1; xcoi+=3)
- {
- iPixelAddr = xcoi + 165*stride;
- for(ycoi = 0; ycoi < height-360; ycoi++)
- {
- frame[iPixelAddr] = wGreen;
- frame[iPixelAddr +1] = wBlue;
- frame[iPixelAddr + 2] = wRed;
- iPixelAddr += stride;
- }
- }
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- }
- void OpStribe(u8 *frame, u32 width, u32 height, u32 stride){
- u32 xcoi, ycoi;
- u32 iPixelAddr;
- u8 wRed, wBlue, wGreen;
- wGreen = 255;
- wRed = 255;
- wBlue = 255;
- for(xcoi = 0; xcoi < (width*3); xcoi+=3)
- {
- iPixelAddr = xcoi + 200*stride;
- for(ycoi = 276; ycoi < height-200; ycoi++)
- {
- frame[iPixelAddr] = wGreen;
- frame[iPixelAddr + 1] = wBlue;
- frame[iPixelAddr + 2] = wRed;
- iPixelAddr += stride;
- }
- }
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- }
- void NedStribe(u8 *frame, u32 width, u32 height, u32 stride){
- u32 xcoi, ycoi;
- u32 iPixelAddr;
- u8 wRed, wBlue, wGreen;
- wGreen = 255;
- wRed = 255;
- wBlue = 255;
- for(xcoi = 0; xcoi < (width*3); xcoi+=3)
- {
- iPixelAddr = xcoi + 240*stride;
- for(ycoi = 276; ycoi < height-200; ycoi++)
- {
- frame[iPixelAddr] = wGreen;
- frame[iPixelAddr + 1] = wBlue;
- frame[iPixelAddr + 2] = wRed;
- iPixelAddr += stride;
- }
- }
- Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
- }
- void DemoISR(void *callBackRef, void *pVideo)
- {
- char *data = (char *) callBackRef;
- *data = 1; //set fRefresh to 1
- }
Advertisement
Add Comment
Please, Sign In to add comment