MCPcopy Create free account
hub / github.com/OpenZWave/open-zwave / HandleSendDataRequest

Method HandleSendDataRequest

cpp/src/Driver.cpp:3206–3327  ·  view source on GitHub ↗

----------------------------------------------------------------------------- Process a request from the Z-Wave PC interface -----------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

3204// Process a request from the Z-Wave PC interface
3205//-----------------------------------------------------------------------------
3206void 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];

Callers

nothing calls this directly

Calls 10

WriteFunction · 0.85
GetCurrentQueryStageMethod · 0.80
QueryStageRetryMethod · 0.80
GetCommandClassMethod · 0.80
SetAwakeMethod · 0.80
IsNodeAliveMethod · 0.80
SetNodeAliveMethod · 0.80
TimeRemainingMethod · 0.45
GetNodeStatisticsMethod · 0.45
c_strMethod · 0.45

Tested by

no test coverage detected