diff --git a/DataSources/UARTOutput/Makefile.cov b/DataSources/UARTOutput/Makefile.cov new file mode 100644 index 0000000..5e0ca6d --- /dev/null +++ b/DataSources/UARTOutput/Makefile.cov @@ -0,0 +1,28 @@ +############################################################# +# +# Copyright 2015 F4E | European Joint Undertaking for ITER +# and the Development of Fusion Energy ('Fusion for Energy') +# +# Licensed under the EUPL, Version 1.1 or - as soon they +# will be approved by the European Commission - subsequent +# versions of the EUPL (the "Licence"); +# You may not use this work except in compliance with the +# Licence. +# You may obtain a copy of the Licence at: +# +# http://ec.europa.eu/idabc/eupl +# +# Unless required by applicable law or agreed to in +# writing, software distributed under the Licence is +# distributed on an "AS IS" basis, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. +# See the Licence for the specific language governing +# permissions and limitations under the Licence. +# +############################################################# + +TARGET=cov + +include Makefile.inc + diff --git a/DataSources/UARTOutput/Makefile.gcc b/DataSources/UARTOutput/Makefile.gcc new file mode 100644 index 0000000..a9d0599 --- /dev/null +++ b/DataSources/UARTOutput/Makefile.gcc @@ -0,0 +1,27 @@ +############################################################# +# +# Copyright 2015 F4E | European Joint Undertaking for ITER +# and the Development of Fusion Energy ('Fusion for Energy') +# +# Licensed under the EUPL, Version 1.1 or - as soon they +# will be approved by the European Commission - subsequent +# versions of the EUPL (the "Licence"); +# You may not use this work except in compliance with the +# Licence. +# You may obtain a copy of the Licence at: +# +# http://ec.europa.eu/idabc/eupl +# +# Unless required by applicable law or agreed to in +# writing, software distributed under the Licence is +# distributed on an "AS IS" basis, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. +# See the Licence for the specific language governing +# permissions and limitations under the Licence. +# +############################################################# + + +include Makefile.inc + diff --git a/DataSources/UARTOutput/Makefile.inc b/DataSources/UARTOutput/Makefile.inc new file mode 100644 index 0000000..877aeb3 --- /dev/null +++ b/DataSources/UARTOutput/Makefile.inc @@ -0,0 +1,57 @@ +############################################################# +# +# Copyright 2015 F4E | European Joint Undertaking for ITER +# and the Development of Fusion Energy ('Fusion for Energy') +# +# Licensed under the EUPL, Version 1.1 or - as soon they +# will be approved by the European Commission - subsequent +# versions of the EUPL (the "Licence"); +# You may not use this work except in compliance with the +# Licence. +# You may obtain a copy of the Licence at: +# +# http://ec.europa.eu/idabc/eupl +# +# Unless required by applicable law or agreed to in +# writing, software distributed under the Licence is +# distributed on an "AS IS" basis, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. +# See the Licence for the specific language governing +# permissions and limitations under the Licence. +# +############################################################# + +OBJSX=UARTOutput.x + +PACKAGE=Components/DataSources + +ROOT_DIR=../.. +MAKEDEFAULTDIR=$(MARTe2_DIR)/MakeDefaults +include $(MAKEDEFAULTDIR)/MakeStdLibDefs.$(TARGET) + +INCLUDES += -I. +INCLUDES += -I./include +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L0Types +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L1Portability +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L2Objects +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L3Streams +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L4Messages +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L4Configuration +INCLUDES += -I$(MARTe2_DIR)/Source/Core/BareMetal/L5GAMs +INCLUDES += -I$(MARTe2_DIR)/Source/Core/Scheduler/L1Portability +INCLUDES += -I$(MARTe2_DIR)/Source/Core/Scheduler/L3Services +INCLUDES += -I$(MARTe2_DIR)/Source/Core/Scheduler/L4Messages +INCLUDES += -I$(MARTe2_DIR)/Source/Core/FileSystem/L1Portability +//INCLUDES += -I$(MARTe2_DIR)/Source/Core/FileSystem/L3Streams + + +all: $(OBJS) \ + $(BUILD_DIR)/UARTOutput$(LIBEXT) \ + $(BUILD_DIR)/UARTOutput$(DLLEXT) + echo $(OBJS) + +include depends.$(TARGET) + +include $(MAKEDEFAULTDIR)/MakeStdLibRules.$(TARGET) + diff --git a/DataSources/UARTOutput/UARTOutput.cpp b/DataSources/UARTOutput/UARTOutput.cpp new file mode 100644 index 0000000..73511ed --- /dev/null +++ b/DataSources/UARTOutput/UARTOutput.cpp @@ -0,0 +1,402 @@ +/** + * @file UARTOutput.cpp + * @brief Source file for class UARTOutput + * @date 19/01/2024 + * @author Andre Neto / Bernardo Carvalho + * + * @copyright Copyright 2015 F4E | European Joint Undertaking for ITER and + * the Development of Fusion Energy ('Fusion for Energy'). + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved + * by the European Commission - subsequent versions of the EUPL (the "Licence") + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl + * + * @warning Unless required by applicable law or agreed to in writing, + * software distributed under the Licence is distributed on an "AS IS" + * basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the Licence permissions and limitations under the Licence. + + * @details This source file contains the definition of all the methods for + * the class UARTOutput (public, protected, and private). Be aware that some + * methods, such as those inline could be defined on the header file, instead. + * + * https://vcis-gitlab.f4e.europa.eu/aneto/MARTe2-components/-/blob/master/Source/Components/DataSources/NI6259/NI6259DAC.cpp + */ + +#define DLL_API + +/*---------------------------------------------------------------------------*/ +/* Standard header includes */ +/*---------------------------------------------------------------------------*/ +#include + +#include // for close() +#include + +/*---------------------------------------------------------------------------*/ +/* Project header includes */ +/*---------------------------------------------------------------------------*/ +#include "AdvancedErrorManagement.h" +#include "MemoryMapSynchronisedOutputBroker.h" +#include "UARTOutput.h" + +/*---------------------------------------------------------------------------*/ +/* Static definitions */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +/* Method definitions */ +/*---------------------------------------------------------------------------*/ +namespace MARTe { + const float32 DAC_RANGE = 20.0; + const float32 ATCA_IOP_MAX_DAC_RANGE = 20.0; + UARTOutput::UARTOutput() : + DataSourceI(), + MessageI() { + //boardFileDescriptor = -1; + //numberOfDACsEnabled = 0u; + //isMaster = 0u; + //deviceName = ""; + //boardId = 2u; + triggerSet = false; + uint32 n; + //for (n = 0u; n < ATCA_IOP_MAX_DAC_CHANNELS; n++) { + //dacEnabled[n] = false; + outputRange = ATCA_IOP_MAX_DAC_RANGE; + //} + + //channelsMemory = NULL_PTR(float32 *); + channelMemory = 0.0;//NULL_PTR(float32 *); + + filter = ReferenceT(GlobalObjectsDatabase::Instance()->GetStandardHeap()); + filter->SetDestination(this); + ErrorManagement::ErrorType ret = MessageI::InstallMessageFilter(filter); + if (!ret.ErrorsCleared()) { + REPORT_ERROR(ErrorManagement::FatalError, "Failed to install message filters"); + } + } + + /*lint -e{1551} the destructor must guarantee that the Timer SingleThreadService is stopped.*/ + UARTOutput::~UARTOutput() { + if (boardFileDescriptor != -1) { + uint32 statusReg = 0; + //REPORT_ERROR(ErrorManagement::Information, " Close Device Status Reg %d, 0x%x", rc, statusReg); + close(boardFileDescriptor); + REPORT_ERROR(ErrorManagement::Information, "Close device %d OK. Status Reg 0x%x,", boardFileDescriptor, statusReg); + } + /* + if (channelsMemory != NULL_PTR(float32 *)) { + delete[] channelsMemory; + } + */ + } + + bool UARTOutput::AllocateMemory() { + return true; + } + + uint32 UARTOutput::GetNumberOfMemoryBuffers() { + return 1u; + } + + /*lint -e{715} [MISRA C++ Rule 0-1-11], [MISRA C++ Rule 0-1-12]. Justification: The memory buffer is independent of the bufferIdx.*/ + bool UARTOutput::GetSignalMemoryBuffer(const uint32 signalIdx, const uint32 bufferIdx, void*& signalAddress) { + bool ok = (signalIdx < (UART_MAX_CHANNELS)); + if (ok) { + //if (channelsMemory != NULL_PTR(float32 *)) { + signalAddress = &channelMemory; + //} + } + return ok; + } + + const char8* UARTOutput::GetBrokerName(StructuredDataI& data, const SignalDirection direction) { + const char8 *brokerName = NULL_PTR(const char8 *); + if (direction == OutputSignals) { + uint32 trigger = 0u; + if (!data.Read("Trigger", trigger)) { + trigger = 0u; + } + + if (trigger == 1u) { + brokerName = "MemoryMapSynchronisedOutputBroker"; + triggerSet = true; + } + else { + brokerName = "MemoryMapOutputBroker"; + } + } + else { + REPORT_ERROR(ErrorManagement::ParametersError, "DataSource not compatible with InputSignals"); + } + return brokerName; + } + bool UARTOutput::GetInputBrokers(ReferenceContainer& inputBrokers, const char8* const functionName, void* const gamMemPtr) { + return false; + } + + bool UARTOutput::GetOutputBrokers(ReferenceContainer& outputBrokers, const char8* const functionName, void* const gamMemPtr) { + //Check if there is a Trigger signal for this function. + uint32 functionIdx = 0u; + uint32 nOfFunctionSignals = 0u; + uint32 i; + bool triggerGAM = false; + bool ok = GetFunctionIndex(functionIdx, functionName); + + if (ok) { + ok = GetFunctionNumberOfSignals(OutputSignals, functionIdx, nOfFunctionSignals); + } + uint32 trigger = 0u; + for (i = 0u; (i < nOfFunctionSignals) && (ok) && (!triggerGAM); i++) { + ok = GetFunctionSignalTrigger(OutputSignals, functionIdx, i, trigger); + triggerGAM = (trigger == 1u); + } + if ((ok) && (triggerGAM)) { + ReferenceT broker("MemoryMapSynchronisedOutputBroker"); + ok = broker.IsValid(); + + if (ok) { + ok = broker->Init(OutputSignals, *this, functionName, gamMemPtr); + } + if (ok) { + ok = outputBrokers.Insert(broker); + } + //Must also add the signals which are not triggering but that belong to the same GAM... + if (ok) { + if (nOfFunctionSignals > 1u) { + ReferenceT brokerNotSync("MemoryMapOutputBroker"); + ok = brokerNotSync.IsValid(); + if (ok) { + ok = brokerNotSync->Init(OutputSignals, *this, functionName, gamMemPtr); + } + if (ok) { + ok = outputBrokers.Insert(brokerNotSync); + } + } + } + } + else { + ReferenceT brokerNotSync("MemoryMapOutputBroker"); + ok = brokerNotSync.IsValid(); + if (ok) { + ok = brokerNotSync->Init(OutputSignals, *this, functionName, gamMemPtr); + } + if (ok) { + ok = outputBrokers.Insert(brokerNotSync); + } + } + return ok; + } + + /*lint -e{715} [MISRA C++ Rule 0-1-11], [MISRA C++ Rule 0-1-12]. Justification: the counter and the timer are always reset irrespectively of the states being changed.*/ + bool UARTOutput::PrepareNextState(const char8* const currentStateName, const char8* const nextStateName) { + return true; + } + + bool UARTOutput::Initialise(StructuredDataI& data) { + bool ok = DataSourceI::Initialise(data); + StreamString portName; + if (ok) { + ok = data.Read("PortName", portName); + if (ok) { + REPORT_ERROR(ErrorManagement::Information, "The port name is set to %s", portName.Buffer()); + } + else { + REPORT_ERROR(ErrorManagement::ParametersError, "The port name property shall be set"); + } + } + uint32 baudRate = 0u; + if (ok) { + ok = data.Read("BaudRate", baudRate); + if (ok) { + REPORT_ERROR(ErrorManagement::Information, "The baud rate is set to %d", baudRate); + } + else { + REPORT_ERROR(ErrorManagement::ParametersError, "The baud rate property shall be set"); + } + } + if (ok) { + if (!data.Read("Timeout", timeout)) { + timeout = 1000u; + } + } + if (ok) { + ok = data.Read("SerialTimeout", serialTimeout); + if (ok) { + REPORT_ERROR(ErrorManagement::Information, "The serial timeout is set to %d", serialTimeout); + } + else { + REPORT_ERROR(ErrorManagement::ParametersError, "The serial timeout property shall be set"); + } + } + if (ok) { + ok = serial.SetSpeed(baudRate); + } + if (ok) { + ok = serial.Open(portName.Buffer()); + } + + //Get individual signal parameters + uint32 i = 0u; + if (ok) { + ok = data.MoveRelative("Signals"); + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, "Could not move to the Signals section"); + } + //Do not allow to add signals in run-time + if (ok) { + ok = signalsDatabase.MoveRelative("Signals"); + } + if (ok) { + ok = signalsDatabase.Write("Locked", 1u); + } + if (ok) { + ok = signalsDatabase.MoveToAncestor(1u); + } +// while ((i < ATCA_IOP_MAX_DAC_CHANNELS) && (ok)) { + if (data.MoveRelative(data.GetChildName(0))) { + //uint32 channelId; + float32 range; + ok = data.Read("OutputRange", range); + if (ok) { + //if (data.Read("OutputRange", range)) { + ok = (range > 0.0) && (range <= ATCA_IOP_MAX_DAC_RANGE); + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, "Invalid OutputRange specified."); + } + if (ok) { + outputRange = range; + REPORT_ERROR_PARAMETERS(ErrorManagement::Information, " Parameter DAC Output Range %f", range); + //dacEnabled[i] = true; + //numberOfDACsEnabled++; + } + } + else { + REPORT_ERROR(ErrorManagement::ParametersError, "The OutputRange shall be specified."); + } + if (ok) { + ok = data.MoveToAncestor(1u); + } + } + } + if (ok) { + ok = data.MoveToAncestor(1u); + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, "Could not move to the parent section"); + } + } + + //REPORT_ERROR_PARAMETERS(ErrorManagement::Information, "numberOfDACsEnabled %d", numberOfDACsEnabled); + return ok; + } + + bool UARTOutput::SetConfiguredDatabase(StructuredDataI& data) { + uint32 i; + bool ok = DataSourceI::SetConfiguredDatabase(data); + + if (ok) { + ok = triggerSet; + } + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, "At least one Trigger signal shall be set."); + } + if (ok) { + //for (i = 0u; (i < numberOfDACsEnabled) && (ok); i++) { + ok = (GetSignalType(0u) == Float32Bit); + //} + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, "All the DAC signals shall be of type Float32Bit"); + } + } + + uint32 nOfFunctions = GetNumberOfFunctions(); + uint32 functionIdx; + //Check that the number of samples for all the signals is one + for (functionIdx = 0u; (functionIdx < nOfFunctions) && (ok); functionIdx++) { + uint32 nOfSignals = 0u; + ok = GetFunctionNumberOfSignals(OutputSignals, functionIdx, nOfSignals); + + for (i = 0u; (i < nOfSignals) && (ok); i++) { + uint32 nSamples = 0u; + ok = GetFunctionSignalSamples(OutputSignals, functionIdx, i, nSamples); + if (ok) { + ok = (nSamples == 1u); + } + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, "The number of samples shall be exactly one"); + } + } + } + + StreamString fullDeviceName; + //Configure the board + if (ok) { + ok = fullDeviceName.Printf("%s_dac_%d", deviceName.Buffer(), boardId); + //ok = fullDeviceName.Printf("%s", deviceName.Buffer()); + } + if (ok) { + ok = fullDeviceName.Seek(0LLU); + } + if (ok) { + boardFileDescriptor = open(fullDeviceName.Buffer(), O_RDWR); + ok = (boardFileDescriptor > -1); + if (!ok) { + REPORT_ERROR_PARAMETERS(ErrorManagement::ParametersError, "Could not open device %s", fullDeviceName); + } + else + REPORT_ERROR_PARAMETERS(ErrorManagement::Information, "Open device %s OK", fullDeviceName); + } + if (ok) { + //Allocate memory + //channelsMemory = new float32[ATCA_IOP_MAX_DAC_CHANNELS]; + } + + return ok; + } + + + bool UARTOutput::Synchronise() { + uint32 i; + int32 w = 24; + bool ok = true; + //if (channelsMemory != NULL_PTR(float32 *)) { + + // value = channelsMemory[0] / DAC_RANGE; + //for (i = 0u; (i < 2u) && (ok); i++) { + //for (i = 0u; (i < numberOfDACsEnabled ) && (ok); i++) { + float32 value = channelMemory / outputRange; + //w = SetDacReg(i, value); + write(boardFileDescriptor, &w, 4); + // value = channelsMemory[1] / DAC_RANGE; + //value = channelsMemory[1] / DAC_RANGE * pow(2,17); + // w = SetDacReg(1, value); + //w = 0x000FFFFF & static_cast(value); + // write(boardFileDescriptor, &w, 4); + //REPORT_ERROR(ErrorManagement::Information, " Writing DAC 0 0x%x", w); + /* + + w = dacValues[i]; + } + */ + return ok; + } + + /* + int32 UARTOutput::SetDacReg(uint32 channel, float32 val) const { + if (val > 1.0) + val = 1.0; + if (val < -1.0) + val = -1.0; + int32 dacReg = static_cast(val * pow(2,17)); + if (dacReg > 0x1FFFF) // 131071 + dacReg = 0x1FFFF; + if (dacReg < -131072) // -0x20000 + dacReg = -131072; + dacReg &= 0x0003FFFF; // keep 18 lsb + dacReg |= (0xF & channel) << 28; + return dacReg; + } + */ + CLASS_REGISTER(UARTOutput, "1.0") + } + // vim: syntax=cpp ts=2 sw=2 sts=2 sr et diff --git a/DataSources/UARTOutput/UARTOutput.h b/DataSources/UARTOutput/UARTOutput.h new file mode 100644 index 0000000..77c1441 --- /dev/null +++ b/DataSources/UARTOutput/UARTOutput.h @@ -0,0 +1,266 @@ +/** + * @file UARTOutput.h + * @brief Header file for class UARTOutput + * @date 19/01/2024 + * @author Andre Neto / Bernardo Carvalho + * + * Based on Example: + * https://vcis-gitlab.f4e.europa.eu/aneto/MARTe2-demos-padova/-/tree/master/DataSources/ADCSimulator + * + * + * @copyright Copyright 2015 F4E | European Joint Undertaking for ITER and + * the Development of Fusion Energy ('Fusion for Energy'). + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved + * by the European Commission - subsequent versions of the EUPL (the "Licence") + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl + * + * @warning Unless required by applicable law or agreed to in writing, + * software distributed under the Licence is distributed on an "AS IS" + * basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the Licence permissions and limitations under the Licence. + + * @details This header file contains the declaration of the class UARTOutput + * with all of its public, protected and private members. It may also include + * definitions for inline methods which need to be visible to the compiler. + */ + +#ifndef UART_OUTPUT_H +#define UART_OUTPUT_H + +/*---------------------------------------------------------------------------*/ +/* Standard header includes */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +/* Project header includes */ +/*---------------------------------------------------------------------------*/ +#include "BasicUART.h" +#include "DataSourceI.h" +#include "EventSem.h" +#include "EmbeddedServiceMethodBinderI.h" +#include "SingleThreadService.h" +#include "MessageI.h" +#include "RegisteredMethodsMessageFilter.h" + +/*---------------------------------------------------------------------------*/ +/* Class declaration */ +/*---------------------------------------------------------------------------*/ +namespace MARTe { + + /** + * The number of signals + */ + + const uint32 ATCA_IOP_N_DACs = 2u; + const uint32 UART_MAX_CHANNELS = 1u; + +/** + * @brief A DataSource which provides an analogue output interface to the ATCA IOP boards. + * @details The configuration syntax is (names are only given as an example): + * + *
+ * +AtcaIop_0_DAC = {
+ *     Class = AtcaIop::UARTOutput
+ *     DeviceName = "/dev/atca_v6_dac_2" //Mandatory
+ *     PortName = "/dev/ttyUSB0" //Name of the UART port
+ *     BaudRate = 115200 //BAUD UART rate
+ *     Timeout = 200000 //Maximum time to wait for data
+ *     CPUMask = 8 //Affinity of the CPU of where to read data from
+
+ *     Signals = {
+ *         DAC0_0 = {
+ *             Type = float32 //Mandatory. Only type that is supported.
+ *             OutputRange = 10.0 //Mandatory. The channel Module Output Range in volt.
+ *             //OutputPolarity = Bipolar //Optional. Possible values: Bipolar, Unipolar. Default value Unipolar.
+ *         }
+ *          Packet = { //Actual data to write
+ *         Type = uint8
+ *         NumberOfElements = 15
+ *       }
+
+ *     }
+ * }
+ * 
+ * Note that at least one of the GAMs writing to this DataSource must have set one of the signals with Trigger=1 (which forces the writing of all the signals to the DAC). + */ + class UARTOutput: public DataSourceI, public MessageI { + public: + CLASS_REGISTER_DECLARATION() + /** + * @brief Default constructor + * @post + * Counter = 0 + * Time = 0 + */ + UARTOutput (); + + /** + * @brief Destructor. Stops the EmbeddedThread. + */ + virtual ~UARTOutput(); + + /** + * @brief See DataSourceI::AllocateMemory. + * * @return true. + */ + virtual bool AllocateMemory(); + + /** + gg* @brief See DataSourceI::GetNumberOfMemoryBuffers. + * @return 1. + */ + virtual uint32 GetNumberOfMemoryBuffers(); + + /** + * @brief See DataSourceI::GetSignalMemoryBuffer. + */ + virtual bool GetSignalMemoryBuffer(const uint32 signalIdx, + const uint32 bufferIdx, + void *&signalAddress); + + + /** + * @brief See DataSourceI::GetNumberOfMemoryBuffers. + * @details Only OutputSignals are supported. + * @return MemoryMapSynchronisedOutputBroker if Trigger == 1 for any of the signals, MemoryMapOutputBroker otherwise. + */ + virtual const char8 *GetBrokerName(StructuredDataI &data, const SignalDirection direction); + + /** + * @brief See DataSourceI::GetInputBrokers. + * @return false. + */ + virtual bool GetInputBrokers(ReferenceContainer &inputBrokers, + const char8* const functionName, + void * const gamMemPtr); + + /** + * @brief See DataSourceI::GetOutputBrokers. + * @details If the functionName is one of the functions which requested a Trigger, + * it adds a MemoryMapSynchronisedOutputBroker instance to the outputBrokers, + * otherwise it adds a MemoryMapOutputBroker instance to the outputBrokers. + * @param[out] outputBrokers where the BrokerI instances have to be added to. + * @param[in] functionName name of the function being queried. + * @param[in] gamMemPtr the GAM memory where the signals will be read from. + * @return true if the outputBrokers can be successfully configured. + */ + virtual bool GetOutputBrokers(ReferenceContainer &outputBrokers, + const char8* const functionName, + void * const gamMemPtr); + + + /** + * @brief See StatefulI::PrepareNextState. + * @details NOOP. + * @return true. + */ + virtual bool PrepareNextState(const char8 * const currentStateName, + const char8 * const nextStateName); + + + /** + * @brief Loads and verifies the configuration parameters detailed in the class description. + * @return true if all the mandatory parameters are correctly specified and if the specified optional parameters have valid values. + */ + + virtual bool Initialise(StructuredDataI & data); + + + /** + * @brief Final verification of all the parameters and setup of the board configuration. + * @details This method verifies that all the parameters (e.g. number of samples) requested by the GAMs interacting with this DataSource + * are valid and consistent with the board parameters set during the initialisation phase. + * In particular the following conditions shall be met: + * - At least one triggering signal was requested by a GAM (with the property Trigger = 1) + * - All the DAC channels have type float32. + * - The number of samples of all the DAC channels is exactly one. + * @return true if all the parameters are valid and consistent with the board parameters and if the board can be successfully configured with + * these parameters. + */ + virtual bool SetConfiguredDatabase(StructuredDataI & data); + + + /** + * @details Writes the value of all the DAC channels to the board. + * @return true if the writing of all the channels is successful. + */ + virtual bool Synchronise(); + + + private: + /** + * The board device name + */ + StreamString deviceName; + /** + * The board identifier + */ + uint32 boardId; + /** + * The board file descriptor + */ + int32 boardFileDescriptor; + /** + * The UART interface. + */ + BasicUART serial; + + /** + * Timeout to wait for data to be available. + */ + uint32 serialTimeout; + + /** + */ + uint32 timeout; + + + + /** + * DAC values + */ + int32 dacValues[ATCA_IOP_N_DACs]; + + /** + * The signal memory + */ + float32 channelMemory; + + /** + * The DACs that are enabled + */ + // bool dacEnabled[ATCA_IOP_MAX_DAC_CHANNELS]; + + /** + * The board individual channel output ranges + */ + float32 outputRange; + + /** + * The number of enabled DACs + */ + uint32 numberOfDACsEnabled; + + /** + * Filter to receive the RPC which allows to change the... + */ + ReferenceT filter; + + /** + * True if at least one trigger was set. + */ + bool triggerSet; + + //int32 SetDacReg(uint32 channel, float32 val) const; + + }; +} + +/*---------------------------------------------------------------------------*/ +/* Inline method definitions */ +/*---------------------------------------------------------------------------*/ + +#endif /* UART_OUTPUT_H */ + +// vim: syntax=cpp ts=2 sw=2 sts=2 sr et