// Set value of given attribute. int CGXDLMSMBusSlavePortSetup::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { m_DefaultBaud = (BAUDRATE) value.ToInteger(); } else if (index == 3) { m_AvailableBaud = (BAUDRATE) value.ToInteger(); } else if (index == 4) { m_AddressState = (ADDRESS_STATE) value.ToInteger(); } else if (index == 5) { m_BusAddress = value.ToInteger(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
/* * Add Register Monitor object. */ void AddRegisterMonitor(CGXDLMSObjectCollection& items, CGXDLMSRegister* pRegister) { CGXDLMSRegisterMonitor* pRm = new CGXDLMSRegisterMonitor("0.0.16.1.0.255"); CGXDLMSVariant threshold; vector<CGXDLMSVariant> thresholds; threshold.Add("Gurux1", 6); thresholds.push_back(threshold); threshold.Clear(); threshold.Add("Gurux2", 6); thresholds.push_back(threshold); pRm->SetThresholds(thresholds); CGXDLMSMonitoredValue mv; mv.Update(pRegister, 2); pRm->SetMonitoredValue(mv); CGXDLMSActionSet * action = new CGXDLMSActionSet(); string ln; pRm->GetLogicalName(ln); action->GetActionDown().SetLogicalName(ln); action->GetActionDown().SetScriptSelector(1); pRm->GetLogicalName(ln); action->GetActionUp().SetLogicalName(ln); action->GetActionUp().SetScriptSelector(1); pRm->GetActions().push_back(action); items.push_back(pRm); }
int CGXDLMSProfileGeneric::GetProfileGenericData(int selector, CGXDLMSVariant& parameters, CGXByteBuffer& reply) { //If all data is read. if (selector == 0 || parameters.vt == DLMS_DATA_TYPE_NONE) { return GetData(GetBuffer(), reply); } std::vector< std::vector<CGXDLMSVariant> >& table = GetBuffer(); std::vector< std::vector<CGXDLMSVariant> > items; if (selector == 1) //Read by range { int ret; CGXDLMSVariant value; if ((ret = CGXDLMSClient::ChangeType(parameters.Arr[1], DLMS_DATA_TYPE_DATETIME, value)) != 0) { return ret; } struct tm tmp = value.dateTime.GetValue(); time_t start = mktime(&tmp); value.Clear(); if ((ret = CGXDLMSClient::ChangeType(parameters.Arr[2], DLMS_DATA_TYPE_DATETIME, value)) != 0) { return ret; } tmp = value.dateTime.GetValue(); time_t end = mktime(&tmp); value.Clear(); for (std::vector< std::vector<CGXDLMSVariant> >::iterator row = table.begin(); row != table.end(); ++row) { tmp = (*row)[0].dateTime.GetValue(); time_t tm = mktime(&tmp); if (tm >= start && tm <= end) { items.push_back(*row); } } } else if (selector == 2) //Read by entry. { int start = parameters.Arr[0].ToInteger(); int count = parameters.Arr[1].ToInteger(); for (int pos = 0; pos < count; ++pos) { if ((unsigned int) (pos + start) == table.size()) { break; } items.push_back(table[start + pos]); } } else { return DLMS_ERROR_CODE_INVALID_PARAMETER; } return GetData(items, reply); }
// Set value of given attribute. int CGXDLMSGPRSSetup::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); return ERROR_CODES_OK; } else if (index == 2) { if (value.vt == DLMS_DATA_TYPE_STRING) { m_APN = value.ToString(); } else { CGXDLMSVariant tmp; int ret; if ((ret = CGXDLMSClient::ChangeType(value.byteArr, DLMS_DATA_TYPE_STRING, tmp)) != 0) { return ret; } m_APN = tmp.strVal; } value = m_APN; } else if (index == 3) { m_PINCode = value.uiVal; } else if (index == 4) { m_DefaultQualityOfService.SetPrecedence(value.Arr[0].Arr[0].iVal); m_DefaultQualityOfService.SetDelay(value.Arr[0].Arr[1].iVal); m_DefaultQualityOfService.SetReliability(value.Arr[0].Arr[2].iVal); m_DefaultQualityOfService.SetPeakThroughput(value.Arr[0].Arr[3].iVal); m_DefaultQualityOfService.SetMeanThroughput(value.Arr[0].Arr[4].iVal); m_RequestedQualityOfService.SetPrecedence(value.Arr[1].Arr[0].iVal); m_RequestedQualityOfService.SetDelay(value.Arr[1].Arr[1].iVal); m_RequestedQualityOfService.SetReliability(value.Arr[1].Arr[2].iVal); m_RequestedQualityOfService.SetPeakThroughput(value.Arr[1].Arr[3].iVal); m_RequestedQualityOfService.SetMeanThroughput(value.Arr[1].Arr[4].iVal); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
/////////////////////////////////////////////////////////////////////// //Add Logical Device Name. 123456 is meter serial number. /////////////////////////////////////////////////////////////////////// // COSEM Logical Device Name is defined as an octet-string of 16 octets. // The first three octets uniquely identify the manufacturer of the device and it corresponds // to the manufacturer's identification in IEC 62056-21. // The following 13 octets are assigned by the manufacturer. //The manufacturer is responsible for guaranteeing the uniqueness of these octets. CGXDLMSData* AddLogicalDeviceName(CGXDLMSObjectCollection& items, unsigned long sn) { char buff[17]; #if defined(_WIN32) || defined(_WIN64)//Windows sprintf_s(buff, "GRX%.13d", sn); #else sprintf(buff, "GRX%.13d", sn); #endif CGXDLMSVariant id; id.Add((const char*)buff, 16); CGXDLMSData* ldn = new CGXDLMSData("0.0.42.0.0.255"); ldn->SetValue(id); items.push_back(ldn); return ldn; }
/* * Add Electricity ID 1. */ void AddElectricityID1(CGXDLMSObjectCollection& items, unsigned long sn) { char buff[17]; #if defined(_WIN32) || defined(_WIN64)//Windows sprintf_s(buff, "GRX%.13d", sn); #else sprintf(buff, "GRX%.13d", sn); #endif CGXDLMSVariant id; id.Add((const char*)buff, 16); CGXDLMSData* d = new CGXDLMSData("1.1.0.0.0.255"); d->SetValue(id); d->GetAttributes().push_back(CGXDLMSAttribute(2, DLMS_DATA_TYPE_STRING)); items.push_back(d); }
// Set value of given attribute. int CGXDLMSMessageHandler::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { m_ListeningWindow.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { for(vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { CGXDLMSVariant tmp; CGXDLMSClient::ChangeType(it->Arr[0].byteArr, DLMS_DATA_TYPE_DATETIME, tmp); CGXDateTime start = tmp.dateTime; CGXDLMSClient::ChangeType(it->Arr[1].byteArr, DLMS_DATA_TYPE_DATETIME, tmp); CGXDateTime end = tmp.dateTime; m_ListeningWindow.push_back(std::pair<CGXDateTime, CGXDateTime>(start, end)); } } } else if (index == 3) { m_AllowedSenders.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { for(vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { m_AllowedSenders.push_back((char*) &it->byteArr[0]); } } } else if (index == 4) { m_SendersAndActions.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { for(vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { string id((char*) &it->Arr[0].byteArr[0]); //Object[] tmp2 = (Object[]) tmp[1]; /*TODO: KeyValuePair<int, GXDLMSScriptAction> executed_script = new KeyValuePair<int, GXDLMSScriptAction>(Convert.ToInt32(tmp2[1], tmp2[2])); m_SendersAndActions.Add(new KeyValuePair<string, KeyValuePair<int, GXDLMSScriptAction>>(id, tmp[1] as GXDateTime)); * */ } } } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
// Set value of given attribute. int CGXDLMSSpecialDaysTable::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { m_Entries.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { CGXDLMSVariant tmp; for (vector<CGXDLMSVariant>::iterator item = value.Arr.begin(); item != value.Arr.end(); ++item) { CGXDLMSSpecialDay it; it.SetIndex((*item).Arr[0].ToInteger()); CGXDLMSClient::ChangeType((*item).Arr[1].byteArr, DLMS_DATA_TYPE_DATE, tmp); it.SetDate(tmp.dateTime); it.SetDayId((*item).Arr[2].ToInteger()); m_Entries.push_back(it); } } } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
int CGXDLMSRegister::SetValue(CGXDLMSSettings* settings, int index, CGXDLMSVariant& value) { if (index == 1) { return SetLogicalName(this, value); } else if (index == 2) { if (m_Scaler != 0) { double val = GetScaler(); val *= value.ToDouble(); CGXDLMSVariant tmp(val); SetValue(tmp); } else { SetValue(value); } } else if (index == 3 && value.vt == DLMS_DATA_TYPE_STRUCTURE) { m_Scaler = value.Arr[0].ToInteger(); m_Unit = value.Arr[1].ToInteger(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
int CGXDLMSObject::SetLogicalName(CGXDLMSObject * target, CGXDLMSVariant& value) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(target->m_LN, value.byteArr, 6); return ERROR_CODES_OK; }
// Set value of given attribute. int CGXDLMSHdlcSetup::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { m_CommunicationSpeed = (BAUDRATE) value.ToInteger(); } else if (index == 3) { m_WindowSizeTransmit = value.ToInteger(); } else if (index == 4) { m_WindowSizeReceive = value.ToInteger(); } else if (index == 5) { m_MaximumInfoLengthTransmit = value.ToInteger(); } else if (index == 6) { m_MaximumInfoLengthReceive = value.ToInteger(); } else if (index == 7) { m_InterCharachterTimeout = value.ToInteger(); } else if (index == 8) { m_InactivityTimeout = value.ToInteger(); } else if (index == 9) { m_DeviceAddress = value.ToInteger(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
// Returns value of given attribute. int CGXDLMSActionSchedule::GetValue(int index, unsigned char* parameters, int length, CGXDLMSVariant& value) { if (index == 1) { GXHelpers::AddRange(value.byteArr, m_LN, 6); value.vt = DLMS_DATA_TYPE_OCTET_STRING; return ERROR_CODES_OK; } if (index == 2) { vector<unsigned char> stream; stream.push_back(DLMS_DATA_TYPE_STRUCTURE); stream.push_back(2); CGXDLMSVariant tmp; tmp.Add(GetExecutedScriptLogicalName()); CGXOBISTemplate::SetData(stream, DLMS_DATA_TYPE_OCTET_STRING, tmp); CGXOBISTemplate::SetData(stream, DLMS_DATA_TYPE_UINT16, GetExecutedScriptSelector()); value = stream; return ERROR_CODES_OK; } if (index == 3) { value = GetType(); return ERROR_CODES_OK; } if (index == 4) { vector<unsigned char> stream; stream.push_back(DLMS_DATA_TYPE_ARRAY); CGXOBISTemplate::SetObjectCount(GetExecutionTime().size(), stream); for (vector<CGXDateTime>::iterator it = m_ExecutionTime.begin(); it != m_ExecutionTime.end(); ++it) { stream.push_back(DLMS_DATA_TYPE_STRUCTURE); stream.push_back(2); //Count CGXOBISTemplate::SetData(stream, DLMS_DATA_TYPE_TIME, *it); //Time CGXOBISTemplate::SetData(stream, DLMS_DATA_TYPE_DATE, *it); //Date } value = stream; return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
// Set value of given attribute. int CGXDLMSMBusMasterPortSetup::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { m_CommSpeed = (BAUDRATE) value.ToInteger(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
int CGXDLMSDemandRegister::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); return ERROR_CODES_OK; } else if (index == 2) { SetCurrentAvarageValue(value.lVal); } else if (index == 3) { SetLastAvarageValue(value); } else if (index == 4) { m_Scaler = value.Arr[0].bVal; m_Unit = value.Arr[1].bVal; } else if (index == 5) { SetStatus(value.lVal); } else if (index == 6) { CGXDLMSVariant tmp; CGXDLMSClient::ChangeType(value.byteArr, DLMS_DATA_TYPE_DATETIME, tmp); SetCaptureTime(tmp.dateTime); } else if (index == 7) { CGXDLMSVariant tmp; CGXDLMSClient::ChangeType(value.byteArr, DLMS_DATA_TYPE_DATETIME, tmp); SetStartTimeCurrent(tmp.dateTime); } else if (index == 8) { SetPeriod(value.ulVal); } else if (index == 9) { SetNumberOfPeriods(value.lVal); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
int CGXDLMSAssociationShortName::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); return ERROR_CODES_OK; } else if (index == 2) { m_ObjectList.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { for(vector<CGXDLMSVariant>::iterator item = value.Arr.begin(); item != value.Arr.end(); ++item) { int sn = item->Arr[0].ToInteger(); CGXDLMSObject* pObj = GetParent()->FindBySN(sn); if (pObj == NULL) { OBJECT_TYPE type = (OBJECT_TYPE) item->Arr[1].ToInteger(); int version = item->Arr[2].ToInteger(); string ln; CGXOBISTemplate::GetLogicalName(&(*item).Arr[3].byteArr[0], ln); pObj = CGXDLMSObjectFactory::CreateObject(type); pObj->SetLogicalName(ln); pObj->SetShortName(sn); pObj->SetVersion(version); } m_ObjectList.push_back(pObj); } } } else if (index == 3) { if (value.vt == DLMS_DATA_TYPE_NONE) { for(vector<CGXDLMSObject*>::iterator it = m_ObjectList.begin(); it != m_ObjectList.end(); ++it) { for(int pos = 1; pos != (*it)->GetAttributeCount(); ++pos) { (*it)->SetAccess(pos, ACCESSMODE_NONE); } } } else { UpdateAccessRights(value); } } return ERROR_CODES_INVALID_PARAMETER; }
int CGXDLMSDemandRegister::GetValue(int index, int selector, CGXDLMSVariant& parameters, CGXDLMSVariant& value) { if (index == 1) { GXHelpers::AddRange(value.byteArr, m_LN, 6); value.vt = DLMS_DATA_TYPE_OCTET_STRING; return ERROR_CODES_OK; } if (index == 2) { value = GetCurrentAvarageValue(); return ERROR_CODES_OK; } if (index == 3) { value = GetLastAvarageValue(); return ERROR_CODES_OK; } if (index == 4) { value.Clear(); value.vt = DLMS_DATA_TYPE_STRUCTURE; value.Arr.push_back(m_Scaler); value.Arr.push_back(m_Unit); return ERROR_CODES_OK; } if (index == 5) { value = GetStatus(); return ERROR_CODES_OK; } if (index == 6) { value = GetCaptureTime(); return ERROR_CODES_OK; } if (index == 7) { value = GetStartTimeCurrent(); return ERROR_CODES_OK; } if (index == 8) { value = GetPeriod(); return ERROR_CODES_OK; } if (index == 9) { value = GetNumberOfPeriods(); return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
// Set value of given attribute. int CGXDLMSModemConfiguration::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); return ERROR_CODES_OK; } else if (index == 2) { m_CommunicationSpeed = (BAUDRATE) value.bVal; return ERROR_CODES_OK; } else if (index == 3) { m_InitialisationStrings.clear(); int ret; for (vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { CGXDLMSModemInitialisation item; CGXDLMSVariant tmp; if((ret = CGXDLMSClient::ChangeType(it->Arr[0].byteArr, DLMS_DATA_TYPE_STRING, tmp)) != ERROR_CODES_OK) { return ret; } item.SetRequest(tmp.ToString()); if((ret = CGXDLMSClient::ChangeType(it->Arr[1].byteArr, DLMS_DATA_TYPE_STRING, tmp)) != ERROR_CODES_OK) { return ret; } item.SetResponse(tmp.ToString()); if (it->Arr.size() > 2) { item.SetDelay(it->Arr[2].uiVal); } m_InitialisationStrings.push_back(item); } return ERROR_CODES_OK; } else if (index == 4) { m_ModemProfile.clear(); int ret; for (vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { CGXDLMSVariant tmp; if((ret = CGXDLMSClient::ChangeType(it->byteArr, DLMS_DATA_TYPE_STRING, tmp)) != ERROR_CODES_OK) { return ret; } m_ModemProfile.push_back(tmp.ToString()); } return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
/* * Set value of given attribute. */ int CGXDLMSAutoAnswer::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); return ERROR_CODES_OK; } if (index == 2) { SetMode((AUTO_CONNECT_MODE) value.lVal); return ERROR_CODES_OK; } if (index == 3) { m_ListeningWindow.clear(); for (vector<CGXDLMSVariant>::iterator item = value.Arr.begin(); item != value.Arr.end(); ++item) { CGXDLMSVariant start, end; CGXDLMSClient::ChangeType((*item).Arr[0].byteArr, DLMS_DATA_TYPE_DATETIME, start); CGXDLMSClient::ChangeType((*item).Arr[1].byteArr, DLMS_DATA_TYPE_DATETIME, end); m_ListeningWindow.push_back(std::pair< CGXDateTime, CGXDateTime>(start.dateTime, end.dateTime)); } return ERROR_CODES_OK; } if (index == 4) { SetStatus((AUTO_ANSWER_STATUS) value.lVal); return ERROR_CODES_OK; } if (index == 5) { SetNumberOfCalls(value.lVal); return ERROR_CODES_OK; } if (index == 6) { m_NumberOfRingsInListeningWindow = m_NumberOfRingsOutListeningWindow = 0; if (value.vt != DLMS_DATA_TYPE_NONE) { m_NumberOfRingsInListeningWindow = value.Arr[0].ToInteger(); m_NumberOfRingsOutListeningWindow = value.Arr[1].ToInteger(); } return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
// Set value of given attribute. int CGXDLMSImageTransfer::SetValue(CGXDLMSSettings* settings, int index, CGXDLMSVariant& value) { if (index == 1) { return SetLogicalName(this, value); } else if (index == 2) { m_ImageBlockSize = value.ToInteger(); } else if (index == 3) { m_ImageTransferredBlocksStatus = value.ToString(); } else if (index == 4) { m_ImageFirstNotTransferredBlockNumber = value.ToInteger(); } else if (index == 5) { m_ImageTransferEnabled = value.boolVal; } else if (index == 6) { m_ImageTransferStatus = (IMAGE_TRANSFER_STATUS) value.ToInteger(); } else if (index == 7) { m_ImageActivateInfo.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { CGXDLMSVariant tmp; for (std::vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { CGXDLMSImageActivateInfo item; item.SetSize((*it).Arr[0].ToInteger()); CGXDLMSClient::ChangeType((*it).Arr[1], DLMS_DATA_TYPE_STRING, tmp); item.SetIdentification(tmp.ToString()); CGXDLMSClient::ChangeType((*it).Arr[2], DLMS_DATA_TYPE_STRING, tmp); item.SetSignature(tmp.ToString()); m_ImageActivateInfo.push_back(item); } } } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
// Set value of given attribute. int CGXDLMSIecHdlcSetup::SetValue(CGXDLMSSettings* settings, int index, CGXDLMSVariant& value) { if (index == 1) { return SetLogicalName(this, value); } else if (index == 2) { m_CommunicationSpeed = (BAUDRATE) value.ToInteger(); } else if (index == 3) { m_WindowSizeTransmit = value.ToInteger(); } else if (index == 4) { m_WindowSizeReceive = value.ToInteger(); } else if (index == 5) { m_MaximumInfoLengthTransmit = value.ToInteger(); } else if (index == 6) { m_MaximumInfoLengthReceive = value.ToInteger(); } else if (index == 7) { m_InterCharachterTimeout = value.ToInteger(); } else if (index == 8) { m_InactivityTimeout = value.ToInteger(); } else if (index == 9) { m_DeviceAddress = value.ToInteger(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
bool CGXDLMSVariant::Equals(CGXDLMSVariant& item) { if (vt != item.vt) { return false; } int size = GetSize(); if (size == -1 || size != item.GetSize()) { return false; } if (size != 0) { return memcmp(&this->bVal, &item.bVal, size) == 0; } return true; }
// Set value of given attribute. int CGXDLMSActionSchedule::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); return ERROR_CODES_OK; } else if (index == 2) { //CGXDLMSVariant tmp; //CGXDLMSClient::ChangeType(value.Arr[0].byteArr, DLMS_DATA_TYPE_OCTET_STRING, tmp); SetExecutedScriptLogicalName(value.Arr[0].ToString()); SetExecutedScriptSelector(value.Arr[1].lVal); return ERROR_CODES_OK; } else if (index == 3) { SetType((SINGLE_ACTION_SCHEDULE_TYPE) value.lVal); return ERROR_CODES_OK; } else if (index == 4) { m_ExecutionTime.clear(); for (vector<CGXDLMSVariant>::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { CGXDLMSVariant time, date; CGXDLMSClient::ChangeType((*it).Arr[0].byteArr, DLMS_DATA_TYPE_TIME, time); CGXDLMSClient::ChangeType((*it).Arr[1].byteArr, DLMS_DATA_TYPE_DATE, date); tm tm2 = time.dateTime.GetValue(); tm dt2 = date.dateTime.GetValue(); m_ExecutionTime.push_back(CGXDateTime(dt2.tm_year, dt2.tm_mon, dt2.tm_mday, tm2.tm_hour, tm2.tm_min, tm2.tm_sec, 0)); } return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
int CGXDLMSRegister::GetValue(int index, int selector, CGXDLMSVariant& parameters, CGXDLMSVariant& value) { if (index == 1) { return GetLogicalName(this, value); } if (index == 2) { value = m_Value; return ERROR_CODES_OK; } if (index == 3) { value.Clear(); value.vt = DLMS_DATA_TYPE_STRUCTURE; value.Arr.push_back(m_Scaler); value.Arr.push_back(m_Unit); return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
int CGXDLMSExtendedRegister::GetValue(int index, unsigned char* parameters, int length, CGXDLMSVariant& value) { if (index == 1) { GXHelpers::AddRange(value.byteArr, m_LN, 6); value.vt = DLMS_DATA_TYPE_OCTET_STRING; return ERROR_CODES_OK; } if (index == 2) { value = m_Value; return ERROR_CODES_OK; } if (index == 3) { value.Clear(); value.vt = DLMS_DATA_TYPE_STRUCTURE; value.Arr.push_back(m_Scaler); value.Arr.push_back(m_Unit); return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
int CGXCommunication::ReadRowsByEntry( CGXDLMSProfileGeneric* pObject, unsigned int index, unsigned int count, CGXDLMSVariant& rows) { rows.Clear(); int ret; std::vector<CGXByteBuffer> data; CGXReplyData reply; if ((ret = m_Parser->ReadRowsByEntry(pObject, index, count, data)) != 0 || (ret = ReadDataBlock(data, reply)) != 0 || (ret = m_Parser->UpdateValue(*pObject, 2, reply.GetValue())) != 0) { return ret; } //Get rows value as string. //Note! This is for example. It's faster if you handle read COSEM object directly. std::vector<std::string> values; pObject->GetValues(values); rows = values[2 - 1]; return DLMS_ERROR_CODE_OK; }
int CGXDLMSAssociationLogicalName::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { m_ObjectList.clear(); if (value.vt != DLMS_DATA_TYPE_NONE) { for (std::vector<CGXDLMSVariant >::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { OBJECT_TYPE type = (OBJECT_TYPE) (*it).Arr[0].ToInteger(); int version = (*it).Arr[1].ToInteger(); string ln; CGXOBISTemplate::GetLogicalName(&(*it).Arr[2].byteArr[0], ln); CGXDLMSObject* pObj = GetParent()->FindByLN(type, ln); if (pObj == NULL) { pObj = CGXDLMSObjectFactory::CreateObject(type); pObj->SetLogicalName(ln); pObj->SetVersion(version); } UpdateAccessRights(pObj, (*it).Arr[3]); m_ObjectList.push_back(pObj); } } } else if (index == 3) { m_AssociatedPartnersId = value; } else if (index == 4) { m_ApplicationContextName = value; } else if (index == 5) { m_XDLMSContextInfo = value; } else if (index == 6) { m_AuthenticationMechanismMame = value; } else if (index == 7) { m_Secret = value; } else if (index == 8) { m_AssociationStatus = (GX_ASSOCIATION_STATUS) value.ToInteger(); } else if (index == 9) { m_SecuritySetupReference = value.ToString(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
/* * Set value of given attribute. */ int CGXDLMSProfileGeneric::SetValue(int index, CGXDLMSVariant& value) { int ret; if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { if (m_CaptureObjects.size() == 0) { //Read capture objects first. return ERROR_CODES_INVALID_PARAMETER; } m_Buffer.clear(); if (value.vt != DLMS_DATA_TYPE_NONE) { vector<DLMS_DATA_TYPE> types; DLMS_DATA_TYPE type; for (std::vector<std::pair<CGXDLMSObject*, CGXDLMSCaptureObject*> >::iterator it = m_CaptureObjects.begin(); it != m_CaptureObjects.end(); ++it) { if ((ret = (*it).first->GetUIDataType((*it).second->GetAttributeIndex(), type)) != 0) { return ret; } types.push_back(type); } for (std::vector<CGXDLMSVariant >::iterator row = value.Arr.begin(); row != value.Arr.end(); ++row) { if ((*row).Arr.size() != m_CaptureObjects.size()) { //Number of columns do not match. return ERROR_CODES_INVALID_PARAMETER; } for(unsigned int a = 0; a < (*row).Arr.size(); ++a) { CGXDLMSVariant data = (*row).Arr[a]; DLMS_DATA_TYPE type = types[a]; if (type != DLMS_DATA_TYPE_NONE && data.vt == DLMS_DATA_TYPE_OCTET_STRING) { unsigned char* pBuff = &data.byteArr[0]; int size = data.byteArr.size(); if ((ret = CGXOBISTemplate::GetData(pBuff, size, type, (*row).Arr[a])) != 0) { return ret; } } std::pair<CGXDLMSObject*, CGXDLMSCaptureObject*> item = m_CaptureObjects[a]; if (item.first->GetObjectType() == OBJECT_TYPE_REGISTER && item.second->GetAttributeIndex() == 2) { double scaler = ((CGXDLMSRegister*) item.first)->GetScaler(); if (scaler != 1) { row[a] = data.ToDouble() * scaler; } } } m_Buffer.push_back(row->Arr); } } m_EntriesInUse = m_Buffer.size(); } else if (index == 3) { m_CaptureObjects.clear(); m_Buffer.clear(); m_EntriesInUse = 0; if (value.vt == DLMS_DATA_TYPE_ARRAY) { for (std::vector<CGXDLMSVariant >::iterator it = value.Arr.begin(); it != value.Arr.end(); ++it) { if ((*it).Arr.size() != 4) { //Invalid structure format. return ERROR_CODES_INVALID_PARAMETER; } OBJECT_TYPE type = (OBJECT_TYPE) (*it).Arr[0].ToInteger(); string ln; CGXOBISTemplate::GetLogicalName(&(*it).Arr[1].byteArr[0], ln); CGXDLMSObject* pObj = NULL; if (GetParent() != NULL) { pObj = GetParent()->FindByLN(type, ln); } if(pObj == NULL) { pObj = CGXDLMSObjectFactory::CreateObject(type); pObj->SetLogicalName(ln); } AddCaptureObject(pObj, (*it).Arr[2].ToInteger(), (*it).Arr[3].ToInteger()); } } } else if (index == 4) { m_CapturePeriod = value.ToInteger(); } else if (index == 5) { m_SortMethod = (GX_SORT_METHOD) value.ToInteger(); } else if (index == 6) { if (value.vt == DLMS_DATA_TYPE_NONE) { m_SortObject = NULL; } else { if (value.Arr.size() != 4) { //Invalid structure format. return ERROR_CODES_INVALID_PARAMETER; } OBJECT_TYPE type = (OBJECT_TYPE) value.Arr[0].ToInteger(); string ln; CGXOBISTemplate::GetLogicalName(&value.Arr[1].byteArr[0], ln); int attributeIndex = value.Arr[2].ToInteger(); int dataIndex = value.Arr[3].ToInteger(); m_SortObject = NULL; if (GetParent() != NULL) { m_SortObject = GetParent()->FindByLN(type, ln); } if(m_SortObject == NULL) { m_SortObject = CGXDLMSObjectFactory::CreateObject(type); m_SortObject->SetLogicalName(ln); } m_SortObjectAttributeIndex = attributeIndex; m_SortObjectDataIndex = dataIndex; } } else if (index == 7) { m_EntriesInUse = value.ToInteger(); } else if (index == 8) { m_ProfileEntries = value.ToInteger(); } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
// Set value of given attribute. int CGXDLMSPppSetup::SetValue(int index, CGXDLMSVariant& value) { if (index == 1) { if (value.vt != DLMS_DATA_TYPE_OCTET_STRING || value.GetSize() != 6) { return ERROR_CODES_INVALID_PARAMETER; } memcpy(m_LN, &value.byteArr[0], 6); } else if (index == 2) { if (value.vt == DLMS_DATA_TYPE_STRING) { m_PHYReference = value.ToString(); } else { CGXDLMSVariant tmp; CGXDLMSClient::ChangeType(value.byteArr, DLMS_DATA_TYPE_OCTET_STRING, tmp); m_PHYReference = tmp.ToString(); } } else if (index == 3) { m_LCPOptions.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { for(vector<CGXDLMSVariant>::iterator item = value.Arr.begin(); item != value.Arr.end(); ++item) { CGXDLMSPppSetupLcpOption it; it.SetType((*item).Arr[0].ToInteger()); it.SetLength((*item).Arr[1].ToInteger()); it.SetData((*item).Arr[2]); m_LCPOptions.push_back(it); } } } else if (index == 4) { m_IPCPOptions.clear(); if (value.vt == DLMS_DATA_TYPE_ARRAY) { for(vector<CGXDLMSVariant>::iterator item = value.Arr.begin(); item != value.Arr.end(); ++item) { CGXDLMSPppSetupIPCPOption it; it.SetType((PPP_SETUP_IPCP_OPTION_TYPE)(*item).Arr[0].ToInteger()); it.SetLength((*item).Arr[1].ToInteger()); it.SetData((*item).Arr[2]); m_IPCPOptions.push_back(it); } } } else if (index == 5) { m_UserName = value.Arr[0].byteArr; m_Password = value.Arr[1].byteArr; } else { return ERROR_CODES_INVALID_PARAMETER; } return ERROR_CODES_OK; }
// Returns value of given attribute. int CGXDLMSActivityCalendar::GetValue(int index, int selector, CGXDLMSVariant& parameters, CGXDLMSVariant& value) { CGXByteBuffer data; if (index == 1) { return GetLogicalName(this, value); } if (index == 2) { value.Add(&m_CalendarNameActive[0], m_CalendarNameActive.size()); return ERROR_CODES_OK; } if (index == 3) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); int cnt = m_SeasonProfileActive.size(); //Add count GXHelpers::SetObjectCount(cnt, data); CGXDLMSVariant tmp; for (std::vector<CGXDLMSSeasonProfile>::iterator it = m_SeasonProfileActive.begin(); it != m_SeasonProfileActive.end(); ++it) { data.SetUInt8(DLMS_DATA_TYPE_STRUCTURE); data.SetUInt8(3); tmp = it->GetName(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); tmp = it->GetStart(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); tmp.Clear(); tmp.Add((*it).GetWeekName()); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); } value = data; return ERROR_CODES_OK; } if (index == 4) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); int cnt = m_WeekProfileTableActive.size(); //Add count GXHelpers::SetObjectCount(cnt, data); CGXDLMSVariant tmp; for (std::vector<CGXDLMSWeekProfile>::iterator it = m_WeekProfileTableActive.begin(); it != m_WeekProfileTableActive.end(); ++it) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); data.SetUInt8(8); tmp = it->GetName(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); tmp = it->GetMonday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetTuesday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetWednesday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetThursday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetFriday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetSaturday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetSunday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); } value = data; return ERROR_CODES_OK; } if (index == 5) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); int cnt = m_DayProfileTableActive.size(); //Add count GXHelpers::SetObjectCount(cnt, data); for (std::vector<CGXDLMSDayProfile>::iterator it = m_DayProfileTableActive.begin(); it != m_DayProfileTableActive.end(); ++it) { data.SetUInt8(DLMS_DATA_TYPE_STRUCTURE); data.SetUInt8(2); CGXDLMSVariant tmp = it->GetDayId(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); data.SetUInt8(DLMS_DATA_TYPE_ARRAY); //Add count std::vector<CGXDLMSDayProfileAction>& schedules = (*it).GetDaySchedules(); GXHelpers::SetObjectCount(schedules.size(), data); CGXDLMSVariant time, ln, selector; for (std::vector<CGXDLMSDayProfileAction>::iterator action = schedules.begin(); action != schedules.end(); ++action) { time = action->GetStartTime(); ln = action->GetScriptLogicalName(); selector = action->GetScriptSelector(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, time); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, ln); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT16, selector); } } value = data; return ERROR_CODES_OK; } if (index == 6) { value.Add(m_CalendarNamePassive); return ERROR_CODES_OK; } // if (index == 7) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); int cnt = m_SeasonProfilePassive.size(); //Add count GXHelpers::SetObjectCount(cnt, data); CGXDLMSVariant tmp; for (std::vector<CGXDLMSSeasonProfile>::iterator it = m_SeasonProfilePassive.begin(); it != m_SeasonProfilePassive.end(); ++it) { data.SetUInt8(DLMS_DATA_TYPE_STRUCTURE); data.SetUInt8(3); tmp = it->GetName(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); tmp = it->GetStart(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); tmp = it->GetWeekName(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); } value = data; return ERROR_CODES_OK; } if (index == 8) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); int cnt = m_WeekProfileTablePassive.size(); //Add count GXHelpers::SetObjectCount(cnt, data); CGXDLMSVariant tmp; for (std::vector<CGXDLMSWeekProfile>::iterator it = m_WeekProfileTablePassive.begin(); it != m_WeekProfileTablePassive.end(); ++it) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); data.SetUInt8(8); tmp = it->GetName(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, tmp); tmp = it->GetMonday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetTuesday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetWednesday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetThursday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetFriday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetSaturday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); tmp = it->GetSunday(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, tmp); } value = data; return ERROR_CODES_OK; } if (index == 9) { data.SetUInt8(DLMS_DATA_TYPE_ARRAY); int cnt = m_DayProfileTablePassive.size(); //Add count GXHelpers::SetObjectCount(cnt, data); CGXDLMSVariant id, time, ln, selector; for (std::vector<CGXDLMSDayProfile>::iterator it = m_DayProfileTablePassive.begin(); it != m_DayProfileTablePassive.end(); ++it) { data.SetUInt8(DLMS_DATA_TYPE_STRUCTURE); data.SetUInt8(2); id = it->GetDayId(); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT8, id); data.SetUInt8(DLMS_DATA_TYPE_ARRAY); //Add count GXHelpers::SetObjectCount((*it).GetDaySchedules().size(), data); for (std::vector<CGXDLMSDayProfileAction>::iterator action = (*it).GetDaySchedules().begin(); action != (*it).GetDaySchedules().end(); ++action) { time = action->GetStartTime(); ln = action->GetScriptLogicalName(); selector = action->GetScriptSelector(); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, time); GXHelpers::SetData(data, DLMS_DATA_TYPE_OCTET_STRING, ln); GXHelpers::SetData(data, DLMS_DATA_TYPE_UINT16, selector); } } value = data; return ERROR_CODES_OK; } if (index == 10) { value = GetTime(); return ERROR_CODES_OK; } return ERROR_CODES_INVALID_PARAMETER; }
int CGXCommunication::GetProfileGenerics() { char buff[200]; int ret = 0; std::string str; std::string value; //Find profile generics and read them. CGXDLMSObjectCollection pgs; m_Parser->GetObjects().GetObjects(DLMS_OBJECT_TYPE_PROFILE_GENERIC, pgs); for (std::vector<CGXDLMSObject*>::iterator it = pgs.begin(); it != pgs.end(); ++it) { #if _MSC_VER > 1000 sprintf_s(buff, 200, "-------- Reading %s %s %s\r\n", CGXDLMSClient::ObjectTypeToString((*it)->GetObjectType()).c_str(), (*it)->GetName().ToString().c_str(), (*it)->GetDescription().c_str()); #else sprintf(buff, "-------- Reading %s %s %s\r\n", CGXDLMSClient::ObjectTypeToString((*it)->GetObjectType()).c_str(), (*it)->GetName().ToString().c_str(), (*it)->GetDescription().c_str()); #endif WriteValue(m_Trace, buff); if ((ret = Read(*it, 7, value)) != DLMS_ERROR_CODE_OK) { #if _MSC_VER > 1000 sprintf_s(buff, 100, "Error! Index: %d: %s\r\n", 7, CGXDLMSConverter::GetErrorMessage(ret)); #else sprintf(buff, "Error! Index: %d: %s\r\n", 7, CGXDLMSConverter::GetErrorMessage(ret)); #endif WriteValue(GX_TRACE_LEVEL_ERROR, buff); //Continue reading. } std::string entriesInUse = value; if ((ret = Read(*it, 8, value)) != DLMS_ERROR_CODE_OK) { #if _MSC_VER > 1000 sprintf_s(buff, 100, "Error! Index: %d: %s\r\n", 8, CGXDLMSConverter::GetErrorMessage(ret)); #else sprintf(buff, "Error! Index: %d: %s\r\n", 8, CGXDLMSConverter::GetErrorMessage(ret)); #endif WriteValue(GX_TRACE_LEVEL_ERROR, buff); //Continue reading. } std::string entries = value; str = "Entries: "; str += entriesInUse; str += "/"; str += entries; str += "\r\n"; WriteValue(m_Trace, str); //If there are no columns or rows. if (((CGXDLMSProfileGeneric*)*it)->GetEntriesInUse() == 0 || ((CGXDLMSProfileGeneric*)*it)->GetCaptureObjects().size() == 0) { continue; } //All meters are not supporting parameterized read. CGXDLMSVariant rows; if ((m_Parser->GetNegotiatedConformance() & (DLMS_CONFORMANCE_PARAMETERIZED_ACCESS | DLMS_CONFORMANCE_SELECTIVE_ACCESS)) != 0) { //Read first row from Profile Generic. if ((ret = ReadRowsByEntry((CGXDLMSProfileGeneric*)*it, 1, 1, rows)) != 0) { str = "Error! Failed to read first row:"; str += CGXDLMSConverter::GetErrorMessage(ret); str += "\r\n"; WriteValue(GX_TRACE_LEVEL_ERROR, str); //Continue reading. } else { ////////////////////////////////////////////////////////////////////////////// //Show rows. WriteValue(m_Trace, rows.ToString()); } } //All meters are not supporting parameterized read. if ((m_Parser->GetNegotiatedConformance() & (DLMS_CONFORMANCE_PARAMETERIZED_ACCESS | DLMS_CONFORMANCE_SELECTIVE_ACCESS)) != 0) { CGXDateTime start = CGXDateTime::Now(); start.ResetTime(); CGXDateTime end = CGXDateTime::Now(); if ((ret = ReadRowsByRange((CGXDLMSProfileGeneric*)(*it), start, end, rows)) != 0) { str = "Error! Failed to read last day:"; str += CGXDLMSConverter::GetErrorMessage(ret); str += "\r\n"; WriteValue(GX_TRACE_LEVEL_ERROR, str); //Continue reading. } else { ////////////////////////////////////////////////////////////////////////////// //Show rows. WriteValue(m_Trace, rows.ToString()); } } } return ret; }