Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: HelloWorld_PLC01A1
Programmable Logic Controller Library
Library to handle the X-NUCLEO-PLC01A1 Programmable Logic Controller Expansion Board based on the VNI8200XP (solid state relay) and CLT01-38SQ7 (octal digital termination array) components.
Information
For further details on VNI8200XP (Octal high side smart power solid state relay with serial/parallel selectable interface on chip) please refer to ST's web site.
For further details on CLT01-38SQ7 (High speed digital input current limiter) please refer to ST's web site.
SPI configuration
Pin D3 and D13 providing the SPI serial clock are short-circuited in the X-NUCLEO-PLC01A1 Expansion Board.
Please be aware that you may not drive the base board LED if it is connected to pin D13 (as it happens on STM32 Nucleo boards) or D3, otherwise you will get a conflict.
Platform compatibility
- STM32 NUCLEO boards have been tested with the default configuration provided by the HelloWorld_PLC01A1 example.
- FRDM-K64F board has been tested with the following patch:
return DSPI_HAL_ReadData(spi_address[obj->instance]);
X-NUCLEO-PLC01A1 board powering and startup
The following steps must be followed to run the X-NUCLEO-PLC01A1:
- Plug the X-NUCLEO-PLC01A1 onto a base board
- Connect the base board to a PC via a standard Type A / mini (or micro) B USB cable
- Download the firmware on the MCU hosted on the base board
- Supply 24 V to the X-NUCLEO-PLC01A1 board through the J8 connector
- The HelloWorld_PLC01A1 demonstration firmware is ready to run: connect any of the 8 inputs on the J8 connector to see the corresponding output on the J10 connector capable of driving a load (i.e. short-circuit input “x” with the 24 V and connect the corresponding output “x” to a load).
Revision 0:b66a560b6618, committed 2016-02-19
- Comitter:
- apalmieri
- Date:
- Fri Feb 19 10:56:30 2016 +0000
- Child:
- 1:88626b7666ff
- Commit message:
- Library to handle the X-NUCLEO-PLC01A1 Programmable Logic Controller Expansion Board.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/CLT01_38SQ7/CLT01_38S_class.cpp Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,221 @@
+/**
+ ******************************************************************************
+ * @file CLT01_38S_class.cpp
+ * @author System Lab Noida
+ * @version V1.0.0
+ * @date 08-July-2015
+ * @brief PLC_CLT01-38SQ7
+ * This file provides firmware functions for how to manage I/O from CLT01-38SQ7
+ ==============================================================================
+
+
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+ /* Includes ------------------------------------------------------------------*/
+#include "plc.h"
+
+#include "CLT01_38S_class.h"
+
+/** @addtogroup Drivers Drivers
+ * @{
+ * @brief Demo Driver Layer
+ */
+
+/** @addtogroup BSP BSP
+ * @{
+ */
+
+/** @addtogroup Components Components
+ * @{
+ */
+
+/** @defgroup CLT01_38S CLT01_38S
+ * @{
+ * @brief Digital Input Driver Layer
+ */
+
+/** @defgroup CLT01_38S_Private_variables CLT01 38S Private variables
+ * @{
+ * @brief Digital Input Private variables
+ */
+
+/* Number of components */
+uint8_t CLT01_38S::number_of_plc_input_components = 0;
+
+
+/** @defgroup CLT01_38S_Exported_Functions CLT01 38S Exported Functions
+ * @{
+ * @brief Digital Input exported Function
+ */
+
+/**********************************************************
+ * @brief Starts the CLT01_38S library
+ * @param init Initialization structure.
+ * @retval COMPONENT_OK in case of success.
+ **********************************************************/
+DrvStatusTypeDef CLT01_38S::CLT01_38S_Init(void *init)
+{
+ OTA_Buffer = 0x00;
+ CLT_PARITY_Buffer = 0x00;
+ UVA_Buffer = 0x00;
+ CLT_INPUT_STATUS_Buffer = 0x00;
+ FLAG_CLT_READ = 0;
+
+ /* Unselect the CLT chip at startup to avoid FAULT */
+ ssel = 1;
+
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief Read id
+ * @param id pointer to the identifier to be read.
+ * @retval COMPONENT_OK in case of success.
+ **********************************************************/
+DrvStatusTypeDef CLT01_38S::CLT01_38S_ReadID(uint8_t *id)
+{
+ *id = plc_input_component_instance;
+
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief CLT Read Status
+ * @param None
+ * @retval Status
+ **********************************************************/
+uint8_t CLT01_38S::CLT01_38S_GetReadStatus(void)
+{
+ return FLAG_CLT_READ;
+}
+
+/**********************************************************
+ * @brief Set CLT Read Status
+ * @param Status
+ * @retval None
+ **********************************************************/
+void CLT01_38S::CLT01_38S_SetReadStatus(uint8_t status)
+{
+ FLAG_CLT_READ = status;
+}
+
+/**********************************************************
+ * @brief INPUT status
+ * @param None
+ * @retval Channels status corresponding to 8 inputs
+ **********************************************************/
+uint8_t CLT01_38S::CLT01_38S_GetInputData(void)
+{
+ CLT_INPUT_STATUS_Buffer = spi_rx_buff[1];
+
+ return CLT_INPUT_STATUS_Buffer;
+}
+
+/**********************************************************
+ * @brief CLT Over_Temprature_Alarm
+ * @param None
+ * @retval Overtemperature bit, COMPONENT_ERROR in case of alarm
+ **********************************************************/
+DrvStatusTypeDef CLT01_38S::CLT01_38S_OverTempAlarm(void)
+{
+ OTA_Buffer = spi_rx_buff[0];
+ OTA_Buffer = OTA_Buffer & (0x40);
+
+ if(OTA_Buffer == 0x40)
+ return COMPONENT_OK;
+ else
+ return COMPONENT_ERROR;
+}
+
+/**********************************************************
+ * @brief CLT Parity_Check_bits
+ * @param None
+ * @retval Parity bits for diagnosing inconsistency in data transmission
+ **********************************************************/
+uint8_t CLT01_38S::CLT01_38S_CheckParity(void)
+{
+ CLT_PARITY_Buffer = spi_rx_buff[0];
+ CLT_PARITY_Buffer = CLT_PARITY_Buffer & (0x3C);
+ CLT_PARITY_Buffer = CLT_PARITY_Buffer >> 2;
+ return CLT_PARITY_Buffer;
+}
+
+/**********************************************************
+ * @brief CLT Under_Voltage_Alarm_bit
+ * @param None
+ * @retval Under voltage alarm bit, COMPONENT_ERROR in case of alarm
+ **********************************************************/
+DrvStatusTypeDef CLT01_38S::CLT01_38S_UnderVoltAlarm(void)
+{
+ UVA_Buffer = spi_rx_buff[0];
+ UVA_Buffer = UVA_Buffer & (0x80);
+
+ if(UVA_Buffer == 0x80)
+ return COMPONENT_OK;
+ else
+ return COMPONENT_ERROR;
+}
+
+/**********************************************************
+ * @brief Get input information from input channels component
+ * @param rxBuff
+ * @retval None
+ **********************************************************/
+void CLT01_38S::CLT01_38S_DigInpArray_GetInput(uint8_t *inputArray)
+{
+ if(CLT01_38S_SpiReadBytes(spi_tx_buff, spi_rx_buff) != 0)
+ {
+ /* Aborting the program */
+ exit(EXIT_FAILURE);
+ }
+ inputArray[0] = spi_rx_buff[0];
+ inputArray[1] = spi_rx_buff[1];
+}
+
+/**
+ * @} //end CLT01_38S Exported Functions
+ */
+
+/**
+ * @} //end CLT01_38S Device Driver
+ */
+/**
+ * @} //end Components
+ */
+/**
+ * @} //close group BSP
+ */
+
+/**
+ * @} //close group Drivers
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/CLT01_38SQ7/CLT01_38S_class.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,378 @@
+/**
+ ******************************************************************************
+ * @file CLT01_38S_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 4th, 2016
+ * @brief This file contains the class of an CLT01_38SQ7 PLC component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+
+#ifndef __CLT01_38S_CLASS_H
+#define __CLT01_38S_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+
+/* ACTION 1 ------------------------------------------------------------------*
+ * Include here platform specific header files. *
+ *----------------------------------------------------------------------------*/
+#include "mbed.h"
+
+/* ACTION 2 ------------------------------------------------------------------*
+ * Include here component specific header files. *
+ *----------------------------------------------------------------------------*/
+ #include "../Common/plc.h"
+
+/* ACTION 3 ------------------------------------------------------------------*
+ * Include here interface specific header files. *
+ * *
+ * Example: *
+ * #include "../Interfaces/PLCInput.h" *
+ *----------------------------------------------------------------------------*/
+#include "../Interfaces/PLCInput_class.h"
+
+
+/* Classes -------------------------------------------------------------------*/
+
+/**
+ * @brief Class representing an CLT01_38S component.
+ */
+class CLT01_38S : public PLCInput
+{
+public:
+
+ /*** Constructor and Destructor Methods ***/
+
+ /**
+ * @brief Constructor.
+ * @param ssel pin name of the SSEL pin of the SPI device to be used for communication.
+ * @param spi SPI device to be used for communication.
+ */
+ CLT01_38S(PinName input_ssel, SPI &spi) : PLCInput(), ssel(input_ssel), dev_spi(spi)
+ {
+ /* Checking stackability. */
+ if (!(number_of_plc_input_components < MAX_NUMBER_OF_PLC_INPUT_COMPONENTS))
+ error("Instantiation of the CLT01_38S component failed: it can be stacked up to %d times.\r\n", MAX_NUMBER_OF_PLC_INPUT_COMPONENTS);
+
+ plc_input_component_instance = number_of_plc_input_components++;
+ memset(spi_tx_buff, 0, NB_BYTES * sizeof(uint8_t));
+ memset(spi_rx_buff, 0, NB_BYTES * sizeof(uint8_t));
+ }
+
+ /**
+ * @brief Destructor.
+ */
+ virtual ~CLT01_38S(void) {}
+
+
+ /*** Public Component Related Methods ***/
+
+ /* ACTION 5 --------------------------------------------------------------*
+ * Implement here the component's public methods, as wrappers of the C *
+ * component's functions. *
+ * They should be: *
+ * + Methods with the same name of the C component's virtual table's *
+ * functions (1); *
+ * + Methods with the same name of the C component's extended virtual *
+ * table's functions, if any (2). *
+ * *
+ * Example: *
+ * virtual int GetValue(float *pData) //(1) *
+ * { *
+ * return COMPONENT_GetValue(float *pfData); *
+ * } *
+ * *
+ * virtual int EnableFeature(void) //(2) *
+ * { *
+ * return COMPONENT_EnableFeature(); *
+ * } *
+ *------------------------------------------------------------------------*/
+ /**
+ * @brief Initializing the component in 1/16 Microstepping mode.
+ * @param init Pointer to device specific initalization structure.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+ virtual int Init(void *init = NULL)
+ {
+ return (int) CLT01_38S_Init((void *) init);
+ }
+
+ /**
+ * @brief Getting the ID of the component.
+ * @param id Pointer to an allocated variable to store the ID into.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+ virtual int ReadID(uint8_t *id = NULL)
+ {
+ return (int) CLT01_38S_ReadID((uint8_t *) id);
+ }
+
+ /**
+ * @brief Set Read Status
+ * @param None
+ * @retval Status
+ */
+ virtual uint8_t GetReadStatus(void)
+ {
+ return (uint8_t) CLT01_38S_GetReadStatus();
+ }
+
+ /**
+ * @brief Set Read Status
+ * @param Status
+ * @retval None
+ */
+ virtual void SetReadStatus(uint8_t status)
+ {
+ CLT01_38S_SetReadStatus(status);
+ }
+
+ /**
+ * @brief Get Input Status
+ * @param None
+ * @retval Channels status corresponding to 8 inputs
+ */
+ virtual uint8_t GetInputData(void)
+ {
+ return (uint8_t) CLT01_38S_GetInputData();
+ }
+
+ /**
+ * @brief Over Temperature Alarm bit
+ * @param None
+ * @retval Overtemperature bit, 1 in case of alarm
+ */
+ virtual uint8_t OverTempAlarm(void)
+ {
+ return (uint8_t) CLT01_38S_OverTempAlarm();
+ }
+
+ /**
+ * @brief Parity Check bits
+ * @param None
+ * @retval Parity bits for diagnosing inconsistency in data transmission
+ */
+ virtual uint8_t CheckParity(void)
+ {
+ return (uint8_t) CLT01_38S_CheckParity();
+ }
+
+ /**
+ * @brief Under Voltage Alarm bit
+ * @param None
+ * @retval Under voltage alarm bit, 1 in case of alarm
+ */
+ virtual uint8_t UnderVoltAlarm(void)
+ {
+ return (uint8_t) CLT01_38S_UnderVoltAlarm();
+ }
+
+ /**
+ * @brief Get input information from output channels component
+ * @param TX buffer
+ * @param RX buffer
+ * @retval None
+ */
+ virtual void DigInpArray_GetInput(uint8_t *inputArray)
+ {
+ CLT01_38S_DigInpArray_GetInput(inputArray);
+ }
+
+ /* Auxiliary method to enable or disable SPI CS pin */
+ virtual void setInputSPI(uint8_t l)
+ {
+ ssel = l;
+ }
+
+protected:
+
+ /*** Protected Component Related Methods ***/
+
+ /* ACTION 7 --------------------------------------------------------------*
+ * Declare here the component's specific methods. *
+ * They should be: *
+ * + Methods with the same name of the C component's virtual table's *
+ * functions (1); *
+ * + Methods with the same name of the C component's extended virtual *
+ * table's functions, if any (2); *
+ * + Helper methods, if any, like functions declared in the component's *
+ * source files but not pointed by the component's virtual table (3). *
+ * *
+ * Example: *
+ * DrvStatusTypeDef COMPONENT_Init(void *init); *
+ *------------------------------------------------------------------------*/
+ DrvStatusTypeDef CLT01_38S_Init(void *init);
+ DrvStatusTypeDef CLT01_38S_ReadID(uint8_t *id);
+ uint8_t CLT01_38S_GetReadStatus(void);
+ void CLT01_38S_SetReadStatus(uint8_t status);
+ uint8_t CLT01_38S_GetInputData(void);
+ DrvStatusTypeDef CLT01_38S_OverTempAlarm(void);
+ uint8_t CLT01_38S_CheckParity(void);
+ DrvStatusTypeDef CLT01_38S_UnderVoltAlarm(void);
+ void CLT01_38S_DigInpArray_GetInput(uint8_t *inputArray);
+
+ /*** Component's I/O Methods ***/
+
+ /**
+ * @brief Utility function to read and write data from/to CLT01_38S at the same time.
+ * @param[out] pBufferToRead pointer to the buffer to read data into.
+ * @param[in] pBufferToWrite pointer to the buffer of data to send.
+ * @param[in] NumValues number of values to read and write.
+ * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
+ */
+ DrvStatusTypeDef ReadWrite(uint8_t* pBufferToRead, uint8_t* pBufferToWrite, uint16_t NumValues)
+ {
+ (void) NumValues;
+ uint16_t dataToRead;
+ uint16_t dataToWrite;
+
+ // Converts two uint8_t words into one of uint16_t
+ dataToWrite = convertFrom8To16(pBufferToWrite);
+
+ // Select the chip.
+ ssel = 0;
+
+ dataToRead = dev_spi.write(dataToWrite);
+
+ // Unselect the chip.
+ ssel = 1;
+
+ // Converts one uint16_t word into two uint8_t
+ convertFrom16To8(dataToRead, pBufferToRead);
+
+ return COMPONENT_OK;
+ }
+
+ /* ACTION 8 --------------------------------------------------------------*
+ * Implement here other I/O methods beyond those already implemented *
+ * above, which are declared extern within the component's header file. *
+ *------------------------------------------------------------------------*/
+ /**
+ * @brief Making the CPU wait.
+ * @param None.
+ * @retval None.
+ */
+ void CLT01_38S_Delay(uint32_t delay)
+ {
+ wait_ms(delay);
+ }
+
+ /**
+ * @brief Writing and reading bytes to/from the component through the SPI at the same time.
+ * @param[in] pByteToTransmit pointer to the buffer of data to send.
+ * @param[out] pReceivedByte pointer to the buffer to read data into.
+ * @retval "0" in case of success, "1" otherwise.
+ */
+ uint8_t CLT01_38S_SpiReadBytes(uint8_t *pByteToTransmit, uint8_t *pReceivedByte)
+ {
+ return (uint8_t) (ReadWrite(pReceivedByte, pByteToTransmit, BUFFERSIZE) == COMPONENT_OK ? 0 : 1);
+ }
+
+
+ /*** Component's Instance Variables ***/
+
+ /* ACTION 9 --------------------------------------------------------------*
+ * Declare here interrupt related variables, if needed. *
+ * Note that interrupt handling is platform dependent, see *
+ * "Interrupt Related Methods" above. *
+ * *
+ * Example: *
+ * + mbed: *
+ * InterruptIn feature_irq; *
+ *------------------------------------------------------------------------*/
+
+ /* ACTION 10 -------------------------------------------------------------*
+ * Declare here other pin related variables, if needed. *
+ * *
+ * Example: *
+ * + mbed: *
+ * PwmOut pwm; *
+ *------------------------------------------------------------------------*/
+
+ /* ACTION 11 -------------------------------------------------------------*
+ * Declare here communication related variables, if needed. *
+ * *
+ * Example: *
+ * + mbed: *
+ * DigitalOut ssel; *
+ * SPI &dev_spi; *
+ *------------------------------------------------------------------------*/
+ /* Configuration. */
+ DigitalOut ssel;
+
+ /* IO Device. */
+ SPI &dev_spi;
+
+ /* ACTION 12 -------------------------------------------------------------*
+ * Declare here identity related variables, if needed. *
+ * Note that there should be only a unique identifier for each component, *
+ * which should be the "who_am_i" parameter. *
+ *------------------------------------------------------------------------*/
+ /* Identity */
+ uint8_t who_am_i;
+
+ /* ACTION 13 -------------------------------------------------------------*
+ * Declare here the component's static and non-static data, one variable *
+ * per line. *
+ * *
+ * Example: *
+ * float measure; *
+ * int instance_id; *
+ * static int number_of_instances; *
+ *------------------------------------------------------------------------*/
+ /* Data. */
+ uint8_t plc_input_component_instance;
+
+ uint8_t OTA_Buffer;
+ uint8_t CLT_PARITY_Buffer;
+ uint8_t UVA_Buffer;
+ uint8_t CLT_INPUT_STATUS_Buffer;
+ uint8_t FLAG_CLT_READ;
+
+ /* Static data. */
+ static uint8_t number_of_plc_input_components;
+
+ /* Digital Input Array buffers for SPI communication */
+ uint8_t spi_tx_buff[NB_BYTES];
+ uint8_t spi_rx_buff[NB_BYTES];
+
+
+public:
+
+ /* Static data. */
+};
+
+#endif // __CLT01_38S_CLASS_H
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Common/plc.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,147 @@
+/**
+ ******************************************************************************
+ * @file plc.h
+ * @author System Lab Noida
+ * @version V1.0.0
+ * @date 08-July-2015
+ * @brief This header file contains the functions prototypes for the
+ * plc driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __PLC_H
+#define __PLC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include <stdint.h>
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup Components
+ * @{
+ */
+
+/** @addtogroup PLC
+ * @{
+ */
+
+/** @defgroup PLC_Exported_Constants
+ * @{
+ */
+#define MAX_NUMBER_OF_PLC_INPUT_COMPONENTS 1
+#define MAX_NUMBER_OF_PLC_OUTPUT_COMPONENTS 1
+
+#define NB_BYTES 2
+#define BUFFERSIZE 1
+
+/** @defgroup PLC_Exported_Types
+ * @{
+ */
+
+/** @defgroup PLC_Exported_variables plc Exported variables
+ * @{
+ * @brief Exported variables
+ */
+
+/**
+ * @brief Component's Status enumerator definition.
+ */
+typedef enum
+{
+ COMPONENT_OK = 0,
+ COMPONENT_ERROR,
+ COMPONENT_TIMEOUT,
+ COMPONENT_NOT_IMPLEMENTED
+} DrvStatusTypeDef;
+
+/**
+ * @brief SSRELAY driver structure definition
+ */
+typedef struct
+{
+ void (*SetChannels) (uint8_t Out_array);
+ uint8_t (*ManageFault)(void);
+ uint8_t (*CheckDCDCStatus)(void);
+ uint8_t (*TemperatureWarning)(void);
+ uint8_t (*CheckParity)(void);
+ uint8_t (*CheckPowerGood)(void);
+ uint8_t (*CheckCommError)(void);
+ void (*Ssrelay_SetOutput)(uint8_t *TxBuff, uint8_t *RxBuff);
+} SSRELAY_DrvTypeDef;
+
+
+/**
+ * @brief DIGITALINPUTARRAY driver structure definition
+ */
+typedef struct
+{
+ uint8_t (*GetReadStatus)(void);
+ void (*SetReadStatus)(uint8_t status);
+ uint8_t (*GetInputData)(void);
+ uint8_t (*OverTempAlarm)(void);
+ uint8_t (*CheckParity)(void);
+ uint8_t (*UnderVoltAlarm)(void);
+ void (*DigInpArray_GetInput)(uint8_t *TxBuff, uint8_t *RxBuff);
+} DIGITALINPUTARRAY_DrvTypeDef;
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __PLC_H */
+/**
+ * @} // end plc Exported Function
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Interfaces/Component_class.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,103 @@
+/**
+ ******************************************************************************
+ * @file Component_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 4th, 2016
+ * @brief This file contains the abstract class describing the interface of a
+ * generic component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent from recursive inclusion --------------------------------*/
+
+#ifndef __COMPONENT_CLASS_H
+#define __COMPONENT_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include <stdint.h>
+
+
+/* Classes ------------------------------------------------------------------*/
+
+/** An abstract class for Generic components.
+ */
+class Component
+{
+public:
+ /**
+ * @brief Initializing the component.
+ * @param init Pointer to device specific initalization structure.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+ virtual int Init(void *init) = 0;
+
+ /**
+ * @brief Getting the ID of the component.
+ * @param id Pointer to an allocated variable to store the ID into.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+ virtual int ReadID(uint8_t *id) = 0;
+
+ /**
+ * @brief Converts two uint8_t words into one of uint16_t
+ * @param[in] ptr pointer to the buffer of data to be converted.
+ * @retval 16-bit data.
+ */
+ uint16_t convertFrom8To16(uint8_t *ptr)
+ {
+ uint16_t data16 = 0x0000;
+
+ data16 = *ptr;
+ data16 |= *(++ptr) << 8;
+
+ return data16;
+ }
+
+ /**
+ * @brief Converts one uint16_t word into two uint8_t
+ * @param[in] ptr pointer to the buffer of uint8_t words.
+ * @param[in] 16-bit data.
+ * @retval none.
+ */
+ void convertFrom16To8(uint16_t data16, uint8_t *ptr)
+ {
+ *(ptr) = data16 & 0x00FF;
+ *(++ptr) = (data16 >> 8) & 0x00FF;
+ }
+
+};
+
+#endif /* __COMPONENT_CLASS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Interfaces/PLCInput_class.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * @file PLCInput_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 4th, 2016
+ * @brief This file contains the abstract class describing the interface of a
+ * PLC input component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent from recursive inclusion --------------------------------*/
+
+#ifndef __PLCINPUT_CLASS_H
+#define __PLCINPUT_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include <Component_class.h>
+
+
+/* Classes ------------------------------------------------------------------*/
+
+/** An abstract class for PLCInput component.
+ */
+class PLCInput : public Component
+{
+public:
+
+ /**
+ * @brief Get Read Status
+ * @param None
+ * @retval Status
+ */
+ virtual uint8_t GetReadStatus(void) = 0;
+
+ /**
+ * @brief Set Read Status
+ * @param Status
+ * @retval None
+ */
+ virtual void SetReadStatus(uint8_t status) = 0;
+
+ /**
+ * @brief Get Input Status
+ * @param None
+ * @retval Channels status corresponding to 8 inputs
+ */
+ virtual uint8_t GetInputData(void) = 0;
+
+ /**
+ * @brief Over Temperature Alarm bit
+ * @param None
+ * @retval Overtemperature bit, 1 in case of alarm
+ */
+ virtual uint8_t OverTempAlarm(void) = 0;
+
+ /**
+ * @brief Parity Check bits
+ * @param None
+ * @retval Parity bits for diagnosing inconsistency in data transmission
+ */
+ virtual uint8_t CheckParity(void) = 0;
+
+ /**
+ * @brief Under Voltage Alarm bit
+ * @param None
+ * @retval Under voltage alarm bit, 1 in case of alarm
+ */
+ virtual uint8_t UnderVoltAlarm(void) = 0;
+
+ /**
+ * @brief Get input information from input channels component
+ * @param RX buffer
+ * @retval None
+ */
+ virtual void DigInpArray_GetInput(uint8_t *inputArray) = 0;
+
+ /* Auxiliary method to enable or disable SPI CS pin */
+ virtual void setInputSPI(uint8_t l) = 0;
+};
+
+#endif /* __PLCINPUT_CLASS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Interfaces/PLCOutput_class.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,118 @@
+/**
+ ******************************************************************************
+ * @file PLCOutput_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 4th, 2016
+ * @brief This file contains the abstract class describing the interface of a
+ * PLC output component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent from recursive inclusion --------------------------------*/
+
+#ifndef __PLCOUTPUT_CLASS_H
+#define __PLCOUTPUT_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include <Component_class.h>
+
+
+/* Classes ------------------------------------------------------------------*/
+
+/** An abstract class for PLCOutut component.
+ */
+class PLCOutput : public Component
+{
+public:
+
+ /**
+ * @brief Set output channels state
+ * @param Output channel data
+ * @retval None
+ */
+ virtual void SetChannels(uint8_t Out_array) = 0;
+
+ /**
+ * @brief Get output fault status
+ * @param None
+ * @retval Output channel fault data
+ */
+ virtual uint8_t ManageFault(void) = 0;
+
+ /**
+ * @brief Get DC-DC status of the output channels component
+ * @param None
+ * @retval Feedback status, 1 if OK else 0
+ */
+ virtual uint8_t CheckDCDCStatus(void) = 0;
+
+ /**
+ * @brief Get temperature warning status
+ * @param None
+ * @retval Temperature warning status, 1 if over temperature
+ */
+ virtual uint8_t TemperatureWarning(void) = 0;
+
+ /**
+ * @brief Get parity check status
+ * @param None
+ * @retval Parity check flag
+ */
+ virtual uint8_t CheckParity(void) = 0;
+
+ /**
+ * @brief Get power supply status
+ * @param None
+ * @retval Power good bit, 1 in case of power good
+ */
+ virtual uint8_t CheckPowerGood(void) = 0;
+
+ /**
+ * @brief Get parity bits for input data
+ * @param None
+ * @retval Parity bits
+ */
+ virtual uint8_t CheckCommError(void) = 0;
+
+ /**
+ * @brief Set output for output channels component
+ * @param TX buffer
+ * @retval None
+ */
+ virtual void Ssrelay_SetOutput(uint8_t *outputArray) = 0;
+};
+
+#endif /* __PLCOUTPUT_CLASS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Interfaces/PLC_class.cpp Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,281 @@
+/**
+ ******************************************************************************
+ * @file PLC_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 9th, 2016
+ * @brief This file contains the abstract class describing the interface of a
+ * generic component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+ /* Includes ------------------------------------------------------------------*/
+
+
+#include "PLC_class.h"
+
+/**
+ * @brief Mirrors input data
+ * @param Input channel state buffer
+ * @retval Input buffer state
+ */
+uint8_t PLC::signalMirror(uint8_t In_Array)
+{
+ return(In_Array);
+}
+
+void PLC::handleFreezeTo(void)
+{
+ freezeTo = true;
+}
+
+/**
+ * @brief Freeze selected output for a given time
+ * @param Output channels to be freezed
+ * @param Duration of freeze
+ * @retval Output value
+ */
+uint8_t PLC::outputFreeze(uint8_t N_Channel, uint16_t msec)
+{
+ if(freezeTo) {
+ timeout.detach();
+ return(0x00);
+ } else if(!attached) {
+ attached = true;
+ timeout.attach(this, &PLC::handleFreezeTo, msec/1000);
+ }
+
+ return N_Channel;
+}
+
+/**
+ * @brief Regroup output buffer according to out_Array
+ * @param Regroup array
+ * @retval Value
+ */
+uint8_t PLC::outputRegroup(uint8_t Out_Array)
+{
+ return(Out_Array);
+}
+
+/**
+ * @brief Sum all the inputs at high state
+ * @param Input channel state data
+ * @retval Value corresponding to the sum of inputs at high
+ */
+uint8_t PLC::inputSum(uint8_t* Buffer, uint8_t In_Array)
+{
+
+ uint8_t inputChannelsOn = 0;
+ uint8_t count = 0;
+ *Buffer = In_Array;
+
+ for(count = 0; count<8; count++)
+ {
+ if((In_Array & 0x01) == 0x01)
+ inputChannelsOn++;
+
+ In_Array = In_Array >> 1;
+ }
+
+ return inputChannelsOn;
+
+}
+
+/**
+ * @brief Set the output channels on/off
+ * @param Output to set
+ * @retval Output value
+ */
+uint8_t PLC::setOutput(uint8_t Out_Array)
+{
+ return(Out_Array);
+}
+
+/**
+ * @brief AND Inputs for selected output channels
+ * @param Input channels state
+ * @param Outputs to be AND with inputs
+ * @retval Result of AND operation
+ */
+uint8_t PLC::inputsAND(uint8_t In_Array, uint8_t Out_Channel)
+{
+ uint8_t outArray = 0;
+ outArray = In_Array & Out_Channel;
+
+ return outArray;
+}
+
+/**
+ * @brief OR Inputs for selected output channels
+ * @param Input channels state
+ * @param Outputs to be OR with inputs
+ * @retval Result of OR operation
+ */
+uint8_t PLC::inputsOR(uint8_t In_Array, uint8_t Out_Channel)
+{
+ uint8_t outArray = 0;
+ outArray = In_Array | Out_Channel;
+
+ return outArray;
+}
+
+/**
+ * @brief NOT Inputs
+ * @param Input channels state
+ * @retval Result of OR operation
+ */
+uint8_t PLC::inputsNOT(uint8_t In_Array)
+{
+ uint8_t outArray = 0;
+ In_Array = ~(In_Array);
+ outArray = In_Array;
+
+ return outArray;
+}
+
+/**
+ * @brief XOR Inputs for selected output channels
+ * @param Input channels state
+ * @param Outputs to be XOR with inputs
+ * @retval Result of XOR operation
+ */
+uint8_t PLC::inputsXOR(uint8_t In_Array, uint8_t Out_Channel)
+{
+ uint8_t outArray = 0;
+ outArray = In_Array ^ Out_Channel;
+
+ return outArray;
+}
+
+/**
+ * @brief Calculate and set parity bits for Ssrelay transmission
+ * @param Output value buffer
+ * @retval None
+ */
+void PLC::outputParityBits(uint8_t* Buffer)
+{
+ uint8_t Parity_Cal0 = 0x00;
+ uint8_t Parity_Cal1 = 0x00;
+ uint8_t Parity_Cal2 = 0x00;
+ uint8_t Parity_Cal3 = 0x00;
+ uint8_t Parity_Cal4 = 0x00;
+ uint8_t Parity_Cal5 = 0x00;
+ uint8_t Parity_Cal6 = 0x00;
+ uint8_t Parity_Cal7 = 0x00;
+ uint8_t nP0 = 0x00;
+ uint8_t P0 = 0x00;
+ uint8_t P1 = 0x00;
+ uint8_t P2 = 0x00;
+
+ Parity_Cal0 = Buffer[1] & 0x80;
+ Parity_Cal0 = Parity_Cal0>>7;
+
+ Parity_Cal1 = Buffer[1] & 0x40;
+ Parity_Cal1 = Parity_Cal1>>6;
+
+ Parity_Cal2 = Buffer[1] & 0x20;
+ Parity_Cal2 = Parity_Cal2>>5;
+
+ Parity_Cal3 = Buffer[1] & 0x10;
+ Parity_Cal3 = Parity_Cal3>>4;
+
+ Parity_Cal4 = Buffer[1] & 0x08;
+ Parity_Cal4 = Parity_Cal4>>3;
+
+ Parity_Cal5 = Buffer[1] & 0x04;
+ Parity_Cal5 = Parity_Cal5>>2;
+
+ Parity_Cal6 = Buffer[1] & 0x02;
+ Parity_Cal6 = Parity_Cal6>>1;
+
+ Parity_Cal7 = Buffer[1] & 0x01;
+
+
+ /* Caluculate parity bits based on output data */
+ P2 = ((Parity_Cal7^Parity_Cal5)^Parity_Cal3)^Parity_Cal1;
+ if(P2 == 0x01)
+ P2 = 0x08;
+ else
+ P2 = 0x00;
+
+ P1 = ((Parity_Cal6^Parity_Cal4)^Parity_Cal2)^Parity_Cal0;
+ if(P1 == 0x01)
+ P1 = 0x04;
+ else
+ P1 = 0x00;
+
+ P0 = ((((((Parity_Cal7^Parity_Cal6)^Parity_Cal5)^Parity_Cal4)^Parity_Cal3)
+ ^Parity_Cal2)^Parity_Cal1)^Parity_Cal0;
+ if(P0 == 0x01)
+ P0 = 0X02;
+ else
+ P0 = 0x00;
+
+ nP0 = 0x00;
+ if(P0 == 0x02)
+ nP0 = 0x00;
+ else
+ nP0 = 0x01;
+
+ /* Set Ssrelay_TxBuffer parity bits field */
+ Buffer[0] = P2|P1|P0|nP0;
+}
+
+/**
+ * @brief Toggle selected output for given frequency
+ * @param Output channels to be toggled
+ * @retval None
+ */
+void PLC::outputCycling(void)
+{
+ if(!attached) {
+ attached = true;
+ ticker.attach(this, &PLC::toggleOutput, 0.3);
+ }
+
+}
+
+void PLC::toggleOutput(void)
+{
+ /* Reset & set CS1 to refresh VNI watchdog */
+ plcIn.setInputSPI(0);
+ plcIn.setInputSPI(1);
+
+ outBuff[1] = ~(outBuff[1]);
+
+ /* Parity bits calculation */
+ outputParityBits(outBuff);
+
+ /* Transmit data to VNI on SPI */
+ plcOut.Ssrelay_SetOutput(outBuff);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Interfaces/PLC_class.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,195 @@
+/**
+ ******************************************************************************
+ * @file PLC_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 9th, 2016
+ * @brief This file contains the abstract class describing the interface of a
+ * generic component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent from recursive inclusion --------------------------------*/
+
+#ifndef __PLC_CLASS_H
+#define __PLC_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "CLT01_38S_class.h"
+#include "VNI8200XP_class.h"
+
+
+/* Classes ------------------------------------------------------------------*/
+
+class PLC
+{
+public:
+
+ /*** Constructor and Destructor Methods ***/
+
+ /**
+ * @brief Constructor.
+ * @param input_ssel pin name of the SSEL pin of the SPI device to be used for communication with Input Channels component
+ * @param output_ssel pin name of the SSEL pin of the SPI device to be used for communication with Output Channels component
+ * @param spi SPI device to be used for communication.
+ */
+ PLC(PinName input_ssel, PinName output_ssel, PinName out_en, SPI &spi) : plcIn(input_ssel, spi), plcOut(out_en, output_ssel, spi), freezeTo(false), attached(false)
+ {
+ if (plcIn.Init() != COMPONENT_OK)
+ exit(EXIT_FAILURE);
+
+ if (plcOut.Init() != COMPONENT_OK)
+ exit(EXIT_FAILURE);
+
+ outBuff[0] = 0;
+ outBuff[1] = 0;
+ }
+
+ /**
+ * @brief Destructor.
+ */
+ virtual ~PLC(void) {}
+
+ /*
+ * Accessors to PLC input channels component. Please refer to PLCInput_class.h. All PLCInput related
+ * functionality requires going through this accessor.
+ */
+ const PLCInput& plcInput() const { return plcIn; }
+ PLCInput& plcInput() { return plcIn; }
+
+ /*
+ * Accessors to PLC output channels component. Please refer to PLCOutput_class.h. All PLCOutput related
+ * functionality requires going through this accessor.
+ */
+ const PLCOutput& plcOutput() const { return plcOut; }
+ PLCOutput& plcOutput() { return plcOut; }
+
+ /*
+ * @brief Mirrors input data
+ * @param Input channel state buffer
+ * @retval Input buffer state
+ */
+ uint8_t signalMirror(uint8_t In_Array);
+
+ /*
+ * @brief Freeze selected output for a given time
+ * @param Output channels to be freezed
+ * @param Duration of freeze
+ * @retval Output value
+ */
+ uint8_t outputFreeze(uint8_t N_Channel, uint16_t msec);
+
+ /*
+ * @brief Regroup output buffer according to out_Array
+ * @param Regroup array
+ * @retval Value
+ */
+ uint8_t outputRegroup(uint8_t Out_Array);
+
+ /*
+ * @brief Sum all the inputs at high state
+ * @param Input channel state data
+ * @retval Value corresponding to the sum of inputs at high
+ */
+ uint8_t inputSum(uint8_t* Buffer, uint8_t In_Array);
+
+ /*
+ * @brief Set the output channels on/off
+ * @param Output to set
+ * @retval Output value
+ */
+ uint8_t setOutput(uint8_t Out_Array);
+
+ /*
+ * @brief AND Inputs for selected output channels
+ * @param Input channels state
+ * @param Outputs to be AND with inputs
+ * @retval Result of AND operation
+ */
+ uint8_t inputsAND(uint8_t In_Array, uint8_t Out_Channel);
+
+ /*
+ * @brief OR Inputs for selected output channels
+ * @param Input channels state
+ * @param Outputs to be OR with inputs
+ * @retval Result of OR operation
+ */
+ uint8_t inputsOR(uint8_t In_Array, uint8_t Out_Channel);
+
+ /*
+ * @brief NOT Inputs
+ * @param Input channels state
+ * @retval Result of OR operation
+ */
+ uint8_t inputsNOT(uint8_t In_Array);
+
+
+ /*
+ * @brief XOR Inputs for selected output channels
+ * @param Input channels state
+ * @param Outputs to be XOR with inputs
+ * @retval Result of XOR operation
+ */
+ uint8_t inputsXOR(uint8_t In_Array, uint8_t Out_Channel);
+
+ /*
+ * @brief Calculate and set parity bits for Ssrelay transmission
+ * @param Output value buffer
+ * @retval None
+ */
+ void outputParityBits(uint8_t* Buffer);
+
+ /*
+ * @brief Toggle selected output for given frequency
+ * @param Output channels to be toggled
+ * @retval None
+ */
+ void outputCycling(void);
+
+protected:
+ void handleFreezeTo(void);
+ void toggleOutput(void);
+
+ CLT01_38S plcIn;
+ VNI8200XP plcOut;
+
+ Timeout timeout;
+ bool freezeTo;
+ bool attached;
+
+ Ticker ticker;
+ uint8_t outBuff[2];
+};
+
+#endif /* __PLC_CLASS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/VNI8200XP/VNI8200XP_class.cpp Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,243 @@
+/**
+ ******************************************************************************
+ * @file VNI8200XP_class.cpp
+ * @author System Lab Noida
+ * @version V1.0.0
+ * @date 08-July-2015
+ * @brief PLC_CLT01-38SQ7
+ * This file provides firmware functions for how to manage I/O from VNI8200XP
+ ==============================================================================
+
+
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+ /* Includes ------------------------------------------------------------------*/
+#include "plc.h"
+
+#include "VNI8200XP_class.h"
+
+/** @addtogroup Drivers Drivers
+ * @{
+ * @brief Demo Driver Layer
+ */
+
+/** @addtogroup BSP BSP
+ * @{
+ */
+
+/** @addtogroup Components Components
+ * @{
+ */
+
+/** @defgroup VNI8200XP VNI8200XP
+ * @{
+ * @brief Digital Output Driver Layer
+ */
+
+/** @defgroup VNI8200XP_Private_variables VNI8200XP Private variables
+ * @{
+ * @brief Digital Output Private variables
+ */
+
+/* Number of components */
+uint8_t VNI8200XP::number_of_plc_output_components = 0;
+
+
+/** @defgroup VNI8200XP_Exported_Functions VNI8200XP Exported Functions
+ * @{
+ * @brief Digital Input exported Function
+ */
+
+/**********************************************************
+ * @brief Starts the VNI8200XP library
+ * @param init Initialization structure.
+ * @retval COMPONENT_OK in case of success.
+ **********************************************************/
+DrvStatusTypeDef VNI8200XP::VNI8200XP_Init(void *init)
+{
+ VNI_PARITY_Buffer = 0x00;
+ VNI_FAULT_Buffer = 0x00;
+ VNI_FB_OK = 0x00;
+ VNI_TEMP_WARNING = 0x00;
+ VNI_PARITY_CHECK = 0x00;
+ VNI_POWER_GOOD = 0x00;
+ VNI_PARITY_FALL_Buffer = 0x00;
+
+ /* Unselect the Ssrelay chip at startup to avoid FAULT */
+ ssel = 1;
+
+ /* Enable Ssrelay Outputs */
+ out_en = 1;
+
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief Read id
+ * @param id pointer to the identifier to be read.
+ * @retval COMPONENT_OK in case of success.
+ **********************************************************/
+DrvStatusTypeDef VNI8200XP::VNI8200XP_ReadID(uint8_t *id)
+{
+ *id = plc_output_component_instance;
+
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief Set output channels state
+ * @param Out_array, output channel data
+ * @retval None
+ **********************************************************/
+void VNI8200XP::VNI8200XP_SetChannels(uint8_t Out_array)
+{
+ spi_tx_buff[1] = Out_array;
+}
+
+/**********************************************************
+ * @brief Get output fault status
+ * @param None
+ * @retval Output channel fault data
+ **********************************************************/
+uint8_t VNI8200XP::VNI8200XP_ManageFault(void)
+{
+ VNI_FAULT_Buffer = spi_rx_buff[1];
+ return VNI_FAULT_Buffer;
+}
+
+/**********************************************************
+ * @brief Get VNI8200XP DC-DC status
+ * @param None
+ * @retval Feedback status, COMPONENT_OK if OK
+ **********************************************************/
+DrvStatusTypeDef VNI8200XP::VNI8200XP_CheckDCDCStatus(void)
+{
+ VNI_FB_OK = spi_rx_buff[0];
+ VNI_FB_OK = VNI_FB_OK & 0x80;
+ if(VNI_FB_OK == 0x80)
+ return COMPONENT_ERROR;
+ else
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief Get temperature warning status
+ * @param None
+ * @retval Temperature warning status, COMPONENT_ERROR if over temperature
+ **********************************************************/
+DrvStatusTypeDef VNI8200XP::VNI8200XP_TemperatureWarning(void)
+{
+ VNI_TEMP_WARNING = spi_rx_buff[0];
+ VNI_TEMP_WARNING = VNI_TEMP_WARNING & 0x40;
+ if(VNI_TEMP_WARNING == 0x40)
+ return COMPONENT_ERROR;
+ else
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief Get parity check status
+ * @param None
+ * @retval Parity check flag, COMPONENT_ERROR if 0x20
+ **********************************************************/
+DrvStatusTypeDef VNI8200XP::VNI8200XP_CheckParity(void)
+{
+ VNI_PARITY_CHECK = spi_rx_buff[0];
+ VNI_PARITY_CHECK = VNI_PARITY_CHECK & 0x20;
+ if(VNI_PARITY_CHECK == 0x20)
+ return COMPONENT_ERROR;
+ else
+ return COMPONENT_OK;
+}
+
+/**********************************************************
+ * @brief Get power supply status
+ * @param None
+ * @retval Power good bit, COMPONENT_OK in case of power good
+ **********************************************************/
+DrvStatusTypeDef VNI8200XP::VNI8200XP_CheckPowerGood(void)
+{
+ VNI_POWER_GOOD = spi_rx_buff[0];
+ VNI_POWER_GOOD = VNI_POWER_GOOD & 0x10;
+ if(VNI_POWER_GOOD == 0x10)
+ return COMPONENT_OK;
+ else
+ return COMPONENT_ERROR;
+}
+
+/**********************************************************
+ * @brief Get parity bits for input data from VNI
+ * @param None
+ * @retval Parity bits from VNI
+ **********************************************************/
+uint8_t VNI8200XP::VNI8200XP_CheckCommError(void)
+{
+ VNI_PARITY_FALL_Buffer = spi_rx_buff[0];
+ VNI_PARITY_FALL_Buffer = VNI_PARITY_FALL_Buffer & 0x0F;
+ return VNI_PARITY_FALL_Buffer;
+}
+
+/**********************************************************
+ * @brief Set output channels component
+ * @param txBuff
+ * @retval None
+ **********************************************************/
+void VNI8200XP::VNI8200XP_Ssrelay_SetOutput(uint8_t *outputArray)
+{
+ spi_tx_buff[0] = outputArray[0];
+ spi_tx_buff[1] = outputArray[1];
+
+ if(VNI8200XP_SpiWriteBytes(spi_tx_buff, spi_rx_buff) != 0)
+ {
+ /* Aborting the program */
+ exit(EXIT_FAILURE);
+ }
+}
+
+/**
+ * @} //end VNI8200XP Exported Functions
+ */
+
+/**
+ * @} //end VNI8200XP Device Driver
+ */
+/**
+ * @} //end Components
+ */
+/**
+ * @} //close group BSP
+ */
+
+/**
+ * @} //close group Drivers
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/VNI8200XP/VNI8200XP_class.h Fri Feb 19 10:56:30 2016 +0000
@@ -0,0 +1,399 @@
+/**
+ ******************************************************************************
+ * @file VNI8200XP_class.h
+ * @author AST/CL
+ * @version V1.0.0
+ * @date Feb 5th, 2016
+ * @brief This file contains the class of an VNI8200XP PLC component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+
+#ifndef __VNI8200XP_CLASS_H
+#define __VNI8200XP_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+
+/* ACTION 1 ------------------------------------------------------------------*
+ * Include here platform specific header files. *
+ *----------------------------------------------------------------------------*/
+#include "mbed.h"
+
+/* ACTION 2 ------------------------------------------------------------------*
+ * Include here component specific header files. *
+ *----------------------------------------------------------------------------*/
+ #include "../Common/plc.h"
+
+/* ACTION 3 ------------------------------------------------------------------*
+ * Include here interface specific header files. *
+ * *
+ * Example: *
+ * #include "../Interfaces/PLCOutput_class.h" *
+ *----------------------------------------------------------------------------*/
+#include "../Interfaces/PLCOutput_class.h"
+
+
+/* Classes -------------------------------------------------------------------*/
+
+/**
+ * @brief Class representing an VNI8200XP component.
+ */
+class VNI8200XP : public PLCOutput
+{
+public:
+
+ /*** Constructor and Destructor Methods ***/
+
+ /**
+ * @brief Constructor.
+ * @param out_en pin name of the OUTPUT ENABLE pin used for communication.
+ * @param ssel pin name of the SSEL pin of the SPI device to be used for communication.
+ * @param spi SPI device to be used for communication.
+ */
+ VNI8200XP(PinName output_en, PinName output_ssel, SPI &spi) : PLCOutput(), out_en(output_en), ssel(output_ssel), dev_spi(spi)
+ {
+ /* Checking stackability. */
+ if (!(number_of_plc_output_components < MAX_NUMBER_OF_PLC_OUTPUT_COMPONENTS))
+ error("Instantiation of the VNI8200XP component failed: it can be stacked up to %d times.\r\n", MAX_NUMBER_OF_PLC_OUTPUT_COMPONENTS);
+
+ plc_output_component_instance = number_of_plc_output_components++;
+ memset(spi_tx_buff, 0, NB_BYTES * sizeof(uint8_t));
+ memset(spi_rx_buff, 0, NB_BYTES * sizeof(uint8_t));
+ }
+
+ /**
+ * @brief Destructor.
+ */
+ virtual ~VNI8200XP(void) {}
+
+
+ /*** Public Component Related Methods ***/
+
+ /* ACTION 5 --------------------------------------------------------------*
+ * Implement here the component's public methods, as wrappers of the C *
+ * component's functions. *
+ * They should be: *
+ * + Methods with the same name of the C component's virtual table's *
+ * functions (1); *
+ * + Methods with the same name of the C component's extended virtual *
+ * table's functions, if any (2). *
+ * *
+ * Example: *
+ * virtual int GetValue(float *pData) //(1) *
+ * { *
+ * return COMPONENT_GetValue(float *pfData); *
+ * } *
+ * *
+ * virtual int EnableFeature(void) //(2) *
+ * { *
+ * return COMPONENT_EnableFeature(); *
+ * } *
+ *------------------------------------------------------------------------*/
+ /**
+ * @brief Initializing the component in 1/16 Microstepping mode.
+ * @param init Pointer to device specific initalization structure.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+ virtual int Init(void *init = NULL)
+ {
+ return (int) VNI8200XP_Init((void *) init);
+ }
+
+ /**
+ * @brief Getting the ID of the component.
+ * @param id Pointer to an allocated variable to store the ID into.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+ virtual int ReadID(uint8_t *id = NULL)
+ {
+ return (int) VNI8200XP_ReadID((uint8_t *) id);
+ }
+
+ /**
+ * @brief Set output channels state
+ * @param Output channel data
+ * @retval None
+ */
+ virtual void SetChannels(uint8_t Out_array)
+ {
+ VNI8200XP_SetChannels(Out_array);
+ }
+
+ /**
+ * @brief Get output fault status
+ * @param None
+ * @retval Output channel fault data
+ */
+ virtual uint8_t ManageFault(void)
+ {
+ return (uint8_t) VNI8200XP_ManageFault();
+ }
+
+ /**
+ * @brief Get DC-DC status of the output channels component
+ * @param None
+ * @retval Feedback status, 1 if OK else 0
+ */
+ virtual uint8_t CheckDCDCStatus(void)
+ {
+ return (uint8_t) VNI8200XP_CheckDCDCStatus();
+ }
+
+ /**
+ * @brief Get temperature warning status
+ * @param None
+ * @retval Temperature warning status, 1 if over temperature
+ */
+ virtual uint8_t TemperatureWarning(void)
+ {
+ return (uint8_t) VNI8200XP_TemperatureWarning();
+ }
+
+ /**
+ * @brief Get parity check status
+ * @param None
+ * @retval Parity check flag
+ */
+ virtual uint8_t CheckParity(void)
+ {
+ return (uint8_t) VNI8200XP_CheckParity();
+ }
+
+ /**
+ * @brief Get power supply status
+ * @param None
+ * @retval Power good bit, 1 in case of power good
+ */
+ virtual uint8_t CheckPowerGood(void)
+ {
+ return (uint8_t) VNI8200XP_CheckPowerGood();
+ }
+
+ /**
+ * @brief Get parity bits for input data
+ * @param None
+ * @retval Parity bits
+ */
+ virtual uint8_t CheckCommError(void)
+ {
+ return (uint8_t) VNI8200XP_CheckCommError();
+ }
+
+ /**
+ * @brief Set output for output channels component
+ * @param TX buffer
+ * @param RX buffer
+ * @retval None
+ */
+ virtual void Ssrelay_SetOutput(uint8_t *outputArray)
+ {
+ VNI8200XP_Ssrelay_SetOutput(outputArray);
+ }
+
+ /* Auxiliary method to enable or disable SPI CS pin */
+ virtual void setOutputSPI(uint8_t l)
+ {
+ ssel = l;
+ }
+
+ /* Auxiliary method to enable or disable Out_En pin */
+ virtual void setOutputEn(uint8_t l)
+ {
+ out_en = l;
+ }
+
+protected:
+
+ /*** Protected Component Related Methods ***/
+
+ /* ACTION 7 --------------------------------------------------------------*
+ * Declare here the component's specific methods. *
+ * They should be: *
+ * + Methods with the same name of the C component's virtual table's *
+ * functions (1); *
+ * + Methods with the same name of the C component's extended virtual *
+ * table's functions, if any (2); *
+ * + Helper methods, if any, like functions declared in the component's *
+ * source files but not pointed by the component's virtual table (3). *
+ * *
+ * Example: *
+ * DrvStatusTypeDef COMPONENT_Init(void *init); *
+ *------------------------------------------------------------------------*/
+ DrvStatusTypeDef VNI8200XP_Init(void *init);
+ DrvStatusTypeDef VNI8200XP_ReadID(uint8_t *id);
+ void VNI8200XP_SetChannels(uint8_t Out_array);
+ uint8_t VNI8200XP_ManageFault(void);
+ DrvStatusTypeDef VNI8200XP_CheckDCDCStatus(void);
+ DrvStatusTypeDef VNI8200XP_TemperatureWarning(void);
+ DrvStatusTypeDef VNI8200XP_CheckParity(void);
+ DrvStatusTypeDef VNI8200XP_CheckPowerGood(void);
+ uint8_t VNI8200XP_CheckCommError(void);
+ void VNI8200XP_Ssrelay_SetOutput(uint8_t *outputArray);
+
+ /*** Component's I/O Methods ***/
+
+ /**
+ * @brief Utility function to read and write data from/to VNI8200XP at the same time.
+ * @param[out] pBufferToRead pointer to the buffer to read data into.
+ * @param[in] pBufferToWrite pointer to the buffer of data to send.
+ * @param[in] NumValues number of values to read and write.
+ * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
+ */
+ DrvStatusTypeDef ReadWrite(uint8_t* pBufferToRead, uint8_t* pBufferToWrite, uint16_t NumValues)
+ {
+ (void) NumValues;0
+ uint16_t dataToRead;
+ uint16_t dataToWrite;
+
+ // Converts two uint8_t words into one of uint16_t
+ dataToWrite = convertFrom8To16(pBufferToWrite);
+
+ // Select the chip.
+ ssel = 0;
+
+ dataToRead = dev_spi.write(dataToWrite);
+
+ // Unselect the chip.
+ ssel = 1;
+
+ // Converts one uint16_t word into two uint8_t
+ convertFrom16To8(dataToRead, pBufferToRead);
+
+ return COMPONENT_OK;
+ }
+
+ /* ACTION 8 --------------------------------------------------------------*
+ * Implement here other I/O methods beyond those already implemented *
+ * above, which are declared extern within the component's header file. *
+ *------------------------------------------------------------------------*/
+ /**
+ * @brief Making the CPU wait.
+ * @param None.
+ * @retval None.
+ */
+ void VNI8200XP_Delay(uint32_t delay)
+ {
+ wait_ms(delay);
+ }
+
+ /**
+ * @brief Writing and reading bytes to/from the component through the SPI at the same time.
+ * @param[in] pByteToTransmit pointer to the buffer of data to send.
+ * @param[out] pReceivedByte pointer to the buffer to read data into.
+ * @retval "0" in case of success, "1" otherwise.
+ */
+ uint8_t VNI8200XP_SpiWriteBytes(uint8_t *pByteToTransmit, uint8_t *pReceivedByte)
+ {
+ return (uint8_t) (ReadWrite(pReceivedByte, pByteToTransmit, BUFFERSIZE) == COMPONENT_OK ? 0 : 1);
+ }
+
+
+ /*** Component's Instance Variables ***/
+
+ /* ACTION 9 --------------------------------------------------------------*
+ * Declare here interrupt related variables, if needed. *
+ * Note that interrupt handling is platform dependent, see *
+ * "Interrupt Related Methods" above. *
+ * *
+ * Example: *
+ * + mbed: *
+ * InterruptIn feature_irq; *
+ *------------------------------------------------------------------------*/
+
+ /* ACTION 10 -------------------------------------------------------------*
+ * Declare here other pin related variables, if needed. *
+ * *
+ * Example: *
+ * + mbed: *
+ * PwmOut pwm; *
+ *------------------------------------------------------------------------*/
+
+ /* ACTION 11 -------------------------------------------------------------*
+ * Declare here communication related variables, if needed. *
+ * *
+ * Example: *
+ * + mbed: *
+ * DigitalOut ssel; *
+ * SPI &dev_spi; *
+ *------------------------------------------------------------------------*/
+ /* Configuration. */
+ DigitalOut out_en;
+ DigitalOut ssel;
+
+ /* IO Device. */
+ SPI &dev_spi;
+
+ /* ACTION 12 -------------------------------------------------------------*
+ * Declare here identity related variables, if needed. *
+ * Note that there should be only a unique identifier for each component, *
+ * which should be the "who_am_i" parameter. *
+ *------------------------------------------------------------------------*/
+ /* Identity */
+ uint8_t who_am_i;
+
+ /* ACTION 13 -------------------------------------------------------------*
+ * Declare here the component's static and non-static data, one variable *
+ * per line. *
+ * *
+ * Example: *
+ * float measure; *
+ * int instance_id; *
+ * static int number_of_instances; *
+ *------------------------------------------------------------------------*/
+ /* Data. */
+ uint8_t plc_output_component_instance;
+
+ uint8_t VNI_PARITY_Buffer;
+ uint8_t VNI_FAULT_Buffer;
+ uint8_t VNI_FB_OK;
+ uint8_t VNI_TEMP_WARNING;
+ uint8_t VNI_PARITY_CHECK;
+ uint8_t VNI_POWER_GOOD;
+ uint8_t VNI_PARITY_FALL_Buffer;
+
+ /* Static data. */
+ static uint8_t number_of_plc_output_components;
+
+ /* Ssrelay Array buffers for SPI communication */
+ uint8_t spi_tx_buff[NB_BYTES];
+ uint8_t spi_rx_buff[NB_BYTES];
+
+
+public:
+
+ /* Static data. */
+};
+
+#endif // __VNI8200XP_CLASS_H
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\ No newline at end of file
X-NUCLEO-PLC01A1 Programmable Logic Controller