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; } } }
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; } }
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; } }