mirror of
https://github.com/thelsing/knx.git
synced 2025-08-13 13:46:20 +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,
|
||||
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
|
||||
// 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);
|
||||
}
|
||||
|
||||
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
|
||||
// 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);
|
||||
}
|
||||
|
||||
void Bau27B0::individualAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, uint16_t newIndividualAddress,
|
||||
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
|
||||
// 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);
|
||||
}
|
||||
|
||||
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
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
@ -362,7 +362,6 @@ void BauSystemB::nextRestartState()
|
||||
void BauSystemB::systemNetworkParameterReadIndication(Priority priority, HopCountType hopType, uint16_t objectType,
|
||||
uint16_t propertyId, uint8_t* testInfo, uint16_t testInfoLength)
|
||||
{
|
||||
uint8_t knxSerialNumber[6];
|
||||
uint8_t operand;
|
||||
|
||||
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))
|
||||
{
|
||||
// Send reply. testResult data is KNX serial number
|
||||
pushWord(_deviceObj.manufacturerId(), &knxSerialNumber[0]);
|
||||
pushInt(_deviceObj.bauNumber(), &knxSerialNumber[2]);
|
||||
_appLayer.systemNetworkParameterReadResponse(priority, hopType, objectType, propertyId,
|
||||
testInfo, testInfoLength, knxSerialNumber, sizeof(knxSerialNumber));
|
||||
testInfo, testInfoLength, (uint8_t*) _deviceObj.knxSerialNumber(), 6);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -47,16 +47,16 @@ void CemiServer::dataConfirmationToTunnel(CemiFrame& frame)
|
||||
|
||||
void CemiServer::dataIndicationToTunnel(CemiFrame& frame)
|
||||
{
|
||||
static uint8_t lfn = 0;
|
||||
#if MEDIUM_TYPE == 2
|
||||
|
||||
uint8_t data[frame.dataLength() + 10];
|
||||
data[0] = L_data_ind;
|
||||
data[1] = 10;
|
||||
data[2] = 0x02; // RF Info add. info
|
||||
data[3] = 0x08; // RF info length
|
||||
data[4] = 0x02; // RF info field (batt ok)
|
||||
pushByteArray(_bau.deviceObject().rfDomainAddress(), 6, &data[5]);
|
||||
data[11] = lfn;
|
||||
lfn = (lfn + 1) & 0x7;
|
||||
data[0] = L_data_ind; // Message Code
|
||||
data[1] = 10; // Total additional info length
|
||||
data[2] = 0x02; // RF add. info: type
|
||||
data[3] = 0x08; // RF add. info: length
|
||||
data[4] = frame.rfInfo(); // RF add. info: info field (batt ok, bidir)
|
||||
pushByteArray(frame.rfSerialOrDoA(), 6, &data[5]); // RF add. info:Serial or Domain Address
|
||||
data[11] = frame.rfLfn(); // RF add. info: link layer frame number
|
||||
memcpy(&data[12], &frame.data()[2], frame.dataLength() - 2);
|
||||
|
||||
CemiFrame tmpFrame(data, sizeof(data));
|
||||
@ -69,6 +69,19 @@ void CemiServer::dataIndicationToTunnel(CemiFrame& frame)
|
||||
printHex(" frame: ", tmpFrame.data(), tmpFrame.dataLength());
|
||||
|
||||
_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();
|
||||
// }
|
||||
|
||||
// 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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
return sendFrame(frame);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
uint8_t* DataLinkLayer::frameData(CemiFrame& frame)
|
||||
|
@ -10,11 +10,10 @@ void DeviceObject::readProperty(PropertyID propertyId, uint32_t start, uint32_t&
|
||||
pushWord(OT_DEVICE, data);
|
||||
break;
|
||||
case PID_SERIAL_NUMBER:
|
||||
pushWord(_manufacturerId, data);
|
||||
pushInt(_bauNumber, data + 2);
|
||||
pushByteArray((uint8_t*)_knxSerialNumber, 6, data);
|
||||
break;
|
||||
case PID_MANUFACTURER_ID:
|
||||
pushWord(_manufacturerId, data);
|
||||
pushByteArray(&_knxSerialNumber[0], 2, data);
|
||||
break;
|
||||
case PID_DEVICE_CONTROL:
|
||||
*data = _deviceControl;
|
||||
@ -220,22 +219,36 @@ void DeviceObject::progMode(bool value)
|
||||
|
||||
uint16_t DeviceObject::manufacturerId()
|
||||
{
|
||||
return _manufacturerId;
|
||||
uint16_t manufacturerId;
|
||||
popWord(manufacturerId, &_knxSerialNumber[0]);
|
||||
return manufacturerId;
|
||||
}
|
||||
|
||||
void DeviceObject::manufacturerId(uint16_t value)
|
||||
{
|
||||
_manufacturerId = value;
|
||||
pushWord(value, &_knxSerialNumber[0]);
|
||||
}
|
||||
|
||||
uint32_t DeviceObject::bauNumber()
|
||||
{
|
||||
return _bauNumber;
|
||||
uint32_t bauNumber;
|
||||
popInt(bauNumber, &_knxSerialNumber[2]);
|
||||
return bauNumber;
|
||||
}
|
||||
|
||||
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()
|
||||
|
@ -29,6 +29,8 @@ public:
|
||||
void manufacturerId(uint16_t value);
|
||||
uint32_t bauNumber();
|
||||
void bauNumber(uint32_t value);
|
||||
const uint8_t* knxSerialNumber();
|
||||
void knxSerialNumber(const uint8_t* value);
|
||||
const char* orderNumber();
|
||||
void orderNumber(const char* value);
|
||||
const uint8_t* hardwareType();
|
||||
@ -51,8 +53,7 @@ private:
|
||||
uint8_t _routingCount = 0;
|
||||
uint8_t _prgMode = 0;
|
||||
uint16_t _ownAddress = 0;
|
||||
uint16_t _manufacturerId = 0xfa; //Default to KNXA
|
||||
uint32_t _bauNumber = 0;
|
||||
uint8_t _knxSerialNumber[6] = { 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00 }; //Default to KNXA (0xFA)
|
||||
char _orderNumber[10] = "";
|
||||
uint8_t _hardwareType[6] = { 0, 0, 0, 0, 0, 0};
|
||||
uint16_t _version = 0;
|
||||
|
@ -23,12 +23,6 @@ void RfDataLinkLayer::loop()
|
||||
|
||||
bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
||||
{
|
||||
if (!_enabled)
|
||||
{
|
||||
dataConReceived(frame, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
// If no serial number of domain address was set,
|
||||
// use our own SN/DoA
|
||||
if (frame.rfSerialOrDoA() == nullptr)
|
||||
@ -37,10 +31,7 @@ bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
||||
// or the RF domain address that was programmed by ETS
|
||||
if (frame.systemBroadcast() == SysBroadcast)
|
||||
{
|
||||
uint8_t knxSerialNumber[6];
|
||||
pushWord(_deviceObject.manufacturerId(), &knxSerialNumber[0]);
|
||||
pushInt(_deviceObject.bauNumber(), &knxSerialNumber[2]);
|
||||
frame.rfSerialOrDoA(&knxSerialNumber[0]);
|
||||
frame.rfSerialOrDoA((uint8_t*)_deviceObject.knxSerialNumber());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -61,6 +52,12 @@ bool RfDataLinkLayer::sendFrame(CemiFrame& frame)
|
||||
// bidirectional device, battery is ok, signal strength indication is void (no measurement)
|
||||
frame.rfInfo(0x02);
|
||||
|
||||
if (!_enabled)
|
||||
{
|
||||
dataConReceived(frame, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: Is queueing really required?
|
||||
// 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.
|
||||
|
Loading…
Reference in New Issue
Block a user