Álvaro de Rada / X_NUCLEO_PLC01A1
Committer:
apalmieri
Date:
Fri Feb 19 10:56:30 2016 +0000
Revision:
0:b66a560b6618
Library to handle the X-NUCLEO-PLC01A1 Programmable Logic Controller Expansion Board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
apalmieri 0:b66a560b6618 1 /**
apalmieri 0:b66a560b6618 2 ******************************************************************************
apalmieri 0:b66a560b6618 3 * @file PLC_class.h
apalmieri 0:b66a560b6618 4 * @author AST/CL
apalmieri 0:b66a560b6618 5 * @version V1.0.0
apalmieri 0:b66a560b6618 6 * @date Feb 9th, 2016
apalmieri 0:b66a560b6618 7 * @brief This file contains the abstract class describing the interface of a
apalmieri 0:b66a560b6618 8 * generic component.
apalmieri 0:b66a560b6618 9 ******************************************************************************
apalmieri 0:b66a560b6618 10 * @attention
apalmieri 0:b66a560b6618 11 *
apalmieri 0:b66a560b6618 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
apalmieri 0:b66a560b6618 13 *
apalmieri 0:b66a560b6618 14 * Redistribution and use in source and binary forms, with or without modification,
apalmieri 0:b66a560b6618 15 * are permitted provided that the following conditions are met:
apalmieri 0:b66a560b6618 16 * 1. Redistributions of source code must retain the above copyright notice,
apalmieri 0:b66a560b6618 17 * this list of conditions and the following disclaimer.
apalmieri 0:b66a560b6618 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
apalmieri 0:b66a560b6618 19 * this list of conditions and the following disclaimer in the documentation
apalmieri 0:b66a560b6618 20 * and/or other materials provided with the distribution.
apalmieri 0:b66a560b6618 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
apalmieri 0:b66a560b6618 22 * may be used to endorse or promote products derived from this software
apalmieri 0:b66a560b6618 23 * without specific prior written permission.
apalmieri 0:b66a560b6618 24 *
apalmieri 0:b66a560b6618 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
apalmieri 0:b66a560b6618 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
apalmieri 0:b66a560b6618 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
apalmieri 0:b66a560b6618 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
apalmieri 0:b66a560b6618 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
apalmieri 0:b66a560b6618 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
apalmieri 0:b66a560b6618 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
apalmieri 0:b66a560b6618 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
apalmieri 0:b66a560b6618 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
apalmieri 0:b66a560b6618 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
apalmieri 0:b66a560b6618 35 *
apalmieri 0:b66a560b6618 36 ******************************************************************************
apalmieri 0:b66a560b6618 37 */
apalmieri 0:b66a560b6618 38
apalmieri 0:b66a560b6618 39 /* Includes ------------------------------------------------------------------*/
apalmieri 0:b66a560b6618 40
apalmieri 0:b66a560b6618 41
apalmieri 0:b66a560b6618 42 #include "PLC_class.h"
apalmieri 0:b66a560b6618 43
apalmieri 0:b66a560b6618 44 /**
apalmieri 0:b66a560b6618 45 * @brief Mirrors input data
apalmieri 0:b66a560b6618 46 * @param Input channel state buffer
apalmieri 0:b66a560b6618 47 * @retval Input buffer state
apalmieri 0:b66a560b6618 48 */
apalmieri 0:b66a560b6618 49 uint8_t PLC::signalMirror(uint8_t In_Array)
apalmieri 0:b66a560b6618 50 {
apalmieri 0:b66a560b6618 51 return(In_Array);
apalmieri 0:b66a560b6618 52 }
apalmieri 0:b66a560b6618 53
apalmieri 0:b66a560b6618 54 void PLC::handleFreezeTo(void)
apalmieri 0:b66a560b6618 55 {
apalmieri 0:b66a560b6618 56 freezeTo = true;
apalmieri 0:b66a560b6618 57 }
apalmieri 0:b66a560b6618 58
apalmieri 0:b66a560b6618 59 /**
apalmieri 0:b66a560b6618 60 * @brief Freeze selected output for a given time
apalmieri 0:b66a560b6618 61 * @param Output channels to be freezed
apalmieri 0:b66a560b6618 62 * @param Duration of freeze
apalmieri 0:b66a560b6618 63 * @retval Output value
apalmieri 0:b66a560b6618 64 */
apalmieri 0:b66a560b6618 65 uint8_t PLC::outputFreeze(uint8_t N_Channel, uint16_t msec)
apalmieri 0:b66a560b6618 66 {
apalmieri 0:b66a560b6618 67 if(freezeTo) {
apalmieri 0:b66a560b6618 68 timeout.detach();
apalmieri 0:b66a560b6618 69 return(0x00);
apalmieri 0:b66a560b6618 70 } else if(!attached) {
apalmieri 0:b66a560b6618 71 attached = true;
apalmieri 0:b66a560b6618 72 timeout.attach(this, &PLC::handleFreezeTo, msec/1000);
apalmieri 0:b66a560b6618 73 }
apalmieri 0:b66a560b6618 74
apalmieri 0:b66a560b6618 75 return N_Channel;
apalmieri 0:b66a560b6618 76 }
apalmieri 0:b66a560b6618 77
apalmieri 0:b66a560b6618 78 /**
apalmieri 0:b66a560b6618 79 * @brief Regroup output buffer according to out_Array
apalmieri 0:b66a560b6618 80 * @param Regroup array
apalmieri 0:b66a560b6618 81 * @retval Value
apalmieri 0:b66a560b6618 82 */
apalmieri 0:b66a560b6618 83 uint8_t PLC::outputRegroup(uint8_t Out_Array)
apalmieri 0:b66a560b6618 84 {
apalmieri 0:b66a560b6618 85 return(Out_Array);
apalmieri 0:b66a560b6618 86 }
apalmieri 0:b66a560b6618 87
apalmieri 0:b66a560b6618 88 /**
apalmieri 0:b66a560b6618 89 * @brief Sum all the inputs at high state
apalmieri 0:b66a560b6618 90 * @param Input channel state data
apalmieri 0:b66a560b6618 91 * @retval Value corresponding to the sum of inputs at high
apalmieri 0:b66a560b6618 92 */
apalmieri 0:b66a560b6618 93 uint8_t PLC::inputSum(uint8_t* Buffer, uint8_t In_Array)
apalmieri 0:b66a560b6618 94 {
apalmieri 0:b66a560b6618 95
apalmieri 0:b66a560b6618 96 uint8_t inputChannelsOn = 0;
apalmieri 0:b66a560b6618 97 uint8_t count = 0;
apalmieri 0:b66a560b6618 98 *Buffer = In_Array;
apalmieri 0:b66a560b6618 99
apalmieri 0:b66a560b6618 100 for(count = 0; count<8; count++)
apalmieri 0:b66a560b6618 101 {
apalmieri 0:b66a560b6618 102 if((In_Array & 0x01) == 0x01)
apalmieri 0:b66a560b6618 103 inputChannelsOn++;
apalmieri 0:b66a560b6618 104
apalmieri 0:b66a560b6618 105 In_Array = In_Array >> 1;
apalmieri 0:b66a560b6618 106 }
apalmieri 0:b66a560b6618 107
apalmieri 0:b66a560b6618 108 return inputChannelsOn;
apalmieri 0:b66a560b6618 109
apalmieri 0:b66a560b6618 110 }
apalmieri 0:b66a560b6618 111
apalmieri 0:b66a560b6618 112 /**
apalmieri 0:b66a560b6618 113 * @brief Set the output channels on/off
apalmieri 0:b66a560b6618 114 * @param Output to set
apalmieri 0:b66a560b6618 115 * @retval Output value
apalmieri 0:b66a560b6618 116 */
apalmieri 0:b66a560b6618 117 uint8_t PLC::setOutput(uint8_t Out_Array)
apalmieri 0:b66a560b6618 118 {
apalmieri 0:b66a560b6618 119 return(Out_Array);
apalmieri 0:b66a560b6618 120 }
apalmieri 0:b66a560b6618 121
apalmieri 0:b66a560b6618 122 /**
apalmieri 0:b66a560b6618 123 * @brief AND Inputs for selected output channels
apalmieri 0:b66a560b6618 124 * @param Input channels state
apalmieri 0:b66a560b6618 125 * @param Outputs to be AND with inputs
apalmieri 0:b66a560b6618 126 * @retval Result of AND operation
apalmieri 0:b66a560b6618 127 */
apalmieri 0:b66a560b6618 128 uint8_t PLC::inputsAND(uint8_t In_Array, uint8_t Out_Channel)
apalmieri 0:b66a560b6618 129 {
apalmieri 0:b66a560b6618 130 uint8_t outArray = 0;
apalmieri 0:b66a560b6618 131 outArray = In_Array & Out_Channel;
apalmieri 0:b66a560b6618 132
apalmieri 0:b66a560b6618 133 return outArray;
apalmieri 0:b66a560b6618 134 }
apalmieri 0:b66a560b6618 135
apalmieri 0:b66a560b6618 136 /**
apalmieri 0:b66a560b6618 137 * @brief OR Inputs for selected output channels
apalmieri 0:b66a560b6618 138 * @param Input channels state
apalmieri 0:b66a560b6618 139 * @param Outputs to be OR with inputs
apalmieri 0:b66a560b6618 140 * @retval Result of OR operation
apalmieri 0:b66a560b6618 141 */
apalmieri 0:b66a560b6618 142 uint8_t PLC::inputsOR(uint8_t In_Array, uint8_t Out_Channel)
apalmieri 0:b66a560b6618 143 {
apalmieri 0:b66a560b6618 144 uint8_t outArray = 0;
apalmieri 0:b66a560b6618 145 outArray = In_Array | Out_Channel;
apalmieri 0:b66a560b6618 146
apalmieri 0:b66a560b6618 147 return outArray;
apalmieri 0:b66a560b6618 148 }
apalmieri 0:b66a560b6618 149
apalmieri 0:b66a560b6618 150 /**
apalmieri 0:b66a560b6618 151 * @brief NOT Inputs
apalmieri 0:b66a560b6618 152 * @param Input channels state
apalmieri 0:b66a560b6618 153 * @retval Result of OR operation
apalmieri 0:b66a560b6618 154 */
apalmieri 0:b66a560b6618 155 uint8_t PLC::inputsNOT(uint8_t In_Array)
apalmieri 0:b66a560b6618 156 {
apalmieri 0:b66a560b6618 157 uint8_t outArray = 0;
apalmieri 0:b66a560b6618 158 In_Array = ~(In_Array);
apalmieri 0:b66a560b6618 159 outArray = In_Array;
apalmieri 0:b66a560b6618 160
apalmieri 0:b66a560b6618 161 return outArray;
apalmieri 0:b66a560b6618 162 }
apalmieri 0:b66a560b6618 163
apalmieri 0:b66a560b6618 164 /**
apalmieri 0:b66a560b6618 165 * @brief XOR Inputs for selected output channels
apalmieri 0:b66a560b6618 166 * @param Input channels state
apalmieri 0:b66a560b6618 167 * @param Outputs to be XOR with inputs
apalmieri 0:b66a560b6618 168 * @retval Result of XOR operation
apalmieri 0:b66a560b6618 169 */
apalmieri 0:b66a560b6618 170 uint8_t PLC::inputsXOR(uint8_t In_Array, uint8_t Out_Channel)
apalmieri 0:b66a560b6618 171 {
apalmieri 0:b66a560b6618 172 uint8_t outArray = 0;
apalmieri 0:b66a560b6618 173 outArray = In_Array ^ Out_Channel;
apalmieri 0:b66a560b6618 174
apalmieri 0:b66a560b6618 175 return outArray;
apalmieri 0:b66a560b6618 176 }
apalmieri 0:b66a560b6618 177
apalmieri 0:b66a560b6618 178 /**
apalmieri 0:b66a560b6618 179 * @brief Calculate and set parity bits for Ssrelay transmission
apalmieri 0:b66a560b6618 180 * @param Output value buffer
apalmieri 0:b66a560b6618 181 * @retval None
apalmieri 0:b66a560b6618 182 */
apalmieri 0:b66a560b6618 183 void PLC::outputParityBits(uint8_t* Buffer)
apalmieri 0:b66a560b6618 184 {
apalmieri 0:b66a560b6618 185 uint8_t Parity_Cal0 = 0x00;
apalmieri 0:b66a560b6618 186 uint8_t Parity_Cal1 = 0x00;
apalmieri 0:b66a560b6618 187 uint8_t Parity_Cal2 = 0x00;
apalmieri 0:b66a560b6618 188 uint8_t Parity_Cal3 = 0x00;
apalmieri 0:b66a560b6618 189 uint8_t Parity_Cal4 = 0x00;
apalmieri 0:b66a560b6618 190 uint8_t Parity_Cal5 = 0x00;
apalmieri 0:b66a560b6618 191 uint8_t Parity_Cal6 = 0x00;
apalmieri 0:b66a560b6618 192 uint8_t Parity_Cal7 = 0x00;
apalmieri 0:b66a560b6618 193 uint8_t nP0 = 0x00;
apalmieri 0:b66a560b6618 194 uint8_t P0 = 0x00;
apalmieri 0:b66a560b6618 195 uint8_t P1 = 0x00;
apalmieri 0:b66a560b6618 196 uint8_t P2 = 0x00;
apalmieri 0:b66a560b6618 197
apalmieri 0:b66a560b6618 198 Parity_Cal0 = Buffer[1] & 0x80;
apalmieri 0:b66a560b6618 199 Parity_Cal0 = Parity_Cal0>>7;
apalmieri 0:b66a560b6618 200
apalmieri 0:b66a560b6618 201 Parity_Cal1 = Buffer[1] & 0x40;
apalmieri 0:b66a560b6618 202 Parity_Cal1 = Parity_Cal1>>6;
apalmieri 0:b66a560b6618 203
apalmieri 0:b66a560b6618 204 Parity_Cal2 = Buffer[1] & 0x20;
apalmieri 0:b66a560b6618 205 Parity_Cal2 = Parity_Cal2>>5;
apalmieri 0:b66a560b6618 206
apalmieri 0:b66a560b6618 207 Parity_Cal3 = Buffer[1] & 0x10;
apalmieri 0:b66a560b6618 208 Parity_Cal3 = Parity_Cal3>>4;
apalmieri 0:b66a560b6618 209
apalmieri 0:b66a560b6618 210 Parity_Cal4 = Buffer[1] & 0x08;
apalmieri 0:b66a560b6618 211 Parity_Cal4 = Parity_Cal4>>3;
apalmieri 0:b66a560b6618 212
apalmieri 0:b66a560b6618 213 Parity_Cal5 = Buffer[1] & 0x04;
apalmieri 0:b66a560b6618 214 Parity_Cal5 = Parity_Cal5>>2;
apalmieri 0:b66a560b6618 215
apalmieri 0:b66a560b6618 216 Parity_Cal6 = Buffer[1] & 0x02;
apalmieri 0:b66a560b6618 217 Parity_Cal6 = Parity_Cal6>>1;
apalmieri 0:b66a560b6618 218
apalmieri 0:b66a560b6618 219 Parity_Cal7 = Buffer[1] & 0x01;
apalmieri 0:b66a560b6618 220
apalmieri 0:b66a560b6618 221
apalmieri 0:b66a560b6618 222 /* Caluculate parity bits based on output data */
apalmieri 0:b66a560b6618 223 P2 = ((Parity_Cal7^Parity_Cal5)^Parity_Cal3)^Parity_Cal1;
apalmieri 0:b66a560b6618 224 if(P2 == 0x01)
apalmieri 0:b66a560b6618 225 P2 = 0x08;
apalmieri 0:b66a560b6618 226 else
apalmieri 0:b66a560b6618 227 P2 = 0x00;
apalmieri 0:b66a560b6618 228
apalmieri 0:b66a560b6618 229 P1 = ((Parity_Cal6^Parity_Cal4)^Parity_Cal2)^Parity_Cal0;
apalmieri 0:b66a560b6618 230 if(P1 == 0x01)
apalmieri 0:b66a560b6618 231 P1 = 0x04;
apalmieri 0:b66a560b6618 232 else
apalmieri 0:b66a560b6618 233 P1 = 0x00;
apalmieri 0:b66a560b6618 234
apalmieri 0:b66a560b6618 235 P0 = ((((((Parity_Cal7^Parity_Cal6)^Parity_Cal5)^Parity_Cal4)^Parity_Cal3)
apalmieri 0:b66a560b6618 236 ^Parity_Cal2)^Parity_Cal1)^Parity_Cal0;
apalmieri 0:b66a560b6618 237 if(P0 == 0x01)
apalmieri 0:b66a560b6618 238 P0 = 0X02;
apalmieri 0:b66a560b6618 239 else
apalmieri 0:b66a560b6618 240 P0 = 0x00;
apalmieri 0:b66a560b6618 241
apalmieri 0:b66a560b6618 242 nP0 = 0x00;
apalmieri 0:b66a560b6618 243 if(P0 == 0x02)
apalmieri 0:b66a560b6618 244 nP0 = 0x00;
apalmieri 0:b66a560b6618 245 else
apalmieri 0:b66a560b6618 246 nP0 = 0x01;
apalmieri 0:b66a560b6618 247
apalmieri 0:b66a560b6618 248 /* Set Ssrelay_TxBuffer parity bits field */
apalmieri 0:b66a560b6618 249 Buffer[0] = P2|P1|P0|nP0;
apalmieri 0:b66a560b6618 250 }
apalmieri 0:b66a560b6618 251
apalmieri 0:b66a560b6618 252 /**
apalmieri 0:b66a560b6618 253 * @brief Toggle selected output for given frequency
apalmieri 0:b66a560b6618 254 * @param Output channels to be toggled
apalmieri 0:b66a560b6618 255 * @retval None
apalmieri 0:b66a560b6618 256 */
apalmieri 0:b66a560b6618 257 void PLC::outputCycling(void)
apalmieri 0:b66a560b6618 258 {
apalmieri 0:b66a560b6618 259 if(!attached) {
apalmieri 0:b66a560b6618 260 attached = true;
apalmieri 0:b66a560b6618 261 ticker.attach(this, &PLC::toggleOutput, 0.3);
apalmieri 0:b66a560b6618 262 }
apalmieri 0:b66a560b6618 263
apalmieri 0:b66a560b6618 264 }
apalmieri 0:b66a560b6618 265
apalmieri 0:b66a560b6618 266 void PLC::toggleOutput(void)
apalmieri 0:b66a560b6618 267 {
apalmieri 0:b66a560b6618 268 /* Reset & set CS1 to refresh VNI watchdog */
apalmieri 0:b66a560b6618 269 plcIn.setInputSPI(0);
apalmieri 0:b66a560b6618 270 plcIn.setInputSPI(1);
apalmieri 0:b66a560b6618 271
apalmieri 0:b66a560b6618 272 outBuff[1] = ~(outBuff[1]);
apalmieri 0:b66a560b6618 273
apalmieri 0:b66a560b6618 274 /* Parity bits calculation */
apalmieri 0:b66a560b6618 275 outputParityBits(outBuff);
apalmieri 0:b66a560b6618 276
apalmieri 0:b66a560b6618 277 /* Transmit data to VNI on SPI */
apalmieri 0:b66a560b6618 278 plcOut.Ssrelay_SetOutput(outBuff);
apalmieri 0:b66a560b6618 279 }
apalmieri 0:b66a560b6618 280
apalmieri 0:b66a560b6618 281 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/