| 1436 | } |
| 1437 | |
| 1438 | bool DataTransfer::WriteSetVariableResult(const char *varName, const ExpressionValue& value) noexcept |
| 1439 | { |
| 1440 | // Calculate payload length |
| 1441 | const size_t varNameLength = strlen(varName); |
| 1442 | size_t payloadLength; |
| 1443 | String<StringLength50> rslt; |
| 1444 | switch (value.GetType()) |
| 1445 | { |
| 1446 | case TypeCode::Bool: |
| 1447 | case TypeCode::DriverId_tc: |
| 1448 | case TypeCode::Uint32: |
| 1449 | case TypeCode::Float: |
| 1450 | case TypeCode::Int32: |
| 1451 | case TypeCode::Char: |
| 1452 | payloadLength = varNameLength; |
| 1453 | break; |
| 1454 | case TypeCode::CString: |
| 1455 | payloadLength = varNameLength + strlen(value.sVal); |
| 1456 | break; |
| 1457 | case TypeCode::IPAddress_tc: |
| 1458 | case TypeCode::MacAddress_tc: |
| 1459 | case TypeCode::DateTime_tc: |
| 1460 | // All these types are represented as strings |
| 1461 | value.AppendAsString(rslt.GetRef()); |
| 1462 | payloadLength = varNameLength + rslt.strlen(); |
| 1463 | break; |
| 1464 | case TypeCode::HeapString: |
| 1465 | payloadLength = varNameLength + value.shVal.GetLength(); |
| 1466 | break; |
| 1467 | |
| 1468 | default: |
| 1469 | rslt.printf("unsupported type code %d", (int)value.type); |
| 1470 | payloadLength = varNameLength + rslt.strlen(); |
| 1471 | break; |
| 1472 | } |
| 1473 | |
| 1474 | // Check if it fits |
| 1475 | if (!CanWritePacket(sizeof(EvaluationResultHeader) + payloadLength)) |
| 1476 | { |
| 1477 | return false; |
| 1478 | } |
| 1479 | |
| 1480 | // Write packet header |
| 1481 | (void)WritePacketHeader(FirmwareRequest::VariableResult, sizeof(EvaluationResultHeader) + payloadLength); |
| 1482 | |
| 1483 | // Write partial header |
| 1484 | EvaluationResultHeader *header = WriteDataHeader<EvaluationResultHeader>(); |
| 1485 | header->expressionLength = varNameLength; |
| 1486 | |
| 1487 | // Write variable name |
| 1488 | WriteData(varName, varNameLength); |
| 1489 | |
| 1490 | // Write data type and expression value |
| 1491 | switch (value.GetType()) |
| 1492 | { |
| 1493 | case TypeCode::Bool: |
| 1494 | header->dataType = DataType::Bool; |
| 1495 | header->intValue = value.bVal ? 1 : 0; |
no test coverage detected