blob: f12a915926875e750917b47967ea0224e7b28960 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2022 Peirlberger Juergen
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Peirlberger Juergen - initial API and implementation and/or initial documentation
*******************************************************************************/
#include "bitSlaveHandle.h"
#include <criticalregion.h>
#include "../slaveHandler.h"
PLCnextBitSlaveHandle::PLCnextBitSlaveHandle(forte::core::io::IODeviceController *paController, forte::core::io::IOMapper::Direction paDirection, uint16_t paBitPosition, PLCnextSlaveHandler *paSlave) :
PLCnextSlaveHandle(paController, paDirection, mType = CIEC_ANY::e_BOOL, paSlave), mMask((uint16_t)(1 << paBitPosition)) {
}
void PLCnextBitSlaveHandle::set(const CIEC_ANY &paState) {
if (mDirection == forte::core::io::IOMapper::In) {
DEVLOG_ERROR("SET operation not allowed for type INPUT\n");
return;
}
CCriticalRegion criticalRegion(mSlave->handleMutex);
if(static_cast<const CIEC_BOOL&>(paState)) {
*(mSlave->imageBuffer + mOffset) = (uint16_t) (*(mSlave->imageBuffer + mOffset) | mMask); // set
} else {
*(mSlave->imageBuffer + mOffset) = (uint16_t) (*(mSlave->imageBuffer + mOffset) & ~mMask); // clear
}
}
void PLCnextBitSlaveHandle::get(CIEC_ANY &paState) {
if (mDirection == forte::core::io::IOMapper::Out) {
DEVLOG_ERROR("GET operation not allowed for type OUTPUT\n");
return;
}
CCriticalRegion criticalRegion(mSlave->handleMutex);
static_cast<CIEC_BOOL&>(paState) = (*(mSlave->imageBuffer + mOffset) & mMask) != 0;
}
bool PLCnextBitSlaveHandle::equal(unsigned char* paOldBuffer) {
return (*(mSlave->imageBuffer + mOffset) & mMask) == (*(paOldBuffer + mOffset) & mMask);
}