asdf

Dependencies:   mbed

Committer:
dicarloj
Date:
Sat Nov 18 04:18:42 2017 +0000
Revision:
0:7757ab3f7206
asdf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dicarloj 0:7757ab3f7206 1 #include "mbed.h"
dicarloj 0:7757ab3f7206 2 #define V_RES 220
dicarloj 0:7757ab3f7206 3 #define H_RES 100
dicarloj 0:7757ab3f7206 4 #include <math.h>
dicarloj 0:7757ab3f7206 5 #define X_MIN 24
dicarloj 0:7757ab3f7206 6 #define X_MAX (76+18)
dicarloj 0:7757ab3f7206 7 #define Y_MIN 7
dicarloj 0:7757ab3f7206 8 #define Y_MAX (V_RES/4 - 15)
dicarloj 0:7757ab3f7206 9
dicarloj 0:7757ab3f7206 10 #define Y_0 ( (Y_MIN + Y_MAX)/2 )
dicarloj 0:7757ab3f7206 11 #define X_0 ( (X_MIN + X_MAX)/2 )
dicarloj 0:7757ab3f7206 12 #define SIDE 8
dicarloj 0:7757ab3f7206 13 #define HSIDE 8
dicarloj 0:7757ab3f7206 14 #define SIN_V (0.03)
dicarloj 0:7757ab3f7206 15 #define COS_V (0.99955f)
dicarloj 0:7757ab3f7206 16 #define BX_0 30
dicarloj 0:7757ab3f7206 17 #define BY_0 (V_RES/4 - 15)
dicarloj 0:7757ab3f7206 18 #define BX 42
dicarloj 0:7757ab3f7206 19 #define BY 15
dicarloj 0:7757ab3f7206 20 #define DEMO_LENGTH 600
dicarloj 0:7757ab3f7206 21
dicarloj 0:7757ab3f7206 22
dicarloj 0:7757ab3f7206 23 DigitalOut sout(D8); //sync
dicarloj 0:7757ab3f7206 24 DigitalOut vout(D7); //video
dicarloj 0:7757ab3f7206 25 Ticker t;
dicarloj 0:7757ab3f7206 26 uint8_t draw_line_inv = 0;
dicarloj 0:7757ab3f7206 27 //9x42
dicarloj 0:7757ab3f7206 28 uint8_t miters[] = {
dicarloj 0:7757ab3f7206 29 1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dicarloj 0:7757ab3f7206 30 1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dicarloj 0:7757ab3f7206 31 1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 32 1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,
dicarloj 0:7757ab3f7206 33 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,
dicarloj 0:7757ab3f7206 34 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,
dicarloj 0:7757ab3f7206 35 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,
dicarloj 0:7757ab3f7206 36 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,
dicarloj 0:7757ab3f7206 37 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,
dicarloj 0:7757ab3f7206 38 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 39 0,0,0,0,0,0,0,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 40 1,1,1,1,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,1,1,1,1,1,
dicarloj 0:7757ab3f7206 41 1,0,1,0,1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,1,
dicarloj 0:7757ab3f7206 42 1,0,1,0,1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,0,1,0,1,
dicarloj 0:7757ab3f7206 43 1,0,1,0,1,0,0,1,1,0,1,0,1,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1,
dicarloj 0:7757ab3f7206 44
dicarloj 0:7757ab3f7206 45 };
dicarloj 0:7757ab3f7206 46
dicarloj 0:7757ab3f7206 47 uint8_t tv[] = {
dicarloj 0:7757ab3f7206 48 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 49 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 50 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 51 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 52 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 53 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 54 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 55 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 56 0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 57 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 58 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 59 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 60 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 61 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
dicarloj 0:7757ab3f7206 62 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0};
dicarloj 0:7757ab3f7206 63
dicarloj 0:7757ab3f7206 64
dicarloj 0:7757ab3f7206 65
dicarloj 0:7757ab3f7206 66 uint16_t l=0; //current line of scan
dicarloj 0:7757ab3f7206 67
dicarloj 0:7757ab3f7206 68 uint8_t im_line_s[H_RES]; //image sync buffer
dicarloj 0:7757ab3f7206 69
dicarloj 0:7757ab3f7206 70 uint8_t bl_line_s[H_RES]; //lower 1/4 of screen sync buffer
dicarloj 0:7757ab3f7206 71 uint8_t bl_line_v[H_RES]; //lower 1/4 of screen video buffer
dicarloj 0:7757ab3f7206 72 uint8_t vb_line_s[H_RES]; //vertical sync, sync buffer
dicarloj 0:7757ab3f7206 73 uint8_t vb_line_v[H_RES]; //vertical sync, video buffer
dicarloj 0:7757ab3f7206 74
dicarloj 0:7757ab3f7206 75 float cube_a[3] = {15.f, 0.f, 0.f};
dicarloj 0:7757ab3f7206 76
dicarloj 0:7757ab3f7206 77
dicarloj 0:7757ab3f7206 78 float cube_pts[8][3] = { {SIDE,SIDE,HSIDE},
dicarloj 0:7757ab3f7206 79 {-SIDE,SIDE,HSIDE},
dicarloj 0:7757ab3f7206 80 {-SIDE,-SIDE,HSIDE},
dicarloj 0:7757ab3f7206 81 {SIDE,-SIDE,HSIDE},
dicarloj 0:7757ab3f7206 82 {SIDE,-SIDE,-HSIDE},
dicarloj 0:7757ab3f7206 83 {-SIDE,-SIDE,-HSIDE},
dicarloj 0:7757ab3f7206 84 {-SIDE,SIDE,-HSIDE},
dicarloj 0:7757ab3f7206 85 {SIDE,SIDE,-HSIDE} };
dicarloj 0:7757ab3f7206 86
dicarloj 0:7757ab3f7206 87 float x_rot[3][3] = { {1.f, 0.f, 0.f},
dicarloj 0:7757ab3f7206 88 {0.f, COS_V, -SIN_V},
dicarloj 0:7757ab3f7206 89 {0.f, SIN_V, COS_V} };
dicarloj 0:7757ab3f7206 90
dicarloj 0:7757ab3f7206 91 float y_rot[3][3] = { {COS_V, 0.f, SIN_V},
dicarloj 0:7757ab3f7206 92 {0.f, 1.f, 0.f},
dicarloj 0:7757ab3f7206 93 {-SIN_V, 0, COS_V} };
dicarloj 0:7757ab3f7206 94
dicarloj 0:7757ab3f7206 95 float z_rot[3][3] = { {COS_V, -SIN_V, 0.f},
dicarloj 0:7757ab3f7206 96 {SIN_V, COS_V, 0.f},
dicarloj 0:7757ab3f7206 97 {0.f, 0.f, 1.f} };
dicarloj 0:7757ab3f7206 98
dicarloj 0:7757ab3f7206 99
dicarloj 0:7757ab3f7206 100 uint8_t im_line_va[H_RES*V_RES]; //image buffer
dicarloj 0:7757ab3f7206 101
dicarloj 0:7757ab3f7206 102 void make_checkerboard()
dicarloj 0:7757ab3f7206 103 {
dicarloj 0:7757ab3f7206 104 for(int i = 0; i < H_RES; i++)
dicarloj 0:7757ab3f7206 105 for(int j = 0; j < V_RES; j++)
dicarloj 0:7757ab3f7206 106 im_line_va[i+j*H_RES] = ((i > 20) && (i < 98)) && ((j%2) ^ (i%2)); //checkerboard
dicarloj 0:7757ab3f7206 107
dicarloj 0:7757ab3f7206 108 }
dicarloj 0:7757ab3f7206 109
dicarloj 0:7757ab3f7206 110 void init_buffers()
dicarloj 0:7757ab3f7206 111 {
dicarloj 0:7757ab3f7206 112 make_checkerboard();
dicarloj 0:7757ab3f7206 113 for(int i = 0; i < H_RES; i++)
dicarloj 0:7757ab3f7206 114 {
dicarloj 0:7757ab3f7206 115 im_line_s[i] = 1;
dicarloj 0:7757ab3f7206 116 bl_line_s[i] = 1;
dicarloj 0:7757ab3f7206 117 bl_line_v[i] = 0;
dicarloj 0:7757ab3f7206 118 vb_line_s[i] = 0;
dicarloj 0:7757ab3f7206 119 vb_line_v[i] = 0;
dicarloj 0:7757ab3f7206 120 }
dicarloj 0:7757ab3f7206 121 im_line_s[0] = 0;
dicarloj 0:7757ab3f7206 122 im_line_s[1] = 0;
dicarloj 0:7757ab3f7206 123 im_line_s[2] = 0;
dicarloj 0:7757ab3f7206 124 bl_line_s[0] = 0;
dicarloj 0:7757ab3f7206 125 vb_line_s[0] = 1;
dicarloj 0:7757ab3f7206 126 bl_line_s[1] = 0;
dicarloj 0:7757ab3f7206 127 vb_line_s[1] = 1;
dicarloj 0:7757ab3f7206 128
dicarloj 0:7757ab3f7206 129
dicarloj 0:7757ab3f7206 130
dicarloj 0:7757ab3f7206 131 }
dicarloj 0:7757ab3f7206 132 void isr()
dicarloj 0:7757ab3f7206 133 {
dicarloj 0:7757ab3f7206 134 uint8_t nop = 0; //use nops or use wait_us
dicarloj 0:7757ab3f7206 135 uint8_t* sptr; //pointer to sync buffer for line
dicarloj 0:7757ab3f7206 136 uint8_t* vptr; //pointer to video buffer for line
dicarloj 0:7757ab3f7206 137 if(l < V_RES){ vptr = im_line_va + ((l/4)*H_RES); sptr = im_line_s; nop = 1; } //pick line buffers
dicarloj 0:7757ab3f7206 138 else if(l < 254){ vptr = bl_line_v; sptr = bl_line_s; nop = 0; }
dicarloj 0:7757ab3f7206 139 else{ vptr = vb_line_v; sptr = vb_line_s; nop = 1;}
dicarloj 0:7757ab3f7206 140 uint8_t lmax = nop?H_RES:12; //number of columns
dicarloj 0:7757ab3f7206 141 for(uint8_t i = 0; i < lmax; i++) //loop over each column
dicarloj 0:7757ab3f7206 142 {
dicarloj 0:7757ab3f7206 143 vout = vptr[i]; //set output pins
dicarloj 0:7757ab3f7206 144 sout = sptr[i];
dicarloj 0:7757ab3f7206 145 if(nop) //nop delay
dicarloj 0:7757ab3f7206 146 {
dicarloj 0:7757ab3f7206 147 asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
dicarloj 0:7757ab3f7206 148 }
dicarloj 0:7757ab3f7206 149 else {wait_us(1); if(i > 2) i++;} //wait delay
dicarloj 0:7757ab3f7206 150
dicarloj 0:7757ab3f7206 151
dicarloj 0:7757ab3f7206 152 }
dicarloj 0:7757ab3f7206 153 //move to next line
dicarloj 0:7757ab3f7206 154 l++;
dicarloj 0:7757ab3f7206 155 if(l > 255) l = 0;
dicarloj 0:7757ab3f7206 156 }
dicarloj 0:7757ab3f7206 157
dicarloj 0:7757ab3f7206 158 //coordinates for bouncing ball
dicarloj 0:7757ab3f7206 159
dicarloj 0:7757ab3f7206 160
dicarloj 0:7757ab3f7206 161
dicarloj 0:7757ab3f7206 162 int k = 0;
dicarloj 0:7757ab3f7206 163 uint16_t px = X_0*10;
dicarloj 0:7757ab3f7206 164 uint16_t py = Y_0*10;
dicarloj 0:7757ab3f7206 165 uint16_t vx = 10;
dicarloj 0:7757ab3f7206 166 uint16_t vy = 10;
dicarloj 0:7757ab3f7206 167 uint16_t px2 = X_0*10 + 80;
dicarloj 0:7757ab3f7206 168 uint16_t py2 = Y_0*10 - 40;
dicarloj 0:7757ab3f7206 169 uint16_t vx2 = 3;
dicarloj 0:7757ab3f7206 170 uint16_t vy2 = -4;
dicarloj 0:7757ab3f7206 171
dicarloj 0:7757ab3f7206 172 int16_t sign(int16_t a)
dicarloj 0:7757ab3f7206 173 {
dicarloj 0:7757ab3f7206 174 if(a > 0) return 1;
dicarloj 0:7757ab3f7206 175 if(a < 0) return -1;
dicarloj 0:7757ab3f7206 176 return 0;
dicarloj 0:7757ab3f7206 177 }
dicarloj 0:7757ab3f7206 178
dicarloj 0:7757ab3f7206 179 void draw_vert(int16_t y0, int16_t y1, int16_t x0)
dicarloj 0:7757ab3f7206 180 {
dicarloj 0:7757ab3f7206 181 for(int16_t i = y0; i < y1; i++)
dicarloj 0:7757ab3f7206 182 im_line_va[H_RES*i + x0] = 1;
dicarloj 0:7757ab3f7206 183 }
dicarloj 0:7757ab3f7206 184
dicarloj 0:7757ab3f7206 185 void draw_horiz(int16_t x0, int16_t x1, int16_t y0)
dicarloj 0:7757ab3f7206 186 {
dicarloj 0:7757ab3f7206 187 for(int16_t i = x0; i < x1; i++)
dicarloj 0:7757ab3f7206 188 im_line_va[H_RES*y0 + i] = 1;
dicarloj 0:7757ab3f7206 189 }
dicarloj 0:7757ab3f7206 190
dicarloj 0:7757ab3f7206 191 int16_t imin(int16_t a, int16_t b)
dicarloj 0:7757ab3f7206 192 {
dicarloj 0:7757ab3f7206 193 if(a<b) return a;
dicarloj 0:7757ab3f7206 194 return b;
dicarloj 0:7757ab3f7206 195 }
dicarloj 0:7757ab3f7206 196
dicarloj 0:7757ab3f7206 197 int16_t imax(int16_t a, int16_t b)
dicarloj 0:7757ab3f7206 198 {
dicarloj 0:7757ab3f7206 199 if(a>b) return a;
dicarloj 0:7757ab3f7206 200 return b;
dicarloj 0:7757ab3f7206 201 }
dicarloj 0:7757ab3f7206 202
dicarloj 0:7757ab3f7206 203 void draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1)
dicarloj 0:7757ab3f7206 204 {
dicarloj 0:7757ab3f7206 205 if(x0 > x1){ x0 = x0 ^ x1; x1 = x1^x0; x0 = x0^x1;y0 = y0 ^ y1; y1 = y1^y0; y0 = y0^y1; }
dicarloj 0:7757ab3f7206 206 if(x0 == x1){draw_vert(y0,y1,x0);}
dicarloj 0:7757ab3f7206 207 if(y0 == y1){draw_horiz(x0,x1,y0);}
dicarloj 0:7757ab3f7206 208 int16_t dx = x1 - x0;
dicarloj 0:7757ab3f7206 209 int16_t dy = y1 - y0;
dicarloj 0:7757ab3f7206 210 float derr = fabs((float)(dy)/(float)(dx));
dicarloj 0:7757ab3f7206 211 float err = 0.f;
dicarloj 0:7757ab3f7206 212 int16_t y = y0;
dicarloj 0:7757ab3f7206 213 for(int16_t x = x0; x < x1; x++)
dicarloj 0:7757ab3f7206 214 {
dicarloj 0:7757ab3f7206 215 //plotxy
dicarloj 0:7757ab3f7206 216 im_line_va[H_RES*y + x] = !draw_line_inv;
dicarloj 0:7757ab3f7206 217 err += derr;
dicarloj 0:7757ab3f7206 218 while(err >= 0.5f)
dicarloj 0:7757ab3f7206 219 {
dicarloj 0:7757ab3f7206 220 y += sign(dy);
dicarloj 0:7757ab3f7206 221 im_line_va[H_RES*y + x] = !draw_line_inv;
dicarloj 0:7757ab3f7206 222 err -= 1.f;
dicarloj 0:7757ab3f7206 223 }
dicarloj 0:7757ab3f7206 224 }
dicarloj 0:7757ab3f7206 225 }
dicarloj 0:7757ab3f7206 226
dicarloj 0:7757ab3f7206 227 void draw_cube(float cp[][3])
dicarloj 0:7757ab3f7206 228 {
dicarloj 0:7757ab3f7206 229 for(uint8_t i = 0; i < 7; i++)
dicarloj 0:7757ab3f7206 230 {
dicarloj 0:7757ab3f7206 231 draw_line((int16_t)cp[i][0]+cube_a[0]+X_0,(int16_t)cp[i][1]+cube_a[1]+Y_0,(int16_t)cp[i+1][0]+cube_a[0]+X_0,(int16_t)cp[i+1][1]+cube_a[1]+Y_0);
dicarloj 0:7757ab3f7206 232 }
dicarloj 0:7757ab3f7206 233 draw_line((int16_t)cp[0][0]+cube_a[0]+X_0,(int16_t)cp[0][1]+cube_a[1]+Y_0,(int16_t)cp[3][0]+cube_a[0]+X_0,(int16_t)cp[3][1]+cube_a[1]+Y_0);
dicarloj 0:7757ab3f7206 234 draw_line((int16_t)cp[4][0]+cube_a[0]+X_0,(int16_t)cp[4][1]+cube_a[1]+Y_0,(int16_t)cp[7][0]+cube_a[0]+X_0,(int16_t)cp[7][1]+cube_a[1]+Y_0);
dicarloj 0:7757ab3f7206 235 draw_line((int16_t)cp[0][0]+cube_a[0]+X_0,(int16_t)cp[0][1]+cube_a[1]+Y_0,(int16_t)cp[7][0]+cube_a[0]+X_0,(int16_t)cp[7][1]+cube_a[1]+Y_0);
dicarloj 0:7757ab3f7206 236 draw_line((int16_t)cp[1][0]+cube_a[0]+X_0,(int16_t)cp[1][1]+cube_a[1]+Y_0,(int16_t)cp[6][0]+cube_a[0]+X_0,(int16_t)cp[6][1]+cube_a[1]+Y_0);
dicarloj 0:7757ab3f7206 237 draw_line((int16_t)cp[2][0]+cube_a[0]+X_0,(int16_t)cp[2][1]+cube_a[1]+Y_0,(int16_t)cp[5][0]+cube_a[0]+X_0,(int16_t)cp[5][1]+cube_a[1]+Y_0);
dicarloj 0:7757ab3f7206 238 }
dicarloj 0:7757ab3f7206 239
dicarloj 0:7757ab3f7206 240 void apply_rot(float cp[][3], float r[][3])
dicarloj 0:7757ab3f7206 241 {
dicarloj 0:7757ab3f7206 242 for(uint8_t pti = 0; pti < 8; pti++)
dicarloj 0:7757ab3f7206 243 {
dicarloj 0:7757ab3f7206 244 float* cpt = cp[pti];
dicarloj 0:7757ab3f7206 245 float xn = r[0][0] * cpt[0] + r[0][1] * cpt[1] + r[0][2] * cpt[2];
dicarloj 0:7757ab3f7206 246 float yn = r[1][0] * cpt[0] + r[1][1] * cpt[1] + r[1][2] * cpt[2];
dicarloj 0:7757ab3f7206 247 float zn = r[2][0] * cpt[0] + r[2][1] * cpt[1] + r[2][2] * cpt[2];
dicarloj 0:7757ab3f7206 248 cpt[0] = xn;
dicarloj 0:7757ab3f7206 249 cpt[1] = yn;
dicarloj 0:7757ab3f7206 250 cpt[2] = zn;
dicarloj 0:7757ab3f7206 251 }
dicarloj 0:7757ab3f7206 252 }
dicarloj 0:7757ab3f7206 253
dicarloj 0:7757ab3f7206 254 void apply_xf_rot(float cpt[], float r[][3])
dicarloj 0:7757ab3f7206 255 {
dicarloj 0:7757ab3f7206 256 float xn = r[0][0] * cpt[0] + r[0][1] * cpt[1] + r[0][2] * cpt[2];
dicarloj 0:7757ab3f7206 257 float yn = r[1][0] * cpt[0] + r[1][1] * cpt[1] + r[1][2] * cpt[2];
dicarloj 0:7757ab3f7206 258 float zn = r[2][0] * cpt[0] + r[2][1] * cpt[1] + r[2][2] * cpt[2];
dicarloj 0:7757ab3f7206 259 cpt[0] = xn;
dicarloj 0:7757ab3f7206 260 cpt[1] = yn;
dicarloj 0:7757ab3f7206 261 cpt[2] = zn;
dicarloj 0:7757ab3f7206 262 }
dicarloj 0:7757ab3f7206 263
dicarloj 0:7757ab3f7206 264 void draw_v_check(int8_t r,uint8_t tt)
dicarloj 0:7757ab3f7206 265 {
dicarloj 0:7757ab3f7206 266 for(int i = 0; i < H_RES; i++)
dicarloj 0:7757ab3f7206 267 for(int j = 0; j < V_RES; j++)
dicarloj 0:7757ab3f7206 268 im_line_va[i+j*H_RES] = (((i > 20) && (i < 98)) && ( tt ^(((j%(r*2))>=r) ^ ((i%(r*2)))>=r))); //checkerboard
dicarloj 0:7757ab3f7206 269 }
dicarloj 0:7757ab3f7206 270
dicarloj 0:7757ab3f7206 271
dicarloj 0:7757ab3f7206 272 int jjj = 0;
dicarloj 0:7757ab3f7206 273 int f_count = DEMO_LENGTH + 10;
dicarloj 0:7757ab3f7206 274 void draw_cube_spin(int kkkk);
dicarloj 0:7757ab3f7206 275 //update bouncing balls
dicarloj 0:7757ab3f7206 276
dicarloj 0:7757ab3f7206 277 void draw_blank()
dicarloj 0:7757ab3f7206 278 {
dicarloj 0:7757ab3f7206 279 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 280 {
dicarloj 0:7757ab3f7206 281 for(uint16_t v = Y_MIN; v < Y_MAX+15; v++)
dicarloj 0:7757ab3f7206 282 {
dicarloj 0:7757ab3f7206 283 im_line_va[v*H_RES + h] = 0;
dicarloj 0:7757ab3f7206 284 }
dicarloj 0:7757ab3f7206 285 }
dicarloj 0:7757ab3f7206 286 }
dicarloj 0:7757ab3f7206 287
dicarloj 0:7757ab3f7206 288 void wipe();
dicarloj 0:7757ab3f7206 289
dicarloj 0:7757ab3f7206 290 void update_image()
dicarloj 0:7757ab3f7206 291 {
dicarloj 0:7757ab3f7206 292 //delay
dicarloj 0:7757ab3f7206 293 k++;
dicarloj 0:7757ab3f7206 294 if(k%4000) return;
dicarloj 0:7757ab3f7206 295 f_count++;
dicarloj 0:7757ab3f7206 296 if(f_count < DEMO_LENGTH/2)
dicarloj 0:7757ab3f7206 297 {
dicarloj 0:7757ab3f7206 298 draw_cube_spin(0);
dicarloj 0:7757ab3f7206 299 }
dicarloj 0:7757ab3f7206 300 else if(f_count < DEMO_LENGTH)
dicarloj 0:7757ab3f7206 301 {
dicarloj 0:7757ab3f7206 302 draw_cube_spin(1);
dicarloj 0:7757ab3f7206 303 }
dicarloj 0:7757ab3f7206 304 else if(f_count < DEMO_LENGTH * 2)
dicarloj 0:7757ab3f7206 305 {
dicarloj 0:7757ab3f7206 306 for(int k = 1; k < 10; k++)
dicarloj 0:7757ab3f7206 307 for(int kk = 1; kk < 3; kk++)
dicarloj 0:7757ab3f7206 308 {
dicarloj 0:7757ab3f7206 309 draw_v_check(k,1);
dicarloj 0:7757ab3f7206 310 draw_v_check(k,1);
dicarloj 0:7757ab3f7206 311 draw_v_check(k,0);
dicarloj 0:7757ab3f7206 312 draw_v_check(k,0);
dicarloj 0:7757ab3f7206 313 }
dicarloj 0:7757ab3f7206 314
dicarloj 0:7757ab3f7206 315 draw_v_check(1,0);
dicarloj 0:7757ab3f7206 316 wipe();
dicarloj 0:7757ab3f7206 317 f_count = 0;
dicarloj 0:7757ab3f7206 318 }
dicarloj 0:7757ab3f7206 319 }
dicarloj 0:7757ab3f7206 320
dicarloj 0:7757ab3f7206 321 void wipe()
dicarloj 0:7757ab3f7206 322 {
dicarloj 0:7757ab3f7206 323 for(int v = Y_MIN; v < Y_MAX+15; v++)
dicarloj 0:7757ab3f7206 324 {
dicarloj 0:7757ab3f7206 325 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 326 {
dicarloj 0:7757ab3f7206 327 im_line_va[v*H_RES+h] = 1;
dicarloj 0:7757ab3f7206 328 }
dicarloj 0:7757ab3f7206 329 wait(.03);
dicarloj 0:7757ab3f7206 330 }
dicarloj 0:7757ab3f7206 331
dicarloj 0:7757ab3f7206 332 for(int v = Y_MAX+15; v > Y_MIN; v--)
dicarloj 0:7757ab3f7206 333 {
dicarloj 0:7757ab3f7206 334 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 335 {
dicarloj 0:7757ab3f7206 336 im_line_va[v*H_RES+h] = 0;
dicarloj 0:7757ab3f7206 337 }
dicarloj 0:7757ab3f7206 338 wait(.03);
dicarloj 0:7757ab3f7206 339 }
dicarloj 0:7757ab3f7206 340
dicarloj 0:7757ab3f7206 341 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 342 {
dicarloj 0:7757ab3f7206 343 for(uint16_t v = Y_MIN; v < Y_MAX+15; v++)
dicarloj 0:7757ab3f7206 344 {
dicarloj 0:7757ab3f7206 345 im_line_va[v*H_RES + h] = 1;
dicarloj 0:7757ab3f7206 346 }
dicarloj 0:7757ab3f7206 347 wait(.03);
dicarloj 0:7757ab3f7206 348 }
dicarloj 0:7757ab3f7206 349
dicarloj 0:7757ab3f7206 350 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 351 {
dicarloj 0:7757ab3f7206 352 for(uint16_t v = Y_MIN; v < Y_MAX+15; v++)
dicarloj 0:7757ab3f7206 353 {
dicarloj 0:7757ab3f7206 354 im_line_va[v*H_RES + h] = 0;
dicarloj 0:7757ab3f7206 355 }
dicarloj 0:7757ab3f7206 356 wait(.03);
dicarloj 0:7757ab3f7206 357 }
dicarloj 0:7757ab3f7206 358
dicarloj 0:7757ab3f7206 359 for(int v = Y_MIN; v < Y_MAX+15; v++)
dicarloj 0:7757ab3f7206 360 {
dicarloj 0:7757ab3f7206 361 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 362 {
dicarloj 0:7757ab3f7206 363 im_line_va[v*H_RES+h] = 0;
dicarloj 0:7757ab3f7206 364 }
dicarloj 0:7757ab3f7206 365 }
dicarloj 0:7757ab3f7206 366 }
dicarloj 0:7757ab3f7206 367
dicarloj 0:7757ab3f7206 368 void draw_cube_spin(int kkkk)
dicarloj 0:7757ab3f7206 369 {
dicarloj 0:7757ab3f7206 370 draw_line_inv = kkkk;
dicarloj 0:7757ab3f7206 371 //blank
dicarloj 0:7757ab3f7206 372 for(uint16_t h = X_MIN; h < X_MAX; h++)
dicarloj 0:7757ab3f7206 373 {
dicarloj 0:7757ab3f7206 374 for(uint16_t v = Y_MIN; v < Y_MAX; v++)
dicarloj 0:7757ab3f7206 375 {
dicarloj 0:7757ab3f7206 376 if( (h > 22) && (h < 76+18))
dicarloj 0:7757ab3f7206 377 im_line_va[v*H_RES + h] = kkkk;
dicarloj 0:7757ab3f7206 378 }
dicarloj 0:7757ab3f7206 379 }
dicarloj 0:7757ab3f7206 380 apply_xf_rot(cube_a,y_rot);
dicarloj 0:7757ab3f7206 381 apply_xf_rot(cube_a,y_rot);
dicarloj 0:7757ab3f7206 382 apply_rot(cube_pts,x_rot);
dicarloj 0:7757ab3f7206 383 apply_rot(cube_pts,x_rot);
dicarloj 0:7757ab3f7206 384 apply_rot(cube_pts,y_rot);
dicarloj 0:7757ab3f7206 385 apply_rot(cube_pts,y_rot);
dicarloj 0:7757ab3f7206 386 apply_rot(cube_pts,z_rot);
dicarloj 0:7757ab3f7206 387 //draw ball
dicarloj 0:7757ab3f7206 388 im_line_va[(py/10)*H_RES + (px/10)] = 1;
dicarloj 0:7757ab3f7206 389 draw_line(X_0,Y_0,(px/10),(py/10));
dicarloj 0:7757ab3f7206 390 draw_cube(cube_pts);
dicarloj 0:7757ab3f7206 391
dicarloj 0:7757ab3f7206 392 //update position/check for bounces
dicarloj 0:7757ab3f7206 393 px += vx;
dicarloj 0:7757ab3f7206 394 py += vy;
dicarloj 0:7757ab3f7206 395 px2 += vx2;
dicarloj 0:7757ab3f7206 396 py2 += vy2;
dicarloj 0:7757ab3f7206 397 if(px/10 > (X_MAX-2) || px/10 < (X_MIN+1)) vx = -vx;
dicarloj 0:7757ab3f7206 398 if(py/10 > (Y_MAX-2) || py/10 < (Y_MIN+1)) vy = -vy;
dicarloj 0:7757ab3f7206 399 if(px2/10 > (X_MAX-2) || px2/10 < (X_MIN+1)) vx2 = -vx2;
dicarloj 0:7757ab3f7206 400 if(py2/10 > (Y_MAX-2) || py2/10 < (Y_MIN+1)) vy2 = -vy2;
dicarloj 0:7757ab3f7206 401 if(k%(8000*50)) return;
dicarloj 0:7757ab3f7206 402
dicarloj 0:7757ab3f7206 403 jjj = !jjj;
dicarloj 0:7757ab3f7206 404 int bmi = 0;
dicarloj 0:7757ab3f7206 405 for(int y = BY_0; y < BY_0 + BY; y++)
dicarloj 0:7757ab3f7206 406 {
dicarloj 0:7757ab3f7206 407 for(int x = BX_0; x < BX_0 + BX; x++)
dicarloj 0:7757ab3f7206 408 {
dicarloj 0:7757ab3f7206 409 im_line_va[H_RES*y + x] = kkkk^(miters[bmi]*jjj + (!jjj)*tv[bmi]);
dicarloj 0:7757ab3f7206 410 bmi++;
dicarloj 0:7757ab3f7206 411 }
dicarloj 0:7757ab3f7206 412 }
dicarloj 0:7757ab3f7206 413 }
dicarloj 0:7757ab3f7206 414
dicarloj 0:7757ab3f7206 415 int main() {
dicarloj 0:7757ab3f7206 416 init_buffers();
dicarloj 0:7757ab3f7206 417 t.attach_us(&isr,63);
dicarloj 0:7757ab3f7206 418 for(;;)
dicarloj 0:7757ab3f7206 419 {
dicarloj 0:7757ab3f7206 420 update_image();
dicarloj 0:7757ab3f7206 421 }
dicarloj 0:7757ab3f7206 422 }