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
Diff: main.cpp
- Revision:
- 0:fe1c42b7b490
- Child:
- 1:3810f9d9c775
diff -r 000000000000 -r fe1c42b7b490 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Nov 01 02:28:21 2015 +0000 @@ -0,0 +1,166 @@ +/* + * co657_lcdplay (main.cpp): playing with the MBED shield's LCD + * Copyright (C) 2015 Fred Barnes, University of Kent <frmb@kent.ac.uk> + */ + +#include "mbed.h" +#include "C12832.h" +#include "FXOS8700CQ.h" + +#include "gfx3d.h" + +#define BENCHMARK + +/* some global objects */ +Serial host (USBTX, USBRX); + +C12832 shld_lcd (D11, D13, D12, D7, D10); /* LCD on the shield (128x32) */ + +FXOS8700CQ fxos (PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); /* On-board accelerometer: SDA, SCL, (addr << 1) */ + +InterruptIn fxos_int1 (PTC6); /* unused, common with SW2 on FRDM-K64F */ +InterruptIn fxos_int2 (PTC13); /* should just be the Data-Ready interrupt */ +InterruptIn sw3_int (PTA4); /* switch SW3 */ + +SRAWDATA fxos_acc; /* collected accelerometer data */ +SRAWDATA fxos_mag; /* collected magnetometer data */ + +Ticker frametimer; /* timer that will be used to update frames and whatnot */ + +#ifdef BENCHMARK +Timer perftimer; +#endif + +#define PFLAG_TIMER (0x01) /* next frame please */ +#define PFLAG_FXOS (0x02) /* accel/magno data ready */ + +static volatile uint8_t pflags = 0x00; /* program flags */ + + + +/* + * unused (?) -- also SW2 on the board + */ +void trigger_fxos_int1 (void) +{ + return; +} + + +/* + * read-ready interrupt for FXOS8700CQ + */ +void trigger_fxos_int2 (void) +{ + pflags |= PFLAG_FXOS; + return; +} + + +/* + * interrupt handler for SW3 on the board + */ +void trigger_sw3_int (void) +{ + return; +} + + +/* + * interrupt handler for the frametimer Ticker object + */ +void trigger_frametimer (void) +{ + pflags |= PFLAG_TIMER; + return; +} + + +/* + * dumps the global accelerometer/magnetomer reading to the serial-port "host" + */ +void print_reading (void) +{ + host.printf ("A X:%5d Y:%5d Z:%5d M X:%5d Y:%5d Z:%5d\r\n", + fxos_acc.x, fxos_acc.y, fxos_acc.z, + fxos_mag.x, fxos_mag.y, fxos_mag.z); +} + + + +/* + * start here + */ +int main (void) +{ + angle_t a; + + /* initialise */ + host.baud (38400); + + shld_lcd.set_auto_up (0); /* we'll do it ourselves */ + shld_lcd.cls (); + shld_lcd.copy_to_lcd (); + + fxos_int2.fall (trigger_fxos_int2); /* level triggered interrupt */ + fxos.enable(); /* enable device */ + + /* Interrupt for SW3 button-down state */ + sw3_int.mode (PullUp); /* Since the FRDM-K64F doesn't have its SW2/SW3 pull-ups populated */ + sw3_int.fall (trigger_sw3_int); + + /* setup frame timer */ + frametimer.attach_us (trigger_frametimer, 40000); + + /* Example data printing */ + fxos.get_data (&fxos_acc, &fxos_mag); + print_reading (); + + a = 0; + for (;;) { + uint8_t cflags = 0x00; + + if (pflags & PFLAG_TIMER) { + g3d_p3_t pts1[8]; /* points for rotates/translated cubes */ + g3d_2p3_t pts2[8]; /* points for projected cube */ + int i; + + /* push last frame first */ + shld_lcd.copy_to_lcd (); + shld_lcd.cls (); + + for (i=0; i<4; i++) { + g3d_p3_t trans = {3.0f * gfx3d_sin (a + (i * 64)), 0.0f, 3.0f * gfx3d_cos (a + (i * 64))}; + + /* rotate, translate and render! */ + if (i == 0) { + gfx3d_translate (g3d_cubepnts, pts1, 8, trans); + } else { + gfx3d_rotate_demo (g3d_cubepnts, pts1, 8, (a * i) & 0xff); + gfx3d_translate (pts1, pts1, 8, trans); + } + + gfx3d_project (pts1, pts2, 8); + + gfx3d_wirecube (pts2, shld_lcd); + } + + a++; + + cflags |= PFLAG_TIMER; + } + if (pflags & PFLAG_FXOS) { + fxos.get_data (&fxos_acc, &fxos_mag); + cflags |= PFLAG_FXOS; + } + + __disable_irq (); + pflags &= ~cflags; + if (!pflags) { + sleep (); + } + __enable_irq (); + } + +} +