From 39176574a5e1adb2befe6144316b7cbdbc3f9068 Mon Sep 17 00:00:00 2001 From: Bernardo Carvalho Date: Sat, 18 Oct 2025 00:35:57 +0100 Subject: [PATCH] Testing UART output Signed-off-by: Bernardo Carvalho --- DataSources/UARTOutput/UARTOutput.cpp | 642 +++++++++++++------------- DataSources/UARTOutput/UARTOutput.h | 338 +++++++------- 2 files changed, 497 insertions(+), 483 deletions(-) diff --git a/DataSources/UARTOutput/UARTOutput.cpp b/DataSources/UARTOutput/UARTOutput.cpp index 73511ed..b653b99 100644 --- a/DataSources/UARTOutput/UARTOutput.cpp +++ b/DataSources/UARTOutput/UARTOutput.cpp @@ -11,13 +11,13 @@ * 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, + * @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 + * 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 @@ -30,8 +30,8 @@ /*---------------------------------------------------------------------------*/ #include -#include // for close() #include +#include // for close() /*---------------------------------------------------------------------------*/ /* Project header includes */ @@ -48,355 +48,365 @@ /* 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; - //} +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 = DAC_RANGE; + //} - //channelsMemory = NULL_PTR(float32 *); - channelMemory = 0.0;//NULL_PTR(float32 *); + // channelsMemory = NULL_PTR(float32 *); + channelValue = 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; - } - */ + 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"); } +} - bool UARTOutput::AllocateMemory() { - return true; +/*lint -e{1551} the destructor must guarantee that the Timer SingleThreadService + * is stopped.*/ +UARTOutput::~UARTOutput() { + // REPORT_ERROR(ErrorManagement::Information, " Close Device Status Reg %d, + // 0x%x", rc, statusReg); close(boardFileDescriptor); + serial.Close(); + REPORT_ERROR_PARAMETERS(ErrorManagement::Information, "Close %s OK.", + portName); + /* + if (channelsMemory != NULL_PTR(float32 *)) { + delete[] channelsMemory; } + */ +} - uint32 UARTOutput::GetNumberOfMemoryBuffers() { - return 1u; +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 = &channelValue; + //} } + return ok; +} - /*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); - } +const char8 *UARTOutput::GetBrokerName(StructuredDataI &data, + const SignalDirection direction) { + const char8 *brokerName = NULL_PTR(const char8 *); + if (direction == OutputSignals) { uint32 trigger = 0u; - for (i = 0u; (i < nOfFunctionSignals) && (ok) && (!triggerGAM); i++) { - ok = GetFunctionSignalTrigger(OutputSignals, functionIdx, i, trigger); - triggerGAM = (trigger == 1u); + if (!data.Read("Trigger", trigger)) { + trigger = 0u; } - 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); - } + 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_PARAMETERS(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_PARAMETERS(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 { - ReferenceT brokerNotSync("MemoryMapOutputBroker"); - ok = brokerNotSync.IsValid(); - if (ok) { - ok = brokerNotSync->Init(OutputSignals, *this, functionName, gamMemPtr); - } - if (ok) { - ok = outputBrokers.Insert(brokerNotSync); - } + REPORT_ERROR(ErrorManagement::ParametersError, "The serial timeout + property shall be set"); } - return ok; + } + */ + if (ok) { + ok = serial.SetSpeed(baudRate); + } + if (ok) { + ok = serial.Open(portName.Buffer()); + } + if (!ok) { + REPORT_ERROR_PARAMETERS(ErrorManagement::ParametersError, + "The port %s Not opened.", portName); } - /*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"); - } + // 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"); } - uint32 baudRate = 0u; + // Do not allow to add signals in run-time 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"); - } + ok = signalsDatabase.MoveRelative("Signals"); } if (ok) { - if (!data.Read("Timeout", timeout)) { - timeout = 1000u; - } + ok = signalsDatabase.Write("Locked", 1u); } 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"); - } + ok = signalsDatabase.MoveToAncestor(1u); } - 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 + // while ((i < ATCA_IOP_MAX_DAC_CHANNELS) && (ok)) { + if (data.MoveRelative(data.GetChildName(0))) { + // uint32 channelId; + float64 range; + ok = data.Read("OutputRange", range); 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 (data.Read("OutputRange", range)) { + ok = (range > 0.0) && (range <= 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) { - REPORT_ERROR(ErrorManagement::ParametersError, "Could not move to the parent section"); - } } - - //REPORT_ERROR_PARAMETERS(ErrorManagement::Information, "numberOfDACsEnabled %d", numberOfDACsEnabled); - return ok; } + } + if (ok) { + ok = data.MoveToAncestor(1u); + if (!ok) { + REPORT_ERROR(ErrorManagement::ParametersError, + "Could not move to the parent section"); + } + } - bool UARTOutput::SetConfiguredDatabase(StructuredDataI& data) { - uint32 i; - bool ok = DataSourceI::SetConfiguredDatabase(data); + // 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 = triggerSet; + ok = (nSamples == 1u); } if (!ok) { - REPORT_ERROR(ErrorManagement::ParametersError, "At least one Trigger signal shall be set."); + REPORT_ERROR(ErrorManagement::ParametersError, + "The number of samples shall be exactly one"); } - 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 + + return ok; +} + +bool UARTOutput::Synchronise() { + uint32 i; + int32 w = 24; + bool ok = true; + char8 text[] = "ola"; + // if (channelsMemory != NULL_PTR(float32 *)) { + + // value = channelsMemory[0] / DAC_RANGE; + // for (i = 0u; (i < numberOfDACsEnabled ) && (ok); i++) { + int32 ser_value = channelValue / outputRange * 1000000.0; + REPORT_ERROR_PARAMETERS(ErrorManagement::Information, + "Synchronise called. value: %f, %d", channelValue, + ser_value); + // w = SetDacReg(i, value); + char8 *data = reinterpret_cast(&ser_value); + serial.Write(data, sizeof(int32)); + // serial.Write(text, 4); + // 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") +} // namespace MARTe +// vim: syntax=cpp ts=2 sw=2 sts=2 sr et diff --git a/DataSources/UARTOutput/UARTOutput.h b/DataSources/UARTOutput/UARTOutput.h index 77c1441..008322a 100644 --- a/DataSources/UARTOutput/UARTOutput.h +++ b/DataSources/UARTOutput/UARTOutput.h @@ -15,7 +15,7 @@ * 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, + * @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. @@ -37,42 +37,44 @@ /*---------------------------------------------------------------------------*/ #include "BasicUART.h" #include "DataSourceI.h" -#include "EventSem.h" #include "EmbeddedServiceMethodBinderI.h" -#include "SingleThreadService.h" +#include "EventSem.h" #include "MessageI.h" #include "RegisteredMethodsMessageFilter.h" +#include "SingleThreadService.h" /*---------------------------------------------------------------------------*/ /* Class declaration */ /*---------------------------------------------------------------------------*/ namespace MARTe { - /** - * The number of signals - */ +/** + * The number of signals + */ - const uint32 ATCA_IOP_N_DACs = 2u; - const uint32 UART_MAX_CHANNELS = 1u; +// 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. + * @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 = {
+ * +AtcaIop_UartOut = {
  *     Class = AtcaIop::UARTOutput
- *     DeviceName = "/dev/atca_v6_dac_2" //Mandatory
- *     PortName = "/dev/ttyUSB0" //Name of the UART port
+ *     PortName = "/dev/ttyUSB0" //Name of the UART port, Mandatory
  *     BaudRate = 115200 //BAUD UART rate
- *     Timeout = 200000 //Maximum time to wait for data
+ *     //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.
+ *         SerialOut = {
+ *             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
@@ -82,180 +84,182 @@ namespace MARTe {
  *     }
  * }
  * 
- * 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). + * 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 (); +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 Destructor. Stops the EmbeddedThread. + */ + virtual ~UARTOutput(); - /** - * @brief See DataSourceI::AllocateMemory. - * * @return true. - */ - virtual bool AllocateMemory(); + /** + * @brief See DataSourceI::AllocateMemory. + * * @return true. + */ + virtual bool AllocateMemory(); - /** - gg* @brief See DataSourceI::GetNumberOfMemoryBuffers. - * @return 1. - */ - virtual uint32 GetNumberOfMemoryBuffers(); + /** + 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::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::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::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 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. + */ - /** - * @brief See StatefulI::PrepareNextState. - * @details NOOP. - * @return true. - */ - virtual bool PrepareNextState(const char8 * const currentStateName, - const char8 * const nextStateName); + 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); - /** - * @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. - */ + /** + * @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(); - virtual bool Initialise(StructuredDataI & data); +private: + /** + * The board device name + */ + StreamString portName; + /** + * 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; - /** - * @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); + /** + */ + uint32 timeout; + /** + * DAC values + */ + // int32 dacValues[ATCA_IOP_N_DACs]; - /** - * @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(); + /** + * The signal memory + */ + float32 channelValue; + /** + * The DACs that are enabled + */ + // bool dacEnabled[ATCA_IOP_MAX_DAC_CHANNELS]; - private: - /** - * The board device name - */ - StreamString deviceName; - /** - * The board identifier - */ - uint32 boardId; - /** - * The board file descriptor - */ - int32 boardFileDescriptor; - /** - * The UART interface. - */ - BasicUART serial; + /** + * The board individual channel output ranges + */ + float32 outputRange; - /** - * Timeout to wait for data to be available. - */ - uint32 serialTimeout; + /** + * The number of enabled DACs + */ + uint32 numberOfDACsEnabled; - /** - */ - uint32 timeout; + /** + * Filter to receive the RPC which allows to change the... + */ + ReferenceT filter; + /** + * True if at least one trigger was set. + */ + bool triggerSet; - - /** - * 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; - - }; -} + // int32 SetDacReg(uint32 channel, float32 val) const; +}; +} // namespace MARTe /*---------------------------------------------------------------------------*/ /* Inline method definitions */