blob: ee9a338b95fccc6cd6210a9d216a0974a2029d24 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 - 2018 Johannes Messmer (admin@jomess.com), fortiss GmbH
* 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:
* Johannes Messmer - initial API and implementation and/or initial documentation
* Jose Cabral - Cleaning of namespaces
*******************************************************************************/
#include "bit.h"
#include "criticalregion.h"
EmbrickBitSlaveHandle::EmbrickBitSlaveHandle(forte::core::io::IODeviceController *paController, forte::core::io::IOMapper::Direction paDirection,
uint8_t paOffset, uint8_t paPosition, EmbrickSlaveHandler *paSlave) :
EmbrickSlaveHandle(paController, paDirection, mType = CIEC_ANY::e_BOOL, paOffset, paSlave), mMask((uint8_t) (1 << paPosition)) {
}
void EmbrickBitSlaveHandle::set(const CIEC_ANY &paState) {
CCriticalRegion criticalRegion(*mUpdateMutex);
if(static_cast<const CIEC_BOOL&>(paState)) {
*(mBuffer + mOffset) = (uint8_t) (*(mBuffer + mOffset) | mMask);
} else {
*(mBuffer + mOffset) = (uint8_t) (*(mBuffer + mOffset) & ~mMask);
}
EmbrickSlaveHandle::set(paState);
}
void EmbrickBitSlaveHandle::get(CIEC_ANY &paState) {
CCriticalRegion criticalRegion(*mUpdateMutex);
static_cast<CIEC_BOOL&>(paState) = (*(mBuffer + mOffset) & mMask) != 0;
}
bool EmbrickBitSlaveHandle::equal(unsigned char* paOldBuffer) {
return (*(mBuffer + mOffset) & mMask) == (*(paOldBuffer + mOffset) & mMask);
}