| 1169 | } |
| 1170 | |
| 1171 | uint16_t CCECClient::CheckKeypressTimeout(void) |
| 1172 | { |
| 1173 | // time when we'd like to be called again |
| 1174 | uint64_t timeout = CEC_PROCESSOR_SIGNAL_WAIT_TIME; |
| 1175 | cec_keypress key; |
| 1176 | key.keycode = CEC_USER_CONTROL_CODE_UNKNOWN; |
| 1177 | key.duration = 0; |
| 1178 | |
| 1179 | if (m_iCurrentButton == CEC_USER_CONTROL_CODE_UNKNOWN) |
| 1180 | return (uint16_t)timeout; |
| 1181 | { |
| 1182 | CLockObject lock(m_mutex); |
| 1183 | uint64_t iNow = GetTimeMs(); |
| 1184 | LIB_CEC->AddLog(CEC_LOG_DEBUG, "%s T:%.3f", __FUNCTION__, iNow*1e-3); |
| 1185 | cec_user_control_code comboKey(m_configuration.comboKey); |
| 1186 | uint32_t iTimeoutMs(m_configuration.iComboKeyTimeoutMs); |
| 1187 | |
| 1188 | if (m_iCurrentButton == comboKey && iTimeoutMs > 0 && iNow - m_updateButtontime >= iTimeoutMs) |
| 1189 | { |
| 1190 | key.duration = (unsigned int) (iNow - m_initialButtontime); |
| 1191 | key.keycode = m_iCurrentButton; |
| 1192 | |
| 1193 | m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN; |
| 1194 | m_initialButtontime = 0; |
| 1195 | m_updateButtontime = 0; |
| 1196 | m_repeatButtontime = 0; |
| 1197 | m_releaseButtontime = 0; |
| 1198 | m_pressedButtoncount = 0; |
| 1199 | m_releasedButtoncount = 0; |
| 1200 | } |
| 1201 | else if (m_iCurrentButton != comboKey && m_releaseButtontime && iNow >= (uint64_t)m_releaseButtontime) |
| 1202 | { |
| 1203 | key.duration = (unsigned int) (iNow - m_initialButtontime); |
| 1204 | key.keycode = CEC_USER_CONTROL_CODE_UNKNOWN; |
| 1205 | |
| 1206 | m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN; |
| 1207 | m_initialButtontime = 0; |
| 1208 | m_updateButtontime = 0; |
| 1209 | m_repeatButtontime = 0; |
| 1210 | m_releaseButtontime = 0; |
| 1211 | m_pressedButtoncount = 0; |
| 1212 | m_releasedButtoncount = 0; |
| 1213 | } |
| 1214 | else if (m_iCurrentButton != comboKey && m_repeatButtontime && iNow >= (uint64_t)m_repeatButtontime) |
| 1215 | { |
| 1216 | key.duration = (unsigned int) (iNow - m_initialButtontime); |
| 1217 | key.keycode = m_iCurrentButton; |
| 1218 | m_repeatButtontime = iNow + m_configuration.iButtonRepeatRateMs; |
| 1219 | timeout = std::min((uint64_t)timeout, m_repeatButtontime - iNow); |
| 1220 | } |
| 1221 | else |
| 1222 | { |
| 1223 | if (m_iCurrentButton == comboKey && iTimeoutMs > 0) |
| 1224 | timeout = std::min((uint64_t)timeout, m_updateButtontime - iNow + iTimeoutMs); |
| 1225 | if (m_iCurrentButton != comboKey && m_releaseButtontime) |
| 1226 | timeout = std::min((uint64_t)timeout, m_releaseButtontime - iNow); |
| 1227 | if (m_iCurrentButton != comboKey && m_repeatButtontime) |
| 1228 | timeout = std::min((uint64_t)timeout, m_repeatButtontime - iNow); |