Álvaro de Rada / X_NUCLEO_PLC01A1
Committer:
apalmieri
Date:
Wed Feb 24 10:52:31 2016 +0000
Revision:
4:e97bbb97aa43
Parent:
2:1ec0dea195f8
Class renaming to keep coherence w/ other expansion board drivers

Who changed what in which revision?

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