From c91d32dc3f9bd9252ef9c7114851ddd3d34388b3 Mon Sep 17 00:00:00 2001 From: Adam Preble Date: Sun, 31 May 2009 17:23:09 -0400 Subject: [PATCH] Added PRDecode(), updated TZ.yaml to reflect it. --- examples/pinproctest/TZ.yaml | 26 ++++++++++++------ examples/pinproctest/pinproctest.cpp | 2 +- examples/pinproctest/switches.cpp | 13 +++++---- include/pinproc.h | 7 +++++ src/pinproc.cpp | 41 ++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+), 15 deletions(-) diff --git a/examples/pinproctest/TZ.yaml b/examples/pinproctest/TZ.yaml index 455ea82..196c9e1 100644 --- a/examples/pinproctest/TZ.yaml +++ b/examples/pinproctest/TZ.yaml @@ -11,17 +11,17 @@ PRBumpers: - slingR PRSwitches: flipperLwR: - number: 1 + number: SF2 flipperLwL: - number: 3 + number: SF4 flipperUpR: - number: 5 + number: SF6 flipperUpL: - number: 7 + number: SF8 slingL: - number: 96 + number: S34 slingR: - number: 97 + number: S35 PRCoils: flipperLwRMain: number: 32 @@ -40,9 +40,17 @@ PRCoils: flipperUpLHold: number: 39 slingL: - number: 54 + number: C11 slingR: - number: 55 + number: C10 + slotKickout: + number: C01 + rocketKickout: + number: C02 + outhole: + number: C08 + ballRelease: + number: C09 PRLamps: doorTheCamera: - number: 80 \ No newline at end of file + number: L11 \ No newline at end of file diff --git a/examples/pinproctest/pinproctest.cpp b/examples/pinproctest/pinproctest.cpp index 55721a5..3d4d826 100644 --- a/examples/pinproctest/pinproctest.cpp +++ b/examples/pinproctest/pinproctest.cpp @@ -28,6 +28,7 @@ */ #include "pinproctest.h" +PRMachineType machineType = kPRMachineInvalid; /** Demonstration of the custom logging callback. */ void TestLogger(PRLogLevel level, const char *text) @@ -147,7 +148,6 @@ int main(int argc, const char **argv) return 1; } - PRMachineType machineType = kPRMachineInvalid; std::string machineTypeString; yamlDoc["PRGame"]["machineType"] >> machineTypeString; if (machineTypeString == "wpc") diff --git a/examples/pinproctest/switches.cpp b/examples/pinproctest/switches.cpp index 9fb7c5e..03feefb 100644 --- a/examples/pinproctest/switches.cpp +++ b/examples/pinproctest/switches.cpp @@ -24,6 +24,8 @@ */ #include "pinproctest.h" +extern PRMachineType machineType; + typedef struct SwitchStatus { PREventType state; uint32_t lastEventTime; @@ -96,15 +98,16 @@ void ConfigureBumperRule (PRHandle proc, int swNum, int coilNum, int pulseTime) void ConfigureSwitchRules(PRHandle proc, YAML::Node& yamlDoc) { // WPC Flippers + std::string numStr; const YAML::Node& flippers = yamlDoc[kFlippersSection]; for (YAML::Iterator flippersIt = flippers.begin(); flippersIt != flippers.end(); ++flippersIt) { int swNum, coilMain, coilHold; std::string flipperName; *flippersIt >> flipperName; - yamlDoc[kSwitchesSection][flipperName][kNumberField] >> swNum; - yamlDoc[kCoilsSection][flipperName + "Main"][kNumberField] >> coilMain; - yamlDoc[kCoilsSection][flipperName + "Hold"][kNumberField] >> coilHold; + yamlDoc[kSwitchesSection][flipperName][kNumberField] >> numStr; swNum = PRDecode(machineType, numStr.c_str()); + yamlDoc[kCoilsSection][flipperName + "Main"][kNumberField] >> numStr; coilMain = PRDecode(machineType, numStr.c_str()); + yamlDoc[kCoilsSection][flipperName + "Hold"][kNumberField] >> numStr; coilHold = PRDecode(machineType, numStr.c_str()); ConfigureWPCFlipperSwitchRule (proc, swNum, coilMain, coilHold, kFlipperPulseTime); } @@ -115,8 +118,8 @@ void ConfigureSwitchRules(PRHandle proc, YAML::Node& yamlDoc) // WPC Slingshots std::string bumperName; *bumpersIt >> bumperName; - yamlDoc[kSwitchesSection][bumperName][kNumberField] >> swNum; - yamlDoc[kCoilsSection][bumperName][kNumberField] >> coilNum; + yamlDoc[kSwitchesSection][bumperName][kNumberField] >> numStr; swNum = PRDecode(machineType, numStr.c_str()); + yamlDoc[kCoilsSection][bumperName][kNumberField] >> numStr; coilNum = PRDecode(machineType, numStr.c_str()); ConfigureBumperRule (proc, swNum, coilNum, kBumperPulseTime); } } diff --git a/include/pinproc.h b/include/pinproc.h index 9fc5076..f2ddabe 100644 --- a/include/pinproc.h +++ b/include/pinproc.h @@ -237,6 +237,13 @@ PR_EXPORT void PRDriverStateSchedule(PRDriverState *driverState, uint32_t schedu */ PR_EXPORT void PRDriverStatePatter(PRDriverState *driverState, uint16_t millisecondsOn, uint16_t millisecondsOff, uint16_t originalOnTime); +/** + * @brief Converts a coil, lamp, switch, or GI string into a P-ROC driver number. + * The following formats are accepted: Cxx (coil), Lxx (lamp), Sxx (matrix switch), SFx (flipper grounded switch), or SDx (dedicated grounded switch). + * If the string does not match this format it will be converted into an integer using atoi(). + */ +PR_EXPORT uint16_t PRDecode(PRMachineType machineType, const char *str); + /** @} */ // End of Drivers // Switches diff --git a/src/pinproc.cpp b/src/pinproc.cpp index 671eea0..59c2fd1 100644 --- a/src/pinproc.cpp +++ b/src/pinproc.cpp @@ -219,6 +219,47 @@ PR_EXPORT void PRDriverStatePatter(PRDriverState *driver, uint16_t millisecondsO driver->patterEnable = true; } +PR_EXPORT uint16_t PRDecode(PRMachineType machineType, const char *str) +{ + if (str == NULL) + return 0; + if (strlen(str) != 3) + return atoi(str); + uint16_t x = (str[1]-'0') * 10 + (str[2]-'0'); + + if (machineType == kPRMachineWPC) + { + switch (str[0]) + { + case 'L': + case 'l': + return 80 + 8 * ((x / 10) - 1) + ((x % 10) -1); + case 'C': + case 'c': + if (x <= 28) + return x + 39; + else + return x + 7; + case 'G': + case 'g': + return x + 71; + case 'S': + case 's': + { + switch (str[1]) + { + case 'D': + case 'd': + return 8 + ((str[2]-'0') - 1); + case 'F': + case 'f': + return (str[2]-'0') - 1; + } + } + } + } + return atoi(str); +} // Switches