Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Pinscape_Controller by
Diff: main.cpp
- Revision:
- 0:5acbbe3f4cf4
- Child:
- 1:d913e0afb2ac
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Jul 11 03:26:11 2014 +0000
@@ -0,0 +1,188 @@
+#include "mbed.h"
+#include "USBJoystick.h"
+#include "MMA8451Q.h"
+#include "tls1410r.h"
+
+PwmOut led1(LED1), led2(LED2), led3(LED3);
+DigitalOut out1(PTE29);
+
+
+
+static int pbaIdx = 0;
+
+// on/off state for each LedWiz output
+static uint8_t ledOn[32];
+
+// profile (brightness/blink) state for each LedWiz output
+static uint8_t ledVal[32] = {
+ 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
+};
+
+static double ledState(int idx)
+{
+ if (ledOn[idx]) {
+ // on - map profile brightness state to PWM level
+ uint8_t val = ledVal[idx];
+ if (val >= 1 && val <= 48)
+ return 1.0 - val/48.0;
+ else if (val >= 129 && val <= 132)
+ return 0.0;
+ else
+ return 1.0;
+ }
+ else {
+ // off
+ return 1.0;
+ }
+}
+
+static void updateLeds()
+{
+ led1 = ledState(0);
+ led2 = ledState(1);
+ led3 = ledState(2);
+}
+
+int main(void)
+{
+ led1 = 1;
+ led2 = 1;
+ led3 = 1;
+ Timer timer;
+
+ // set up a timer for spacing USB reports
+ timer.start();
+ float t0 = timer.read_ms();
+ float tout1 = timer.read_ms();
+
+ // Create the joystick USB client. Show a read LED while connecting, and
+ // change to green when connected.
+ led1 = 0.75;
+ USBJoystick js(0xFAFA, 0x00F7, 0x0001);
+ led1 = 1;
+ led2 = 0.75;
+
+ // create the accelerometer object
+ const int MMA8451_I2C_ADDRESS = (0x1d<<1);
+ MMA8451Q accel(PTE25, PTE24, MMA8451_I2C_ADDRESS);
+ printf("MMA8451 ID: %d\r\n", accel.getWhoAmI());
+
+ // create the CCD array object
+ TLS1410R ccd(PTE20, PTE21, PTB0);
+
+ // process sensor reports and LedWiz requests forever
+ int x = 0, y = 127, z = 0;
+ for (;;)
+ {
+ // Look for an incoming report. Continue processing input as
+ // long as there's anything pending - this ensures that we
+ // handle input in as timely a fashion as possible by deferring
+ // output tasks as long as there's input to process.
+ HID_REPORT report;
+ while (js.readNB(&report) && report.length == 8)
+ {
+ uint8_t *data = report.data;
+ if (data[0] == 64) {
+ // LWZ-SBA - first four bytes are bit-packed on/off flags
+ // for the outputs; 5th byte is the pulse speed (0-7)
+ //printf("LWZ-SBA %02x %02x %02x %02x ; %02x\r\n",
+ // data[1], data[2], data[3], data[4], data[5]);
+
+ // update all on/off states
+ for (int i = 0, bit = 1, ri = 1 ; i < 32 ; ++i, bit <<= 1)
+ {
+ if (bit == 0x100) {
+ bit = 1;
+ ++ri;
+ }
+ ledOn[i] = ((data[ri] & bit) != 0);
+ }
+
+ // update the physical LED state
+ updateLeds();
+
+ // reset the PBA counter
+ pbaIdx = 0;
+ }
+ else {
+ // LWZ-PBA - full state dump; each byte is one output
+ // in the current bank. pbaIdx keeps track of the bank;
+ // this is incremented implicitly by each PBA message.
+ //printf("LWZ-PBA[%d] %02x %02x %02x %02x %02x %02x %02x %02x\r\n",
+ // pbaIdx, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
+
+ // update all output profile settings
+ for (int i = 0 ; i < 8 ; ++i)
+ ledVal[pbaIdx + i] = data[i];
+
+ // update the physical LED state if this is the last bank
+ if (pbaIdx == 24)
+ updateLeds();
+
+ // advance to the next bank
+ pbaIdx = (pbaIdx + 8) & 31;
+ }
+ }
+
+#if 1
+ // check the accelerometer
+ {
+ // read the accelerometer
+ float xa = accel.getAccX();
+ float ya = accel.getAccY();
+
+ // figure the new joystick position
+ int xnew = (int)(127 * xa);
+ int ynew = (int)(127 * ya);
+
+ // send an update if the position has changed
+ if (xnew != x || ynew != y)
+ {
+ x = xnew;
+ y = ynew;
+
+ // send the status report
+ js.update(x, y, z, 0);
+ }
+ }
+#else
+ // Send a joystick report if it's been long enough since the
+ // last report
+ if (timer.read_ms() - t0 > 250)
+ {
+ // send the current joystick status report
+ js.update(x, y, z, 0);
+
+ // update our internal joystick position record
+ x += dx;
+ y += dy;
+ z += dz;
+ if (x > xmax || x < xmin) {
+ dx = -dx;
+ x += 2*dx;
+ }
+ if (y > ymax || y < ymin) {
+ dy = -dy;
+ y += 2*dy;
+ }
+ if (z > zmax || z < zmin) {
+ dz = -dz;
+ z += 2*dz;
+ }
+
+ // note the time of the last report
+ t0 = timer.read_ms();
+ }
+#endif
+
+ // pulse E29
+ if (timer.read_ms() - tout1 > 2000)
+ {
+ out1 = !out1;
+ tout1 = timer.read_ms();
+ }
+ }
+}
