Pinscape Controller version 1 fork. This is a fork to allow for ongoing bug fixes to the original controller version, from before the major changes for the expansion board project.

Dependencies:   FastIO FastPWM SimpleDMA mbed

Fork of Pinscape_Controller by Mike R

Committer:
mjr
Date:
Mon Feb 15 23:03:55 2016 +0000
Revision:
68:edfecf67a931
Parent:
34:6b981a2afab7
Child:
35:e959ffba78fd
Finalize USB library updates to fix compatibility problems introduced in USBHAL_KL25Z overhaul.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mjr 17:ab3cec0c8bf4 1 // Pinscape Controller Configuration
mjr 17:ab3cec0c8bf4 2 //
mjr 17:ab3cec0c8bf4 3 // To customize your private configuration, simply open this file in the
mjr 17:ab3cec0c8bf4 4 // mbed on-line IDE, make your changes, save the file, and click the Compile
mjr 17:ab3cec0c8bf4 5 // button at the top of the window. That will generate a customized .bin
mjr 17:ab3cec0c8bf4 6 // file that you can download onto your KL25Z board.
mjr 17:ab3cec0c8bf4 7
mjr 25:e22b88bd783a 8 #ifndef CONFIG_H
mjr 25:e22b88bd783a 9 #define CONFIG_H
mjr 17:ab3cec0c8bf4 10
mjr 33:d832bcab089e 11 // ---------------------------------------------------------------------------
mjr 33:d832bcab089e 12 //
mjr 33:d832bcab089e 13 // Expansion Board. If you're using the expansion board, un-comment the
mjr 33:d832bcab089e 14 // line below. This will select all of the correct defaults for the board.
mjr 33:d832bcab089e 15 //
mjr 33:d832bcab089e 16 // The expansion board settings are mostly automatic, so you shouldn't have
mjr 33:d832bcab089e 17 // to change much else. However, you should still look at and adjust the
mjr 33:d832bcab089e 18 // following as needed:
mjr 33:d832bcab089e 19 // - TV power on delay time
mjr 33:d832bcab089e 20 // - Plunger sensor settings, if you're using a plunger
mjr 33:d832bcab089e 21 //
mjr 33:d832bcab089e 22 //#define EXPANSION_BOARD
mjr 33:d832bcab089e 23
mjr 33:d832bcab089e 24
mjr 17:ab3cec0c8bf4 25 // --------------------------------------------------------------------------
mjr 21:5048e16cc9ef 26 //
mjr 21:5048e16cc9ef 27 // Enable/disable joystick functions.
mjr 21:5048e16cc9ef 28 //
mjr 21:5048e16cc9ef 29 // This controls whether or not we send joystick reports to the PC with the
mjr 21:5048e16cc9ef 30 // plunger and accelerometer readings. By default, this is enabled. If
mjr 21:5048e16cc9ef 31 // you want to use two or more physical KL25Z Pinscape controllers in your
mjr 21:5048e16cc9ef 32 // system (e.g., if you want to increase the number of output ports
mjr 21:5048e16cc9ef 33 // available by using two or more KL25Z's), you should disable the joystick
mjr 21:5048e16cc9ef 34 // features on the second (and third+) controller. It's not useful to have
mjr 21:5048e16cc9ef 35 // more than one board reporting the accelerometer readings to the host -
mjr 21:5048e16cc9ef 36 // doing so will just add USB overhead. This setting lets you turn off the
mjr 21:5048e16cc9ef 37 // reports for the secondary controllers, turning the secondary boards into
mjr 21:5048e16cc9ef 38 // output-only devices.
mjr 21:5048e16cc9ef 39 //
mjr 21:5048e16cc9ef 40 // Note that you can't use button inputs on a controller that has the
mjr 21:5048e16cc9ef 41 // joystick features disabled, because the buttons are handled via the
mjr 21:5048e16cc9ef 42 // joystick reports. Wire all of your buttons to the primary KL25Z that
mjr 21:5048e16cc9ef 43 // has the joystick features enabled.
mjr 21:5048e16cc9ef 44 //
mjr 21:5048e16cc9ef 45 // To disable the joystick features, just comment out the next line (add
mjr 21:5048e16cc9ef 46 // two slashes at the beginning of the line).
mjr 21:5048e16cc9ef 47 //
mjr 21:5048e16cc9ef 48 #define ENABLE_JOYSTICK
mjr 21:5048e16cc9ef 49
mjr 21:5048e16cc9ef 50
mjr 33:d832bcab089e 51 // ---------------------------------------------------------------------------
mjr 33:d832bcab089e 52 //
mjr 33:d832bcab089e 53 // USB device vendor ID and product ID. These values identify the device
mjr 33:d832bcab089e 54 // to the host software on the PC. By default, we use the same settings as
mjr 33:d832bcab089e 55 // a real LedWiz so that host software will recognize us as an LedWiz.
mjr 33:d832bcab089e 56 //
mjr 33:d832bcab089e 57 // The standard settings *should* work without conflicts, even if you have
mjr 33:d832bcab089e 58 // a real LedWiz. My reference system is 64-bit Windows 7 with a real LedWiz
mjr 33:d832bcab089e 59 // on unit #1 and a Pinscape controller on unit #8 (the default), and the
mjr 33:d832bcab089e 60 // two coexist happily in my system. The LedWiz is designed specifically
mjr 33:d832bcab089e 61 // to allow multiple units in one system, using the unit number value
mjr 33:d832bcab089e 62 // (see below) to distinguish multiple units, so there should be no conflict
mjr 33:d832bcab089e 63 // between Pinscape and any real LedWiz devices you have.
mjr 33:d832bcab089e 64 //
mjr 33:d832bcab089e 65 // However, even though conflicts *shouldn't* happen, I've had one report
mjr 33:d832bcab089e 66 // from a user who experienced a Windows USB driver conflict that they could
mjr 33:d832bcab089e 67 // only resolve by changing the vendor ID. The real underlying cause is
mjr 33:d832bcab089e 68 // still a mystery, but whatever was going on, changing the vendor ID fixed
mjr 33:d832bcab089e 69 // it. If you run into a similar problem, you can try the same fix as a
mjr 33:d832bcab089e 70 // last resort. Before doing that, though, you should try changing the
mjr 33:d832bcab089e 71 // Pinscape unit number first - it's possible that your real LedWiz is using
mjr 33:d832bcab089e 72 // unit #8, which is our default setting.
mjr 33:d832bcab089e 73 //
mjr 33:d832bcab089e 74 // If you must change the vendor ID for any reason, you'll sacrifice LedWiz
mjr 33:d832bcab089e 75 // compatibility, which means that old programs like Future Pinball that use
mjr 33:d832bcab089e 76 // the LedWiz interface directly won't be able to access the LedWiz output
mjr 33:d832bcab089e 77 // controller features. However, all is not lost. All of the other functions
mjr 33:d832bcab089e 78 // (plunger, nudge, and key input) use the joystick interface, which will
mjr 33:d832bcab089e 79 // work regardless of the ID values. In addition, DOF R3 recognizes the
mjr 33:d832bcab089e 80 // "emergency fallback" ID below, so if you use that, *all* functions
mjr 33:d832bcab089e 81 // including the output controller will work in any DOF R3-enabled software,
mjr 33:d832bcab089e 82 // including Visual Pinball and PinballX. So the only loss will be that
mjr 33:d832bcab089e 83 // old LedWiz-only software won't be able to control the outputs.
mjr 33:d832bcab089e 84 //
mjr 33:d832bcab089e 85 // The "emergency fallback" ID below is officially registerd with
mjr 33:d832bcab089e 86 // http://pid.codes, a registry for open-source USB projects, which should
mjr 33:d832bcab089e 87 // all but guarantee that this alternative ID shouldn't conflict with
mjr 33:d832bcab089e 88 // any other devices in your system.
mjr 25:e22b88bd783a 89
mjr 25:e22b88bd783a 90
mjr 33:d832bcab089e 91 // STANDARD ID SETTINGS. These provide full, transparent LedWiz compatibility.
mjr 33:d832bcab089e 92 const uint16_t USB_VENDOR_ID = 0xFAFA; // LedWiz vendor ID = FAFA
mjr 33:d832bcab089e 93 const uint16_t USB_PRODUCT_ID = 0x00F0; // LedWiz start of product ID range = 00F0
mjr 33:d832bcab089e 94
mjr 33:d832bcab089e 95
mjr 33:d832bcab089e 96 // EMERGENCY FALLBACK ID SETTINGS. These settings are not LedWiz-compatible,
mjr 33:d832bcab089e 97 // so older LedWiz-only software won't be able to access the output controller
mjr 33:d832bcab089e 98 // features. However, DOF R3 recognizes these IDs, so DOF-aware software (Visual
mjr 33:d832bcab089e 99 // Pinball, PinballX) will have full access to all features.
mjr 33:d832bcab089e 100 //
mjr 33:d832bcab089e 101 //const uint16_t USB_VENDOR_ID = 0x1209; // DOF R3-compatible vendor ID = 1209
mjr 33:d832bcab089e 102 //const uint16_t USB_PRODUCT_ID = 0xEAEA; // DOF R3-compatible product ID = EAEA
mjr 33:d832bcab089e 103
mjr 33:d832bcab089e 104
mjr 33:d832bcab089e 105 // ---------------------------------------------------------------------------
mjr 33:d832bcab089e 106 //
mjr 33:d832bcab089e 107 // LedWiz unit number.
mjr 17:ab3cec0c8bf4 108 //
mjr 21:5048e16cc9ef 109 // Each LedWiz device has a unit number, from 1 to 16. This lets you install
mjr 17:ab3cec0c8bf4 110 // more than one LedWiz in your system: as long as each one has a different
mjr 17:ab3cec0c8bf4 111 // unit number, the software on the PC can tell them apart and route commands
mjr 17:ab3cec0c8bf4 112 // to the right device.
mjr 17:ab3cec0c8bf4 113 //
mjr 33:d832bcab089e 114 // A real LedWiz has its unit number set at the factory. If you don't tell
mjr 33:d832bcab089e 115 // them otherwise when placing your order, they will set it to unit #1. Most
mjr 33:d832bcab089e 116 // real LedWiz units therefore are set to unit #1. There's no provision on
mjr 33:d832bcab089e 117 // a real LedWiz for users to change the unit number after it leaves the
mjr 33:d832bcab089e 118 // factory.
mjr 21:5048e16cc9ef 119 //
mjr 33:d832bcab089e 120 // For our *emulated* LedWiz, we default to unit #8 if we're the primary
mjr 33:d832bcab089e 121 // Pinscape controller in the system, or unit #9 if we're set up as the
mjr 33:d832bcab089e 122 // secondary controller with the joystick functions turned off.
mjr 17:ab3cec0c8bf4 123 //
mjr 21:5048e16cc9ef 124 // The reason we start at unit #8 is that we want to avoid conflicting with
mjr 33:d832bcab089e 125 // any real LedWiz devices in your system. Most real LedWiz devices are
mjr 33:d832bcab089e 126 // set up as unit #1, and in the rare cases where people have two of them,
mjr 33:d832bcab089e 127 // the second one is usually unit #2.
mjr 17:ab3cec0c8bf4 128 //
mjr 21:5048e16cc9ef 129 // Note 1: the unit number here is the *user visible* unit number that
mjr 21:5048e16cc9ef 130 // you use on the PC side. It's the number you specify in your DOF
mjr 21:5048e16cc9ef 131 // configuration and so forth. Internally, the USB reports subtract
mjr 21:5048e16cc9ef 132 // one from this number - e.g., nominal unit #1 shows up as 0 in the USB
mjr 21:5048e16cc9ef 133 // reports. If you're trying to puzzle out why all of the USB reports
mjr 21:5048e16cc9ef 134 // are all off by one from the unit number you select here, that's why.
mjr 17:ab3cec0c8bf4 135 //
mjr 17:ab3cec0c8bf4 136 // Note 2: the DOF Configtool (google it) knows about the Pinscape
mjr 29:582472d0bc57 137 // controller. There it's referred to as simply "KL25Z" rather than
mjr 29:582472d0bc57 138 // Pinscape Controller, but that's what they're talking about. The DOF
mjr 29:582472d0bc57 139 // tool knows that it uses #8 as its default unit number, so it names the
mjr 29:582472d0bc57 140 // .ini file for this controller xxx8.ini. If you change the unit number
mjr 29:582472d0bc57 141 // here, remember to rename the DOF-generated .ini file to match, by
mjr 29:582472d0bc57 142 // changing the "8" at the end of the filename to the new number you set
mjr 29:582472d0bc57 143 // here.
mjr 21:5048e16cc9ef 144 const uint8_t DEFAULT_LEDWIZ_UNIT_NUMBER =
mjr 21:5048e16cc9ef 145 #ifdef ENABLE_JOYSTICK
mjr 30:6e9902f06f48 146 0x08; // joystick enabled - assume we're the primary KL25Z, so use unit #8
mjr 21:5048e16cc9ef 147 #else
mjr 21:5048e16cc9ef 148 0x09; // joystick disabled - assume we're a secondary, output-only KL25Z, so use #9
mjr 21:5048e16cc9ef 149 #endif
mjr 17:ab3cec0c8bf4 150
mjr 33:d832bcab089e 151
mjr 33:d832bcab089e 152 // --------------------------------------------------------------------------
mjr 33:d832bcab089e 153 //
mjr 33:d832bcab089e 154 // Accelerometer orientation. The accelerometer feature lets Visual Pinball
mjr 33:d832bcab089e 155 // (and other pinball software) sense nudges to the cabinet, and simulate
mjr 33:d832bcab089e 156 // the effect on the ball's trajectory during play. We report the direction
mjr 33:d832bcab089e 157 // of the accelerometer readings as well as the strength, so it's important
mjr 33:d832bcab089e 158 // for VP and the KL25Z to agree on the physical orientation of the
mjr 33:d832bcab089e 159 // accelerometer relative to the cabinet. The accelerometer on the KL25Z
mjr 33:d832bcab089e 160 // is always mounted the same way on the board, but we still have to know
mjr 33:d832bcab089e 161 // which way you mount the board in your cabinet. We assume as default
mjr 33:d832bcab089e 162 // orientation where the KL25Z is mounted flat on the bottom of your
mjr 33:d832bcab089e 163 // cabinet with the USB ports pointing forward, toward the coin door. If
mjr 33:d832bcab089e 164 // it's more convenient for you to mount the board in a different direction,
mjr 33:d832bcab089e 165 // you simply need to select the matching direction here. Comment out the
mjr 33:d832bcab089e 166 // ORIENTATION_PORTS_AT_FRONT line and un-comment the line that matches
mjr 33:d832bcab089e 167 // your board's orientation.
mjr 33:d832bcab089e 168
mjr 33:d832bcab089e 169 #define ORIENTATION_PORTS_AT_FRONT // USB ports pointing toward front of cabinet
mjr 33:d832bcab089e 170 // #define ORIENTATION_PORTS_AT_LEFT // USB ports pointing toward left side of cab
mjr 33:d832bcab089e 171 // #define ORIENTATION_PORTS_AT_RIGHT // USB ports pointing toward right side of cab
mjr 33:d832bcab089e 172 // #define ORIENTATION_PORTS_AT_REAR // USB ports pointing toward back of cabinet
mjr 33:d832bcab089e 173
mjr 33:d832bcab089e 174
mjr 33:d832bcab089e 175
mjr 17:ab3cec0c8bf4 176 // --------------------------------------------------------------------------
mjr 17:ab3cec0c8bf4 177 //
mjr 17:ab3cec0c8bf4 178 // Plunger CCD sensor.
mjr 17:ab3cec0c8bf4 179 //
mjr 17:ab3cec0c8bf4 180 // If you're NOT using the CCD sensor, comment out the next line (by adding
mjr 17:ab3cec0c8bf4 181 // two slashes at the start of the line).
mjr 17:ab3cec0c8bf4 182
mjr 24:e902bc7cdc1e 183 #define ENABLE_CCD_SENSOR
mjr 17:ab3cec0c8bf4 184
mjr 25:e22b88bd783a 185 // Physical pixel count for your sensor. This software has been tested with
mjr 25:e22b88bd783a 186 // TAOS TSL1410R (1280 pixels) and TSL1412R (1536 pixels) sensors. It might
mjr 25:e22b88bd783a 187 // work with other similar sensors as well, but you'll probably have to make
mjr 25:e22b88bd783a 188 // some changes to the software interface to the sensor if you're using any
mjr 25:e22b88bd783a 189 // sensor outside of the TAOS TSL14xxR series.
mjr 25:e22b88bd783a 190 //
mjr 25:e22b88bd783a 191 // If you're not using a CCD sensor, you can ignore this.
mjr 25:e22b88bd783a 192 const int CCD_NPIXELS = 1280;
mjr 25:e22b88bd783a 193
mjr 25:e22b88bd783a 194 // Number of pixels from the CCD to sample on each high-res scan. We don't
mjr 25:e22b88bd783a 195 // sample every pixel from the sensor on each scan, because (a) we don't
mjr 25:e22b88bd783a 196 // have to, and (b) we don't want to. We don't have to sample all of the
mjr 25:e22b88bd783a 197 // pixels because these sensors have much finer resolution than we need to
mjr 25:e22b88bd783a 198 // get good results. On a typical pinball cabinet setup with a 1920x1080
mjr 25:e22b88bd783a 199 // HD TV display, the on-screen plunger travel distance is about 165 pixels,
mjr 25:e22b88bd783a 200 // so that's all the pixels we need to sample for pixel-accurate animation.
mjr 25:e22b88bd783a 201 // Even so, we still *could* sample at higher resolution, but we don't *want*
mjr 25:e22b88bd783a 202 // to sample more pixels than we have to, because reading each pixel takes
mjr 25:e22b88bd783a 203 // time. The limiting factor for read speed is the sampling time for the ADC
mjr 25:e22b88bd783a 204 // (analog to digital converter); it needs about 20us per sample to get an
mjr 25:e22b88bd783a 205 // accurate voltage reading. We want to animate the on-screen plunger in
mjr 25:e22b88bd783a 206 // real time, with minimal lag, so it's important that we complete each scan
mjr 25:e22b88bd783a 207 // as quickly as possible. The fewer pixels we sample, the faster we
mjr 25:e22b88bd783a 208 // complete each scan.
mjr 25:e22b88bd783a 209 //
mjr 25:e22b88bd783a 210 // Happily, the time needed to read the approximately 165 pixels required
mjr 25:e22b88bd783a 211 // for pixel-accurate positioning on the display is short enough that we can
mjr 33:d832bcab089e 212 // complete a scan within the cycle time for USB reports. Visual Pinball
mjr 33:d832bcab089e 213 // only polls for input at about 10ms intervals, so there's no benefit
mjr 33:d832bcab089e 214 // to going much faster than this. The sensor timing is such that we can
mjr 33:d832bcab089e 215 // read about 165 pixels in well under 10ms. So that's really the sweet
mjr 33:d832bcab089e 216 // spot for our scans.
mjr 25:e22b88bd783a 217 //
mjr 25:e22b88bd783a 218 // Note that we distribute the sampled pixels evenly across the full range
mjr 25:e22b88bd783a 219 // of the sensor's pixels. That is, we read every nth pixel, and skip the
mjr 25:e22b88bd783a 220 // ones in between. That means that the sample count here has to be an even
mjr 25:e22b88bd783a 221 // divisor of the physical pixel count. Empirically, reading every 8th
mjr 25:e22b88bd783a 222 // pixel gives us good results on both the TSL1410R and TSL1412R, so you
mjr 25:e22b88bd783a 223 // shouldn't need to change this if you're using one of those sensors. If
mjr 25:e22b88bd783a 224 // you're using a different sensor, you should be sure to adjust this so that
mjr 25:e22b88bd783a 225 // it works out to an integer result with no remainder.
mjr 25:e22b88bd783a 226 //
mjr 25:e22b88bd783a 227 const int CCD_NPIXELS_SAMPLED = CCD_NPIXELS / 8;
mjr 25:e22b88bd783a 228
mjr 17:ab3cec0c8bf4 229 // The KL25Z pins that the CCD sensor is physically attached to:
mjr 17:ab3cec0c8bf4 230 //
mjr 17:ab3cec0c8bf4 231 // CCD_SI_PIN = the SI (sensor data input) pin
mjr 17:ab3cec0c8bf4 232 // CCD_CLOCK_PIN = the sensor clock pin
mjr 17:ab3cec0c8bf4 233 // CCD_SO_PIN = the SO (sensor data output) pin
mjr 17:ab3cec0c8bf4 234 //
mjr 17:ab3cec0c8bf4 235 // The SI an Clock pins are DigitalOut pins, so these can be set to just
mjr 17:ab3cec0c8bf4 236 // about any gpio pins that aren't used for something else. The SO pin must
mjr 17:ab3cec0c8bf4 237 // be an AnalogIn capable pin - only a few of the KL25Z gpio pins qualify,
mjr 17:ab3cec0c8bf4 238 // so check the pinout diagram to find suitable candidates if you need to
mjr 17:ab3cec0c8bf4 239 // change this. Note that some of the gpio pins shown in the mbed pinout
mjr 17:ab3cec0c8bf4 240 // diagrams are committed to other uses by the mbed software or by the KL25Z
mjr 17:ab3cec0c8bf4 241 // wiring itself, so if you do change these, be sure that the new pins you
mjr 17:ab3cec0c8bf4 242 // select are really available.
mjr 17:ab3cec0c8bf4 243
mjr 17:ab3cec0c8bf4 244 const PinName CCD_SI_PIN = PTE20;
mjr 17:ab3cec0c8bf4 245 const PinName CCD_CLOCK_PIN = PTE21;
mjr 17:ab3cec0c8bf4 246 const PinName CCD_SO_PIN = PTB0;
mjr 17:ab3cec0c8bf4 247
mjr 17:ab3cec0c8bf4 248 // --------------------------------------------------------------------------
mjr 17:ab3cec0c8bf4 249 //
mjr 17:ab3cec0c8bf4 250 // Plunger potentiometer sensor.
mjr 17:ab3cec0c8bf4 251 //
mjr 23:14f8c5004cd0 252 // If you're using a potentiometer as the plunger sensor, un-comment the
mjr 23:14f8c5004cd0 253 // next line (by removing the two slashes at the start of the line), and
mjr 23:14f8c5004cd0 254 // also comment out the ENABLE_CCD_SENSOR line above.
mjr 17:ab3cec0c8bf4 255
mjr 24:e902bc7cdc1e 256 //#define ENABLE_POT_SENSOR
mjr 17:ab3cec0c8bf4 257
mjr 23:14f8c5004cd0 258 // The KL25Z pin that your potentiometer is attached to. The potentiometer
mjr 23:14f8c5004cd0 259 // requires wiring three connectins:
mjr 23:14f8c5004cd0 260 //
mjr 23:14f8c5004cd0 261 // - Wire the fixed resistance end of the potentiometer nearest the KNOB
mjr 23:14f8c5004cd0 262 // end of the plunger to the 3.3V output from the KL25Z
mjr 23:14f8c5004cd0 263 //
mjr 23:14f8c5004cd0 264 // - Wire the other fixed resistance end to KL25Z Ground
mjr 23:14f8c5004cd0 265 //
mjr 23:14f8c5004cd0 266 // - Wire the potentiometer wiper (the variable output terminal) to the
mjr 23:14f8c5004cd0 267 // KL25Z pin identified below.
mjr 23:14f8c5004cd0 268 //
mjr 23:14f8c5004cd0 269 // Note that you can change the pin selection below, but if you do, the new
mjr 23:14f8c5004cd0 270 // pin must be AnalogIn capable. Only a few of the KL25Z pins qualify. Refer
mjr 23:14f8c5004cd0 271 // to the KL25Z pinout diagram to find another AnalogIn pin if you need to
mjr 23:14f8c5004cd0 272 // change this for any reason. Note that the default is to use the same analog
mjr 23:14f8c5004cd0 273 // input that the CCD sensor would use if it were enabled, which is why you
mjr 23:14f8c5004cd0 274 // have to be sure to disable the CCD support in the software if you're using
mjr 23:14f8c5004cd0 275 // a potentiometer as the sensor.
mjr 17:ab3cec0c8bf4 276
mjr 17:ab3cec0c8bf4 277 const PinName POT_PIN = PTB0;
mjr 17:ab3cec0c8bf4 278
mjr 17:ab3cec0c8bf4 279 // --------------------------------------------------------------------------
mjr 17:ab3cec0c8bf4 280 //
mjr 17:ab3cec0c8bf4 281 // Plunger calibration button and indicator light.
mjr 17:ab3cec0c8bf4 282 //
mjr 17:ab3cec0c8bf4 283 // These specify the pin names of the plunger calibration button connections.
mjr 17:ab3cec0c8bf4 284 // If you're not using these, you can set these to NC. (You can even use the
mjr 17:ab3cec0c8bf4 285 // button but not the LED; set the LED to NC if you're only using the button.)
mjr 17:ab3cec0c8bf4 286 //
mjr 17:ab3cec0c8bf4 287 // If you're using the button, wire one terminal of a momentary switch or
mjr 17:ab3cec0c8bf4 288 // pushbutton to the input pin you select, and wire the other terminal to the
mjr 17:ab3cec0c8bf4 289 // KL25Z ground. Push and hold the button for a few seconds to enter plunger
mjr 17:ab3cec0c8bf4 290 // calibration mode.
mjr 17:ab3cec0c8bf4 291 //
mjr 17:ab3cec0c8bf4 292 // If you're using the LED, you'll need to build a little transistor power
mjr 17:ab3cec0c8bf4 293 // booster circuit to power the LED, as described in the build guide. The
mjr 17:ab3cec0c8bf4 294 // LED gives you visual confirmation that the you've triggered calibration
mjr 17:ab3cec0c8bf4 295 // mode and lets you know when the mode times out. Note that the LED on
mjr 17:ab3cec0c8bf4 296 // board the KL25Z also changes color to indicate the same information, so
mjr 17:ab3cec0c8bf4 297 // if the KL25Z is positioned so that you can see it while you're doing the
mjr 17:ab3cec0c8bf4 298 // calibration, you don't really need a separate button LED. But the
mjr 17:ab3cec0c8bf4 299 // separate LED is spiffy, especially if it's embedded in the pushbutton.
mjr 17:ab3cec0c8bf4 300 //
mjr 17:ab3cec0c8bf4 301 // Note that you can skip the pushbutton altogether and trigger calibration
mjr 17:ab3cec0c8bf4 302 // from the Windows control software. But again, the button is spiffier.
mjr 17:ab3cec0c8bf4 303
mjr 17:ab3cec0c8bf4 304 // calibration button input
mjr 17:ab3cec0c8bf4 305 const PinName CAL_BUTTON_PIN = PTE29;
mjr 17:ab3cec0c8bf4 306
mjr 17:ab3cec0c8bf4 307 // calibration button indicator LED
mjr 17:ab3cec0c8bf4 308 const PinName CAL_BUTTON_LED = PTE23;
mjr 17:ab3cec0c8bf4 309
mjr 17:ab3cec0c8bf4 310
mjr 33:d832bcab089e 311 // ---------------------------------------------------------------------------
mjr 33:d832bcab089e 312 //
mjr 33:d832bcab089e 313 // TV Power-On Timer. This section lets you set up a delayed relay timer
mjr 33:d832bcab089e 314 // for turning on your TV monitor(s) shortly after you turn on power to the
mjr 33:d832bcab089e 315 // system. This requires some external circuitry, which is built in to the
mjr 33:d832bcab089e 316 // expansion board, or which you can build yourself - refer to the Build
mjr 33:d832bcab089e 317 // Guide for the circuit plan.
mjr 33:d832bcab089e 318 //
mjr 33:d832bcab089e 319 // If you're using this feature, un-comment the next line, and make any
mjr 33:d832bcab089e 320 // changes to the port assignments below. The default port assignments are
mjr 33:d832bcab089e 321 // suitable for the expansion board. Note that the TV timer is enabled
mjr 33:d832bcab089e 322 // automatically if you're using the expansion board, since it's built in.
mjr 33:d832bcab089e 323 //#define ENABLE_TV_TIMER
mjr 33:d832bcab089e 324
mjr 33:d832bcab089e 325 #if defined(ENABLE_TV_TIMER) || defined(EXPANSION_BOARD)
mjr 33:d832bcab089e 326 # define PSU2_STATUS_SENSE PTD2 // Digital In pin to read latch status
mjr 33:d832bcab089e 327 # define PSU2_STATUS_SET PTE0 // Digital Out pin to set latch
mjr 33:d832bcab089e 328 # define TV_RELAY_PIN PTD3 // Digital Out pin to control TV switch relay
mjr 33:d832bcab089e 329
mjr 33:d832bcab089e 330 // Amount of time (in seconds) to wait after system power-up before
mjr 33:d832bcab089e 331 // pulsing the TV ON switch relay. Adjust as needed for your TV(s).
mjr 33:d832bcab089e 332 // Most monitors won't respond to any buttons for the first few seconds
mjr 33:d832bcab089e 333 // after they're plugged in, so we need to wait long enough to make sure
mjr 33:d832bcab089e 334 // the TVs are ready to receive input before pressing the button.
mjr 33:d832bcab089e 335 #define TV_DELAY_TIME 7.0
mjr 33:d832bcab089e 336
mjr 33:d832bcab089e 337 #endif
mjr 33:d832bcab089e 338
mjr 33:d832bcab089e 339
mjr 17:ab3cec0c8bf4 340 // --------------------------------------------------------------------------
mjr 17:ab3cec0c8bf4 341 //
mjr 17:ab3cec0c8bf4 342 // Pseudo "Launch Ball" button.
mjr 17:ab3cec0c8bf4 343 //
mjr 17:ab3cec0c8bf4 344 // Zeb of zebsboards.com came up with a clever scheme for his plunger kit
mjr 17:ab3cec0c8bf4 345 // that lets the plunger simulate a Launch Ball button for tables where
mjr 17:ab3cec0c8bf4 346 // the original used a Launch button instead of a plunger (e.g., Medieval
mjr 17:ab3cec0c8bf4 347 // Madness, T2, or Star Trek: The Next Generation). The scheme uses an
mjr 17:ab3cec0c8bf4 348 // LedWiz output to tell us when such a table is loaded. On the DOF
mjr 17:ab3cec0c8bf4 349 // Configtool site, this is called "ZB Launch Ball". When this LedWiz
mjr 17:ab3cec0c8bf4 350 // output is ON, it tells us that the table will ignore the analog plunger
mjr 17:ab3cec0c8bf4 351 // because it doesn't have a plunger object, so the analog plunger should
mjr 17:ab3cec0c8bf4 352 // send a Launch Ball button press signal when the user releases the plunger.
mjr 17:ab3cec0c8bf4 353 //
mjr 17:ab3cec0c8bf4 354 // If you wish to use this feature, you need to do two things:
mjr 17:ab3cec0c8bf4 355 //
mjr 17:ab3cec0c8bf4 356 // First, adjust the two lines below to set the LedWiz output and joystick
mjr 17:ab3cec0c8bf4 357 // button you wish to use for this feature. The defaults below should be
mjr 17:ab3cec0c8bf4 358 // fine for most people, but if you're using the Pinscape controller for
mjr 17:ab3cec0c8bf4 359 // your physical button wiring, you should set the launch button to match
mjr 17:ab3cec0c8bf4 360 // where you physically wired your actual Launch Ball button. Likewise,
mjr 17:ab3cec0c8bf4 361 // change the LedWiz port if you're using the one below for some actual
mjr 17:ab3cec0c8bf4 362 // hardware output. This is a virtual port that won't control any hardware;
mjr 17:ab3cec0c8bf4 363 // it's just for signaling the plunger that we're in "button mode". Note
mjr 17:ab3cec0c8bf4 364 // that the numbering for the both the LedWiz port and joystick button
mjr 17:ab3cec0c8bf4 365 // start at 1 to match the DOF Configtool and VP dialog numbering.
mjr 17:ab3cec0c8bf4 366 //
mjr 17:ab3cec0c8bf4 367 // Second, in the DOF Configtool, make sure you have a Pinscape controller
mjr 17:ab3cec0c8bf4 368 // in your cabinet configuration, then go to your Port Assignments and set
mjr 17:ab3cec0c8bf4 369 // the port defined below to "ZB Launch Ball".
mjr 17:ab3cec0c8bf4 370 //
mjr 17:ab3cec0c8bf4 371 // Third, open the Visual Pinball editor, open the Preferences | Keys
mjr 17:ab3cec0c8bf4 372 // dialog, and find the Plunger item. Open the drop-down list under that
mjr 17:ab3cec0c8bf4 373 // item and select the button number defined below.
mjr 17:ab3cec0c8bf4 374 //
mjr 21:5048e16cc9ef 375 // To disable this feature, just set ZBLaunchBallPort to 0 here.
mjr 17:ab3cec0c8bf4 376
mjr 17:ab3cec0c8bf4 377 const int ZBLaunchBallPort = 32;
mjr 17:ab3cec0c8bf4 378 const int LaunchBallButton = 24;
mjr 17:ab3cec0c8bf4 379
mjr 18:5e890ebd0023 380 // Distance necessary to push the plunger to activate the simulated
mjr 18:5e890ebd0023 381 // launch ball button, in inches. A standard pinball plunger can be
mjr 18:5e890ebd0023 382 // pushed forward about 1/2". However, the barrel spring is very
mjr 18:5e890ebd0023 383 // stiff, and anything more than about 1/8" requires quite a bit
mjr 18:5e890ebd0023 384 // of force. Ideally the force required should be about the same as
mjr 18:5e890ebd0023 385 // for any ordinary pushbutton.
mjr 18:5e890ebd0023 386 //
mjr 18:5e890ebd0023 387 // On my cabinet, empirically, a distance around 2mm (.08") seems
mjr 18:5e890ebd0023 388 // to work pretty well. It's far enough that it doesn't trigger
mjr 18:5e890ebd0023 389 // spuriously, but short enough that it responds to a reasonably
mjr 18:5e890ebd0023 390 // light push.
mjr 18:5e890ebd0023 391 //
mjr 18:5e890ebd0023 392 // You might need to adjust this up or down to get the right feel.
mjr 18:5e890ebd0023 393 // Alternatively, if you don't like the "push" gesture at all and
mjr 18:5e890ebd0023 394 // would prefer to only make the plunger respond to a pull-and-release
mjr 18:5e890ebd0023 395 // motion, simply set this to, say, 2.0 - it's impossible to push a
mjr 18:5e890ebd0023 396 // plunger forward that far, so that will effectively turn off the
mjr 18:5e890ebd0023 397 // push mode.
mjr 18:5e890ebd0023 398 const float LaunchBallPushDistance = .08;
mjr 18:5e890ebd0023 399
mjr 29:582472d0bc57 400
mjr 29:582472d0bc57 401 // --------------------------------------------------------------------------
mjr 29:582472d0bc57 402 //
mjr 29:582472d0bc57 403 // TLC5940 PWM controller chip setup - Enhanced LedWiz emulation
mjr 29:582472d0bc57 404 //
mjr 29:582472d0bc57 405 // By default, the Pinscape Controller software can provide limited LedWiz
mjr 29:582472d0bc57 406 // emulation through the KL25Z's on-board GPIO ports. This lets you hook
mjr 29:582472d0bc57 407 // up external devices, such as LED flashers or solenoids, to the KL25Z
mjr 29:582472d0bc57 408 // outputs (using external circuitry to boost power - KL25Z GPIO ports
mjr 29:582472d0bc57 409 // are limited to a meager 4mA per port). This capability is limited by
mjr 29:582472d0bc57 410 // the number of available GPIO ports on the KL25Z, and even smaller limit
mjr 29:582472d0bc57 411 // of 10 PWM-capable GPIO ports.
mjr 29:582472d0bc57 412 //
mjr 29:582472d0bc57 413 // As an alternative, the controller software lets you use external PWM
mjr 29:582472d0bc57 414 // controller chips to control essentially unlimited channels with full
mjr 29:582472d0bc57 415 // PWM control on all channels. This requires building external circuitry
mjr 29:582472d0bc57 416 // using TLC5940 chips. Each TLC5940 chip provides 16 full PWM channels,
mjr 29:582472d0bc57 417 // and you can daisy-chain multiple TLC5940 chips together to set up 32,
mjr 29:582472d0bc57 418 // 48, 64, or more channels.
mjr 29:582472d0bc57 419 //
mjr 29:582472d0bc57 420 // If you do add TLC5940 circuits to your controller hardware, use this
mjr 29:582472d0bc57 421 // section to configure the connection to the KL25Z.
mjr 29:582472d0bc57 422 //
mjr 33:d832bcab089e 423 // Note that when using the TLC5940, you can still also use some GPIO
mjr 33:d832bcab089e 424 // pins for outputs as normal. See ledWizPinMap[] for
mjr 29:582472d0bc57 425
mjr 29:582472d0bc57 426 // Number of TLC5940 chips you're using. For a full LedWiz-compatible
mjr 33:d832bcab089e 427 // setup, you need two of these chips, for 32 outputs. The software
mjr 34:6b981a2afab7 428 // will handle up to 8.
mjr 34:6b981a2afab7 429 // If you're using the expansion board, the main KL25Z interface board
mjr 34:6b981a2afab7 430 // has 2 chips and the MOSFET board has 2 more, for a total of 4. If
mjr 34:6b981a2afab7 431 // you add extra daisy-chained MOSFET boards, add 2 more per board.
mjr 33:d832bcab089e 432 #ifdef EXPANSION_BOARD
mjr 33:d832bcab089e 433 # define TLC5940_NCHIPS 4
mjr 33:d832bcab089e 434 #else
mjr 33:d832bcab089e 435 # define TLC5940_NCHIPS 0 // change this if you're using TLC5940's without the expansion board
mjr 33:d832bcab089e 436 #endif
mjr 29:582472d0bc57 437
mjr 29:582472d0bc57 438 // If you're using TLC5940s, change any of these as needed to match the
mjr 29:582472d0bc57 439 // GPIO pins that you connected to the TLC5940 control pins. Note that
mjr 29:582472d0bc57 440 // SIN and SCLK *must* be connected to the KL25Z SPI0 MOSI and SCLK
mjr 29:582472d0bc57 441 // outputs, respectively, which effectively limits them to the default
mjr 33:d832bcab089e 442 // selections, and that the GSCLK pin must be PWM-capable. These defaults
mjr 33:d832bcab089e 443 // all match the expansion board wiring.
mjr 34:6b981a2afab7 444 #define TLC5940_SIN PTC6 // Serial data - Must connect to SPI0 MOSI -> PTC6 or PTD2
mjr 34:6b981a2afab7 445 #define TLC5940_SCLK PTC5 // Serial clock - Must connect to SPI0 SCLK -> PTC5 or PTD1,
mjr 34:6b981a2afab7 446 // but don't use PTD1 because it's hard-wired to the on-board
mjr 34:6b981a2afab7 447 // blue LED
mjr 34:6b981a2afab7 448 #define TLC5940_XLAT PTC10 // XLAT (latch) signal - Any GPIO pin can be used
mjr 34:6b981a2afab7 449 #define TLC5940_BLANK PTC7 // BLANK signal - Any GPIO pin can be used
mjr 34:6b981a2afab7 450 #define TLC5940_GSCLK PTA1 // Grayscale clock - Must be a PWM-capable pin
mjr 34:6b981a2afab7 451
mjr 25:e22b88bd783a 452
mjr 34:6b981a2afab7 453 // --------------------------------------------------------------------------
mjr 34:6b981a2afab7 454 //
mjr 34:6b981a2afab7 455 // 74HC595 digital output setup - "Chime Board" module
mjr 34:6b981a2afab7 456 //
mjr 34:6b981a2afab7 457 // The 74HC595 is an 8-output serial-to-parallel shift register IC. This lets
mjr 34:6b981a2afab7 458 // us add extra digital outputs (on/off only, not PWM), 8 at a time, similar
mjr 34:6b981a2afab7 459 // to the way the TLC5940 lets us add extra PWM outputs. The 74HC595 requires
mjr 34:6b981a2afab7 460 // four control signals, so one chip gives us 8 outputs using only 4 GPIOs.
mjr 34:6b981a2afab7 461 // The chips can be daisy-chained, so by adding multiple chips, we can add
mjr 34:6b981a2afab7 462 // any number of new outputs, still using only 4 GPIO pins for the whole chain.
mjr 34:6b981a2afab7 463 //
mjr 34:6b981a2afab7 464 // The TLC5940 is more useful for general-purpose outputs because of its PWM
mjr 34:6b981a2afab7 465 // capabilities, but digital-only outputs are better for some special cases.
mjr 34:6b981a2afab7 466 //
mjr 34:6b981a2afab7 467 // The Expansion Board "Chime" module uses these chips to add timer-protected
mjr 34:6b981a2afab7 468 // outputs. The timer triggers are edge-sensitive, so we want simple on/off
mjr 34:6b981a2afab7 469 // signals to control them; a PWM signal wouldn't work properly because it's
mjr 34:6b981a2afab7 470 // constantly switching on and off even when nominally 100% on.
mjr 34:6b981a2afab7 471 //
mjr 34:6b981a2afab7 472
mjr 34:6b981a2afab7 473 #define HC595_NCHIPS 0 // Number of chips == number of Chime boards connected
mjr 34:6b981a2afab7 474 #define HC595_SIN PTA5 // Serial data - use any GPIO pin
mjr 34:6b981a2afab7 475 #define HC595_SCLK PTA4 // Serial clock - use any GPIO pin
mjr 34:6b981a2afab7 476 #define HC595_LATCH PTA12 // Latch signal - use any GPIO pin
mjr 34:6b981a2afab7 477 #define HC595_ENA PTD4 // Enable signal - use any GPIO pin
mjr 34:6b981a2afab7 478
mjr 17:ab3cec0c8bf4 479
mjr 29:582472d0bc57 480 #endif // CONFIG_H - end of include-once section (code below this point can be multiply included)
mjr 29:582472d0bc57 481
mjr 29:582472d0bc57 482
mjr 29:582472d0bc57 483 #ifdef DECL_EXTERNS // this section defines global variables, only if this macro is set
mjr 29:582472d0bc57 484
mjr 17:ab3cec0c8bf4 485 // --------------------------------------------------------------------------
mjr 17:ab3cec0c8bf4 486 //
mjr 17:ab3cec0c8bf4 487
mjr 17:ab3cec0c8bf4 488 // Joystick button input pin assignments.
mjr 17:ab3cec0c8bf4 489 //
mjr 17:ab3cec0c8bf4 490 // You can wire up to 32 GPIO ports to buttons (equipped with
mjr 17:ab3cec0c8bf4 491 // momentary switches). Connect each switch between the desired
mjr 17:ab3cec0c8bf4 492 // GPIO port and ground (J9 pin 12 or 14). When the button is pressed,
mjr 17:ab3cec0c8bf4 493 // we'll tell the host PC that the corresponding joystick button is
mjr 17:ab3cec0c8bf4 494 // pressed. We debounce the keystrokes in software, so you can simply
mjr 17:ab3cec0c8bf4 495 // wire directly to pushbuttons with no additional external hardware.
mjr 17:ab3cec0c8bf4 496 //
mjr 17:ab3cec0c8bf4 497 // Note that we assign 24 buttons by default, even though the USB
mjr 17:ab3cec0c8bf4 498 // joystick interface can handle up to 32 buttons. VP itself only
mjr 17:ab3cec0c8bf4 499 // allows mapping of up to 24 buttons in the preferences dialog
mjr 17:ab3cec0c8bf4 500 // (although it can recognize 32 buttons internally). If you want
mjr 17:ab3cec0c8bf4 501 // more buttons, you can reassign pins that are assigned by default
mjr 17:ab3cec0c8bf4 502 // as LedWiz outputs. To reassign a pin, find the pin you wish to
mjr 17:ab3cec0c8bf4 503 // reassign in the LedWizPortMap array below, and change the pin name
mjr 17:ab3cec0c8bf4 504 // there to NC (for Not Connected). You can then change one of the
mjr 17:ab3cec0c8bf4 505 // "NC" entries below to the reallocated pin name. The limit is 32
mjr 17:ab3cec0c8bf4 506 // buttons total.
mjr 17:ab3cec0c8bf4 507 //
mjr 34:6b981a2afab7 508 // (If you're using TLC5940 chips to control outputs, many of the
mjr 34:6b981a2afab7 509 // GPIO pins that are mapped to LedWiz outputs in the default
mjr 34:6b981a2afab7 510 // mapping can be reassigned as keys, since the TLC5940 outputs
mjr 34:6b981a2afab7 511 // take over for the GPIO pins. The exceptions are the pins that
mjr 34:6b981a2afab7 512 // are reassigned to control the TLC5940 chips.)
mjr 26:cb71c4af2912 513 //
mjr 17:ab3cec0c8bf4 514 // Note: PTD1 (pin J2-12) should NOT be assigned as a button input,
mjr 17:ab3cec0c8bf4 515 // as this pin is physically connected on the KL25Z to the on-board
mjr 34:6b981a2afab7 516 // indicator LED's blue segment.
mjr 17:ab3cec0c8bf4 517 PinName buttonMap[] = {
mjr 17:ab3cec0c8bf4 518 PTC2, // J10 pin 10, joystick button 1
mjr 17:ab3cec0c8bf4 519 PTB3, // J10 pin 8, joystick button 2
mjr 17:ab3cec0c8bf4 520 PTB2, // J10 pin 6, joystick button 3
mjr 17:ab3cec0c8bf4 521 PTB1, // J10 pin 4, joystick button 4
mjr 17:ab3cec0c8bf4 522
mjr 17:ab3cec0c8bf4 523 PTE30, // J10 pin 11, joystick button 5
mjr 34:6b981a2afab7 524 #ifdef EXPANSION_BOARD
mjr 34:6b981a2afab7 525 PTC11, // J1 pin 15, joystick button 6
mjr 34:6b981a2afab7 526 #else
mjr 17:ab3cec0c8bf4 527 PTE22, // J10 pin 5, joystick button 6
mjr 34:6b981a2afab7 528 #endif
mjr 17:ab3cec0c8bf4 529
mjr 17:ab3cec0c8bf4 530 PTE5, // J9 pin 15, joystick button 7
mjr 17:ab3cec0c8bf4 531 PTE4, // J9 pin 13, joystick button 8
mjr 17:ab3cec0c8bf4 532 PTE3, // J9 pin 11, joystick button 9
mjr 17:ab3cec0c8bf4 533 PTE2, // J9 pin 9, joystick button 10
mjr 17:ab3cec0c8bf4 534 PTB11, // J9 pin 7, joystick button 11
mjr 17:ab3cec0c8bf4 535 PTB10, // J9 pin 5, joystick button 12
mjr 17:ab3cec0c8bf4 536 PTB9, // J9 pin 3, joystick button 13
mjr 17:ab3cec0c8bf4 537 PTB8, // J9 pin 1, joystick button 14
mjr 17:ab3cec0c8bf4 538
mjr 17:ab3cec0c8bf4 539 PTC12, // J2 pin 1, joystick button 15
mjr 17:ab3cec0c8bf4 540 PTC13, // J2 pin 3, joystick button 16
mjr 17:ab3cec0c8bf4 541 PTC16, // J2 pin 5, joystick button 17
mjr 17:ab3cec0c8bf4 542 PTC17, // J2 pin 7, joystick button 18
mjr 17:ab3cec0c8bf4 543 PTA16, // J2 pin 9, joystick button 19
mjr 17:ab3cec0c8bf4 544 PTA17, // J2 pin 11, joystick button 20
mjr 17:ab3cec0c8bf4 545 PTE31, // J2 pin 13, joystick button 21
mjr 17:ab3cec0c8bf4 546 PTD6, // J2 pin 17, joystick button 22
mjr 17:ab3cec0c8bf4 547 PTD7, // J2 pin 19, joystick button 23
mjr 17:ab3cec0c8bf4 548
mjr 17:ab3cec0c8bf4 549 PTE1, // J2 pin 20, joystick button 24
mjr 17:ab3cec0c8bf4 550
mjr 17:ab3cec0c8bf4 551 NC, // not used, joystick button 25
mjr 17:ab3cec0c8bf4 552 NC, // not used, joystick button 26
mjr 17:ab3cec0c8bf4 553 NC, // not used, joystick button 27
mjr 17:ab3cec0c8bf4 554 NC, // not used, joystick button 28
mjr 17:ab3cec0c8bf4 555 NC, // not used, joystick button 29
mjr 17:ab3cec0c8bf4 556 NC, // not used, joystick button 30
mjr 17:ab3cec0c8bf4 557 NC, // not used, joystick button 31
mjr 17:ab3cec0c8bf4 558 NC // not used, joystick button 32
mjr 17:ab3cec0c8bf4 559 };
mjr 17:ab3cec0c8bf4 560
mjr 17:ab3cec0c8bf4 561 // --------------------------------------------------------------------------
mjr 17:ab3cec0c8bf4 562 //
mjr 33:d832bcab089e 563 // LED-Wiz emulation output pin assignments
mjr 17:ab3cec0c8bf4 564 //
mjr 33:d832bcab089e 565 // This sets the mapping from logical LedWiz port numbers, as used
mjr 33:d832bcab089e 566 // in the software on the PC side, to physical hardware pins on the
mjr 33:d832bcab089e 567 // KL25Z and/or the TLC5940 controllers.
mjr 26:cb71c4af2912 568 //
mjr 33:d832bcab089e 569 // The LedWiz protocol lets the PC software set a "brightness" level
mjr 33:d832bcab089e 570 // for each output. This is used to control the intensity of LEDs
mjr 33:d832bcab089e 571 // and other lights, and can also control motor speeds. To implement
mjr 33:d832bcab089e 572 // the intensity level in hardware, we use PWM, or pulse width
mjr 33:d832bcab089e 573 // modulation, which switches the output on and off very rapidly
mjr 33:d832bcab089e 574 // to give the effect of a reduced voltage. Unfortunately, the KL25Z
mjr 33:d832bcab089e 575 // hardware is limited to 10 channels of PWM control for its GPIO
mjr 33:d832bcab089e 576 // outputs, so it's impossible to implement the LedWiz's full set
mjr 33:d832bcab089e 577 // of 32 adjustable outputs using only GPIO ports. However, you can
mjr 33:d832bcab089e 578 // create 10 adjustable ports and fill out the rest with "digital"
mjr 33:d832bcab089e 579 // GPIO pins, which are simple on/off switches. The intensity level
mjr 33:d832bcab089e 580 // of a digital port can't be adjusted - it's either fully on or
mjr 33:d832bcab089e 581 // fully off - but this is fine for devices that don't have
mjr 33:d832bcab089e 582 // different intensity settings anyway, such as replay knockers
mjr 33:d832bcab089e 583 // and flipper solenoids.
mjr 17:ab3cec0c8bf4 584 //
mjr 33:d832bcab089e 585 // In the mapping list below, you can decide how to dole out the
mjr 33:d832bcab089e 586 // PWM-capable and digital-only GPIO pins. To make it easier to
mjr 33:d832bcab089e 587 // remember which is which, the default mapping below groups all
mjr 33:d832bcab089e 588 // of the PWM-capable ports together in the first 10 logical LedWiz
mjr 33:d832bcab089e 589 // port numbers. Unfortunately, these ports aren't *physically*
mjr 33:d832bcab089e 590 // together on the KL25Z pin headers, so this layout may be simple
mjr 33:d832bcab089e 591 // in terms of the LedWiz numbering, but it's a little jumbled
mjr 33:d832bcab089e 592 // in the physical layout.t
mjr 33:d832bcab089e 593 //
mjr 33:d832bcab089e 594 // "NC" in the pin name slot means "not connected". This means
mjr 33:d832bcab089e 595 // that there's no physical output for this LedWiz port number.
mjr 33:d832bcab089e 596 // The device will still accept commands that control the port,
mjr 33:d832bcab089e 597 // but these will just be silently ignored, since there's no pin
mjr 33:d832bcab089e 598 // to turn on or off for these ports. The reason we leave some
mjr 33:d832bcab089e 599 // ports unconnected is that we don't have enough physical GPIO
mjr 33:d832bcab089e 600 // pins to fill out the full LedWiz complement of 32 ports. Many
mjr 33:d832bcab089e 601 // pins are already taken for other purposes, such as button
mjr 33:d832bcab089e 602 // inputs or the plunger CCD interface.
mjr 17:ab3cec0c8bf4 603 //
mjr 17:ab3cec0c8bf4 604 // The mapping between physical output pins on the KL25Z and the
mjr 33:d832bcab089e 605 // assigned LED-Wiz port numbers is essentially arbitrary. You can
mjr 17:ab3cec0c8bf4 606 // customize this by changing the entries in the array below if you
mjr 17:ab3cec0c8bf4 607 // wish to rearrange the pins for any reason. Be aware that some
mjr 17:ab3cec0c8bf4 608 // of the physical outputs are already used for other purposes
mjr 17:ab3cec0c8bf4 609 // (e.g., some of the GPIO pins on header J10 are used for the
mjr 17:ab3cec0c8bf4 610 // CCD sensor - but you can of course reassign those as well by
mjr 33:d832bcab089e 611 // changing the corresponding declarations elsewhere in this file).
mjr 17:ab3cec0c8bf4 612 // The assignments we make here have two main objectives: first,
mjr 17:ab3cec0c8bf4 613 // to group the outputs on headers J1 and J2 (to facilitate neater
mjr 17:ab3cec0c8bf4 614 // wiring by keeping the output pins together physically), and
mjr 17:ab3cec0c8bf4 615 // second, to make the physical pin layout match the LED-Wiz port
mjr 17:ab3cec0c8bf4 616 // numbering order to the extent possible. There's one big wrench
mjr 17:ab3cec0c8bf4 617 // in the works, though, which is the limited number and discontiguous
mjr 17:ab3cec0c8bf4 618 // placement of the KL25Z PWM-capable output pins. This prevents
mjr 17:ab3cec0c8bf4 619 // us from doing the most obvious sequential ordering of the pins,
mjr 17:ab3cec0c8bf4 620 // so we end up with the outputs arranged into several blocks.
mjr 17:ab3cec0c8bf4 621 // Hopefully this isn't too confusing; for more detailed rationale,
mjr 17:ab3cec0c8bf4 622 // read on...
mjr 17:ab3cec0c8bf4 623 //
mjr 17:ab3cec0c8bf4 624 // With the LED-Wiz, the host software configuration usually
mjr 17:ab3cec0c8bf4 625 // assumes that each RGB LED is hooked up to three consecutive ports
mjr 17:ab3cec0c8bf4 626 // (for the red, green, and blue components, which need to be
mjr 17:ab3cec0c8bf4 627 // physically wired to separate outputs to allow each color to be
mjr 17:ab3cec0c8bf4 628 // controlled independently). To facilitate this, we arrange the
mjr 17:ab3cec0c8bf4 629 // PWM-enabled outputs so that they're grouped together in the
mjr 17:ab3cec0c8bf4 630 // port numbering scheme. Unfortunately, these outputs aren't
mjr 17:ab3cec0c8bf4 631 // together in a single group in the physical pin layout, so to
mjr 17:ab3cec0c8bf4 632 // group them logically in the LED-Wiz port numbering scheme, we
mjr 17:ab3cec0c8bf4 633 // have to break up the overall numbering scheme into several blocks.
mjr 17:ab3cec0c8bf4 634 // So our port numbering goes sequentially down each column of
mjr 17:ab3cec0c8bf4 635 // header pins, but there are several break points where we have
mjr 17:ab3cec0c8bf4 636 // to interrupt the obvious sequence to keep the PWM pins grouped
mjr 17:ab3cec0c8bf4 637 // logically.
mjr 17:ab3cec0c8bf4 638 //
mjr 17:ab3cec0c8bf4 639 // In the list below, "pin J1-2" refers to pin 2 on header J1 on
mjr 17:ab3cec0c8bf4 640 // the KL25Z, using the standard pin numbering in the KL25Z
mjr 17:ab3cec0c8bf4 641 // documentation - this is the physical pin that the port controls.
mjr 17:ab3cec0c8bf4 642 // "LW port 1" means LED-Wiz port 1 - this is the LED-Wiz port
mjr 17:ab3cec0c8bf4 643 // number that you use on the PC side (in the DirectOutput config
mjr 17:ab3cec0c8bf4 644 // file, for example) to address the port. PWM-capable ports are
mjr 17:ab3cec0c8bf4 645 // marked as such - we group the PWM-capable ports into the first
mjr 17:ab3cec0c8bf4 646 // 10 LED-Wiz port numbers.
mjr 17:ab3cec0c8bf4 647 //
mjr 17:ab3cec0c8bf4 648 // If you wish to reallocate a pin in the array below to some other
mjr 17:ab3cec0c8bf4 649 // use, such as a button input port, simply change the pin name in
mjr 17:ab3cec0c8bf4 650 // the entry to NC (for Not Connected). This will disable the given
mjr 17:ab3cec0c8bf4 651 // logical LedWiz port number and free up the physical pin.
mjr 17:ab3cec0c8bf4 652 //
mjr 17:ab3cec0c8bf4 653 // If you wish to reallocate a pin currently assigned to the button
mjr 17:ab3cec0c8bf4 654 // input array, simply change the entry for the pin in the buttonMap[]
mjr 17:ab3cec0c8bf4 655 // array above to NC (for "not connected"), and plug the pin name into
mjr 17:ab3cec0c8bf4 656 // a slot of your choice in the array below.
mjr 17:ab3cec0c8bf4 657 //
mjr 33:d832bcab089e 658 // Note: Don't assign PTD1 (pin J2-12) as an LedWiz output. That pin
mjr 33:d832bcab089e 659 // is hard-wired on the KL25Z to the on-board indicator LED's blue segment,
mjr 34:6b981a2afab7 660 // which pretty precludes other uses of the pin.
mjr 33:d832bcab089e 661 //
mjr 33:d832bcab089e 662 // ACTIVE-LOW PORTS: By default, when a logical port is turned on in
mjr 33:d832bcab089e 663 // the software, we set the physical GPIO voltage to "high" (3.3V), and
mjr 33:d832bcab089e 664 // set it "low" (0V) when the logical port is off. This is the right
mjr 33:d832bcab089e 665 // scheme for the booster circuit described in the build guide. Some
mjr 33:d832bcab089e 666 // third-party booster circuits want the opposite voltage scheme, where
mjr 33:d832bcab089e 667 // logical "on" is represented by 0V on the port and logical "off" is
mjr 33:d832bcab089e 668 // represented by 3.3V. If you're using an "active low" booster like
mjr 33:d832bcab089e 669 // that, set the PORT_ACTIVE_LOW flag in the array below for each
mjr 33:d832bcab089e 670 // affected port.
mjr 33:d832bcab089e 671 //
mjr 33:d832bcab089e 672 // TLC5940 PORTS: To assign an LedWiz output port number to a particular
mjr 34:6b981a2afab7 673 // output on a TLC5940, set the port type to TLC_PORT and set the 'pin'
mjr 34:6b981a2afab7 674 // value to the index of the output port in the daisy chain. The first
mjr 34:6b981a2afab7 675 // chip in the daisy chain has ports 1-16, the second has ports 17-32,
mjr 34:6b981a2afab7 676 // and so on.
mjr 34:6b981a2afab7 677 //
mjr 34:6b981a2afab7 678 // 74HC595 PORTS: To assign an LedWiz output port to a 74HC595 port,
mjr 34:6b981a2afab7 679 // set the port type to HC595_PORT and set 'pin' to the index of the port
mjr 34:6b981a2afab7 680 // in the daisy chain. The first chip has ports 1-8, the second has
mjr 34:6b981a2afab7 681 // 9-16, etc.
mjr 33:d832bcab089e 682 //
mjr 33:d832bcab089e 683
mjr 34:6b981a2afab7 684 // ledWizPortMap 'typ' values
mjr 34:6b981a2afab7 685 enum LWPortType {
mjr 34:6b981a2afab7 686 NO_PORT = -1, // Not connected
mjr 34:6b981a2afab7 687 DIG_GPIO = 0, // DigitalOut I/O pin (not PWM capable)
mjr 34:6b981a2afab7 688 PWM_GPIO = 1, // AnalogOut I/O pin (PWM capable)
mjr 34:6b981a2afab7 689 TLC_PORT = 2, // TLC5940 output port
mjr 34:6b981a2afab7 690 HC595_PORT = 3 // 74HC595 output port
mjr 34:6b981a2afab7 691 };
mjr 34:6b981a2afab7 692
mjr 34:6b981a2afab7 693 // flags - combine with '|'
mjr 34:6b981a2afab7 694 const int PORT_ACTIVE_LOW = 0x0001; // use LOW voltage (0V) when port is ON
mjr 33:d832bcab089e 695
mjr 17:ab3cec0c8bf4 696 struct {
mjr 34:6b981a2afab7 697 int pin; // Pin name/index - PinName for GPIO, pin index for TLC5940 or 74HC595
mjr 34:6b981a2afab7 698 LWPortType typ; // type of pin
mjr 33:d832bcab089e 699 int flags; // flags - a combination of PORT_xxx flag bits (see above)
mjr 33:d832bcab089e 700 } ledWizPortMap[] = {
mjr 33:d832bcab089e 701
mjr 33:d832bcab089e 702 #if TLC5940_NCHIPS == 0
mjr 33:d832bcab089e 703
mjr 33:d832bcab089e 704 // *** BASIC MODE - GPIO OUTPUTS ONLY ***
mjr 33:d832bcab089e 705 // This is the basic mapping, using entirely GPIO pins, for when you're
mjr 33:d832bcab089e 706 // not using external TLC5940 chips. We provide 22 physical outputs, 10
mjr 33:d832bcab089e 707 // of which are PWM capable.
mjr 33:d832bcab089e 708 //
mjr 33:d832bcab089e 709 // Important! Note that the "isPWM" setting isn't just something we get to
mjr 33:d832bcab089e 710 // choose. It's a feature of the KL25Z hardware. Some pins are PWM capable
mjr 33:d832bcab089e 711 // and some aren't, and there's nothing we can do about that in the software.
mjr 33:d832bcab089e 712 // Refer to the KL25Z manual or schematics for the possible connections. Note
mjr 33:d832bcab089e 713 // that there are other PWM-capable pins besides the 10 shown below, BUT they
mjr 33:d832bcab089e 714 // all share TPM channels with the pins below. For example, TPM 2.0 can be
mjr 33:d832bcab089e 715 // connected to PTA1, PTB2, PTB18, PTE22 - but only one at a time. So if you
mjr 33:d832bcab089e 716 // want to use PTB2 as a PWM out, it means you CAN'T use PTA1 as a PWM out.
mjr 33:d832bcab089e 717 // We commented each PWM pin with its hardware channel number to help you keep
mjr 33:d832bcab089e 718 // track of available channels if you do need to rearrange any of these pins.
mjr 33:d832bcab089e 719
mjr 34:6b981a2afab7 720 { PTA1, PWM_GPIO }, // pin J1-2, LW port 1 (PWM capable - TPM 2.0 = channel 9)
mjr 34:6b981a2afab7 721 { PTA2, PWM_GPIO }, // pin J1-4, LW port 2 (PWM capable - TPM 2.1 = channel 10)
mjr 34:6b981a2afab7 722 { PTD4, PWM_GPIO }, // pin J1-6, LW port 3 (PWM capable - TPM 0.4 = channel 5)
mjr 34:6b981a2afab7 723 { PTA12, PWM_GPIO }, // pin J1-8, LW port 4 (PWM capable - TPM 1.0 = channel 7)
mjr 34:6b981a2afab7 724 { PTA4, PWM_GPIO }, // pin J1-10, LW port 5 (PWM capable - TPM 0.1 = channel 2)
mjr 34:6b981a2afab7 725 { PTA5, PWM_GPIO }, // pin J1-12, LW port 6 (PWM capable - TPM 0.2 = channel 3)
mjr 34:6b981a2afab7 726 { PTA13, PWM_GPIO }, // pin J2-2, LW port 7 (PWM capable - TPM 1.1 = channel 13)
mjr 34:6b981a2afab7 727 { PTD5, PWM_GPIO }, // pin J2-4, LW port 8 (PWM capable - TPM 0.5 = channel 6)
mjr 34:6b981a2afab7 728 { PTD0, PWM_GPIO }, // pin J2-6, LW port 9 (PWM capable - TPM 0.0 = channel 1)
mjr 34:6b981a2afab7 729 { PTD3, PWM_GPIO }, // pin J2-10, LW port 10 (PWM capable - TPM 0.3 = channel 4)
mjr 34:6b981a2afab7 730 { PTD2, DIG_GPIO }, // pin J2-8, LW port 11
mjr 34:6b981a2afab7 731 { PTC8, DIG_GPIO }, // pin J1-14, LW port 12
mjr 34:6b981a2afab7 732 { PTC9, DIG_GPIO }, // pin J1-16, LW port 13
mjr 34:6b981a2afab7 733 { PTC7, DIG_GPIO }, // pin J1-1, LW port 14
mjr 34:6b981a2afab7 734 { PTC0, DIG_GPIO }, // pin J1-3, LW port 15
mjr 34:6b981a2afab7 735 { PTC3, DIG_GPIO }, // pin J1-5, LW port 16
mjr 34:6b981a2afab7 736 { PTC4, DIG_GPIO }, // pin J1-7, LW port 17
mjr 34:6b981a2afab7 737 { PTC5, DIG_GPIO }, // pin J1-9, LW port 18
mjr 34:6b981a2afab7 738 { PTC6, DIG_GPIO }, // pin J1-11, LW port 19
mjr 34:6b981a2afab7 739 { PTC10, DIG_GPIO }, // pin J1-13, LW port 20
mjr 34:6b981a2afab7 740 { PTC11, DIG_GPIO }, // pin J1-15, LW port 21
mjr 34:6b981a2afab7 741 { PTE0, DIG_GPIO }, // pin J2-18, LW port 22
mjr 34:6b981a2afab7 742 { NC, NO_PORT }, // Not connected, LW port 23
mjr 34:6b981a2afab7 743 { NC, NO_PORT }, // Not connected, LW port 24
mjr 34:6b981a2afab7 744 { NC, NO_PORT }, // Not connected, LW port 25
mjr 34:6b981a2afab7 745 { NC, NO_PORT }, // Not connected, LW port 26
mjr 34:6b981a2afab7 746 { NC, NO_PORT }, // Not connected, LW port 27
mjr 34:6b981a2afab7 747 { NC, NO_PORT }, // Not connected, LW port 28
mjr 34:6b981a2afab7 748 { NC, NO_PORT }, // Not connected, LW port 29
mjr 34:6b981a2afab7 749 { NC, NO_PORT }, // Not connected, LW port 30
mjr 34:6b981a2afab7 750 { NC, NO_PORT }, // Not connected, LW port 31
mjr 34:6b981a2afab7 751 { NC, NO_PORT } // Not connected, LW port 32
mjr 34:6b981a2afab7 752
mjr 33:d832bcab089e 753 #elif defined(EXPANSION_BOARD)
mjr 33:d832bcab089e 754
mjr 33:d832bcab089e 755 // *** EXPANSION BOARD MODE ***
mjr 33:d832bcab089e 756 //
mjr 33:d832bcab089e 757 // This mapping is for the expansion board, which uses four TLC5940
mjr 33:d832bcab089e 758 // chips to provide 64 outputs. The expansion board also uses
mjr 33:d832bcab089e 759 // one GPIO pin to provide a digital (non-PWM) output dedicated to
mjr 33:d832bcab089e 760 // the knocker circuit. That's on a digital pin because it's used
mjr 33:d832bcab089e 761 // to trigger an external timer circuit that limits the amount of
mjr 33:d832bcab089e 762 // time that the knocker coil can be continuously energized, to protect
mjr 33:d832bcab089e 763 // it against software faults on the PC that leave the port stuck on.
mjr 33:d832bcab089e 764 // (The knocker coil is unique among standard virtual cabinet output
mjr 33:d832bcab089e 765 // devices in this respect - it's the only device in common use that
mjr 33:d832bcab089e 766 // can be damaged if left on for too long. Other devices won't be
mjr 33:d832bcab089e 767 // damaged, so they don't require such elaborate precautions.)
mjr 33:d832bcab089e 768 //
mjr 33:d832bcab089e 769 // The specific device assignments in the last column are just
mjr 34:6b981a2afab7 770 // recommendations. You can assign any port to any device with
mjr 33:d832bcab089e 771 // compatible power needs. The "General Purpose" ports are good to
mjr 34:6b981a2afab7 772 // at least 5A, so you can use these for virtually anything; put
mjr 34:6b981a2afab7 773 // your heavy-duty devices, such as solenoids and motors, on these
mjr 34:6b981a2afab7 774 // outputs. You can also put lighter loads like lamps and LEDs
mjr 34:6b981a2afab7 775 // on these if you have ports left over after connecting all of
mjr 34:6b981a2afab7 776 // your high-power devices. The "Flasher" and "Button light" ports
mjr 34:6b981a2afab7 777 // are good to about 1.5A, so they work for medium loads like lamps,
mjr 34:6b981a2afab7 778 // flashers, high-power LEDs, etc. The flipper and magnasave ports
mjr 34:6b981a2afab7 779 // only provide 20mA; use these only for small LEDs.
mjr 34:6b981a2afab7 780 //
mjr 34:6b981a2afab7 781 // The TLC5940 outputs on the expansion board are hard-wired to
mjr 34:6b981a2afab7 782 // specific output drivers - that's what determines the power
mjr 34:6b981a2afab7 783 // limits described above. You can rearrange the ports in the
mjr 34:6b981a2afab7 784 // list below to change the LedWiz port numbering to any order
mjr 34:6b981a2afab7 785 // you prefer, but the association between a TLC5940 port number
mjr 34:6b981a2afab7 786 // and the output circuit type can't be changed in the software.
mjr 34:6b981a2afab7 787 // That's a function of how the TLC5940 port is physically wired
mjr 34:6b981a2afab7 788 // on the board. Likewise, the PTC8 output is hard-wired to the
mjr 34:6b981a2afab7 789 // knocker time limiter.
mjr 34:6b981a2afab7 790 // TLC ports 1-20 and 44-47 = Darlington outputs, 1.5A max
mjr 34:6b981a2afab7 791 // TLC ports 21-44 = MOSFET outputs (limit depends on MOSFET chosen)
mjr 34:6b981a2afab7 792 // TLC ports 49-64 = direct outputs, limited to 20mA
mjr 33:d832bcab089e 793
mjr 33:d832bcab089e 794 // The first 32 ports are LedWiz-compatible, so they're universally
mjr 33:d832bcab089e 795 // accessible, even to older non-DOF software. Attach the most common
mjr 33:d832bcab089e 796 // devices to these ports.
mjr 34:6b981a2afab7 797 { 1, TLC_PORT }, // TLC port 1, LW output 1 - Flasher 1 R
mjr 34:6b981a2afab7 798 { 2, TLC_PORT }, // TLC port 2, LW output 2 - Flasher 1 G
mjr 34:6b981a2afab7 799 { 3, TLC_PORT }, // TLC port 3, LW output 3 - Flasher 1 B
mjr 34:6b981a2afab7 800 { 4, TLC_PORT }, // TLC port 4, LW output 4 - Flasher 2 R
mjr 34:6b981a2afab7 801 { 5, TLC_PORT }, // TLC port 5, LW output 5 - Flasher 2 G
mjr 34:6b981a2afab7 802 { 6, TLC_PORT }, // TLC port 6, LW output 6 - Flasher 2 B
mjr 34:6b981a2afab7 803 { 7, TLC_PORT }, // TLC port 7, LW output 7 - Flasher 3 R
mjr 34:6b981a2afab7 804 { 8, TLC_PORT }, // TLC port 8, LW output 8 - Flasher 3 G
mjr 34:6b981a2afab7 805 { 9, TLC_PORT }, // TLC port 9, LW output 9 - Flasher 3 B
mjr 34:6b981a2afab7 806 { 10, TLC_PORT }, // TLC port 10, LW output 10 - Flasher 4 R
mjr 34:6b981a2afab7 807 { 11, TLC_PORT }, // TLC port 11, LW output 11 - Flasher 4 G
mjr 34:6b981a2afab7 808 { 12, TLC_PORT }, // TLC port 12, LW output 12 - Flasher 4 B
mjr 34:6b981a2afab7 809 { 13, TLC_PORT }, // TLC port 13, LW output 13 - Flasher 5 R
mjr 34:6b981a2afab7 810 { 14, TLC_PORT }, // TLC port 14, LW output 14 - Flasher 5 G
mjr 34:6b981a2afab7 811 { 15, TLC_PORT }, // TLC port 15, LW output 15 - Flasher 5 B
mjr 34:6b981a2afab7 812 { 16, TLC_PORT }, // TLC port 16, LW output 16 - Strobe/Button light
mjr 34:6b981a2afab7 813 { 17, TLC_PORT }, // TLC port 17, LW output 17 - Button light 1
mjr 34:6b981a2afab7 814 { 18, TLC_PORT }, // TLC port 18, LW output 18 - Button light 2
mjr 34:6b981a2afab7 815 { 19, TLC_PORT }, // TLC port 19, LW output 19 - Button light 3
mjr 34:6b981a2afab7 816 { 20, TLC_PORT }, // TLC port 20, LW output 20 - Button light 4
mjr 34:6b981a2afab7 817 { PTC8, DIG_GPIO }, // PTC8, LW output 21 - Replay Knocker
mjr 34:6b981a2afab7 818 { 21, TLC_PORT }, // TLC port 21, LW output 22 - Contactor 1/General purpose
mjr 34:6b981a2afab7 819 { 22, TLC_PORT }, // TLC port 22, LW output 23 - Contactor 2/General purpose
mjr 34:6b981a2afab7 820 { 23, TLC_PORT }, // TLC port 23, LW output 24 - Contactor 3/General purpose
mjr 34:6b981a2afab7 821 { 24, TLC_PORT }, // TLC port 24, LW output 25 - Contactor 4/General purpose
mjr 34:6b981a2afab7 822 { 25, TLC_PORT }, // TLC port 25, LW output 26 - Contactor 5/General purpose
mjr 34:6b981a2afab7 823 { 26, TLC_PORT }, // TLC port 26, LW output 27 - Contactor 6/General purpose
mjr 34:6b981a2afab7 824 { 27, TLC_PORT }, // TLC port 27, LW output 28 - Contactor 7/General purpose
mjr 34:6b981a2afab7 825 { 28, TLC_PORT }, // TLC port 28, LW output 29 - Contactor 8/General purpose
mjr 34:6b981a2afab7 826 { 29, TLC_PORT }, // TLC port 29, LW output 30 - Contactor 9/General purpose
mjr 34:6b981a2afab7 827 { 30, TLC_PORT }, // TLC port 30, LW output 31 - Contactor 10/General purpose
mjr 34:6b981a2afab7 828 { 31, TLC_PORT }, // TLC port 31, LW output 32 - Shaker Motor/General purpose
mjr 33:d832bcab089e 829
mjr 33:d832bcab089e 830 // Ports 33+ are accessible only to DOF-based software. Older LedWiz-only
mjr 33:d832bcab089e 831 // software on the can't access these. Attach less common devices to these ports.
mjr 34:6b981a2afab7 832 { 32, TLC_PORT }, // TLC port 32, LW output 33 - Gear Motor/General purpose
mjr 34:6b981a2afab7 833 { 33, TLC_PORT }, // TLC port 33, LW output 34 - Fan/General purpose
mjr 34:6b981a2afab7 834 { 34, TLC_PORT }, // TLC port 34, LW output 35 - Beacon/General purpose
mjr 34:6b981a2afab7 835 { 35, TLC_PORT }, // TLC port 35, LW output 36 - Undercab RGB R/General purpose
mjr 34:6b981a2afab7 836 { 36, TLC_PORT }, // TLC port 36, LW output 37 - Undercab RGB G/General purpose
mjr 34:6b981a2afab7 837 { 37, TLC_PORT }, // TLC port 37, LW output 38 - Undercab RGB B/General purpose
mjr 34:6b981a2afab7 838 { 38, TLC_PORT }, // TLC port 38, LW output 39 - Bell/General purpose
mjr 34:6b981a2afab7 839 { 39, TLC_PORT }, // TLC port 39, LW output 40 - Chime 1/General purpose
mjr 34:6b981a2afab7 840 { 40, TLC_PORT }, // TLC port 40, LW output 41 - Chime 2/General purpose
mjr 34:6b981a2afab7 841 { 41, TLC_PORT }, // TLC port 41, LW output 42 - Chime 3/General purpose
mjr 34:6b981a2afab7 842 { 42, TLC_PORT }, // TLC port 42, LW output 43 - General purpose
mjr 34:6b981a2afab7 843 { 43, TLC_PORT }, // TLC port 43, LW output 44 - General purpose
mjr 34:6b981a2afab7 844 { 44, TLC_PORT }, // TLC port 44, LW output 45 - Button light 5
mjr 34:6b981a2afab7 845 { 45, TLC_PORT }, // TLC port 45, LW output 46 - Button light 6
mjr 34:6b981a2afab7 846 { 46, TLC_PORT }, // TLC port 46, LW output 47 - Button light 7
mjr 34:6b981a2afab7 847 { 47, TLC_PORT }, // TLC port 47, LW output 48 - Button light 8
mjr 34:6b981a2afab7 848 { 49, TLC_PORT }, // TLC port 49, LW output 49 - Flipper button RGB left R
mjr 34:6b981a2afab7 849 { 50, TLC_PORT }, // TLC port 50, LW output 50 - Flipper button RGB left G
mjr 34:6b981a2afab7 850 { 51, TLC_PORT }, // TLC port 51, LW output 51 - Flipper button RGB left B
mjr 34:6b981a2afab7 851 { 52, TLC_PORT }, // TLC port 52, LW output 52 - Flipper button RGB right R
mjr 34:6b981a2afab7 852 { 53, TLC_PORT }, // TLC port 53, LW output 53 - Flipper button RGB right G
mjr 34:6b981a2afab7 853 { 54, TLC_PORT }, // TLC port 54, LW output 54 - Flipper button RGB right B
mjr 34:6b981a2afab7 854 { 55, TLC_PORT }, // TLC port 55, LW output 55 - MagnaSave button RGB left R
mjr 34:6b981a2afab7 855 { 56, TLC_PORT }, // TLC port 56, LW output 56 - MagnaSave button RGB left G
mjr 34:6b981a2afab7 856 { 57, TLC_PORT }, // TLC port 57, LW output 57 - MagnaSave button RGB left B
mjr 34:6b981a2afab7 857 { 58, TLC_PORT }, // TLC port 58, LW output 58 - MagnaSave button RGB right R
mjr 34:6b981a2afab7 858 { 59, TLC_PORT }, // TLC port 59, LW output 59 - MagnaSave button RGB right G
mjr 34:6b981a2afab7 859 { 60, TLC_PORT }, // TLC port 60, LW output 60 - MagnaSave button RGB right B
mjr 34:6b981a2afab7 860 { 61, TLC_PORT }, // TLC port 61, LW output 61 - Extra RGB LED R
mjr 34:6b981a2afab7 861 { 62, TLC_PORT }, // TLC port 62, LW output 62 - Extra RGB LED G
mjr 34:6b981a2afab7 862 { 63, TLC_PORT }, // TLC port 63, LW output 63 - Extra RGB LED B
mjr 34:6b981a2afab7 863 { 64, TLC_PORT } // TLC port 64, LW output 64 - Extra single LED
mjr 33:d832bcab089e 864
mjr 33:d832bcab089e 865 #else
mjr 33:d832bcab089e 866
mjr 33:d832bcab089e 867 // *** TLC5940 + GPIO OUTPUTS, Without the expansion board ***
mjr 33:d832bcab089e 868 //
mjr 33:d832bcab089e 869 // This is the mapping for the ehnanced mode, with one or more TLC5940
mjr 33:d832bcab089e 870 // chips connected. Each TLC5940 chip provides 16 PWM channels. We
mjr 33:d832bcab089e 871 // can supplement the TLC5940 outputs with GPIO pins to get even more
mjr 33:d832bcab089e 872 // physical outputs.
mjr 33:d832bcab089e 873 //
mjr 33:d832bcab089e 874 // Because we've already declared the number of TLC5940 chips earlier
mjr 33:d832bcab089e 875 // in this file, we don't actually have to map out all of the TLC5940
mjr 33:d832bcab089e 876 // ports here. The software will automatically assign all of the
mjr 33:d832bcab089e 877 // TLC5940 ports that aren't explicitly mentioned here to the next
mjr 33:d832bcab089e 878 // available LedWiz port numbers after the end of this array, assigning
mjr 33:d832bcab089e 879 // them sequentially in TLC5940 port order.
mjr 33:d832bcab089e 880 //
mjr 33:d832bcab089e 881 // In contrast to the basic mode arrangement, we're putting all of the
mjr 33:d832bcab089e 882 // NON PWM ports first in this mapping. The logic is that all of the
mjr 33:d832bcab089e 883 // TLC5940 ports are PWM-capable, and they'll all at the end of the list
mjr 33:d832bcab089e 884 // here, so by putting the PWM GPIO pins last here, we'll keep all of the
mjr 33:d832bcab089e 885 // PWM ports grouped in the final mapping.
mjr 33:d832bcab089e 886 //
mjr 33:d832bcab089e 887 // Note that the TLC5940 control wiring takes away several GPIO pins
mjr 33:d832bcab089e 888 // that we used as output ports in the basic mode. Further, because the
mjr 33:d832bcab089e 889 // TLC5940 makes ports so plentiful, we're intentionally omitting several
mjr 33:d832bcab089e 890 // more of the pins from the basic set, to make them available for other
mjr 33:d832bcab089e 891 // uses. To keep things more neatly grouped, we're only assigning J1 pins
mjr 33:d832bcab089e 892 // in this set. This leaves the following ports from the basic mode output
mjr 33:d832bcab089e 893 // set available for other users: PTA13, PTD0, PTD2, PTD3, PTD5, PTE0.
mjr 33:d832bcab089e 894
mjr 34:6b981a2afab7 895 { PTC8, DIG_GPIO }, // pin J1-14, LW port 1
mjr 34:6b981a2afab7 896 { PTC9, DIG_GPIO }, // pin J1-16, LW port 2
mjr 34:6b981a2afab7 897 { PTC0, DIG_GPIO }, // pin J1-3, LW port 3
mjr 34:6b981a2afab7 898 { PTC3, DIG_GPIO }, // pin J1-5, LW port 4
mjr 34:6b981a2afab7 899 { PTC4, DIG_GPIO }, // pin J1-7, LW port 5
mjr 34:6b981a2afab7 900 { PTC11, DIG_GPIO }, // pin J1-15, LW port 6
mjr 34:6b981a2afab7 901 { PTA2, PWM_GPIO }, // pin J1-4, LW port 7 (PWM capable - TPM 2.1 = channel 10)
mjr 34:6b981a2afab7 902 { PTD4, PWM_GPIO }, // pin J1-6, LW port 8 (PWM capable - TPM 0.4 = channel 5)
mjr 34:6b981a2afab7 903 { PTA12, PWM_GPIO }, // pin J1-8, LW port 9 (PWM capable - TPM 1.0 = channel 7)
mjr 34:6b981a2afab7 904 { PTA4, PWM_GPIO }, // pin J1-10, LW port 10 (PWM capable - TPM 0.1 = channel 2)
mjr 34:6b981a2afab7 905 { PTA5, PWM_GPIO } // pin J1-12, LW port 11 (PWM capable - TPM 0.2 = channel 3)
mjr 33:d832bcab089e 906
mjr 33:d832bcab089e 907 // TLC5940 ports start here!
mjr 33:d832bcab089e 908 // First chip port 0 -> LW port 12
mjr 33:d832bcab089e 909 // First chip port 1 -> LW port 13
mjr 33:d832bcab089e 910 // ... etc, filling out all chip ports sequentially ...
mjr 33:d832bcab089e 911
mjr 33:d832bcab089e 912 #endif // TLC5940_NCHIPS
mjr 17:ab3cec0c8bf4 913 };
mjr 17:ab3cec0c8bf4 914
mjr 21:5048e16cc9ef 915
mjr 25:e22b88bd783a 916 #endif // DECL_EXTERNS