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
Revision 13:72dda449c3c0, committed 2014-09-13
- Comitter:
- mjr
- Date:
- Sat Sep 13 23:47:32 2014 +0000
- Parent:
- 12:669df364a565
- Child:
- 14:df700b22ca08
- Commit message:
- Fix voltage level reversal on LedWiz outputs; handle all undefined LedWiz level values as fully on
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Aug 27 00:43:20 2014 +0000
+++ b/main.cpp Sat Sep 13 23:47:32 2014 +0000
@@ -110,6 +110,20 @@
// the plunger are removed and reinstalled, since the relative alignment of the
// parts could cahnge slightly when reinstalling.
//
+// - Button input wiring. 24 of the KL25Z's GPIO ports are mapped as digital inputs
+// for buttons and switches. The software reports these as joystick buttons when
+// it sends reports to the PC. These can be used to wire physical pinball-style
+// buttons in the cabinet (e.g., flipper buttons, the Start button) and miscellaneous
+// switches (such as a tilt bob) to the PC. Visual Pinball can use joystick buttons
+// for input - you just have to assign a VP function to each button using VP's
+// keyboard options dialog. To wire a button physically, connect one terminal of
+// the button switch to the KL25Z ground, and connect the other terminal to the
+// the GPIO port you wish to assign to the button. See the buttonMap[] array
+// below for the available GPIO ports and their assigned joystick button numbers.
+// If you're not using a GPIO port, you can just leave it unconnected - the digital
+// inputs have built-in pull-up resistors, so an unconnected port is the same as
+// an open switch (an "off" state for the button).
+//
// - LedWiz emulation. The KL25Z can appear to the PC as an LedWiz device, and will
// accept and process LedWiz commands from the host. The software can turn digital
// output ports on and off, and can set varying PWM intensitiy levels on a subset
@@ -281,7 +295,7 @@
// 32 GPIO ports to buttons (equipped with momentary switches).
// Connect each switch between the desired GPIO port and ground
// (J9 pin 12 or 14). When the button is pressed, we'll tell the
-// host PC that the corresponding joystick button as pressed. We
+// host PC that the corresponding joystick button is pressed. We
// debounce the keystrokes in software, so you can simply wire
// directly to pushbuttons with no additional external hardware.
//
@@ -503,16 +517,26 @@
class LwPwmOut: public LwOut
{
public:
- LwPwmOut(PinName pin) : p(pin) { }
- virtual void set(float val) { p = val; }
+ LwPwmOut(PinName pin) : p(pin) { prv = -1; }
+ virtual void set(float val)
+ {
+ if (val != prv)
+ p.write(prv = val);
+ }
PwmOut p;
+ float prv;
};
class LwDigOut: public LwOut
{
public:
- LwDigOut(PinName pin) : p(pin) { }
- virtual void set(float val) { p = val; }
+ LwDigOut(PinName pin) : p(pin) { prv = -1; }
+ virtual void set(float val)
+ {
+ if (val != prv)
+ p.write((prv = val) == 0.0 ? 0 : 1);
+ }
DigitalOut p;
+ float prv;
};
class LwUnusedOut: public LwOut
{
@@ -544,27 +568,64 @@
// profile (brightness/blink) state for each LedWiz output
static uint8_t wizVal[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
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48
};
static float wizState(int idx)
{
- if (wizOn[idx]) {
+ if (wizOn[idx])
+ {
// on - map profile brightness state to PWM level
uint8_t val = wizVal[idx];
- if (val >= 1 && val <= 48)
- return 1.0 - val/48.0;
+ if (val <= 48)
+ {
+ // PWM brightness/intensity level - rescale from the LedWiz
+ // 0..48 integer range to our internal PwmOut 0..1 float range
+ return val/48.0;
+ }
+ else if (val == 49)
+ {
+ // 49 is undefined in the LedWiz documentation. Even so, DOF2
+ // *does* set outputs to 49 in some cases where it intends for
+ // them to be fully on. This is a DOF2 bug, but the real LedWiz
+ // treats 49 as fully on, so it's a harmless bug when used with
+ // real LedWiz units. For the sake of bug-for-bug compatibility,
+ // we must do the same thing.
+ return 1.0;
+ }
else if (val >= 129 && val <= 132)
- return 0.0;
+ {
+ // Values of 129-132 select different flashing modes. We don't
+ // support any of these. Instead, simply treat them as fully on.
+ // Note that DOF doesn't ever use modes 129-132, as it implements
+ // all flashing modes itself on the host side, so this limitation
+ // won't have any effect on DOF users. You can observe it using
+ // LedBlinky, though.
+ return 1.0;
+ }
else
+ {
+ // Other values are undefined in the LedWiz documentation. Hosts
+ // *should* never send undefined values, since whatever behavior an
+ // LedWiz unit exhibits in response is accidental and could change
+ // in a future version. We'll treat all undefined values as equivalent
+ // to 48 (fully on).
+ //
+ // NB: the 49 and 129-132 cases are broken out above for the sake
+ // of documentation. We end up using 1.0 as the return value for
+ // everything outside of the defined 0-48 range, so we could collapse
+ // this whole thing to a single 'else' branch, but I wanted to call
+ // out the specific reasons for handling the settings above as we do.
return 1.0;
+ }
}
- else {
- // off
- return 1.0;
+ else
+ {
+ // off - show at 0 intensity
+ return 0.0;
}
}
@@ -1311,10 +1372,12 @@
// update the physical LED state if this is the last bank
if (pbaIdx == 24)
+ {
updateWizOuts();
-
- // advance to the next bank
- pbaIdx = (pbaIdx + 8) & 31;
+ pbaIdx = 0;
+ }
+ else
+ pbaIdx += 8;
}
}
}
