void Slave::HandleEnableUnsolicited(const APDU& arRequest, bool aIsEnable)
{
	mResponse.Set(FC_RESPONSE);

	if (mConfig.mDisableUnsol) {
		mRspIIN.SetFuncNotSupported(true);
	}
	else {
		if (aIsEnable) {
			this->mDeferredUnsol = true;
		}

		for (HeaderReadIterator hdr = arRequest.BeginRead(); !hdr.IsEnd(); ++hdr) {

			switch (MACRO_DNP_RADIX(hdr->GetGroup(), hdr->GetVariation())) {
			case (MACRO_DNP_RADIX(60, 2)):
				mConfig.mUnsolMask.class1 = aIsEnable;
				break;

			case (MACRO_DNP_RADIX(60, 3)):
				mConfig.mUnsolMask.class2 = aIsEnable;
				break;

			case (MACRO_DNP_RADIX(60, 4)):
				mConfig.mUnsolMask.class3 = aIsEnable;
				break;

			default:
				mRspIIN.SetFuncNotSupported(true);
				LOG_BLOCK(LEV_WARNING, "Cannot enable/disable unsol for " << hdr->GetBaseObject()->Name());
				break;
			}
		}
	}
}
void Slave::HandleWrite(const APDU& arRequest)
{
	for (HeaderReadIterator hdr = arRequest.BeginRead(); !hdr.IsEnd(); ++hdr) {
		switch (hdr->GetGroup()) {
		case 112:
			this->HandleWriteVto(hdr);
			continue;
		}

		switch (MACRO_DNP_RADIX(hdr->GetGroup(), hdr->GetVariation())) {
		case (MACRO_DNP_RADIX(80, 1)):
			this->HandleWriteIIN(hdr);
			break;
		case (MACRO_DNP_RADIX(50, 1)):
			this->HandleWriteTimeDate(hdr);
			break;
		default:
			mRspIIN.SetFuncNotSupported(true);
			ERROR_BLOCK(LEV_WARNING, "Object/Function mismatch", SERR_OBJ_FUNC_MISMATCH);
			break;
		}
	}
}
void Slave::HandleOperate(const APDU& arRequest, SequenceInfo aSeqInfo)
{
	if (aSeqInfo == SI_PREV && mLastRequest == arRequest) {
		return;
	}

	mResponse.Set(FC_RESPONSE);

	for (HeaderReadIterator hdr = arRequest.BeginRead(); !hdr.IsEnd(); ++hdr) {

		ObjectReadIterator i = hdr.BeginRead();

		switch (MACRO_DNP_RADIX(hdr->GetGroup(), hdr->GetVariation())) {

		case (MACRO_DNP_RADIX(12, 1)):
			this->RespondToCommands<BinaryOutput>(Group12Var1::Inst(), i, boost::bind(&Slave::Operate<BinaryOutput>, this, _1, _2, false, hdr.info(), aSeqInfo, arRequest.GetControl().SEQ));
			break;

		case (MACRO_DNP_RADIX(41, 1)):
			this->RespondToCommands<Setpoint>(Group41Var1::Inst(), i, boost::bind(&Slave::Operate<Setpoint>, this, _1, _2, false, hdr.info(), aSeqInfo, arRequest.GetControl().SEQ));
			break;

		case (MACRO_DNP_RADIX(41, 2)):
			this->RespondToCommands<Setpoint>(Group41Var2::Inst(), i, boost::bind(&Slave::Operate<Setpoint>, this, _1, _2, false, hdr.info(), aSeqInfo, arRequest.GetControl().SEQ));
			break;

		case (MACRO_DNP_RADIX(41, 3)):
			this->RespondToCommands<Setpoint>(Group41Var3::Inst(), i, boost::bind(&Slave::Operate<Setpoint>, this, _1, _2, false, hdr.info(), aSeqInfo, arRequest.GetControl().SEQ));
			break;

		case (MACRO_DNP_RADIX(41, 4)):
			this->RespondToCommands<Setpoint>(Group41Var4::Inst(), i, boost::bind(&Slave::Operate<Setpoint>, this, _1, _2, false, hdr.info(), aSeqInfo, arRequest.GetControl().SEQ));
			break;

		default:
			mRspIIN.SetFuncNotSupported(true);
			ERROR_BLOCK(LEV_WARNING, "Object/Function mismatch", SERR_OBJ_FUNC_MISMATCH);
			break;
		}
	}
}
Example #4
0
void ResponseLoader::ProcessData(HeaderReadIterator& arIter, int aGrp, int aVar)
{
	switch(MACRO_DNP_RADIX(aGrp, aVar))
	{
		// Control Status
		case(MACRO_DNP_RADIX(10,2)): this->Read(arIter, Group10Var2::Inst()); break;

		// Binary
		case(MACRO_DNP_RADIX(1,1)): this->ReadBitfield<Group1Var1>(arIter);	break;

		case(MACRO_DNP_RADIX(1,2)):	this->Read(arIter, Group1Var2::Inst());	break;
		case(MACRO_DNP_RADIX(2,1)):	this->Read(arIter, Group2Var1::Inst());	break;
		case(MACRO_DNP_RADIX(2,2)):	this->Read(arIter, Group2Var2::Inst());	break;
		case(MACRO_DNP_RADIX(2,3)):	this->Read(arIter, Group2Var3::Inst());	break;

		// Counters
		case(MACRO_DNP_RADIX(20,1)): this->Read(arIter, Group20Var1::Inst());	break;
		case(MACRO_DNP_RADIX(20,2)): this->Read(arIter, Group20Var2::Inst());	break;
		case(MACRO_DNP_RADIX(20,3)): this->Read(arIter, Group20Var3::Inst());	break;
		case(MACRO_DNP_RADIX(20,4)): this->Read(arIter, Group20Var4::Inst());	break;
		case(MACRO_DNP_RADIX(20,5)): this->Read(arIter, Group20Var5::Inst());	break;
		case(MACRO_DNP_RADIX(20,6)): this->Read(arIter, Group20Var6::Inst());	break;
		case(MACRO_DNP_RADIX(20,7)): this->Read(arIter, Group20Var7::Inst());	break;
		case(MACRO_DNP_RADIX(20,8)): this->Read(arIter, Group20Var8::Inst());	break;

		case(MACRO_DNP_RADIX(22,1)): this->Read(arIter, Group22Var1::Inst());	break;
		case(MACRO_DNP_RADIX(22,2)): this->Read(arIter, Group22Var2::Inst());	break;
		case(MACRO_DNP_RADIX(22,3)): this->Read(arIter, Group22Var3::Inst());	break;
		case(MACRO_DNP_RADIX(22,4)): this->Read(arIter, Group22Var4::Inst());	break;

		// Analogs
		case(MACRO_DNP_RADIX(30,1)): this->Read(arIter, Group30Var1::Inst());	break;
		case(MACRO_DNP_RADIX(30,2)): this->Read(arIter, Group30Var2::Inst());	break;
		case(MACRO_DNP_RADIX(30,3)): this->Read(arIter, Group30Var3::Inst());	break;
		case(MACRO_DNP_RADIX(30,4)): this->Read(arIter, Group30Var4::Inst());	break;
		case(MACRO_DNP_RADIX(30,5)): this->Read(arIter, Group30Var5::Inst());	break;
		case(MACRO_DNP_RADIX(30,6)): this->Read(arIter, Group30Var6::Inst());	break;		

		case(MACRO_DNP_RADIX(32,1)): this->Read(arIter, Group32Var1::Inst());	break;
		case(MACRO_DNP_RADIX(32,2)): this->Read(arIter, Group32Var2::Inst());	break;
		case(MACRO_DNP_RADIX(32,3)): this->Read(arIter, Group32Var3::Inst());	break;
		case(MACRO_DNP_RADIX(32,4)): this->Read(arIter, Group32Var4::Inst());	break;
		case(MACRO_DNP_RADIX(32,5)): this->Read(arIter, Group32Var5::Inst());	break;
		case(MACRO_DNP_RADIX(32,6)): this->Read(arIter, Group32Var6::Inst());	break;
		case(MACRO_DNP_RADIX(32,7)): this->Read(arIter, Group32Var7::Inst());	break;
		case(MACRO_DNP_RADIX(32,8)): this->Read(arIter, Group32Var8::Inst());	break;

		// Setpoint Status
		case(MACRO_DNP_RADIX(40,1)): this->Read(arIter, Group40Var1::Inst());	break;
		case(MACRO_DNP_RADIX(40,2)): this->Read(arIter, Group40Var2::Inst());	break;
		case(MACRO_DNP_RADIX(40,3)): this->Read(arIter, Group40Var3::Inst());	break;
		case(MACRO_DNP_RADIX(40,4)): this->Read(arIter, Group40Var4::Inst());	break;

		// CTO
		case(MACRO_DNP_RADIX(51,1)): this->ReadCTO<Group51Var1>(arIter);		break;
		case(MACRO_DNP_RADIX(51,2)): this->ReadCTO<Group51Var2>(arIter);		break;

		default:
			LOG_BLOCK(LEV_WARNING, "Group: " << aGrp << " Var: " << aVar << " does not map to a data type");
			break;
	}
}
Example #5
0
void ResponseLoader::ProcessData(HeaderReadIterator& arIter, int aGrp, int aVar)
{
	/*
	 * These objects require matching on both the aGrp and aVar fields.
	 */
	switch (MACRO_DNP_RADIX(aGrp, aVar)) {
		// Control Status
	case (MACRO_DNP_RADIX(10, 2)): this->Read(arIter, Group10Var2::Inst()); break;

		// Binary
	case (MACRO_DNP_RADIX(1, 1)): this->ReadBitfield<Group1Var1>(arIter); break;

	case (MACRO_DNP_RADIX(1, 2)): this->Read(arIter, Group1Var2::Inst()); break;
	case (MACRO_DNP_RADIX(2, 1)): this->Read(arIter, Group2Var1::Inst()); break;
	case (MACRO_DNP_RADIX(2, 2)): this->Read(arIter, Group2Var2::Inst()); break;
	case (MACRO_DNP_RADIX(2, 3)): this->Read(arIter, Group2Var3::Inst()); break;

		// Counters
	case (MACRO_DNP_RADIX(20, 1)): this->Read(arIter, Group20Var1::Inst()); break;
	case (MACRO_DNP_RADIX(20, 2)): this->Read(arIter, Group20Var2::Inst()); break;
	case (MACRO_DNP_RADIX(20, 3)): this->Read(arIter, Group20Var3::Inst()); break;
	case (MACRO_DNP_RADIX(20, 4)): this->Read(arIter, Group20Var4::Inst()); break;
	case (MACRO_DNP_RADIX(20, 5)): this->Read(arIter, Group20Var5::Inst()); break;
	case (MACRO_DNP_RADIX(20, 6)): this->Read(arIter, Group20Var6::Inst()); break;
	case (MACRO_DNP_RADIX(20, 7)): this->Read(arIter, Group20Var7::Inst()); break;
	case (MACRO_DNP_RADIX(20, 8)): this->Read(arIter, Group20Var8::Inst()); break;

	case (MACRO_DNP_RADIX(22, 1)): this->Read(arIter, Group22Var1::Inst()); break;
	case (MACRO_DNP_RADIX(22, 2)): this->Read(arIter, Group22Var2::Inst()); break;
	case (MACRO_DNP_RADIX(22, 3)): this->Read(arIter, Group22Var3::Inst()); break;
	case (MACRO_DNP_RADIX(22, 4)): this->Read(arIter, Group22Var4::Inst()); break;

		// Analogs
	case (MACRO_DNP_RADIX(30, 1)): this->Read(arIter, Group30Var1::Inst()); break;
	case (MACRO_DNP_RADIX(30, 2)): this->Read(arIter, Group30Var2::Inst()); break;
	case (MACRO_DNP_RADIX(30, 3)): this->Read(arIter, Group30Var3::Inst()); break;
	case (MACRO_DNP_RADIX(30, 4)): this->Read(arIter, Group30Var4::Inst()); break;
	case (MACRO_DNP_RADIX(30, 5)): this->Read(arIter, Group30Var5::Inst()); break;
	case (MACRO_DNP_RADIX(30, 6)): this->Read(arIter, Group30Var6::Inst()); break;

	case (MACRO_DNP_RADIX(32, 1)): this->Read(arIter, Group32Var1::Inst()); break;
	case (MACRO_DNP_RADIX(32, 2)): this->Read(arIter, Group32Var2::Inst()); break;
	case (MACRO_DNP_RADIX(32, 3)): this->Read(arIter, Group32Var3::Inst()); break;
	case (MACRO_DNP_RADIX(32, 4)): this->Read(arIter, Group32Var4::Inst()); break;
	case (MACRO_DNP_RADIX(32, 5)): this->Read(arIter, Group32Var5::Inst()); break;
	case (MACRO_DNP_RADIX(32, 6)): this->Read(arIter, Group32Var6::Inst()); break;
	case (MACRO_DNP_RADIX(32, 7)): this->Read(arIter, Group32Var7::Inst()); break;
	case (MACRO_DNP_RADIX(32, 8)): this->Read(arIter, Group32Var8::Inst()); break;

		// Setpoint Status
	case (MACRO_DNP_RADIX(40, 1)): this->Read(arIter, Group40Var1::Inst()); break;
	case (MACRO_DNP_RADIX(40, 2)): this->Read(arIter, Group40Var2::Inst()); break;
	case (MACRO_DNP_RADIX(40, 3)): this->Read(arIter, Group40Var3::Inst()); break;
	case (MACRO_DNP_RADIX(40, 4)): this->Read(arIter, Group40Var4::Inst()); break;

		// CTO
	case (MACRO_DNP_RADIX(51, 1)): this->ReadCTO<Group51Var1>(arIter); break;
	case (MACRO_DNP_RADIX(51, 2)): this->ReadCTO<Group51Var2>(arIter); break;

	default:
		this->ProcessSizeByVariation(arIter, aGrp, aVar);
		break;
	}
}