----------------------------------------------------------------------------- Process a request from the Z-Wave PC interface -----------------------------------------------------------------------------
| 3204 | // Process a request from the Z-Wave PC interface |
| 3205 | //----------------------------------------------------------------------------- |
| 3206 | void Driver::HandleSendDataRequest |
| 3207 | ( |
| 3208 | uint8* _data, |
| 3209 | uint8 _length, |
| 3210 | bool _replication |
| 3211 | ) |
| 3212 | { |
| 3213 | uint8 nodeId = GetNodeNumber( m_currentMsg ); |
| 3214 | Log::Write( LogLevel_Detail, nodeId, " %s Request with callback ID 0x%.2x received (expected 0x%.2x)", _replication ? "ZW_REPLICATION_SEND_DATA" : "ZW_SEND_DATA", _data[2], _data[2] < 10 ? _data[2] : m_expectedCallbackId ); |
| 3215 | /* Callback ID's below 10 are reserved for NONCE messages */ |
| 3216 | if ((_data[2] > 10 ) && ( _data[2] != m_expectedCallbackId )) { |
| 3217 | // Wrong callback ID |
| 3218 | m_callbacks++; |
| 3219 | Log::Write( LogLevel_Warning, nodeId, "WARNING: Unexpected Callback ID received" ); |
| 3220 | } else { |
| 3221 | Node* node = GetNodeUnsafe( nodeId ); |
| 3222 | if( node != NULL ) |
| 3223 | { |
| 3224 | if( _data[3] != TRANSMIT_COMPLETE_OK ) |
| 3225 | { |
| 3226 | node->m_sentFailed++; |
| 3227 | } |
| 3228 | else |
| 3229 | { |
| 3230 | node->m_lastRequestRTT = -node->m_sentTS.TimeRemaining(); |
| 3231 | |
| 3232 | if( node->m_averageRequestRTT ) |
| 3233 | { |
| 3234 | // if the average has been established, update by averaging the average and the last RTT |
| 3235 | node->m_averageRequestRTT = ( node->m_averageRequestRTT + node->m_lastRequestRTT ) >> 1; |
| 3236 | } |
| 3237 | else |
| 3238 | { |
| 3239 | // if this is the first observed RTT, set the average to this value |
| 3240 | node->m_averageRequestRTT = node->m_lastRequestRTT; |
| 3241 | } |
| 3242 | Log::Write(LogLevel_Info, nodeId, "Request RTT %d Average Request RTT %d", node->m_lastRequestRTT, node->m_averageRequestRTT ); |
| 3243 | } |
| 3244 | /* if the frame has txStatus message, then extract it */ |
| 3245 | // petergebruers, changed test (_length > 7) to >= 23 to avoid extracting non-existent data, highest is _data[22] |
| 3246 | if (_length >= 23) { |
| 3247 | node->m_txStatusReportSupported = true; |
| 3248 | // petergebruers: |
| 3249 | // because OpenZWave uses "ms" everywhere, and wTransmitTicks |
| 3250 | // has "10 ms" as unit... multiply by 10. This wil avoid |
| 3251 | // confusion when people look at stats or log files. |
| 3252 | node->m_txTime = (_data[5] + (_data[4] << 8)) * 10; |
| 3253 | node->m_hops = _data[6]; |
| 3254 | // petergebruers: there are 5 rssi values because there are |
| 3255 | // 4 repeaters + 1 sending node |
| 3256 | strncpy(node->m_rssi_1, rssi_to_string(_data[7]), sizeof(node->m_rssi_1) - 1); |
| 3257 | strncpy(node->m_rssi_2, rssi_to_string(_data[8]), sizeof(node->m_rssi_2) - 1); |
| 3258 | strncpy(node->m_rssi_3, rssi_to_string(_data[9]), sizeof(node->m_rssi_3) - 1); |
| 3259 | strncpy(node->m_rssi_4, rssi_to_string(_data[10]), sizeof(node->m_rssi_4) - 1); |
| 3260 | strncpy(node->m_rssi_5, rssi_to_string(_data[11]), sizeof(node->m_rssi_5) - 1); |
| 3261 | node->m_ackChannel = _data[12]; |
| 3262 | node->m_lastTxChannel = _data[13]; |
| 3263 | node->m_routeScheme = (TXSTATUS_ROUTING_SCHEME)_data[14]; |
nothing calls this directly
no test coverage detected