mirror of
https://github.com/thelsing/knx.git
synced 2025-08-22 13:46:21 +02:00
save work
This commit is contained in:
parent
ee72a23617
commit
589aec4585
@ -118,50 +118,34 @@ void Bau27B0::loop()
|
|||||||
void Bau27B0::domainAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, uint8_t* rfDoA,
|
void Bau27B0::domainAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, uint8_t* rfDoA,
|
||||||
uint8_t* knxSerialNumber)
|
uint8_t* knxSerialNumber)
|
||||||
{
|
{
|
||||||
uint8_t curSerialNumber[6];
|
|
||||||
pushWord(_deviceObj.manufacturerId(), &curSerialNumber[0]);
|
|
||||||
pushInt(_deviceObj.bauNumber(), &curSerialNumber[2]);
|
|
||||||
|
|
||||||
// If the received serial number matches our serial number
|
// If the received serial number matches our serial number
|
||||||
// then store the received RF domain address in the RF medium object
|
// then store the received RF domain address in the RF medium object
|
||||||
if (!memcmp(knxSerialNumber, curSerialNumber, 6))
|
if (!memcmp(knxSerialNumber, _deviceObj.knxSerialNumber(), 6))
|
||||||
_rfMediumObj.rfDomainAddress(rfDoA);
|
_rfMediumObj.rfDomainAddress(rfDoA);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bau27B0::domainAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, uint8_t* knxSerialNumber)
|
void Bau27B0::domainAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, uint8_t* knxSerialNumber)
|
||||||
{
|
{
|
||||||
uint8_t curSerialNumber[6];
|
|
||||||
pushWord(_deviceObj.manufacturerId(), &curSerialNumber[0]);
|
|
||||||
pushInt(_deviceObj.bauNumber(), &curSerialNumber[2]);
|
|
||||||
|
|
||||||
// If the received serial number matches our serial number
|
// If the received serial number matches our serial number
|
||||||
// then send a response with the current RF domain address stored in the RF medium object
|
// then send a response with the current RF domain address stored in the RF medium object
|
||||||
if (!memcmp(knxSerialNumber, curSerialNumber, 6))
|
if (!memcmp(knxSerialNumber, _deviceObj.knxSerialNumber(), 6))
|
||||||
_appLayer.domainAddressSerialNumberReadResponse(priority, hopType, _rfMediumObj.rfDomainAddress(), knxSerialNumber);
|
_appLayer.domainAddressSerialNumberReadResponse(priority, hopType, _rfMediumObj.rfDomainAddress(), knxSerialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bau27B0::individualAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, uint16_t newIndividualAddress,
|
void Bau27B0::individualAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, uint16_t newIndividualAddress,
|
||||||
uint8_t* knxSerialNumber)
|
uint8_t* knxSerialNumber)
|
||||||
{
|
{
|
||||||
uint8_t curSerialNumber[6];
|
|
||||||
pushWord(_deviceObj.manufacturerId(), &curSerialNumber[0]);
|
|
||||||
pushInt(_deviceObj.bauNumber(), &curSerialNumber[2]);
|
|
||||||
|
|
||||||
// If the received serial number matches our serial number
|
// If the received serial number matches our serial number
|
||||||
// then store the received new individual address in the device object
|
// then store the received new individual address in the device object
|
||||||
if (!memcmp(knxSerialNumber, curSerialNumber, 6))
|
if (!memcmp(knxSerialNumber, _deviceObj.knxSerialNumber(), 6))
|
||||||
_deviceObj.induvidualAddress(newIndividualAddress);
|
_deviceObj.induvidualAddress(newIndividualAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bau27B0::individualAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, uint8_t* knxSerialNumber)
|
void Bau27B0::individualAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, uint8_t* knxSerialNumber)
|
||||||
{
|
{
|
||||||
uint8_t curSerialNumber[6];
|
|
||||||
pushWord(_deviceObj.manufacturerId(), &curSerialNumber[0]);
|
|
||||||
pushInt(_deviceObj.bauNumber(), &curSerialNumber[2]);
|
|
||||||
|
|
||||||
// If the received serial number matches our serial number
|
// If the received serial number matches our serial number
|
||||||
// then send a response with the current RF domain address stored in the RF medium object and the serial number
|
// then send a response with the current RF domain address stored in the RF medium object and the serial number
|
||||||
if (!memcmp(knxSerialNumber, curSerialNumber, 6))
|
if (!memcmp(knxSerialNumber, _deviceObj.knxSerialNumber(), 6))
|
||||||
_appLayer.IndividualAddressSerialNumberReadResponse(priority, hopType, _rfMediumObj.rfDomainAddress(), knxSerialNumber);
|
_appLayer.IndividualAddressSerialNumberReadResponse(priority, hopType, _rfMediumObj.rfDomainAddress(), knxSerialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,7 +362,6 @@ void BauSystemB::nextRestartState()
|
|||||||
void BauSystemB::systemNetworkParameterReadIndication(Priority priority, HopCountType hopType, uint16_t objectType,
|
void BauSystemB::systemNetworkParameterReadIndication(Priority priority, HopCountType hopType, uint16_t objectType,
|
||||||
uint16_t propertyId, uint8_t* testInfo, uint16_t testInfoLength)
|
uint16_t propertyId, uint8_t* testInfo, uint16_t testInfoLength)
|
||||||
{
|
{
|
||||||
uint8_t knxSerialNumber[6];
|
|
||||||
uint8_t operand;
|
uint8_t operand;
|
||||||
|
|
||||||
popByte(operand, testInfo + 1); // First byte (+ 0) contains only 4 reserved bits (0)
|
popByte(operand, testInfo + 1); // First byte (+ 0) contains only 4 reserved bits (0)
|
||||||
@ -375,10 +374,8 @@ void BauSystemB::systemNetworkParameterReadIndication(Priority priority, HopCoun
|
|||||||
if (_deviceObj.progMode() && (objectType == OT_DEVICE) && (propertyId == PID_SERIAL_NUMBER))
|
if (_deviceObj.progMode() && (objectType == OT_DEVICE) && (propertyId == PID_SERIAL_NUMBER))
|
||||||
{
|
{
|
||||||
// Send reply. testResult data is KNX serial number
|
// Send reply. testResult data is KNX serial number
|
||||||
pushWord(_deviceObj.manufacturerId(), &knxSerialNumber[0]);
|
|
||||||
pushInt(_deviceObj.bauNumber(), &knxSerialNumber[2]);
|
|
||||||
_appLayer.systemNetworkParameterReadResponse(priority, hopType, objectType, propertyId,
|
_appLayer.systemNetworkParameterReadResponse(priority, hopType, objectType, propertyId,
|
||||||
testInfo, testInfoLength, knxSerialNumber, sizeof(knxSerialNumber));
|
testInfo, testInfoLength, (uint8_t*) _deviceObj.knxSerialNumber(), 6);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -47,16 +47,16 @@ void CemiServer::dataConfirmationToTunnel(CemiFrame& frame)
|
|||||||
|
|
||||||
void CemiServer::dataIndicationToTunnel(CemiFrame& frame)
|
void CemiServer::dataIndicationToTunnel(CemiFrame& frame)
|
||||||
{
|
{
|
||||||
static uint8_t lfn = 0;
|
#if MEDIUM_TYPE == 2
|
||||||
|
|
||||||
uint8_t data[frame.dataLength() + 10];
|
uint8_t data[frame.dataLength() + 10];
|
||||||
data[0] = L_data_ind;
|
data[0] = L_data_ind; // Message Code
|
||||||
data[1] = 10;
|
data[1] = 10; // Total additional info length
|
||||||
data[2] = 0x02; // RF Info add. info
|
data[2] = 0x02; // RF add. info: type
|
||||||
data[3] = 0x08; // RF info length
|
data[3] = 0x08; // RF add. info: length
|
||||||
data[4] = 0x02; // RF info field (batt ok)
|
data[4] = frame.rfInfo(); // RF add. info: info field (batt ok, bidir)
|
||||||
pushByteArray(_bau.deviceObject().rfDomainAddress(), 6, &data[5]);
|
pushByteArray(frame.rfSerialOrDoA(), 6, &data[5]); // RF add. info:Serial or Domain Address
|
||||||
data[11] = lfn;
|
data[11] = frame.rfLfn(); // RF add. info: link layer frame number
|
||||||
lfn = (lfn + 1) & 0x7;
|
|
||||||
memcpy(&data[12], &frame.data()[2], frame.dataLength() - 2);
|
memcpy(&data[12], &frame.data()[2], frame.dataLength() - 2);
|
||||||
|
|
||||||
CemiFrame tmpFrame(data, sizeof(data));
|
CemiFrame tmpFrame(data, sizeof(data));
|
||||||
@ -69,6 +69,19 @@ void CemiServer::dataIndicationToTunnel(CemiFrame& frame)
|
|||||||
printHex(" frame: ", tmpFrame.data(), tmpFrame.dataLength());
|
printHex(" frame: ", tmpFrame.data(), tmpFrame.dataLength());
|
||||||
|
|
||||||
_usbTunnelInterface.sendCemiFrame(tmpFrame);
|
_usbTunnelInterface.sendCemiFrame(tmpFrame);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
print("L_data_ind: src: ");
|
||||||
|
print(frame.sourceAddress(), HEX);
|
||||||
|
print(" dst: ");
|
||||||
|
print(frame.destinationAddress(), HEX);
|
||||||
|
|
||||||
|
printHex(" frame: ", frame.data(), frame.dataLength());
|
||||||
|
|
||||||
|
_usbTunnelInterface.sendCemiFrame(frame);
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -157,13 +157,25 @@ bool DataLinkLayer::sendTelegram(NPDU & npdu, AckType ack, uint16_t destinationA
|
|||||||
// frame.apdu().printPDU();
|
// frame.apdu().printPDU();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// The data link layer might be an open media link layer
|
||||||
|
// and will setup rfSerialOrDoA, rfInfo and rfLfn that we also
|
||||||
|
// have to send through the cEMI server tunnel
|
||||||
|
// Thus, reuse the modified cEMI frame as "frame" is only passed by reference here!
|
||||||
|
bool success = sendFrame(frame);
|
||||||
|
|
||||||
if (_cemiServer)
|
if (_cemiServer)
|
||||||
{
|
{
|
||||||
CemiFrame tmpFrame(frame.data(), frame.totalLenght());
|
CemiFrame tmpFrame(frame.data(), frame.totalLenght());
|
||||||
|
// We can just copy the pointer for rfSerialOrDoA as sendFrame() sets
|
||||||
|
// a pointer to const uint8_t data in either device object (serial) or
|
||||||
|
// RF medium object (domain address)
|
||||||
|
tmpFrame.rfSerialOrDoA(frame.rfSerialOrDoA());
|
||||||
|
tmpFrame.rfInfo(frame.rfInfo());
|
||||||
|
tmpFrame.rfLfn(frame.rfLfn());
|
||||||
_cemiServer->dataIndicationToTunnel(tmpFrame);
|
_cemiServer->dataIndicationToTunnel(tmpFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sendFrame(frame);
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* DataLinkLayer::frameData(CemiFrame& frame)
|
uint8_t* DataLinkLayer::frameData(CemiFrame& frame)
|
||||||
|
@ -10,11 +10,10 @@ void DeviceObject::readProperty(PropertyID propertyId, uint32_t start, uint32_t&
|
|||||||
pushWord(OT_DEVICE, data);
|
pushWord(OT_DEVICE, data);
|
||||||
break;
|
break;
|
||||||
case PID_SERIAL_NUMBER:
|
case PID_SERIAL_NUMBER:
|
||||||
pushWord(_manufacturerId, data);
|
pushByteArray((uint8_t*)_knxSerialNumber, 6, data);
|
||||||
pushInt(_bauNumber, data + 2);
|
|
||||||
break;
|
break;
|
||||||
case PID_MANUFACTURER_ID:
|
case PID_MANUFACTURER_ID:
|
||||||
pushWord(_manufacturerId, data);
|
pushByteArray(&_knxSerialNumber[0], 2, data);
|
||||||
break;
|
break;
|
||||||
case PID_DEVICE_CONTROL:
|
case PID_DEVICE_CONTROL:
|
||||||
*data = _deviceControl;
|
*data = _deviceControl;
|
||||||
@ -220,22 +219,36 @@ void DeviceObject::progMode(bool value)
|
|||||||
|
|
||||||
uint16_t DeviceObject::manufacturerId()
|
uint16_t DeviceObject::manufacturerId()
|
||||||
{
|
{
|
||||||
return _manufacturerId;
|
uint16_t manufacturerId;
|
||||||
|
popWord(manufacturerId, &_knxSerialNumber[0]);
|
||||||
|
return manufacturerId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceObject::manufacturerId(uint16_t value)
|
void DeviceObject::manufacturerId(uint16_t value)
|
||||||
{
|
{
|
||||||
_manufacturerId = value;
|
pushWord(value, &_knxSerialNumber[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t DeviceObject::bauNumber()
|
uint32_t DeviceObject::bauNumber()
|
||||||
{
|
{
|
||||||
return _bauNumber;
|
uint32_t bauNumber;
|
||||||
|
popInt(bauNumber, &_knxSerialNumber[2]);
|
||||||
|
return bauNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceObject::bauNumber(uint32_t value)
|
void DeviceObject::bauNumber(uint32_t value)
|
||||||
{
|
{
|
||||||
_bauNumber = value;
|
pushInt(value, &_knxSerialNumber[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t* DeviceObject::knxSerialNumber()
|
||||||
|
{
|
||||||
|
return _knxSerialNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceObject::knxSerialNumber(const uint8_t* value)
|
||||||
|
{
|
||||||
|
pushByteArray(value, 6, _knxSerialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DeviceObject::orderNumber()
|
const char* DeviceObject::orderNumber()
|
||||||
|
@ -29,6 +29,8 @@ public:
|
|||||||
void manufacturerId(uint16_t value);
|
void manufacturerId(uint16_t value);
|
||||||
uint32_t bauNumber();
|
uint32_t bauNumber();
|
||||||
void bauNumber(uint32_t value);
|
void bauNumber(uint32_t value);
|
||||||
|
const uint8_t* knxSerialNumber();
|
||||||
|
void knxSerialNumber(const uint8_t* value);
|
||||||
const char* orderNumber();
|
const char* orderNumber();
|
||||||
void orderNumber(const char* value);
|
void orderNumber(const char* value);
|
||||||
const uint8_t* hardwareType();
|
const uint8_t* hardwareType();
|
||||||
@ -51,8 +53,7 @@ private:
|
|||||||
uint8_t _routingCount = 0;
|
uint8_t _routingCount = 0;
|
||||||
uint8_t _prgMode = 0;
|
uint8_t _prgMode = 0;
|
||||||
uint16_t _ownAddress = 0;
|
uint16_t _ownAddress = 0;
|
||||||
uint16_t _manufacturerId = 0xfa; //Default to KNXA
|
uint8_t _knxSerialNumber[6] = { 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00 }; //Default to KNXA (0xFA)
|
||||||
uint32_t _bauNumber = 0;
|
|
||||||
char _orderNumber[10] = "";
|
char _orderNumber[10] = "";
|
||||||
uint8_t _hardwareType[6] = { 0, 0, 0, 0, 0, 0};
|
uint8_t _hardwareType[6] = { 0, 0, 0, 0, 0, 0};
|
||||||
uint16_t _version = 0;
|
uint16_t _version = 0;
|
||||||
|
@ -23,12 +23,6 @@ void RfDataLinkLayer::loop()
|
|||||||
|
|
||||||
bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
||||||
{
|
{
|
||||||
if (!_enabled)
|
|
||||||
{
|
|
||||||
dataConReceived(frame, false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no serial number of domain address was set,
|
// If no serial number of domain address was set,
|
||||||
// use our own SN/DoA
|
// use our own SN/DoA
|
||||||
if (frame.rfSerialOrDoA() == nullptr)
|
if (frame.rfSerialOrDoA() == nullptr)
|
||||||
@ -37,10 +31,7 @@ bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
|||||||
// or the RF domain address that was programmed by ETS
|
// or the RF domain address that was programmed by ETS
|
||||||
if (frame.systemBroadcast() == SysBroadcast)
|
if (frame.systemBroadcast() == SysBroadcast)
|
||||||
{
|
{
|
||||||
uint8_t knxSerialNumber[6];
|
frame.rfSerialOrDoA((uint8_t*)_deviceObject.knxSerialNumber());
|
||||||
pushWord(_deviceObject.manufacturerId(), &knxSerialNumber[0]);
|
|
||||||
pushInt(_deviceObject.bauNumber(), &knxSerialNumber[2]);
|
|
||||||
frame.rfSerialOrDoA(&knxSerialNumber[0]);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -61,6 +52,12 @@ bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
|||||||
// bidirectional device, battery is ok, signal strength indication is void (no measurement)
|
// bidirectional device, battery is ok, signal strength indication is void (no measurement)
|
||||||
frame.rfInfo(0x02);
|
frame.rfInfo(0x02);
|
||||||
|
|
||||||
|
if (!_enabled)
|
||||||
|
{
|
||||||
|
dataConReceived(frame, false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Is queueing really required?
|
// TODO: Is queueing really required?
|
||||||
// According to the spec. the upper layer may only send a new L_Data.req if it received
|
// According to the spec. the upper layer may only send a new L_Data.req if it received
|
||||||
// the L_Data.con for the previous L_Data.req.
|
// the L_Data.con for the previous L_Data.req.
|
||||||
|
Loading…
Reference in New Issue
Block a user