diff --git a/src/PRDevice.cpp b/src/PRDevice.cpp index 8884c9b..2ba9584 100644 --- a/src/PRDevice.cpp +++ b/src/PRDevice.cpp @@ -174,15 +174,29 @@ int PRDevice::GetEvents(PREvent *events, int maxEvents) uint32_t event_data = unrequestedDataQueue.front(); unrequestedDataQueue.pop(); - events[i].value = event_data & P_ROC_EVENT_SWITCH_NUM_MASK; - int open = (event_data & P_ROC_EVENT_SWITCH_STATE_MASK) >> P_ROC_EVENT_SWITCH_STATE_SHIFT; + int type; + bool open, debounced; - switch ((event_data & P_ROC_EVENT_TYPE_MASK) >> P_ROC_EVENT_TYPE_SHIFT) + if (version >= 2) { + events[i].value = event_data & P_ROC_V2_EVENT_SWITCH_NUM_MASK; + type = (event_data & P_ROC_V2_EVENT_TYPE_MASK) >> P_ROC_V2_EVENT_TYPE_SHIFT; + open = (event_data & P_ROC_V2_EVENT_SWITCH_STATE_MASK) >> P_ROC_V2_EVENT_SWITCH_STATE_SHIFT; + debounced = (event_data & P_ROC_V2_EVENT_SWITCH_DEBOUNCED_MASK) >> P_ROC_V2_EVENT_SWITCH_DEBOUNCED_SHIFT; + events[i].time = (event_data & P_ROC_V2_EVENT_SWITCH_TIMESTAMP_MASK) >> P_ROC_V2_EVENT_SWITCH_TIMESTAMP_SHIFT; + } + else { + type = (event_data & P_ROC_V1_EVENT_TYPE_MASK) >> P_ROC_V1_EVENT_TYPE_SHIFT; + events[i].value = event_data & P_ROC_V1_EVENT_SWITCH_NUM_MASK; + open = (event_data & P_ROC_V1_EVENT_SWITCH_STATE_MASK) >> P_ROC_V1_EVENT_SWITCH_STATE_SHIFT; + debounced = (event_data & P_ROC_V1_EVENT_SWITCH_DEBOUNCED_MASK) >> P_ROC_V1_EVENT_SWITCH_DEBOUNCED_SHIFT; + events[i].time = (event_data & P_ROC_V1_EVENT_SWITCH_TIMESTAMP_MASK) >> P_ROC_V1_EVENT_SWITCH_TIMESTAMP_SHIFT; + } + + + switch (type) { case P_ROC_EVENT_TYPE_SWITCH: { - events[i].time = (event_data & P_ROC_EVENT_SWITCH_TIMESTAMP_MASK) >> P_ROC_EVENT_SWITCH_TIMESTAMP_SHIFT; - int debounced = (event_data & P_ROC_EVENT_SWITCH_DEBOUNCED_MASK) >> P_ROC_EVENT_SWITCH_DEBOUNCED_SHIFT; if (open) events[i].type = debounced ? kPREventTypeSwitchOpenDebounced : kPREventTypeSwitchOpenNondebounced; else @@ -196,6 +210,13 @@ int PRDevice::GetEvents(PREvent *events, int maxEvents) break; } + case P_ROC_EVENT_TYPE_BURST_SWITCH: + { + if (open) events[i].type = kPREventTypeSwitchOpenNondebounced; + else events[i].type = kPREventTypeSwitchClosedNondebounced; + break; + } + default: events[i].type = kPREventTypeInvalid; } diff --git a/src/PRHardware.h b/src/PRHardware.h index 6f18698..8fe5a5c 100644 --- a/src/PRHardware.h +++ b/src/PRHardware.h @@ -129,16 +129,28 @@ const uint32_t P_ROC_SWITCH_CTRL_DEBOUNCE_BASE_ADDR = 12; const uint32_t P_ROC_EVENT_TYPE_SWITCH = 0; const uint32_t P_ROC_EVENT_TYPE_DMD = 1; -const uint32_t P_ROC_EVENT_TYPE_MASK = 0xC00; -const uint32_t P_ROC_EVENT_TYPE_SHIFT = 10; -const uint32_t P_ROC_EVENT_SWITCH_NUM_MASK = 0xFF; -const uint32_t P_ROC_EVENT_SWITCH_STATE_MASK = 0x100; -const uint32_t P_ROC_EVENT_SWITCH_STATE_SHIFT = 8; -const uint32_t P_ROC_EVENT_SWITCH_TIMESTAMP_MASK = 0xFFFFF000; -const uint32_t P_ROC_EVENT_SWITCH_TIMESTAMP_SHIFT = 12; +const uint32_t P_ROC_EVENT_TYPE_BURST_SWITCH = 2; + +const uint32_t P_ROC_V1_EVENT_TYPE_MASK = 0xC00; +const uint32_t P_ROC_V1_EVENT_TYPE_SHIFT = 10; +const uint32_t P_ROC_V2_EVENT_TYPE_MASK = 0xC000; +const uint32_t P_ROC_V2_EVENT_TYPE_SHIFT = 14; + +const uint32_t P_ROC_V1_EVENT_SWITCH_NUM_MASK = 0xFF; +const uint32_t P_ROC_V2_EVENT_SWITCH_NUM_MASK = 0x7FF; +const uint32_t P_ROC_V1_EVENT_SWITCH_STATE_MASK = 0x100; +const uint32_t P_ROC_V2_EVENT_SWITCH_STATE_MASK = 0x1000; +const uint32_t P_ROC_V1_EVENT_SWITCH_STATE_SHIFT = 8; +const uint32_t P_ROC_V2_EVENT_SWITCH_STATE_SHIFT = 12; +const uint32_t P_ROC_V1_EVENT_SWITCH_DEBOUNCED_MASK = 0x200; +const uint32_t P_ROC_V2_EVENT_SWITCH_DEBOUNCED_MASK = 0x2000; +const uint32_t P_ROC_V1_EVENT_SWITCH_DEBOUNCED_SHIFT = 9; +const uint32_t P_ROC_V2_EVENT_SWITCH_DEBOUNCED_SHIFT = 13; +const uint32_t P_ROC_V1_EVENT_SWITCH_TIMESTAMP_MASK = 0xFFFFF000; +const uint32_t P_ROC_V1_EVENT_SWITCH_TIMESTAMP_SHIFT = 12; +const uint32_t P_ROC_V2_EVENT_SWITCH_TIMESTAMP_MASK = 0xFFFF0000; +const uint32_t P_ROC_V2_EVENT_SWITCH_TIMESTAMP_SHIFT = 16; -const uint32_t P_ROC_EVENT_SWITCH_DEBOUNCED_MASK = 0x200; -const uint32_t P_ROC_EVENT_SWITCH_DEBOUNCED_SHIFT = 9; const uint32_t P_ROC_DRIVER_CTRL_DECODE_SHIFT = 10; const uint32_t P_ROC_DRIVER_CTRL_REG_DECODE = 0;