work in progress
Dependencies: FastAnalogIn FastIO USBDevice mbed FastPWM SimpleDMA
Fork of Pinscape_Controller by
config.h@35:d832bcab089e, 2015-10-21 (annotated)
- Committer:
- mjr
- Date:
- Wed Oct 21 21:53:07 2015 +0000
- Revision:
- 35:d832bcab089e
- Parent:
- 34:cbff13b98441
- Child:
- 36:6b981a2afab7
With expansion board 5940 "power enable" output; saving this feature, which is to be removed.
Who changed what in which revision?
User | Revision | Line number | New 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 | 35:d832bcab089e | 11 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 12 | // |
mjr | 35:d832bcab089e | 13 | // Expansion Board. If you're using the expansion board, un-comment the |
mjr | 35:d832bcab089e | 14 | // line below. This will select all of the correct defaults for the board. |
mjr | 35:d832bcab089e | 15 | // |
mjr | 35:d832bcab089e | 16 | // The expansion board settings are mostly automatic, so you shouldn't have |
mjr | 35:d832bcab089e | 17 | // to change much else. However, you should still look at and adjust the |
mjr | 35:d832bcab089e | 18 | // following as needed: |
mjr | 35:d832bcab089e | 19 | // - TV power on delay time |
mjr | 35:d832bcab089e | 20 | // - Plunger sensor settings, if you're using a plunger |
mjr | 35:d832bcab089e | 21 | // |
mjr | 35:d832bcab089e | 22 | //#define EXPANSION_BOARD |
mjr | 35:d832bcab089e | 23 | |
mjr | 35: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 | 35:d832bcab089e | 51 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 52 | // |
mjr | 35:d832bcab089e | 53 | // USB device vendor ID and product ID. These values identify the device |
mjr | 35:d832bcab089e | 54 | // to the host software on the PC. By default, we use the same settings as |
mjr | 35:d832bcab089e | 55 | // a real LedWiz so that host software will recognize us as an LedWiz. |
mjr | 35:d832bcab089e | 56 | // |
mjr | 35:d832bcab089e | 57 | // The standard settings *should* work without conflicts, even if you have |
mjr | 35:d832bcab089e | 58 | // a real LedWiz. My reference system is 64-bit Windows 7 with a real LedWiz |
mjr | 35:d832bcab089e | 59 | // on unit #1 and a Pinscape controller on unit #8 (the default), and the |
mjr | 35:d832bcab089e | 60 | // two coexist happily in my system. The LedWiz is designed specifically |
mjr | 35:d832bcab089e | 61 | // to allow multiple units in one system, using the unit number value |
mjr | 35:d832bcab089e | 62 | // (see below) to distinguish multiple units, so there should be no conflict |
mjr | 35:d832bcab089e | 63 | // between Pinscape and any real LedWiz devices you have. |
mjr | 35:d832bcab089e | 64 | // |
mjr | 35:d832bcab089e | 65 | // However, even though conflicts *shouldn't* happen, I've had one report |
mjr | 35:d832bcab089e | 66 | // from a user who experienced a Windows USB driver conflict that they could |
mjr | 35:d832bcab089e | 67 | // only resolve by changing the vendor ID. The real underlying cause is |
mjr | 35:d832bcab089e | 68 | // still a mystery, but whatever was going on, changing the vendor ID fixed |
mjr | 35:d832bcab089e | 69 | // it. If you run into a similar problem, you can try the same fix as a |
mjr | 35:d832bcab089e | 70 | // last resort. Before doing that, though, you should try changing the |
mjr | 35:d832bcab089e | 71 | // Pinscape unit number first - it's possible that your real LedWiz is using |
mjr | 35:d832bcab089e | 72 | // unit #8, which is our default setting. |
mjr | 35:d832bcab089e | 73 | // |
mjr | 35:d832bcab089e | 74 | // If you must change the vendor ID for any reason, you'll sacrifice LedWiz |
mjr | 35:d832bcab089e | 75 | // compatibility, which means that old programs like Future Pinball that use |
mjr | 35:d832bcab089e | 76 | // the LedWiz interface directly won't be able to access the LedWiz output |
mjr | 35:d832bcab089e | 77 | // controller features. However, all is not lost. All of the other functions |
mjr | 35:d832bcab089e | 78 | // (plunger, nudge, and key input) use the joystick interface, which will |
mjr | 35:d832bcab089e | 79 | // work regardless of the ID values. In addition, DOF R3 recognizes the |
mjr | 35:d832bcab089e | 80 | // "emergency fallback" ID below, so if you use that, *all* functions |
mjr | 35:d832bcab089e | 81 | // including the output controller will work in any DOF R3-enabled software, |
mjr | 35:d832bcab089e | 82 | // including Visual Pinball and PinballX. So the only loss will be that |
mjr | 35:d832bcab089e | 83 | // old LedWiz-only software won't be able to control the outputs. |
mjr | 35:d832bcab089e | 84 | // |
mjr | 35:d832bcab089e | 85 | // The "emergency fallback" ID below is officially registerd with |
mjr | 35:d832bcab089e | 86 | // http://pid.codes, a registry for open-source USB projects, which should |
mjr | 35:d832bcab089e | 87 | // all but guarantee that this alternative ID shouldn't conflict with |
mjr | 35:d832bcab089e | 88 | // any other devices in your system. |
mjr | 25:e22b88bd783a | 89 | |
mjr | 25:e22b88bd783a | 90 | |
mjr | 35:d832bcab089e | 91 | // STANDARD ID SETTINGS. These provide full, transparent LedWiz compatibility. |
mjr | 35:d832bcab089e | 92 | const uint16_t USB_VENDOR_ID = 0xFAFA; // LedWiz vendor ID = FAFA |
mjr | 35:d832bcab089e | 93 | const uint16_t USB_PRODUCT_ID = 0x00F0; // LedWiz start of product ID range = 00F0 |
mjr | 35:d832bcab089e | 94 | |
mjr | 35:d832bcab089e | 95 | |
mjr | 35:d832bcab089e | 96 | // EMERGENCY FALLBACK ID SETTINGS. These settings are not LedWiz-compatible, |
mjr | 35:d832bcab089e | 97 | // so older LedWiz-only software won't be able to access the output controller |
mjr | 35:d832bcab089e | 98 | // features. However, DOF R3 recognizes these IDs, so DOF-aware software (Visual |
mjr | 35:d832bcab089e | 99 | // Pinball, PinballX) will have full access to all features. |
mjr | 35:d832bcab089e | 100 | // |
mjr | 35:d832bcab089e | 101 | //const uint16_t USB_VENDOR_ID = 0x1209; // DOF R3-compatible vendor ID = 1209 |
mjr | 35:d832bcab089e | 102 | //const uint16_t USB_PRODUCT_ID = 0xEAEA; // DOF R3-compatible product ID = EAEA |
mjr | 35:d832bcab089e | 103 | |
mjr | 35:d832bcab089e | 104 | |
mjr | 35:d832bcab089e | 105 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 106 | // |
mjr | 35: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 | 35:d832bcab089e | 114 | // A real LedWiz has its unit number set at the factory. If you don't tell |
mjr | 35:d832bcab089e | 115 | // them otherwise when placing your order, they will set it to unit #1. Most |
mjr | 35:d832bcab089e | 116 | // real LedWiz units therefore are set to unit #1. There's no provision on |
mjr | 35:d832bcab089e | 117 | // a real LedWiz for users to change the unit number after it leaves the |
mjr | 35:d832bcab089e | 118 | // factory. |
mjr | 21:5048e16cc9ef | 119 | // |
mjr | 35:d832bcab089e | 120 | // For our *emulated* LedWiz, we default to unit #8 if we're the primary |
mjr | 35:d832bcab089e | 121 | // Pinscape controller in the system, or unit #9 if we're set up as the |
mjr | 35: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 | 35:d832bcab089e | 125 | // any real LedWiz devices in your system. Most real LedWiz devices are |
mjr | 35:d832bcab089e | 126 | // set up as unit #1, and in the rare cases where people have two of them, |
mjr | 35: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 | 31:582472d0bc57 | 137 | // controller. There it's referred to as simply "KL25Z" rather than |
mjr | 31:582472d0bc57 | 138 | // Pinscape Controller, but that's what they're talking about. The DOF |
mjr | 31:582472d0bc57 | 139 | // tool knows that it uses #8 as its default unit number, so it names the |
mjr | 31:582472d0bc57 | 140 | // .ini file for this controller xxx8.ini. If you change the unit number |
mjr | 31:582472d0bc57 | 141 | // here, remember to rename the DOF-generated .ini file to match, by |
mjr | 31:582472d0bc57 | 142 | // changing the "8" at the end of the filename to the new number you set |
mjr | 31:582472d0bc57 | 143 | // here. |
mjr | 21:5048e16cc9ef | 144 | const uint8_t DEFAULT_LEDWIZ_UNIT_NUMBER = |
mjr | 21:5048e16cc9ef | 145 | #ifdef ENABLE_JOYSTICK |
mjr | 32: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 | 35:d832bcab089e | 151 | |
mjr | 35:d832bcab089e | 152 | // -------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 153 | // |
mjr | 35:d832bcab089e | 154 | // Accelerometer orientation. The accelerometer feature lets Visual Pinball |
mjr | 35:d832bcab089e | 155 | // (and other pinball software) sense nudges to the cabinet, and simulate |
mjr | 35:d832bcab089e | 156 | // the effect on the ball's trajectory during play. We report the direction |
mjr | 35:d832bcab089e | 157 | // of the accelerometer readings as well as the strength, so it's important |
mjr | 35:d832bcab089e | 158 | // for VP and the KL25Z to agree on the physical orientation of the |
mjr | 35:d832bcab089e | 159 | // accelerometer relative to the cabinet. The accelerometer on the KL25Z |
mjr | 35:d832bcab089e | 160 | // is always mounted the same way on the board, but we still have to know |
mjr | 35:d832bcab089e | 161 | // which way you mount the board in your cabinet. We assume as default |
mjr | 35:d832bcab089e | 162 | // orientation where the KL25Z is mounted flat on the bottom of your |
mjr | 35:d832bcab089e | 163 | // cabinet with the USB ports pointing forward, toward the coin door. If |
mjr | 35:d832bcab089e | 164 | // it's more convenient for you to mount the board in a different direction, |
mjr | 35:d832bcab089e | 165 | // you simply need to select the matching direction here. Comment out the |
mjr | 35:d832bcab089e | 166 | // ORIENTATION_PORTS_AT_FRONT line and un-comment the line that matches |
mjr | 35:d832bcab089e | 167 | // your board's orientation. |
mjr | 35:d832bcab089e | 168 | |
mjr | 35:d832bcab089e | 169 | #define ORIENTATION_PORTS_AT_FRONT // USB ports pointing toward front of cabinet |
mjr | 35:d832bcab089e | 170 | // #define ORIENTATION_PORTS_AT_LEFT // USB ports pointing toward left side of cab |
mjr | 35:d832bcab089e | 171 | // #define ORIENTATION_PORTS_AT_RIGHT // USB ports pointing toward right side of cab |
mjr | 35:d832bcab089e | 172 | // #define ORIENTATION_PORTS_AT_REAR // USB ports pointing toward back of cabinet |
mjr | 35:d832bcab089e | 173 | |
mjr | 35:d832bcab089e | 174 | |
mjr | 35: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 | 35:d832bcab089e | 212 | // complete a scan within the cycle time for USB reports. Visual Pinball |
mjr | 35:d832bcab089e | 213 | // only polls for input at about 10ms intervals, so there's no benefit |
mjr | 35:d832bcab089e | 214 | // to going much faster than this. The sensor timing is such that we can |
mjr | 35:d832bcab089e | 215 | // read about 165 pixels in well under 10ms. So that's really the sweet |
mjr | 35: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 | 35:d832bcab089e | 311 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 312 | // |
mjr | 35:d832bcab089e | 313 | // TV Power-On Timer. This section lets you set up a delayed relay timer |
mjr | 35:d832bcab089e | 314 | // for turning on your TV monitor(s) shortly after you turn on power to the |
mjr | 35:d832bcab089e | 315 | // system. This requires some external circuitry, which is built in to the |
mjr | 35:d832bcab089e | 316 | // expansion board, or which you can build yourself - refer to the Build |
mjr | 35:d832bcab089e | 317 | // Guide for the circuit plan. |
mjr | 35:d832bcab089e | 318 | // |
mjr | 35:d832bcab089e | 319 | // If you're using this feature, un-comment the next line, and make any |
mjr | 35:d832bcab089e | 320 | // changes to the port assignments below. The default port assignments are |
mjr | 35:d832bcab089e | 321 | // suitable for the expansion board. Note that the TV timer is enabled |
mjr | 35:d832bcab089e | 322 | // automatically if you're using the expansion board, since it's built in. |
mjr | 35:d832bcab089e | 323 | //#define ENABLE_TV_TIMER |
mjr | 35:d832bcab089e | 324 | |
mjr | 35:d832bcab089e | 325 | #if defined(ENABLE_TV_TIMER) || defined(EXPANSION_BOARD) |
mjr | 35:d832bcab089e | 326 | # define PSU2_STATUS_SENSE PTD2 // Digital In pin to read latch status |
mjr | 35:d832bcab089e | 327 | # define PSU2_STATUS_SET PTE0 // Digital Out pin to set latch |
mjr | 35:d832bcab089e | 328 | # define TV_RELAY_PIN PTD3 // Digital Out pin to control TV switch relay |
mjr | 35:d832bcab089e | 329 | |
mjr | 35:d832bcab089e | 330 | // Amount of time (in seconds) to wait after system power-up before |
mjr | 35:d832bcab089e | 331 | // pulsing the TV ON switch relay. Adjust as needed for your TV(s). |
mjr | 35:d832bcab089e | 332 | // Most monitors won't respond to any buttons for the first few seconds |
mjr | 35:d832bcab089e | 333 | // after they're plugged in, so we need to wait long enough to make sure |
mjr | 35:d832bcab089e | 334 | // the TVs are ready to receive input before pressing the button. |
mjr | 35:d832bcab089e | 335 | #define TV_DELAY_TIME 7.0 |
mjr | 35:d832bcab089e | 336 | |
mjr | 35:d832bcab089e | 337 | #endif |
mjr | 35:d832bcab089e | 338 | |
mjr | 35: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 | 31:582472d0bc57 | 400 | |
mjr | 31:582472d0bc57 | 401 | // -------------------------------------------------------------------------- |
mjr | 31:582472d0bc57 | 402 | // |
mjr | 31:582472d0bc57 | 403 | // TLC5940 PWM controller chip setup - Enhanced LedWiz emulation |
mjr | 31:582472d0bc57 | 404 | // |
mjr | 31:582472d0bc57 | 405 | // By default, the Pinscape Controller software can provide limited LedWiz |
mjr | 31:582472d0bc57 | 406 | // emulation through the KL25Z's on-board GPIO ports. This lets you hook |
mjr | 31:582472d0bc57 | 407 | // up external devices, such as LED flashers or solenoids, to the KL25Z |
mjr | 31:582472d0bc57 | 408 | // outputs (using external circuitry to boost power - KL25Z GPIO ports |
mjr | 31:582472d0bc57 | 409 | // are limited to a meager 4mA per port). This capability is limited by |
mjr | 31:582472d0bc57 | 410 | // the number of available GPIO ports on the KL25Z, and even smaller limit |
mjr | 31:582472d0bc57 | 411 | // of 10 PWM-capable GPIO ports. |
mjr | 31:582472d0bc57 | 412 | // |
mjr | 31:582472d0bc57 | 413 | // As an alternative, the controller software lets you use external PWM |
mjr | 31:582472d0bc57 | 414 | // controller chips to control essentially unlimited channels with full |
mjr | 31:582472d0bc57 | 415 | // PWM control on all channels. This requires building external circuitry |
mjr | 31:582472d0bc57 | 416 | // using TLC5940 chips. Each TLC5940 chip provides 16 full PWM channels, |
mjr | 31:582472d0bc57 | 417 | // and you can daisy-chain multiple TLC5940 chips together to set up 32, |
mjr | 31:582472d0bc57 | 418 | // 48, 64, or more channels. |
mjr | 31:582472d0bc57 | 419 | // |
mjr | 31:582472d0bc57 | 420 | // If you do add TLC5940 circuits to your controller hardware, use this |
mjr | 31:582472d0bc57 | 421 | // section to configure the connection to the KL25Z. |
mjr | 31:582472d0bc57 | 422 | // |
mjr | 35:d832bcab089e | 423 | // Note that when using the TLC5940, you can still also use some GPIO |
mjr | 35:d832bcab089e | 424 | // pins for outputs as normal. See ledWizPinMap[] for |
mjr | 31:582472d0bc57 | 425 | |
mjr | 31:582472d0bc57 | 426 | // Number of TLC5940 chips you're using. For a full LedWiz-compatible |
mjr | 35:d832bcab089e | 427 | // setup, you need two of these chips, for 32 outputs. The software |
mjr | 35:d832bcab089e | 428 | // will handle up to 8. The expansion board uses 4 of these chips; if |
mjr | 35:d832bcab089e | 429 | // you're not using the expansion board, we assume you're not using |
mjr | 35:d832bcab089e | 430 | // any of them. |
mjr | 35:d832bcab089e | 431 | #ifdef EXPANSION_BOARD |
mjr | 35:d832bcab089e | 432 | # define TLC5940_NCHIPS 4 |
mjr | 35:d832bcab089e | 433 | #else |
mjr | 35:d832bcab089e | 434 | # define TLC5940_NCHIPS 0 // change this if you're using TLC5940's without the expansion board |
mjr | 35:d832bcab089e | 435 | #endif |
mjr | 31:582472d0bc57 | 436 | |
mjr | 31:582472d0bc57 | 437 | // If you're using TLC5940s, change any of these as needed to match the |
mjr | 31:582472d0bc57 | 438 | // GPIO pins that you connected to the TLC5940 control pins. Note that |
mjr | 31:582472d0bc57 | 439 | // SIN and SCLK *must* be connected to the KL25Z SPI0 MOSI and SCLK |
mjr | 31:582472d0bc57 | 440 | // outputs, respectively, which effectively limits them to the default |
mjr | 35:d832bcab089e | 441 | // selections, and that the GSCLK pin must be PWM-capable. These defaults |
mjr | 35:d832bcab089e | 442 | // all match the expansion board wiring. |
mjr | 31:582472d0bc57 | 443 | #define TLC5940_SIN PTC6 // Must connect to SPI0 MOSI -> PTC6 or PTD2 |
mjr | 31:582472d0bc57 | 444 | #define TLC5940_SCLK PTC5 // Must connect to SPI0 SCLK -> PTC5 or PTD1; however, PTD1 isn't |
mjr | 31:582472d0bc57 | 445 | // recommended because it's hard-wired to the on-board blue LED |
mjr | 31:582472d0bc57 | 446 | #define TLC5940_XLAT PTC10 // Any GPIO pin can be used |
mjr | 35:d832bcab089e | 447 | #define TLC5940_BLANK PTC7 // Any GPIO pin can be used |
mjr | 35:d832bcab089e | 448 | #define TLC5940_GSCLK PTA1 // Must be a PWM-capable pin |
mjr | 25:e22b88bd783a | 449 | |
mjr | 35:d832bcab089e | 450 | // TLC5940 output power enable pin. This is a GPIO pin that controls |
mjr | 35:d832bcab089e | 451 | // a high-side transistor switch that controls power to the optos and |
mjr | 35:d832bcab089e | 452 | // LEDs connected to the TLC5940 outputs. This is a precaution against |
mjr | 35:d832bcab089e | 453 | // powering the chip's output pins before Vcc is powered. Vcc comes |
mjr | 35:d832bcab089e | 454 | // from the KL25Z, so when our program is running, we know for certain |
mjr | 35:d832bcab089e | 455 | // that Vcc is up. This means that we can simply enable this pin any |
mjr | 35:d832bcab089e | 456 | // time after entering our main(). Un-comment this line if using this |
mjr | 35:d832bcab089e | 457 | // circuit. |
mjr | 35:d832bcab089e | 458 | // #define TLC5940_PWRENA PTC11 // Any GPIO pin can be used |
mjr | 35:d832bcab089e | 459 | #ifdef EXPANSION_BOARD |
mjr | 35:d832bcab089e | 460 | # define TLC5940_PWRENA PTC11 |
mjr | 35:d832bcab089e | 461 | #endif |
mjr | 17:ab3cec0c8bf4 | 462 | |
mjr | 31:582472d0bc57 | 463 | #endif // CONFIG_H - end of include-once section (code below this point can be multiply included) |
mjr | 31:582472d0bc57 | 464 | |
mjr | 31:582472d0bc57 | 465 | |
mjr | 31:582472d0bc57 | 466 | #ifdef DECL_EXTERNS // this section defines global variables, only if this macro is set |
mjr | 31:582472d0bc57 | 467 | |
mjr | 17:ab3cec0c8bf4 | 468 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 469 | // |
mjr | 17:ab3cec0c8bf4 | 470 | |
mjr | 17:ab3cec0c8bf4 | 471 | // Joystick button input pin assignments. |
mjr | 17:ab3cec0c8bf4 | 472 | // |
mjr | 17:ab3cec0c8bf4 | 473 | // You can wire up to 32 GPIO ports to buttons (equipped with |
mjr | 17:ab3cec0c8bf4 | 474 | // momentary switches). Connect each switch between the desired |
mjr | 17:ab3cec0c8bf4 | 475 | // GPIO port and ground (J9 pin 12 or 14). When the button is pressed, |
mjr | 17:ab3cec0c8bf4 | 476 | // we'll tell the host PC that the corresponding joystick button is |
mjr | 17:ab3cec0c8bf4 | 477 | // pressed. We debounce the keystrokes in software, so you can simply |
mjr | 17:ab3cec0c8bf4 | 478 | // wire directly to pushbuttons with no additional external hardware. |
mjr | 17:ab3cec0c8bf4 | 479 | // |
mjr | 17:ab3cec0c8bf4 | 480 | // Note that we assign 24 buttons by default, even though the USB |
mjr | 17:ab3cec0c8bf4 | 481 | // joystick interface can handle up to 32 buttons. VP itself only |
mjr | 17:ab3cec0c8bf4 | 482 | // allows mapping of up to 24 buttons in the preferences dialog |
mjr | 17:ab3cec0c8bf4 | 483 | // (although it can recognize 32 buttons internally). If you want |
mjr | 17:ab3cec0c8bf4 | 484 | // more buttons, you can reassign pins that are assigned by default |
mjr | 17:ab3cec0c8bf4 | 485 | // as LedWiz outputs. To reassign a pin, find the pin you wish to |
mjr | 17:ab3cec0c8bf4 | 486 | // reassign in the LedWizPortMap array below, and change the pin name |
mjr | 17:ab3cec0c8bf4 | 487 | // there to NC (for Not Connected). You can then change one of the |
mjr | 17:ab3cec0c8bf4 | 488 | // "NC" entries below to the reallocated pin name. The limit is 32 |
mjr | 17:ab3cec0c8bf4 | 489 | // buttons total. |
mjr | 17:ab3cec0c8bf4 | 490 | // |
mjr | 28:cb71c4af2912 | 491 | // (If you're using TLC5940 chips to control outputs, ALL of the |
mjr | 28:cb71c4af2912 | 492 | // LedWiz mapped ports can be reassigned as keys, except, of course, |
mjr | 28:cb71c4af2912 | 493 | // those taken over for the 5940 interface.) |
mjr | 28:cb71c4af2912 | 494 | // |
mjr | 17:ab3cec0c8bf4 | 495 | // Note: PTD1 (pin J2-12) should NOT be assigned as a button input, |
mjr | 17:ab3cec0c8bf4 | 496 | // as this pin is physically connected on the KL25Z to the on-board |
mjr | 17:ab3cec0c8bf4 | 497 | // indicator LED's blue segment. This precludes any other use of |
mjr | 17:ab3cec0c8bf4 | 498 | // the pin. |
mjr | 17:ab3cec0c8bf4 | 499 | PinName buttonMap[] = { |
mjr | 17:ab3cec0c8bf4 | 500 | PTC2, // J10 pin 10, joystick button 1 |
mjr | 17:ab3cec0c8bf4 | 501 | PTB3, // J10 pin 8, joystick button 2 |
mjr | 17:ab3cec0c8bf4 | 502 | PTB2, // J10 pin 6, joystick button 3 |
mjr | 17:ab3cec0c8bf4 | 503 | PTB1, // J10 pin 4, joystick button 4 |
mjr | 17:ab3cec0c8bf4 | 504 | |
mjr | 17:ab3cec0c8bf4 | 505 | PTE30, // J10 pin 11, joystick button 5 |
mjr | 17:ab3cec0c8bf4 | 506 | PTE22, // J10 pin 5, joystick button 6 |
mjr | 17:ab3cec0c8bf4 | 507 | |
mjr | 17:ab3cec0c8bf4 | 508 | PTE5, // J9 pin 15, joystick button 7 |
mjr | 17:ab3cec0c8bf4 | 509 | PTE4, // J9 pin 13, joystick button 8 |
mjr | 17:ab3cec0c8bf4 | 510 | PTE3, // J9 pin 11, joystick button 9 |
mjr | 17:ab3cec0c8bf4 | 511 | PTE2, // J9 pin 9, joystick button 10 |
mjr | 17:ab3cec0c8bf4 | 512 | PTB11, // J9 pin 7, joystick button 11 |
mjr | 17:ab3cec0c8bf4 | 513 | PTB10, // J9 pin 5, joystick button 12 |
mjr | 17:ab3cec0c8bf4 | 514 | PTB9, // J9 pin 3, joystick button 13 |
mjr | 17:ab3cec0c8bf4 | 515 | PTB8, // J9 pin 1, joystick button 14 |
mjr | 17:ab3cec0c8bf4 | 516 | |
mjr | 17:ab3cec0c8bf4 | 517 | PTC12, // J2 pin 1, joystick button 15 |
mjr | 17:ab3cec0c8bf4 | 518 | PTC13, // J2 pin 3, joystick button 16 |
mjr | 17:ab3cec0c8bf4 | 519 | PTC16, // J2 pin 5, joystick button 17 |
mjr | 17:ab3cec0c8bf4 | 520 | PTC17, // J2 pin 7, joystick button 18 |
mjr | 17:ab3cec0c8bf4 | 521 | PTA16, // J2 pin 9, joystick button 19 |
mjr | 17:ab3cec0c8bf4 | 522 | PTA17, // J2 pin 11, joystick button 20 |
mjr | 17:ab3cec0c8bf4 | 523 | PTE31, // J2 pin 13, joystick button 21 |
mjr | 17:ab3cec0c8bf4 | 524 | PTD6, // J2 pin 17, joystick button 22 |
mjr | 17:ab3cec0c8bf4 | 525 | PTD7, // J2 pin 19, joystick button 23 |
mjr | 17:ab3cec0c8bf4 | 526 | |
mjr | 17:ab3cec0c8bf4 | 527 | PTE1, // J2 pin 20, joystick button 24 |
mjr | 17:ab3cec0c8bf4 | 528 | |
mjr | 17:ab3cec0c8bf4 | 529 | NC, // not used, joystick button 25 |
mjr | 17:ab3cec0c8bf4 | 530 | NC, // not used, joystick button 26 |
mjr | 17:ab3cec0c8bf4 | 531 | NC, // not used, joystick button 27 |
mjr | 17:ab3cec0c8bf4 | 532 | NC, // not used, joystick button 28 |
mjr | 17:ab3cec0c8bf4 | 533 | NC, // not used, joystick button 29 |
mjr | 17:ab3cec0c8bf4 | 534 | NC, // not used, joystick button 30 |
mjr | 17:ab3cec0c8bf4 | 535 | NC, // not used, joystick button 31 |
mjr | 17:ab3cec0c8bf4 | 536 | NC // not used, joystick button 32 |
mjr | 17:ab3cec0c8bf4 | 537 | }; |
mjr | 17:ab3cec0c8bf4 | 538 | |
mjr | 17:ab3cec0c8bf4 | 539 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 540 | // |
mjr | 35:d832bcab089e | 541 | // LED-Wiz emulation output pin assignments |
mjr | 17:ab3cec0c8bf4 | 542 | // |
mjr | 35:d832bcab089e | 543 | // This sets the mapping from logical LedWiz port numbers, as used |
mjr | 35:d832bcab089e | 544 | // in the software on the PC side, to physical hardware pins on the |
mjr | 35:d832bcab089e | 545 | // KL25Z and/or the TLC5940 controllers. |
mjr | 28:cb71c4af2912 | 546 | // |
mjr | 35:d832bcab089e | 547 | // The LedWiz protocol lets the PC software set a "brightness" level |
mjr | 35:d832bcab089e | 548 | // for each output. This is used to control the intensity of LEDs |
mjr | 35:d832bcab089e | 549 | // and other lights, and can also control motor speeds. To implement |
mjr | 35:d832bcab089e | 550 | // the intensity level in hardware, we use PWM, or pulse width |
mjr | 35:d832bcab089e | 551 | // modulation, which switches the output on and off very rapidly |
mjr | 35:d832bcab089e | 552 | // to give the effect of a reduced voltage. Unfortunately, the KL25Z |
mjr | 35:d832bcab089e | 553 | // hardware is limited to 10 channels of PWM control for its GPIO |
mjr | 35:d832bcab089e | 554 | // outputs, so it's impossible to implement the LedWiz's full set |
mjr | 35:d832bcab089e | 555 | // of 32 adjustable outputs using only GPIO ports. However, you can |
mjr | 35:d832bcab089e | 556 | // create 10 adjustable ports and fill out the rest with "digital" |
mjr | 35:d832bcab089e | 557 | // GPIO pins, which are simple on/off switches. The intensity level |
mjr | 35:d832bcab089e | 558 | // of a digital port can't be adjusted - it's either fully on or |
mjr | 35:d832bcab089e | 559 | // fully off - but this is fine for devices that don't have |
mjr | 35:d832bcab089e | 560 | // different intensity settings anyway, such as replay knockers |
mjr | 35:d832bcab089e | 561 | // and flipper solenoids. |
mjr | 17:ab3cec0c8bf4 | 562 | // |
mjr | 35:d832bcab089e | 563 | // In the mapping list below, you can decide how to dole out the |
mjr | 35:d832bcab089e | 564 | // PWM-capable and digital-only GPIO pins. To make it easier to |
mjr | 35:d832bcab089e | 565 | // remember which is which, the default mapping below groups all |
mjr | 35:d832bcab089e | 566 | // of the PWM-capable ports together in the first 10 logical LedWiz |
mjr | 35:d832bcab089e | 567 | // port numbers. Unfortunately, these ports aren't *physically* |
mjr | 35:d832bcab089e | 568 | // together on the KL25Z pin headers, so this layout may be simple |
mjr | 35:d832bcab089e | 569 | // in terms of the LedWiz numbering, but it's a little jumbled |
mjr | 35:d832bcab089e | 570 | // in the physical layout.t |
mjr | 35:d832bcab089e | 571 | // |
mjr | 35:d832bcab089e | 572 | // "NC" in the pin name slot means "not connected". This means |
mjr | 35:d832bcab089e | 573 | // that there's no physical output for this LedWiz port number. |
mjr | 35:d832bcab089e | 574 | // The device will still accept commands that control the port, |
mjr | 35:d832bcab089e | 575 | // but these will just be silently ignored, since there's no pin |
mjr | 35:d832bcab089e | 576 | // to turn on or off for these ports. The reason we leave some |
mjr | 35:d832bcab089e | 577 | // ports unconnected is that we don't have enough physical GPIO |
mjr | 35:d832bcab089e | 578 | // pins to fill out the full LedWiz complement of 32 ports. Many |
mjr | 35:d832bcab089e | 579 | // pins are already taken for other purposes, such as button |
mjr | 35:d832bcab089e | 580 | // inputs or the plunger CCD interface. |
mjr | 17:ab3cec0c8bf4 | 581 | // |
mjr | 17:ab3cec0c8bf4 | 582 | // The mapping between physical output pins on the KL25Z and the |
mjr | 35:d832bcab089e | 583 | // assigned LED-Wiz port numbers is essentially arbitrary. You can |
mjr | 17:ab3cec0c8bf4 | 584 | // customize this by changing the entries in the array below if you |
mjr | 17:ab3cec0c8bf4 | 585 | // wish to rearrange the pins for any reason. Be aware that some |
mjr | 17:ab3cec0c8bf4 | 586 | // of the physical outputs are already used for other purposes |
mjr | 17:ab3cec0c8bf4 | 587 | // (e.g., some of the GPIO pins on header J10 are used for the |
mjr | 17:ab3cec0c8bf4 | 588 | // CCD sensor - but you can of course reassign those as well by |
mjr | 35:d832bcab089e | 589 | // changing the corresponding declarations elsewhere in this file). |
mjr | 17:ab3cec0c8bf4 | 590 | // The assignments we make here have two main objectives: first, |
mjr | 17:ab3cec0c8bf4 | 591 | // to group the outputs on headers J1 and J2 (to facilitate neater |
mjr | 17:ab3cec0c8bf4 | 592 | // wiring by keeping the output pins together physically), and |
mjr | 17:ab3cec0c8bf4 | 593 | // second, to make the physical pin layout match the LED-Wiz port |
mjr | 17:ab3cec0c8bf4 | 594 | // numbering order to the extent possible. There's one big wrench |
mjr | 17:ab3cec0c8bf4 | 595 | // in the works, though, which is the limited number and discontiguous |
mjr | 17:ab3cec0c8bf4 | 596 | // placement of the KL25Z PWM-capable output pins. This prevents |
mjr | 17:ab3cec0c8bf4 | 597 | // us from doing the most obvious sequential ordering of the pins, |
mjr | 17:ab3cec0c8bf4 | 598 | // so we end up with the outputs arranged into several blocks. |
mjr | 17:ab3cec0c8bf4 | 599 | // Hopefully this isn't too confusing; for more detailed rationale, |
mjr | 17:ab3cec0c8bf4 | 600 | // read on... |
mjr | 17:ab3cec0c8bf4 | 601 | // |
mjr | 17:ab3cec0c8bf4 | 602 | // With the LED-Wiz, the host software configuration usually |
mjr | 17:ab3cec0c8bf4 | 603 | // assumes that each RGB LED is hooked up to three consecutive ports |
mjr | 17:ab3cec0c8bf4 | 604 | // (for the red, green, and blue components, which need to be |
mjr | 17:ab3cec0c8bf4 | 605 | // physically wired to separate outputs to allow each color to be |
mjr | 17:ab3cec0c8bf4 | 606 | // controlled independently). To facilitate this, we arrange the |
mjr | 17:ab3cec0c8bf4 | 607 | // PWM-enabled outputs so that they're grouped together in the |
mjr | 17:ab3cec0c8bf4 | 608 | // port numbering scheme. Unfortunately, these outputs aren't |
mjr | 17:ab3cec0c8bf4 | 609 | // together in a single group in the physical pin layout, so to |
mjr | 17:ab3cec0c8bf4 | 610 | // group them logically in the LED-Wiz port numbering scheme, we |
mjr | 17:ab3cec0c8bf4 | 611 | // have to break up the overall numbering scheme into several blocks. |
mjr | 17:ab3cec0c8bf4 | 612 | // So our port numbering goes sequentially down each column of |
mjr | 17:ab3cec0c8bf4 | 613 | // header pins, but there are several break points where we have |
mjr | 17:ab3cec0c8bf4 | 614 | // to interrupt the obvious sequence to keep the PWM pins grouped |
mjr | 17:ab3cec0c8bf4 | 615 | // logically. |
mjr | 17:ab3cec0c8bf4 | 616 | // |
mjr | 17:ab3cec0c8bf4 | 617 | // In the list below, "pin J1-2" refers to pin 2 on header J1 on |
mjr | 17:ab3cec0c8bf4 | 618 | // the KL25Z, using the standard pin numbering in the KL25Z |
mjr | 17:ab3cec0c8bf4 | 619 | // documentation - this is the physical pin that the port controls. |
mjr | 17:ab3cec0c8bf4 | 620 | // "LW port 1" means LED-Wiz port 1 - this is the LED-Wiz port |
mjr | 17:ab3cec0c8bf4 | 621 | // number that you use on the PC side (in the DirectOutput config |
mjr | 17:ab3cec0c8bf4 | 622 | // file, for example) to address the port. PWM-capable ports are |
mjr | 17:ab3cec0c8bf4 | 623 | // marked as such - we group the PWM-capable ports into the first |
mjr | 17:ab3cec0c8bf4 | 624 | // 10 LED-Wiz port numbers. |
mjr | 17:ab3cec0c8bf4 | 625 | // |
mjr | 17:ab3cec0c8bf4 | 626 | // If you wish to reallocate a pin in the array below to some other |
mjr | 17:ab3cec0c8bf4 | 627 | // use, such as a button input port, simply change the pin name in |
mjr | 17:ab3cec0c8bf4 | 628 | // the entry to NC (for Not Connected). This will disable the given |
mjr | 17:ab3cec0c8bf4 | 629 | // logical LedWiz port number and free up the physical pin. |
mjr | 17:ab3cec0c8bf4 | 630 | // |
mjr | 17:ab3cec0c8bf4 | 631 | // If you wish to reallocate a pin currently assigned to the button |
mjr | 17:ab3cec0c8bf4 | 632 | // input array, simply change the entry for the pin in the buttonMap[] |
mjr | 17:ab3cec0c8bf4 | 633 | // array above to NC (for "not connected"), and plug the pin name into |
mjr | 17:ab3cec0c8bf4 | 634 | // a slot of your choice in the array below. |
mjr | 17:ab3cec0c8bf4 | 635 | // |
mjr | 35:d832bcab089e | 636 | // Note: Don't assign PTD1 (pin J2-12) as an LedWiz output. That pin |
mjr | 35:d832bcab089e | 637 | // is hard-wired on the KL25Z to the on-board indicator LED's blue segment, |
mjr | 35:d832bcab089e | 638 | // which pretty much precludes any other use of the pin. |
mjr | 35:d832bcab089e | 639 | // |
mjr | 35:d832bcab089e | 640 | // ACTIVE-LOW PORTS: By default, when a logical port is turned on in |
mjr | 35:d832bcab089e | 641 | // the software, we set the physical GPIO voltage to "high" (3.3V), and |
mjr | 35:d832bcab089e | 642 | // set it "low" (0V) when the logical port is off. This is the right |
mjr | 35:d832bcab089e | 643 | // scheme for the booster circuit described in the build guide. Some |
mjr | 35:d832bcab089e | 644 | // third-party booster circuits want the opposite voltage scheme, where |
mjr | 35:d832bcab089e | 645 | // logical "on" is represented by 0V on the port and logical "off" is |
mjr | 35:d832bcab089e | 646 | // represented by 3.3V. If you're using an "active low" booster like |
mjr | 35:d832bcab089e | 647 | // that, set the PORT_ACTIVE_LOW flag in the array below for each |
mjr | 35:d832bcab089e | 648 | // affected port. |
mjr | 35:d832bcab089e | 649 | // |
mjr | 35:d832bcab089e | 650 | // TLC5940 PORTS: To assign an LedWiz output port number to a particular |
mjr | 35:d832bcab089e | 651 | // output on a TLC5940, set tlcPortNum to the non-zero port number, |
mjr | 35:d832bcab089e | 652 | // starting at 1 for the first output on the first chip, 16 for the |
mjr | 35:d832bcab089e | 653 | // last output on the first chip, 17 for the first output on the second |
mjr | 35:d832bcab089e | 654 | // chip, and so on. TLC ports are inherently PWM-capable only, so it's |
mjr | 35:d832bcab089e | 655 | // not necessary to set the PORT_IS_PWM flag for those. |
mjr | 35:d832bcab089e | 656 | // |
mjr | 35:d832bcab089e | 657 | |
mjr | 35:d832bcab089e | 658 | // ledWizPortMap 'flags' bits - combine these with '|' |
mjr | 35:d832bcab089e | 659 | const int PORT_IS_PWM = 0x0001; // this port is PWM-capable |
mjr | 35:d832bcab089e | 660 | const int PORT_ACTIVE_LOW = 0x0002; // use LOW voltage (0V) when port is ON |
mjr | 35:d832bcab089e | 661 | |
mjr | 17:ab3cec0c8bf4 | 662 | struct { |
mjr | 35:d832bcab089e | 663 | PinName pin; // the GPIO pin assigned to this output; NC if not connected or a TLC5940 port |
mjr | 35:d832bcab089e | 664 | int flags; // flags - a combination of PORT_xxx flag bits (see above) |
mjr | 35:d832bcab089e | 665 | int tlcPortNum; // for TLC5940 ports, the TLC output number (1 to number of chips*16); otherwise 0 |
mjr | 35:d832bcab089e | 666 | } ledWizPortMap[] = { |
mjr | 35:d832bcab089e | 667 | |
mjr | 35:d832bcab089e | 668 | #if TLC5940_NCHIPS == 0 |
mjr | 35:d832bcab089e | 669 | |
mjr | 35:d832bcab089e | 670 | // *** BASIC MODE - GPIO OUTPUTS ONLY *** |
mjr | 35:d832bcab089e | 671 | // This is the basic mapping, using entirely GPIO pins, for when you're |
mjr | 35:d832bcab089e | 672 | // not using external TLC5940 chips. We provide 22 physical outputs, 10 |
mjr | 35:d832bcab089e | 673 | // of which are PWM capable. |
mjr | 35:d832bcab089e | 674 | // |
mjr | 35:d832bcab089e | 675 | // Important! Note that the "isPWM" setting isn't just something we get to |
mjr | 35:d832bcab089e | 676 | // choose. It's a feature of the KL25Z hardware. Some pins are PWM capable |
mjr | 35:d832bcab089e | 677 | // and some aren't, and there's nothing we can do about that in the software. |
mjr | 35:d832bcab089e | 678 | // Refer to the KL25Z manual or schematics for the possible connections. Note |
mjr | 35:d832bcab089e | 679 | // that there are other PWM-capable pins besides the 10 shown below, BUT they |
mjr | 35:d832bcab089e | 680 | // all share TPM channels with the pins below. For example, TPM 2.0 can be |
mjr | 35:d832bcab089e | 681 | // connected to PTA1, PTB2, PTB18, PTE22 - but only one at a time. So if you |
mjr | 35:d832bcab089e | 682 | // want to use PTB2 as a PWM out, it means you CAN'T use PTA1 as a PWM out. |
mjr | 35:d832bcab089e | 683 | // We commented each PWM pin with its hardware channel number to help you keep |
mjr | 35:d832bcab089e | 684 | // track of available channels if you do need to rearrange any of these pins. |
mjr | 35:d832bcab089e | 685 | |
mjr | 35:d832bcab089e | 686 | { PTA1, PORT_IS_PWM }, // pin J1-2, LW port 1 (PWM capable - TPM 2.0 = channel 9) |
mjr | 35:d832bcab089e | 687 | { PTA2, PORT_IS_PWM }, // pin J1-4, LW port 2 (PWM capable - TPM 2.1 = channel 10) |
mjr | 35:d832bcab089e | 688 | { PTD4, PORT_IS_PWM }, // pin J1-6, LW port 3 (PWM capable - TPM 0.4 = channel 5) |
mjr | 35:d832bcab089e | 689 | { PTA12, PORT_IS_PWM }, // pin J1-8, LW port 4 (PWM capable - TPM 1.0 = channel 7) |
mjr | 35:d832bcab089e | 690 | { PTA4, PORT_IS_PWM }, // pin J1-10, LW port 5 (PWM capable - TPM 0.1 = channel 2) |
mjr | 35:d832bcab089e | 691 | { PTA5, PORT_IS_PWM }, // pin J1-12, LW port 6 (PWM capable - TPM 0.2 = channel 3) |
mjr | 35:d832bcab089e | 692 | { PTA13, PORT_IS_PWM }, // pin J2-2, LW port 7 (PWM capable - TPM 1.1 = channel 13) |
mjr | 35:d832bcab089e | 693 | { PTD5, PORT_IS_PWM }, // pin J2-4, LW port 8 (PWM capable - TPM 0.5 = channel 6) |
mjr | 35:d832bcab089e | 694 | { PTD0, PORT_IS_PWM }, // pin J2-6, LW port 9 (PWM capable - TPM 0.0 = channel 1) |
mjr | 35:d832bcab089e | 695 | { PTD3, PORT_IS_PWM }, // pin J2-10, LW port 10 (PWM capable - TPM 0.3 = channel 4) |
mjr | 35:d832bcab089e | 696 | { PTD2, 0 }, // pin J2-8, LW port 11 |
mjr | 35:d832bcab089e | 697 | { PTC8, 0 }, // pin J1-14, LW port 12 |
mjr | 35:d832bcab089e | 698 | { PTC9, 0 }, // pin J1-16, LW port 13 |
mjr | 35:d832bcab089e | 699 | { PTC7, 0 }, // pin J1-1, LW port 14 |
mjr | 35:d832bcab089e | 700 | { PTC0, 0 }, // pin J1-3, LW port 15 |
mjr | 35:d832bcab089e | 701 | { PTC3, 0 }, // pin J1-5, LW port 16 |
mjr | 35:d832bcab089e | 702 | { PTC4, 0 }, // pin J1-7, LW port 17 |
mjr | 35:d832bcab089e | 703 | { PTC5, 0 }, // pin J1-9, LW port 18 |
mjr | 35:d832bcab089e | 704 | { PTC6, 0 }, // pin J1-11, LW port 19 |
mjr | 35:d832bcab089e | 705 | { PTC10, 0 }, // pin J1-13, LW port 20 |
mjr | 35:d832bcab089e | 706 | { PTC11, 0 }, // pin J1-15, LW port 21 |
mjr | 35:d832bcab089e | 707 | { PTE0, 0 }, // pin J2-18, LW port 22 |
mjr | 35:d832bcab089e | 708 | { NC, 0 }, // Not connected, LW port 23 |
mjr | 35:d832bcab089e | 709 | { NC, 0 }, // Not connected, LW port 24 |
mjr | 35:d832bcab089e | 710 | { NC, 0 }, // Not connected, LW port 25 |
mjr | 35:d832bcab089e | 711 | { NC, 0 }, // Not connected, LW port 26 |
mjr | 35:d832bcab089e | 712 | { NC, 0 }, // Not connected, LW port 27 |
mjr | 35:d832bcab089e | 713 | { NC, 0 }, // Not connected, LW port 28 |
mjr | 35:d832bcab089e | 714 | { NC, 0 }, // Not connected, LW port 29 |
mjr | 35:d832bcab089e | 715 | { NC, 0 }, // Not connected, LW port 30 |
mjr | 35:d832bcab089e | 716 | { NC, 0 }, // Not connected, LW port 31 |
mjr | 35:d832bcab089e | 717 | { NC, 0 } // Not connected, LW port 32 |
mjr | 35:d832bcab089e | 718 | |
mjr | 35:d832bcab089e | 719 | #elif defined(EXPANSION_BOARD) |
mjr | 35:d832bcab089e | 720 | |
mjr | 35:d832bcab089e | 721 | // *** EXPANSION BOARD MODE *** |
mjr | 35:d832bcab089e | 722 | // |
mjr | 35:d832bcab089e | 723 | // This mapping is for the expansion board, which uses four TLC5940 |
mjr | 35:d832bcab089e | 724 | // chips to provide 64 outputs. The expansion board also uses |
mjr | 35:d832bcab089e | 725 | // one GPIO pin to provide a digital (non-PWM) output dedicated to |
mjr | 35:d832bcab089e | 726 | // the knocker circuit. That's on a digital pin because it's used |
mjr | 35:d832bcab089e | 727 | // to trigger an external timer circuit that limits the amount of |
mjr | 35:d832bcab089e | 728 | // time that the knocker coil can be continuously energized, to protect |
mjr | 35:d832bcab089e | 729 | // it against software faults on the PC that leave the port stuck on. |
mjr | 35:d832bcab089e | 730 | // (The knocker coil is unique among standard virtual cabinet output |
mjr | 35:d832bcab089e | 731 | // devices in this respect - it's the only device in common use that |
mjr | 35:d832bcab089e | 732 | // can be damaged if left on for too long. Other devices won't be |
mjr | 35:d832bcab089e | 733 | // damaged, so they don't require such elaborate precautions.) |
mjr | 35:d832bcab089e | 734 | // |
mjr | 35:d832bcab089e | 735 | // The specific device assignments in the last column are just |
mjr | 35:d832bcab089e | 736 | // recommendations - you can assign any port to any device with |
mjr | 35:d832bcab089e | 737 | // compatible power needs. The "General Purpose" ports are good to |
mjr | 35:d832bcab089e | 738 | // at least 5A, so you can use these for virtually anything. The |
mjr | 35:d832bcab089e | 739 | // "Button light" ports are good to about 1.5A, so these are most |
mjr | 35:d832bcab089e | 740 | // suitable for smaller loads like lamps, flashers, LEDs, etc. The |
mjr | 35:d832bcab089e | 741 | // flipper and magnasave ports will only provide 20mA, so these are |
mjr | 35:d832bcab089e | 742 | // only usable for small LEDs. |
mjr | 35:d832bcab089e | 743 | |
mjr | 35:d832bcab089e | 744 | // The first 32 ports are LedWiz-compatible, so they're universally |
mjr | 35:d832bcab089e | 745 | // accessible, even to older non-DOF software. Attach the most common |
mjr | 35:d832bcab089e | 746 | // devices to these ports. |
mjr | 35:d832bcab089e | 747 | { NC, 0, 1 }, // TLC port 1, LW output 1 - Flasher 1 R |
mjr | 35:d832bcab089e | 748 | { NC, 0, 2 }, // TLC port 2, LW output 2 - Flasher 1 G |
mjr | 35:d832bcab089e | 749 | { NC, 0, 3 }, // TLC port 3, LW output 3 - Flasher 1 B |
mjr | 35:d832bcab089e | 750 | { NC, 0, 4 }, // TLC port 4, LW output 4 - Flasher 2 R |
mjr | 35:d832bcab089e | 751 | { NC, 0, 5 }, // TLC port 5, LW output 5 - Flasher 2 G |
mjr | 35:d832bcab089e | 752 | { NC, 0, 6 }, // TLC port 6, LW output 6 - Flasher 2 B |
mjr | 35:d832bcab089e | 753 | { NC, 0, 7 }, // TLC port 7, LW output 7 - Flasher 3 R |
mjr | 35:d832bcab089e | 754 | { NC, 0, 8 }, // TLC port 8, LW output 8 - Flasher 3 G |
mjr | 35:d832bcab089e | 755 | { NC, 0, 9 }, // TLC port 9, LW output 9 - Flasher 3 B |
mjr | 35:d832bcab089e | 756 | { NC, 0, 10 }, // TLC port 10, LW output 10 - Flasher 4 R |
mjr | 35:d832bcab089e | 757 | { NC, 0, 11 }, // TLC port 11, LW output 11 - Flasher 4 G |
mjr | 35:d832bcab089e | 758 | { NC, 0, 12 }, // TLC port 12, LW output 12 - Flasher 4 B |
mjr | 35:d832bcab089e | 759 | { NC, 0, 13 }, // TLC port 13, LW output 13 - Flasher 5 R |
mjr | 35:d832bcab089e | 760 | { NC, 0, 14 }, // TLC port 14, LW output 14 - Flasher 5 G |
mjr | 35:d832bcab089e | 761 | { NC, 0, 15 }, // TLC port 15, LW output 15 - Flasher 5 B |
mjr | 35:d832bcab089e | 762 | { NC, 0, 16 }, // TLC port 16, LW output 16 - Strobe/Button light |
mjr | 35:d832bcab089e | 763 | { NC, 0, 17 }, // TLC port 17, LW output 17 - Button light 1 |
mjr | 35:d832bcab089e | 764 | { NC, 0, 18 }, // TLC port 18, LW output 18 - Button light 2 |
mjr | 35:d832bcab089e | 765 | { NC, 0, 19 }, // TLC port 19, LW output 19 - Button light 3 |
mjr | 35:d832bcab089e | 766 | { NC, 0, 20 }, // TLC port 20, LW output 20 - Button light 4 |
mjr | 35:d832bcab089e | 767 | { PTC8, 0, 0 }, // PTC8, LW output 21 - Replay Knocker |
mjr | 35:d832bcab089e | 768 | { NC, 0, 21 }, // TLC port 21, LW output 22 - Contactor 1/General purpose |
mjr | 35:d832bcab089e | 769 | { NC, 0, 22 }, // TLC port 22, LW output 23 - Contactor 2/General purpose |
mjr | 35:d832bcab089e | 770 | { NC, 0, 23 }, // TLC port 23, LW output 24 - Contactor 3/General purpose |
mjr | 35:d832bcab089e | 771 | { NC, 0, 24 }, // TLC port 24, LW output 25 - Contactor 4/General purpose |
mjr | 35:d832bcab089e | 772 | { NC, 0, 25 }, // TLC port 25, LW output 26 - Contactor 5/General purpose |
mjr | 35:d832bcab089e | 773 | { NC, 0, 26 }, // TLC port 26, LW output 27 - Contactor 6/General purpose |
mjr | 35:d832bcab089e | 774 | { NC, 0, 27 }, // TLC port 27, LW output 28 - Contactor 7/General purpose |
mjr | 35:d832bcab089e | 775 | { NC, 0, 28 }, // TLC port 28, LW output 29 - Contactor 8/General purpose |
mjr | 35:d832bcab089e | 776 | { NC, 0, 29 }, // TLC port 29, LW output 30 - Contactor 9/General purpose |
mjr | 35:d832bcab089e | 777 | { NC, 0, 30 }, // TLC port 30, LW output 31 - Contactor 10/General purpose |
mjr | 35:d832bcab089e | 778 | { NC, 0, 31 }, // TLC port 31, LW output 32 - Shaker Motor/General purpose |
mjr | 35:d832bcab089e | 779 | |
mjr | 35:d832bcab089e | 780 | // Ports 33+ are accessible only to DOF-based software. Older LedWiz-only |
mjr | 35:d832bcab089e | 781 | // software on the can't access these. Attach less common devices to these ports. |
mjr | 35:d832bcab089e | 782 | { NC, 0, 32 }, // TLC port 32, LW output 33 - Gear Motor/General purpose |
mjr | 35:d832bcab089e | 783 | { NC, 0, 33 }, // TLC port 33, LW output 34 - Fan/General purpose |
mjr | 35:d832bcab089e | 784 | { NC, 0, 34 }, // TLC port 34, LW output 35 - Beacon/General purpose |
mjr | 35:d832bcab089e | 785 | { NC, 0, 35 }, // TLC port 35, LW output 36 - Undercab RGB R/General purpose |
mjr | 35:d832bcab089e | 786 | { NC, 0, 36 }, // TLC port 36, LW output 37 - Undercab RGB G/General purpose |
mjr | 35:d832bcab089e | 787 | { NC, 0, 37 }, // TLC port 37, LW output 38 - Undercab RGB B/General purpose |
mjr | 35:d832bcab089e | 788 | { NC, 0, 38 }, // TLC port 38, LW output 39 - Bell/General purpose |
mjr | 35:d832bcab089e | 789 | { NC, 0, 39 }, // TLC port 39, LW output 40 - Chime 1/General purpose |
mjr | 35:d832bcab089e | 790 | { NC, 0, 40 }, // TLC port 40, LW output 41 - Chime 2/General purpose |
mjr | 35:d832bcab089e | 791 | { NC, 0, 41 }, // TLC port 41, LW output 42 - Chime 3/General purpose |
mjr | 35:d832bcab089e | 792 | { NC, 0, 42 }, // TLC port 42, LW output 43 - General purpose |
mjr | 35:d832bcab089e | 793 | { NC, 0, 43 }, // TLC port 43, LW output 44 - General purpose |
mjr | 35:d832bcab089e | 794 | { NC, 0, 44 }, // TLC port 44, LW output 45 - Button light 5 |
mjr | 35:d832bcab089e | 795 | { NC, 0, 45 }, // TLC port 45, LW output 46 - Button light 6 |
mjr | 35:d832bcab089e | 796 | { NC, 0, 46 }, // TLC port 46, LW output 47 - Button light 7 |
mjr | 35:d832bcab089e | 797 | { NC, 0, 47 }, // TLC port 47, LW output 48 - Button light 8 |
mjr | 35:d832bcab089e | 798 | { NC, 0, 49 }, // TLC port 49, LW output 49 - Flipper button RGB left R |
mjr | 35:d832bcab089e | 799 | { NC, 0, 50 }, // TLC port 50, LW output 50 - Flipper button RGB left G |
mjr | 35:d832bcab089e | 800 | { NC, 0, 51 }, // TLC port 51, LW output 51 - Flipper button RGB left B |
mjr | 35:d832bcab089e | 801 | { NC, 0, 52 }, // TLC port 52, LW output 52 - Flipper button RGB right R |
mjr | 35:d832bcab089e | 802 | { NC, 0, 53 }, // TLC port 53, LW output 53 - Flipper button RGB right G |
mjr | 35:d832bcab089e | 803 | { NC, 0, 54 }, // TLC port 54, LW output 54 - Flipper button RGB right B |
mjr | 35:d832bcab089e | 804 | { NC, 0, 55 }, // TLC port 55, LW output 55 - MagnaSave button RGB left R |
mjr | 35:d832bcab089e | 805 | { NC, 0, 56 }, // TLC port 56, LW output 56 - MagnaSave button RGB left G |
mjr | 35:d832bcab089e | 806 | { NC, 0, 57 }, // TLC port 57, LW output 57 - MagnaSave button RGB left B |
mjr | 35:d832bcab089e | 807 | { NC, 0, 58 }, // TLC port 58, LW output 58 - MagnaSave button RGB right R |
mjr | 35:d832bcab089e | 808 | { NC, 0, 59 }, // TLC port 59, LW output 59 - MagnaSave button RGB right G |
mjr | 35:d832bcab089e | 809 | { NC, 0, 60 } // TLC port 60, LW output 60 - MagnaSave button RGB right B |
mjr | 35:d832bcab089e | 810 | |
mjr | 35:d832bcab089e | 811 | #else |
mjr | 35:d832bcab089e | 812 | |
mjr | 35:d832bcab089e | 813 | // *** TLC5940 + GPIO OUTPUTS, Without the expansion board *** |
mjr | 35:d832bcab089e | 814 | // |
mjr | 35:d832bcab089e | 815 | // This is the mapping for the ehnanced mode, with one or more TLC5940 |
mjr | 35:d832bcab089e | 816 | // chips connected. Each TLC5940 chip provides 16 PWM channels. We |
mjr | 35:d832bcab089e | 817 | // can supplement the TLC5940 outputs with GPIO pins to get even more |
mjr | 35:d832bcab089e | 818 | // physical outputs. |
mjr | 35:d832bcab089e | 819 | // |
mjr | 35:d832bcab089e | 820 | // Because we've already declared the number of TLC5940 chips earlier |
mjr | 35:d832bcab089e | 821 | // in this file, we don't actually have to map out all of the TLC5940 |
mjr | 35:d832bcab089e | 822 | // ports here. The software will automatically assign all of the |
mjr | 35:d832bcab089e | 823 | // TLC5940 ports that aren't explicitly mentioned here to the next |
mjr | 35:d832bcab089e | 824 | // available LedWiz port numbers after the end of this array, assigning |
mjr | 35:d832bcab089e | 825 | // them sequentially in TLC5940 port order. |
mjr | 35:d832bcab089e | 826 | // |
mjr | 35:d832bcab089e | 827 | // In contrast to the basic mode arrangement, we're putting all of the |
mjr | 35:d832bcab089e | 828 | // NON PWM ports first in this mapping. The logic is that all of the |
mjr | 35:d832bcab089e | 829 | // TLC5940 ports are PWM-capable, and they'll all at the end of the list |
mjr | 35:d832bcab089e | 830 | // here, so by putting the PWM GPIO pins last here, we'll keep all of the |
mjr | 35:d832bcab089e | 831 | // PWM ports grouped in the final mapping. |
mjr | 35:d832bcab089e | 832 | // |
mjr | 35:d832bcab089e | 833 | // Note that the TLC5940 control wiring takes away several GPIO pins |
mjr | 35:d832bcab089e | 834 | // that we used as output ports in the basic mode. Further, because the |
mjr | 35:d832bcab089e | 835 | // TLC5940 makes ports so plentiful, we're intentionally omitting several |
mjr | 35:d832bcab089e | 836 | // more of the pins from the basic set, to make them available for other |
mjr | 35:d832bcab089e | 837 | // uses. To keep things more neatly grouped, we're only assigning J1 pins |
mjr | 35:d832bcab089e | 838 | // in this set. This leaves the following ports from the basic mode output |
mjr | 35:d832bcab089e | 839 | // set available for other users: PTA13, PTD0, PTD2, PTD3, PTD5, PTE0. |
mjr | 35:d832bcab089e | 840 | |
mjr | 35:d832bcab089e | 841 | { PTC8, 0 }, // pin J1-14, LW port 1 |
mjr | 35:d832bcab089e | 842 | { PTC9, 0 }, // pin J1-16, LW port 2 |
mjr | 35:d832bcab089e | 843 | { PTC0, 0 }, // pin J1-3, LW port 3 |
mjr | 35:d832bcab089e | 844 | { PTC3, 0 }, // pin J1-5, LW port 4 |
mjr | 35:d832bcab089e | 845 | { PTC4, 0 }, // pin J1-7, LW port 5 |
mjr | 35:d832bcab089e | 846 | { PTA2, PORT_IS_PWM }, // pin J1-4, LW port 6 (PWM capable - TPM 2.1 = channel 10) |
mjr | 35:d832bcab089e | 847 | { PTD4, PORT_IS_PWM }, // pin J1-6, LW port 7 (PWM capable - TPM 0.4 = channel 5) |
mjr | 35:d832bcab089e | 848 | { PTA12, PORT_IS_PWM }, // pin J1-8, LW port 8 (PWM capable - TPM 1.0 = channel 7) |
mjr | 35:d832bcab089e | 849 | { PTA4, PORT_IS_PWM }, // pin J1-10, LW port 9 (PWM capable - TPM 0.1 = channel 2) |
mjr | 35:d832bcab089e | 850 | { PTA5, PORT_IS_PWM } // pin J1-12, LW port 10 (PWM capable - TPM 0.2 = channel 3) |
mjr | 35:d832bcab089e | 851 | |
mjr | 35:d832bcab089e | 852 | // TLC5940 ports start here! |
mjr | 35:d832bcab089e | 853 | // First chip port 0 -> LW port 12 |
mjr | 35:d832bcab089e | 854 | // First chip port 1 -> LW port 13 |
mjr | 35:d832bcab089e | 855 | // ... etc, filling out all chip ports sequentially ... |
mjr | 35:d832bcab089e | 856 | |
mjr | 35:d832bcab089e | 857 | #endif // TLC5940_NCHIPS |
mjr | 17:ab3cec0c8bf4 | 858 | }; |
mjr | 17:ab3cec0c8bf4 | 859 | |
mjr | 21:5048e16cc9ef | 860 | |
mjr | 25:e22b88bd783a | 861 | #endif // DECL_EXTERNS |