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
main.cpp@0:fe1c42b7b490, 2015-11-01 (annotated)
- Committer:
- co657_frmb
- Date:
- Sun Nov 01 02:28:21 2015 +0000
- Revision:
- 0:fe1c42b7b490
- Child:
- 1:3810f9d9c775
Minor changes.
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:fe1c42b7b490 | 97 | |
co657_frmb | 0:fe1c42b7b490 | 98 | /* initialise */ |
co657_frmb | 0:fe1c42b7b490 | 99 | host.baud (38400); |
co657_frmb | 0:fe1c42b7b490 | 100 | |
co657_frmb | 0:fe1c42b7b490 | 101 | shld_lcd.set_auto_up (0); /* we'll do it ourselves */ |
co657_frmb | 0:fe1c42b7b490 | 102 | shld_lcd.cls (); |
co657_frmb | 0:fe1c42b7b490 | 103 | shld_lcd.copy_to_lcd (); |
co657_frmb | 0:fe1c42b7b490 | 104 | |
co657_frmb | 0:fe1c42b7b490 | 105 | fxos_int2.fall (trigger_fxos_int2); /* level triggered interrupt */ |
co657_frmb | 0:fe1c42b7b490 | 106 | fxos.enable(); /* enable device */ |
co657_frmb | 0:fe1c42b7b490 | 107 | |
co657_frmb | 0:fe1c42b7b490 | 108 | /* Interrupt for SW3 button-down state */ |
co657_frmb | 0:fe1c42b7b490 | 109 | sw3_int.mode (PullUp); /* Since the FRDM-K64F doesn't have its SW2/SW3 pull-ups populated */ |
co657_frmb | 0:fe1c42b7b490 | 110 | sw3_int.fall (trigger_sw3_int); |
co657_frmb | 0:fe1c42b7b490 | 111 | |
co657_frmb | 0:fe1c42b7b490 | 112 | /* setup frame timer */ |
co657_frmb | 0:fe1c42b7b490 | 113 | frametimer.attach_us (trigger_frametimer, 40000); |
co657_frmb | 0:fe1c42b7b490 | 114 | |
co657_frmb | 0:fe1c42b7b490 | 115 | /* Example data printing */ |
co657_frmb | 0:fe1c42b7b490 | 116 | fxos.get_data (&fxos_acc, &fxos_mag); |
co657_frmb | 0:fe1c42b7b490 | 117 | print_reading (); |
co657_frmb | 0:fe1c42b7b490 | 118 | |
co657_frmb | 0:fe1c42b7b490 | 119 | a = 0; |
co657_frmb | 0:fe1c42b7b490 | 120 | for (;;) { |
co657_frmb | 0:fe1c42b7b490 | 121 | uint8_t cflags = 0x00; |
co657_frmb | 0:fe1c42b7b490 | 122 | |
co657_frmb | 0:fe1c42b7b490 | 123 | if (pflags & PFLAG_TIMER) { |
co657_frmb | 0:fe1c42b7b490 | 124 | g3d_p3_t pts1[8]; /* points for rotates/translated cubes */ |
co657_frmb | 0:fe1c42b7b490 | 125 | g3d_2p3_t pts2[8]; /* points for projected cube */ |
co657_frmb | 0:fe1c42b7b490 | 126 | int i; |
co657_frmb | 0:fe1c42b7b490 | 127 | |
co657_frmb | 0:fe1c42b7b490 | 128 | /* push last frame first */ |
co657_frmb | 0:fe1c42b7b490 | 129 | shld_lcd.copy_to_lcd (); |
co657_frmb | 0:fe1c42b7b490 | 130 | shld_lcd.cls (); |
co657_frmb | 0:fe1c42b7b490 | 131 | |
co657_frmb | 0:fe1c42b7b490 | 132 | for (i=0; i<4; i++) { |
co657_frmb | 0:fe1c42b7b490 | 133 | g3d_p3_t trans = {3.0f * gfx3d_sin (a + (i * 64)), 0.0f, 3.0f * gfx3d_cos (a + (i * 64))}; |
co657_frmb | 0:fe1c42b7b490 | 134 | |
co657_frmb | 0:fe1c42b7b490 | 135 | /* rotate, translate and render! */ |
co657_frmb | 0:fe1c42b7b490 | 136 | if (i == 0) { |
co657_frmb | 0:fe1c42b7b490 | 137 | gfx3d_translate (g3d_cubepnts, pts1, 8, trans); |
co657_frmb | 0:fe1c42b7b490 | 138 | } else { |
co657_frmb | 0:fe1c42b7b490 | 139 | gfx3d_rotate_demo (g3d_cubepnts, pts1, 8, (a * i) & 0xff); |
co657_frmb | 0:fe1c42b7b490 | 140 | gfx3d_translate (pts1, pts1, 8, trans); |
co657_frmb | 0:fe1c42b7b490 | 141 | } |
co657_frmb | 0:fe1c42b7b490 | 142 | |
co657_frmb | 0:fe1c42b7b490 | 143 | gfx3d_project (pts1, pts2, 8); |
co657_frmb | 0:fe1c42b7b490 | 144 | |
co657_frmb | 0:fe1c42b7b490 | 145 | gfx3d_wirecube (pts2, shld_lcd); |
co657_frmb | 0:fe1c42b7b490 | 146 | } |
co657_frmb | 0:fe1c42b7b490 | 147 | |
co657_frmb | 0:fe1c42b7b490 | 148 | a++; |
co657_frmb | 0:fe1c42b7b490 | 149 | |
co657_frmb | 0:fe1c42b7b490 | 150 | cflags |= PFLAG_TIMER; |
co657_frmb | 0:fe1c42b7b490 | 151 | } |
co657_frmb | 0:fe1c42b7b490 | 152 | if (pflags & PFLAG_FXOS) { |
co657_frmb | 0:fe1c42b7b490 | 153 | fxos.get_data (&fxos_acc, &fxos_mag); |
co657_frmb | 0:fe1c42b7b490 | 154 | cflags |= PFLAG_FXOS; |
co657_frmb | 0:fe1c42b7b490 | 155 | } |
co657_frmb | 0:fe1c42b7b490 | 156 | |
co657_frmb | 0:fe1c42b7b490 | 157 | __disable_irq (); |
co657_frmb | 0:fe1c42b7b490 | 158 | pflags &= ~cflags; |
co657_frmb | 0:fe1c42b7b490 | 159 | if (!pflags) { |
co657_frmb | 0:fe1c42b7b490 | 160 | sleep (); |
co657_frmb | 0:fe1c42b7b490 | 161 | } |
co657_frmb | 0:fe1c42b7b490 | 162 | __enable_irq (); |
co657_frmb | 0:fe1c42b7b490 | 163 | } |
co657_frmb | 0:fe1c42b7b490 | 164 | |
co657_frmb | 0:fe1c42b7b490 | 165 | } |
co657_frmb | 0:fe1c42b7b490 | 166 |