diff --git a/include/pinproc.h b/include/pinproc.h index 4cf3eeb..24b7540 100644 --- a/include/pinproc.h +++ b/include/pinproc.h @@ -247,7 +247,8 @@ PR_EXPORT int PRGetEvents(PRHandle handle, PREvent *eventsOut, int maxEvents); #define kPRSwitchPhysicalLast (223) /**< Switch number of the last physical switch. */ #define kPRSwitchVirtualFirst (224) /**< Switch number of the first virtual switch. */ #define kPRSwitchVirtualLast (255) /**< Switch number of the last virtual switch. */ -#define kPRSwitchRulesCount ((kPRSwitchVirtualLast + 1) << 2) /**< Total number of available switch rules. */ +#define kPRSwitchCount (256) +#define kPRSwitchRulesCount (kPRSwitchCount << 2) /**< Total number of available switch rules. */ typedef struct PRSwitchConfig { bool_t clear; // Drive the clear output diff --git a/src/PRDevice.cpp b/src/PRDevice.cpp index 1b21f65..272f77f 100644 --- a/src/PRDevice.cpp +++ b/src/PRDevice.cpp @@ -82,29 +82,35 @@ PRResult PRDevice::Reset(uint32_t resetFlags) group->polarity = defaultPolarity; } - // Create empty switch rule for clearing the rules in the device. - PRSwitchRule emptySwitchRule; - memset(&emptySwitchRule, 0x00, sizeof(PRSwitchRule)); - + freeSwitchRuleIndexes.empty(); + for (i = 0; i < kPRSwitchRulesCount; i++) { PRSwitchRuleInternal *switchRule = &switchRules[i]; memset(switchRule, 0x00, sizeof(PRSwitchRule)); - // Send blank rule for each event type to Device if necessary - if ((resetFlags & kPRResetFlagUpdateDevice) && i <= kPRSwitchPhysicalLast) { - SwitchUpdateRule(i, kPREventTypeSwitchOpenDebounced, &emptySwitchRule, NULL, 0); - SwitchUpdateRule(i, kPREventTypeSwitchClosedDebounced, &emptySwitchRule, NULL, 0); - SwitchUpdateRule(i, kPREventTypeSwitchOpenNondebounced, &emptySwitchRule, NULL, 0); - SwitchUpdateRule(i, kPREventTypeSwitchClosedNondebounced, &emptySwitchRule, NULL, 0); - } - uint16_t ruleIndex = i; ParseSwitchRuleIndex(ruleIndex, &switchRule->switchNum, &switchRule->eventType); switchRule->driver.polarity = defaultPolarity; if (switchRule->switchNum >= kPRSwitchVirtualFirst) // Disabled for compiler warning (always true due to data type): && switchRule->switchNum <= kPRSwitchVirtualLast) freeSwitchRuleIndexes.push(ruleIndex); } + + // Create empty switch rule for clearing the rules in the device. + PRSwitchRule emptySwitchRule; + memset(&emptySwitchRule, 0x00, sizeof(PRSwitchRule)); + + for (i = 0; i < kPRSwitchCount; i++) + { + // Send blank rule for each event type to Device if necessary + if ((resetFlags & kPRResetFlagUpdateDevice) && i <= kPRSwitchPhysicalLast) + { + SwitchUpdateRule(i, kPREventTypeSwitchOpenDebounced, &emptySwitchRule, NULL, 0); + SwitchUpdateRule(i, kPREventTypeSwitchClosedDebounced, &emptySwitchRule, NULL, 0); + SwitchUpdateRule(i, kPREventTypeSwitchOpenNondebounced, &emptySwitchRule, NULL, 0); + SwitchUpdateRule(i, kPREventTypeSwitchClosedNondebounced, &emptySwitchRule, NULL, 0); + } + } unrequestedDataQueue.empty(); requestedDataQueue.empty();