Demo code for basic 3D graphics on the MBED application shield's LCD (K64F). Left pot changes Z depth, joystick rotates one of the cubes.

Dependencies:   C12832 FXOS8700CQ gfx3d mbed

Committer:
co657_frmb
Date:
Sun Nov 01 23:10:01 2015 +0000
Revision:
1:3810f9d9c775
Parent:
0:fe1c42b7b490
Child:
2:297b43e931d0
Added some basic benchmarking, displayed on LCD in us.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co657_frmb 0:fe1c42b7b490 1 /*
co657_frmb 0:fe1c42b7b490 2 * co657_lcdplay (main.cpp): playing with the MBED shield's LCD
co657_frmb 0:fe1c42b7b490 3 * Copyright (C) 2015 Fred Barnes, University of Kent <frmb@kent.ac.uk>
co657_frmb 0:fe1c42b7b490 4 */
co657_frmb 0:fe1c42b7b490 5
co657_frmb 0:fe1c42b7b490 6 #include "mbed.h"
co657_frmb 0:fe1c42b7b490 7 #include "C12832.h"
co657_frmb 0:fe1c42b7b490 8 #include "FXOS8700CQ.h"
co657_frmb 0:fe1c42b7b490 9
co657_frmb 0:fe1c42b7b490 10 #include "gfx3d.h"
co657_frmb 0:fe1c42b7b490 11
co657_frmb 0:fe1c42b7b490 12 #define BENCHMARK
co657_frmb 0:fe1c42b7b490 13
co657_frmb 0:fe1c42b7b490 14 /* some global objects */
co657_frmb 0:fe1c42b7b490 15 Serial host (USBTX, USBRX);
co657_frmb 0:fe1c42b7b490 16
co657_frmb 0:fe1c42b7b490 17 C12832 shld_lcd (D11, D13, D12, D7, D10); /* LCD on the shield (128x32) */
co657_frmb 0:fe1c42b7b490 18
co657_frmb 0:fe1c42b7b490 19 FXOS8700CQ fxos (PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); /* On-board accelerometer: SDA, SCL, (addr << 1) */
co657_frmb 0:fe1c42b7b490 20
co657_frmb 0:fe1c42b7b490 21 InterruptIn fxos_int1 (PTC6); /* unused, common with SW2 on FRDM-K64F */
co657_frmb 0:fe1c42b7b490 22 InterruptIn fxos_int2 (PTC13); /* should just be the Data-Ready interrupt */
co657_frmb 0:fe1c42b7b490 23 InterruptIn sw3_int (PTA4); /* switch SW3 */
co657_frmb 0:fe1c42b7b490 24
co657_frmb 0:fe1c42b7b490 25 SRAWDATA fxos_acc; /* collected accelerometer data */
co657_frmb 0:fe1c42b7b490 26 SRAWDATA fxos_mag; /* collected magnetometer data */
co657_frmb 0:fe1c42b7b490 27
co657_frmb 0:fe1c42b7b490 28 Ticker frametimer; /* timer that will be used to update frames and whatnot */
co657_frmb 0:fe1c42b7b490 29
co657_frmb 0:fe1c42b7b490 30 #ifdef BENCHMARK
co657_frmb 0:fe1c42b7b490 31 Timer perftimer;
co657_frmb 0:fe1c42b7b490 32 #endif
co657_frmb 0:fe1c42b7b490 33
co657_frmb 0:fe1c42b7b490 34 #define PFLAG_TIMER (0x01) /* next frame please */
co657_frmb 0:fe1c42b7b490 35 #define PFLAG_FXOS (0x02) /* accel/magno data ready */
co657_frmb 0:fe1c42b7b490 36
co657_frmb 0:fe1c42b7b490 37 static volatile uint8_t pflags = 0x00; /* program flags */
co657_frmb 0:fe1c42b7b490 38
co657_frmb 0:fe1c42b7b490 39
co657_frmb 0:fe1c42b7b490 40
co657_frmb 0:fe1c42b7b490 41 /*
co657_frmb 0:fe1c42b7b490 42 * unused (?) -- also SW2 on the board
co657_frmb 0:fe1c42b7b490 43 */
co657_frmb 0:fe1c42b7b490 44 void trigger_fxos_int1 (void)
co657_frmb 0:fe1c42b7b490 45 {
co657_frmb 0:fe1c42b7b490 46 return;
co657_frmb 0:fe1c42b7b490 47 }
co657_frmb 0:fe1c42b7b490 48
co657_frmb 0:fe1c42b7b490 49
co657_frmb 0:fe1c42b7b490 50 /*
co657_frmb 0:fe1c42b7b490 51 * read-ready interrupt for FXOS8700CQ
co657_frmb 0:fe1c42b7b490 52 */
co657_frmb 0:fe1c42b7b490 53 void trigger_fxos_int2 (void)
co657_frmb 0:fe1c42b7b490 54 {
co657_frmb 0:fe1c42b7b490 55 pflags |= PFLAG_FXOS;
co657_frmb 0:fe1c42b7b490 56 return;
co657_frmb 0:fe1c42b7b490 57 }
co657_frmb 0:fe1c42b7b490 58
co657_frmb 0:fe1c42b7b490 59
co657_frmb 0:fe1c42b7b490 60 /*
co657_frmb 0:fe1c42b7b490 61 * interrupt handler for SW3 on the board
co657_frmb 0:fe1c42b7b490 62 */
co657_frmb 0:fe1c42b7b490 63 void trigger_sw3_int (void)
co657_frmb 0:fe1c42b7b490 64 {
co657_frmb 0:fe1c42b7b490 65 return;
co657_frmb 0:fe1c42b7b490 66 }
co657_frmb 0:fe1c42b7b490 67
co657_frmb 0:fe1c42b7b490 68
co657_frmb 0:fe1c42b7b490 69 /*
co657_frmb 0:fe1c42b7b490 70 * interrupt handler for the frametimer Ticker object
co657_frmb 0:fe1c42b7b490 71 */
co657_frmb 0:fe1c42b7b490 72 void trigger_frametimer (void)
co657_frmb 0:fe1c42b7b490 73 {
co657_frmb 0:fe1c42b7b490 74 pflags |= PFLAG_TIMER;
co657_frmb 0:fe1c42b7b490 75 return;
co657_frmb 0:fe1c42b7b490 76 }
co657_frmb 0:fe1c42b7b490 77
co657_frmb 0:fe1c42b7b490 78
co657_frmb 0:fe1c42b7b490 79 /*
co657_frmb 0:fe1c42b7b490 80 * dumps the global accelerometer/magnetomer reading to the serial-port "host"
co657_frmb 0:fe1c42b7b490 81 */
co657_frmb 0:fe1c42b7b490 82 void print_reading (void)
co657_frmb 0:fe1c42b7b490 83 {
co657_frmb 0:fe1c42b7b490 84 host.printf ("A X:%5d Y:%5d Z:%5d M X:%5d Y:%5d Z:%5d\r\n",
co657_frmb 0:fe1c42b7b490 85 fxos_acc.x, fxos_acc.y, fxos_acc.z,
co657_frmb 0:fe1c42b7b490 86 fxos_mag.x, fxos_mag.y, fxos_mag.z);
co657_frmb 0:fe1c42b7b490 87 }
co657_frmb 0:fe1c42b7b490 88
co657_frmb 0:fe1c42b7b490 89
co657_frmb 0:fe1c42b7b490 90
co657_frmb 0:fe1c42b7b490 91 /*
co657_frmb 0:fe1c42b7b490 92 * start here
co657_frmb 0:fe1c42b7b490 93 */
co657_frmb 0:fe1c42b7b490 94 int main (void)
co657_frmb 0:fe1c42b7b490 95 {
co657_frmb 0:fe1c42b7b490 96 angle_t a;
co657_frmb 1:3810f9d9c775 97 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 98 int bt_start, bt_now, bt_trans = 0, bt_render = 0;
co657_frmb 1:3810f9d9c775 99 #endif
co657_frmb 0:fe1c42b7b490 100
co657_frmb 0:fe1c42b7b490 101 /* initialise */
co657_frmb 0:fe1c42b7b490 102 host.baud (38400);
co657_frmb 0:fe1c42b7b490 103
co657_frmb 0:fe1c42b7b490 104 shld_lcd.set_auto_up (0); /* we'll do it ourselves */
co657_frmb 0:fe1c42b7b490 105 shld_lcd.cls ();
co657_frmb 0:fe1c42b7b490 106 shld_lcd.copy_to_lcd ();
co657_frmb 0:fe1c42b7b490 107
co657_frmb 0:fe1c42b7b490 108 fxos_int2.fall (trigger_fxos_int2); /* level triggered interrupt */
co657_frmb 0:fe1c42b7b490 109 fxos.enable(); /* enable device */
co657_frmb 0:fe1c42b7b490 110
co657_frmb 0:fe1c42b7b490 111 /* Interrupt for SW3 button-down state */
co657_frmb 0:fe1c42b7b490 112 sw3_int.mode (PullUp); /* Since the FRDM-K64F doesn't have its SW2/SW3 pull-ups populated */
co657_frmb 0:fe1c42b7b490 113 sw3_int.fall (trigger_sw3_int);
co657_frmb 0:fe1c42b7b490 114
co657_frmb 0:fe1c42b7b490 115 /* setup frame timer */
co657_frmb 0:fe1c42b7b490 116 frametimer.attach_us (trigger_frametimer, 40000);
co657_frmb 0:fe1c42b7b490 117
co657_frmb 0:fe1c42b7b490 118 /* Example data printing */
co657_frmb 0:fe1c42b7b490 119 fxos.get_data (&fxos_acc, &fxos_mag);
co657_frmb 0:fe1c42b7b490 120 print_reading ();
co657_frmb 0:fe1c42b7b490 121
co657_frmb 1:3810f9d9c775 122 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 123 perftimer.reset ();
co657_frmb 1:3810f9d9c775 124 perftimer.start ();
co657_frmb 1:3810f9d9c775 125 #endif
co657_frmb 1:3810f9d9c775 126
co657_frmb 0:fe1c42b7b490 127 a = 0;
co657_frmb 0:fe1c42b7b490 128 for (;;) {
co657_frmb 0:fe1c42b7b490 129 uint8_t cflags = 0x00;
co657_frmb 0:fe1c42b7b490 130
co657_frmb 0:fe1c42b7b490 131 if (pflags & PFLAG_TIMER) {
co657_frmb 0:fe1c42b7b490 132 g3d_p3_t pts1[8]; /* points for rotates/translated cubes */
co657_frmb 0:fe1c42b7b490 133 g3d_2p3_t pts2[8]; /* points for projected cube */
co657_frmb 0:fe1c42b7b490 134 int i;
co657_frmb 0:fe1c42b7b490 135
co657_frmb 0:fe1c42b7b490 136 /* push last frame first */
co657_frmb 0:fe1c42b7b490 137 shld_lcd.copy_to_lcd ();
co657_frmb 0:fe1c42b7b490 138 shld_lcd.cls ();
co657_frmb 1:3810f9d9c775 139
co657_frmb 1:3810f9d9c775 140 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 141 bt_start = perftimer.read_us ();
co657_frmb 1:3810f9d9c775 142 bt_trans = 0;
co657_frmb 1:3810f9d9c775 143 bt_render = 0;
co657_frmb 1:3810f9d9c775 144 #endif
co657_frmb 0:fe1c42b7b490 145 for (i=0; i<4; i++) {
co657_frmb 0:fe1c42b7b490 146 g3d_p3_t trans = {3.0f * gfx3d_sin (a + (i * 64)), 0.0f, 3.0f * gfx3d_cos (a + (i * 64))};
co657_frmb 0:fe1c42b7b490 147
co657_frmb 0:fe1c42b7b490 148 /* rotate, translate and render! */
co657_frmb 0:fe1c42b7b490 149 if (i == 0) {
co657_frmb 0:fe1c42b7b490 150 gfx3d_translate (g3d_cubepnts, pts1, 8, trans);
co657_frmb 0:fe1c42b7b490 151 } else {
co657_frmb 0:fe1c42b7b490 152 gfx3d_rotate_demo (g3d_cubepnts, pts1, 8, (a * i) & 0xff);
co657_frmb 0:fe1c42b7b490 153 gfx3d_translate (pts1, pts1, 8, trans);
co657_frmb 0:fe1c42b7b490 154 }
co657_frmb 0:fe1c42b7b490 155
co657_frmb 0:fe1c42b7b490 156 gfx3d_project (pts1, pts2, 8);
co657_frmb 1:3810f9d9c775 157
co657_frmb 1:3810f9d9c775 158 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 159 bt_now = perftimer.read_us ();
co657_frmb 1:3810f9d9c775 160 bt_trans += (bt_now - bt_start);
co657_frmb 1:3810f9d9c775 161 bt_start = bt_now;
co657_frmb 1:3810f9d9c775 162 #endif
co657_frmb 1:3810f9d9c775 163
co657_frmb 0:fe1c42b7b490 164 gfx3d_wirecube (pts2, shld_lcd);
co657_frmb 1:3810f9d9c775 165
co657_frmb 1:3810f9d9c775 166 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 167 bt_now = perftimer.read_us ();
co657_frmb 1:3810f9d9c775 168 bt_render += (bt_now - bt_start);
co657_frmb 1:3810f9d9c775 169 bt_start = bt_now;
co657_frmb 1:3810f9d9c775 170 #endif
co657_frmb 1:3810f9d9c775 171
co657_frmb 0:fe1c42b7b490 172 }
co657_frmb 0:fe1c42b7b490 173
co657_frmb 0:fe1c42b7b490 174 a++;
co657_frmb 1:3810f9d9c775 175
co657_frmb 1:3810f9d9c775 176 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 177 /* write bt_trans and bt_render into the display */
co657_frmb 1:3810f9d9c775 178 shld_lcd.locate (0, 24);
co657_frmb 1:3810f9d9c775 179 shld_lcd.printf ("T: %d, R: %d", bt_trans, bt_render);
co657_frmb 1:3810f9d9c775 180 #endif
co657_frmb 0:fe1c42b7b490 181 cflags |= PFLAG_TIMER;
co657_frmb 0:fe1c42b7b490 182 }
co657_frmb 0:fe1c42b7b490 183 if (pflags & PFLAG_FXOS) {
co657_frmb 0:fe1c42b7b490 184 fxos.get_data (&fxos_acc, &fxos_mag);
co657_frmb 0:fe1c42b7b490 185 cflags |= PFLAG_FXOS;
co657_frmb 0:fe1c42b7b490 186 }
co657_frmb 0:fe1c42b7b490 187
co657_frmb 0:fe1c42b7b490 188 __disable_irq ();
co657_frmb 0:fe1c42b7b490 189 pflags &= ~cflags;
co657_frmb 0:fe1c42b7b490 190 if (!pflags) {
co657_frmb 0:fe1c42b7b490 191 sleep ();
co657_frmb 0:fe1c42b7b490 192 }
co657_frmb 0:fe1c42b7b490 193 __enable_irq ();
co657_frmb 0:fe1c42b7b490 194 }
co657_frmb 0:fe1c42b7b490 195
co657_frmb 0:fe1c42b7b490 196 }
co657_frmb 0:fe1c42b7b490 197