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.
Dependencies: mbed
I2CSlaveComm.cpp@8:e82e5b78dbbd, 2019-05-06 (annotated)
- Committer:
- gmfortier
- Date:
- Mon May 06 20:26:33 2019 +0000
- Revision:
- 8:e82e5b78dbbd
- Parent:
- 7:8698d17a0168
- Child:
- 9:d2b700d42dbe
Second sensor added, can be toggled with blue button on Nucleo. The LD2 LED indicates which sensor configuration is used.; The configurations are not changeable and are meant to be used on the waterbench.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Blanglois | 0:265fff2cfb0a | 1 | #include "mbed.h" |
Blanglois | 0:265fff2cfb0a | 2 | #include "I2CSlaveComm.h" |
gmfortier | 8:e82e5b78dbbd | 3 | |
eboily1 | 2:d0308b3aaf69 | 4 | I2CSlaveCustom slave(D4, D7); |
eboily1 | 2:d0308b3aaf69 | 5 | I2CSlaveCustom slave2(D14, D15); //use another I2C to emulate the adc |
gmfortier | 8:e82e5b78dbbd | 6 | |
Blanglois | 3:29925a0f88da | 7 | Ticker command_ticker; |
Blanglois | 3:29925a0f88da | 8 | Ticker flow_ticker; |
Blanglois | 3:29925a0f88da | 9 | |
gmfortier | 8:e82e5b78dbbd | 10 | DigitalIn mybutton(USER_BUTTON); |
gmfortier | 8:e82e5b78dbbd | 11 | DigitalOut myled(LED1); |
gmfortier | 8:e82e5b78dbbd | 12 | |
Blanglois | 3:29925a0f88da | 13 | Serial PcUart(USBTX, USBRX); |
Blanglois | 3:29925a0f88da | 14 | |
gmfortier | 8:e82e5b78dbbd | 15 | int current_tensiometer = 0; // Two possible sensors with different patterns |
gmfortier | 8:e82e5b78dbbd | 16 | |
gmfortier | 8:e82e5b78dbbd | 17 | float tension; |
Blanglois | 3:29925a0f88da | 18 | |
gmfortier | 8:e82e5b78dbbd | 19 | int modeSwitch = 1; |
gmfortier | 8:e82e5b78dbbd | 20 | int saveSwitch = 0; |
gmfortier | 8:e82e5b78dbbd | 21 | float counter = 0; |
gmfortier | 8:e82e5b78dbbd | 22 | |
Blanglois | 0:265fff2cfb0a | 23 | unsigned char PointOnAddress = 0; |
gmfortier | 8:e82e5b78dbbd | 24 | |
Blanglois | 3:29925a0f88da | 25 | char buffer[64]; |
Blanglois | 3:29925a0f88da | 26 | |
eboily1 | 2:d0308b3aaf69 | 27 | unsigned char ADCValue[2]; |
gmfortier | 8:e82e5b78dbbd | 28 | |
gmfortier | 8:e82e5b78dbbd | 29 | struct CycleValues { |
gmfortier | 8:e82e5b78dbbd | 30 | float riseTime; |
gmfortier | 8:e82e5b78dbbd | 31 | float fallTime; |
gmfortier | 8:e82e5b78dbbd | 32 | float plateauTime; |
gmfortier | 8:e82e5b78dbbd | 33 | float stepTime; |
gmfortier | 8:e82e5b78dbbd | 34 | |
gmfortier | 8:e82e5b78dbbd | 35 | float highValue; |
gmfortier | 8:e82e5b78dbbd | 36 | float lowValue; |
gmfortier | 8:e82e5b78dbbd | 37 | float stepValueRise; |
gmfortier | 8:e82e5b78dbbd | 38 | float stepValueFall; |
gmfortier | 8:e82e5b78dbbd | 39 | int offset; //Number of steps |
gmfortier | 8:e82e5b78dbbd | 40 | }; |
gmfortier | 8:e82e5b78dbbd | 41 | |
gmfortier | 8:e82e5b78dbbd | 42 | struct CycleValues tensiometer0 = |
gmfortier | 8:e82e5b78dbbd | 43 | { |
gmfortier | 8:e82e5b78dbbd | 44 | .riseTime = 2700, |
gmfortier | 8:e82e5b78dbbd | 45 | .fallTime = 900, |
gmfortier | 8:e82e5b78dbbd | 46 | .plateauTime = 0, |
gmfortier | 8:e82e5b78dbbd | 47 | .stepTime = 30, |
gmfortier | 8:e82e5b78dbbd | 48 | .highValue = 42, |
gmfortier | 8:e82e5b78dbbd | 49 | .lowValue = -3, |
gmfortier | 8:e82e5b78dbbd | 50 | .stepValueRise = tensiometer0.stepTime * (tensiometer0.highValue - tensiometer0.lowValue) / tensiometer0.riseTime, |
gmfortier | 8:e82e5b78dbbd | 51 | .stepValueFall = tensiometer0.stepTime * (tensiometer0.lowValue - tensiometer0.highValue) / tensiometer0.fallTime, |
gmfortier | 8:e82e5b78dbbd | 52 | .offset = 0 |
gmfortier | 8:e82e5b78dbbd | 53 | }; |
gmfortier | 8:e82e5b78dbbd | 54 | |
gmfortier | 8:e82e5b78dbbd | 55 | struct CycleValues tensiometer1 = |
gmfortier | 8:e82e5b78dbbd | 56 | { |
gmfortier | 8:e82e5b78dbbd | 57 | .riseTime = 1200, |
gmfortier | 8:e82e5b78dbbd | 58 | .fallTime = 480, |
gmfortier | 8:e82e5b78dbbd | 59 | .plateauTime = 60, |
gmfortier | 8:e82e5b78dbbd | 60 | .stepTime = 30, |
gmfortier | 8:e82e5b78dbbd | 61 | .highValue = 38, |
gmfortier | 8:e82e5b78dbbd | 62 | .lowValue = 0, |
gmfortier | 8:e82e5b78dbbd | 63 | .stepValueRise = tensiometer1.stepTime * (tensiometer1.highValue - tensiometer1.lowValue) / tensiometer1.riseTime, |
gmfortier | 8:e82e5b78dbbd | 64 | .stepValueFall = tensiometer1.stepTime * (tensiometer1.lowValue - tensiometer1.highValue) / tensiometer1.fallTime, |
gmfortier | 8:e82e5b78dbbd | 65 | .offset = 0 |
gmfortier | 8:e82e5b78dbbd | 66 | }; |
gmfortier | 8:e82e5b78dbbd | 67 | |
gmfortier | 8:e82e5b78dbbd | 68 | struct CycleValues tensiometers[2] = {tensiometer0, tensiometer1}; |
gmfortier | 8:e82e5b78dbbd | 69 | struct CycleValues tensiometer = tensiometers[current_tensiometer]; |
gmfortier | 8:e82e5b78dbbd | 70 | |
Blanglois | 0:265fff2cfb0a | 71 | #pragma pack(push,1) |
Blanglois | 0:265fff2cfb0a | 72 | struct SmartSensorStruct { |
Blanglois | 0:265fff2cfb0a | 73 | char crc; ///< Checksum CRC8 |
Blanglois | 0:265fff2cfb0a | 74 | char serial[11]; ///< No Série du capteur. Doit demeurer à l'offset 1 dans la structure |
Blanglois | 0:265fff2cfb0a | 75 | char gain; ///< Gain à appliquer |
Blanglois | 0:265fff2cfb0a | 76 | char sampling_rate; ///< Vitesse de sampling |
Blanglois | 0:265fff2cfb0a | 77 | char model; ///< Model de capteur |
Blanglois | 0:265fff2cfb0a | 78 | short c1; ///< Consigne c1 de calcul |
Blanglois | 0:265fff2cfb0a | 79 | short c2; ///< Consigne c2 de calcul |
Blanglois | 0:265fff2cfb0a | 80 | short c3; ///< Consigne c3 de calcul |
Blanglois | 0:265fff2cfb0a | 81 | char depth; ///< Profondeur du capteur en mètres ou en pieds |
Blanglois | 0:265fff2cfb0a | 82 | short c4; ///< Consigne c4 de calcul |
Blanglois | 0:265fff2cfb0a | 83 | unsigned long code;///< Code de détection du type de smartSensor (Salinité ou Tension) |
Blanglois | 0:265fff2cfb0a | 84 | }SmartSensorStruct_packed; |
Blanglois | 0:265fff2cfb0a | 85 | #pragma pack(pop) |
gmfortier | 8:e82e5b78dbbd | 86 | |
Blanglois | 0:265fff2cfb0a | 87 | struct SmartSensorStruct stSensor; |
gmfortier | 8:e82e5b78dbbd | 88 | |
Blanglois | 0:265fff2cfb0a | 89 | char RAMBuffer[256]; //simulate EEPROM |
gmfortier | 8:e82e5b78dbbd | 90 | |
Blanglois | 0:265fff2cfb0a | 91 | void DoCRC8(char* a_crc8, char b) |
Blanglois | 0:265fff2cfb0a | 92 | { |
Blanglois | 0:265fff2cfb0a | 93 | char i, j; |
gmfortier | 8:e82e5b78dbbd | 94 | |
Blanglois | 0:265fff2cfb0a | 95 | for (i = 0; i < 8; b >>= 1, i++) { |
gmfortier | 8:e82e5b78dbbd | 96 | |
Blanglois | 0:265fff2cfb0a | 97 | j = (b ^ (*a_crc8)) & 1; |
Blanglois | 0:265fff2cfb0a | 98 | (*a_crc8) >>= 1; |
gmfortier | 8:e82e5b78dbbd | 99 | |
Blanglois | 0:265fff2cfb0a | 100 | if (j) (*a_crc8) ^= 0x8C; |
Blanglois | 0:265fff2cfb0a | 101 | } |
Blanglois | 0:265fff2cfb0a | 102 | } |
gmfortier | 8:e82e5b78dbbd | 103 | |
eboily1 | 2:d0308b3aaf69 | 104 | void setTension(double value) |
Blanglois | 0:265fff2cfb0a | 105 | { |
Blanglois | 3:29925a0f88da | 106 | int tensionset = (int)(value*100); |
eboily1 | 2:d0308b3aaf69 | 107 | |
Blanglois | 3:29925a0f88da | 108 | int adc = ((1000 * (tensionset - stSensor.c3)) / stSensor.c2) - stSensor.c1; |
eboily1 | 2:d0308b3aaf69 | 109 | adc = adc / 4; //into low read of the ST |
eboily1 | 2:d0308b3aaf69 | 110 | ADCValue[0] = (adc >> 8)&0xFF; |
eboily1 | 2:d0308b3aaf69 | 111 | ADCValue[1] = (adc)&0xFF; |
Blanglois | 0:265fff2cfb0a | 112 | } |
gmfortier | 8:e82e5b78dbbd | 113 | |
Blanglois | 0:265fff2cfb0a | 114 | char ComputeCRC8(char *buff, char len, char start_data) |
Blanglois | 0:265fff2cfb0a | 115 | { |
Blanglois | 0:265fff2cfb0a | 116 | char crc8 = 0; |
Blanglois | 0:265fff2cfb0a | 117 | DoCRC8(&crc8, start_data); |
Blanglois | 0:265fff2cfb0a | 118 | while (len--) DoCRC8(&crc8, *buff++); |
gmfortier | 8:e82e5b78dbbd | 119 | |
Blanglois | 0:265fff2cfb0a | 120 | return crc8; |
Blanglois | 0:265fff2cfb0a | 121 | } |
gmfortier | 8:e82e5b78dbbd | 122 | |
gmfortier | 8:e82e5b78dbbd | 123 | |
Blanglois | 0:265fff2cfb0a | 124 | void SaveRamBuffer(char address, char* value, unsigned char length) |
Blanglois | 0:265fff2cfb0a | 125 | { |
gmfortier | 8:e82e5b78dbbd | 126 | |
Blanglois | 0:265fff2cfb0a | 127 | unsigned char i; |
Blanglois | 0:265fff2cfb0a | 128 | for(i = 0; i < length; i++) |
Blanglois | 0:265fff2cfb0a | 129 | RAMBuffer[address + i] = value[i]; |
Blanglois | 0:265fff2cfb0a | 130 | } |
gmfortier | 8:e82e5b78dbbd | 131 | |
Blanglois | 0:265fff2cfb0a | 132 | void SaveData(char add, long value) |
Blanglois | 0:265fff2cfb0a | 133 | { |
Blanglois | 0:265fff2cfb0a | 134 | SaveRamBuffer(add, (char*)&value, 4); |
Blanglois | 0:265fff2cfb0a | 135 | } |
gmfortier | 8:e82e5b78dbbd | 136 | |
Blanglois | 0:265fff2cfb0a | 137 | void I2C_1Process() |
Blanglois | 0:265fff2cfb0a | 138 | { |
Blanglois | 0:265fff2cfb0a | 139 | char buf[MAX_WRITE_SIZE + 1]; |
Blanglois | 0:265fff2cfb0a | 140 | int nbRx = 0; |
gmfortier | 8:e82e5b78dbbd | 141 | |
Blanglois | 0:265fff2cfb0a | 142 | for(int i = 0; i < MAX_WRITE_SIZE; i++) buf[i] = 0; // Clear buffer |
gmfortier | 8:e82e5b78dbbd | 143 | |
Blanglois | 0:265fff2cfb0a | 144 | int rx = slave.receive(); |
gmfortier | 8:e82e5b78dbbd | 145 | |
Blanglois | 0:265fff2cfb0a | 146 | switch (rx) |
Blanglois | 0:265fff2cfb0a | 147 | { |
Blanglois | 0:265fff2cfb0a | 148 | case I2CSlave::ReadAddressed: |
eboily1 | 1:85afd4bd4651 | 149 | slave.write(&RAMBuffer[PointOnAddress], 0xFF - PointOnAddress); |
Blanglois | 0:265fff2cfb0a | 150 | break; |
gmfortier | 8:e82e5b78dbbd | 151 | |
Blanglois | 0:265fff2cfb0a | 152 | /*case I2CSlave::WriteGeneral: |
Blanglois | 0:265fff2cfb0a | 153 | break;*/ |
gmfortier | 8:e82e5b78dbbd | 154 | |
Blanglois | 0:265fff2cfb0a | 155 | case I2CSlave::WriteAddressed: |
eboily1 | 1:85afd4bd4651 | 156 | int ret = slave.read(buf, 1); |
Blanglois | 0:265fff2cfb0a | 157 | PointOnAddress = buf[0]; |
Blanglois | 0:265fff2cfb0a | 158 | nbRx = slave.getCount(); |
eboily1 | 1:85afd4bd4651 | 159 | if (nbRx > 0) //to simulate write on EEPROM need to test |
eboily1 | 1:85afd4bd4651 | 160 | { |
eboily1 | 1:85afd4bd4651 | 161 | ret = slave.read(buf, nbRx); |
eboily1 | 1:85afd4bd4651 | 162 | SaveRamBuffer(PointOnAddress, buf, nbRx); |
eboily1 | 1:85afd4bd4651 | 163 | } |
Blanglois | 0:265fff2cfb0a | 164 | break; |
Blanglois | 0:265fff2cfb0a | 165 | } |
Blanglois | 0:265fff2cfb0a | 166 | } |
gmfortier | 8:e82e5b78dbbd | 167 | |
Blanglois | 0:265fff2cfb0a | 168 | void I2C_2Process() |
Blanglois | 0:265fff2cfb0a | 169 | { |
eboily1 | 1:85afd4bd4651 | 170 | char buf[MAX_WRITE_SIZE + 1]; |
Blanglois | 0:265fff2cfb0a | 171 | int rx = slave2.receive(); |
eboily1 | 1:85afd4bd4651 | 172 | int nbRx = 0; |
Blanglois | 0:265fff2cfb0a | 173 | switch (rx) |
Blanglois | 0:265fff2cfb0a | 174 | { |
Blanglois | 0:265fff2cfb0a | 175 | case I2CSlave::ReadAddressed: |
eboily1 | 2:d0308b3aaf69 | 176 | slave2.write((char*)&ADCValue, 2); |
Blanglois | 0:265fff2cfb0a | 177 | break; |
Blanglois | 0:265fff2cfb0a | 178 | /*case I2CSlave::WriteGeneral: |
gmfortier | 8:e82e5b78dbbd | 179 | |
gmfortier | 8:e82e5b78dbbd | 180 | |
Blanglois | 0:265fff2cfb0a | 181 | break;*/ |
eboily1 | 1:85afd4bd4651 | 182 | case I2CSlave::WriteAddressed: |
eboily1 | 1:85afd4bd4651 | 183 | //to empty read buffer we do nothing with the data |
eboily1 | 1:85afd4bd4651 | 184 | int ret = slave2.read(buf, 1); |
eboily1 | 2:d0308b3aaf69 | 185 | nbRx = slave2.getCount(); |
eboily1 | 1:85afd4bd4651 | 186 | if (nbRx > 0) //to simulate write on EEPROM need to test |
eboily1 | 1:85afd4bd4651 | 187 | { |
eboily1 | 1:85afd4bd4651 | 188 | ret = slave2.read(buf, nbRx); |
eboily1 | 1:85afd4bd4651 | 189 | } |
eboily1 | 1:85afd4bd4651 | 190 | break; |
Blanglois | 0:265fff2cfb0a | 191 | } |
Blanglois | 0:265fff2cfb0a | 192 | } |
gmfortier | 8:e82e5b78dbbd | 193 | |
Blanglois | 0:265fff2cfb0a | 194 | void I2CSlaveProcess() |
Blanglois | 0:265fff2cfb0a | 195 | { |
Blanglois | 0:265fff2cfb0a | 196 | I2C_1Process(); |
Blanglois | 0:265fff2cfb0a | 197 | I2C_2Process(); |
Blanglois | 0:265fff2cfb0a | 198 | } |
gmfortier | 8:e82e5b78dbbd | 199 | |
Blanglois | 0:265fff2cfb0a | 200 | void InitI2CSlaveComm() |
Blanglois | 0:265fff2cfb0a | 201 | { |
Blanglois | 0:265fff2cfb0a | 202 | slave.address(0xA0); |
Blanglois | 0:265fff2cfb0a | 203 | sprintf(stSensor.serial, "2059123456"); |
Blanglois | 0:265fff2cfb0a | 204 | stSensor.gain = 0x01; |
Blanglois | 0:265fff2cfb0a | 205 | stSensor.sampling_rate = 0x03; |
Blanglois | 0:265fff2cfb0a | 206 | stSensor.c1 = -37; |
Blanglois | 0:265fff2cfb0a | 207 | stSensor.c2 = 634; |
Blanglois | 0:265fff2cfb0a | 208 | stSensor.c3 = -7; |
Blanglois | 0:265fff2cfb0a | 209 | stSensor.c4 = -1; |
Blanglois | 0:265fff2cfb0a | 210 | stSensor.depth = 0x00; |
Blanglois | 0:265fff2cfb0a | 211 | stSensor.model = 2; //Nombre de données à transmettre vers le ST |
Blanglois | 0:265fff2cfb0a | 212 | stSensor.code = 0xFFFF; //Type of sensor |
Blanglois | 0:265fff2cfb0a | 213 | stSensor.crc = ComputeCRC8(((char *)&stSensor)+1, sizeof(SmartSensorStruct_packed) - 7, 0); |
Blanglois | 0:265fff2cfb0a | 214 | SaveRamBuffer(0, (char*)&stSensor, sizeof(SmartSensorStruct_packed)); |
gmfortier | 8:e82e5b78dbbd | 215 | |
Blanglois | 0:265fff2cfb0a | 216 | slave2.address(0x90); |
Blanglois | 3:29925a0f88da | 217 | } |
gmfortier | 8:e82e5b78dbbd | 218 | |
gmfortier | 8:e82e5b78dbbd | 219 | void cycle() |
Blanglois | 3:29925a0f88da | 220 | { |
gmfortier | 8:e82e5b78dbbd | 221 | if(modeSwitch == 3 ) |
Blanglois | 3:29925a0f88da | 222 | { |
gmfortier | 8:e82e5b78dbbd | 223 | if(saveSwitch == 2) |
gmfortier | 8:e82e5b78dbbd | 224 | { |
gmfortier | 8:e82e5b78dbbd | 225 | printf("Tension fall begins\n"); |
gmfortier | 8:e82e5b78dbbd | 226 | } |
gmfortier | 8:e82e5b78dbbd | 227 | else if (saveSwitch == 1) |
gmfortier | 8:e82e5b78dbbd | 228 | { |
gmfortier | 8:e82e5b78dbbd | 229 | printf("Tension rise begins\n"); |
gmfortier | 8:e82e5b78dbbd | 230 | } |
Blanglois | 7:8698d17a0168 | 231 | |
gmfortier | 8:e82e5b78dbbd | 232 | counter = 0; |
gmfortier | 8:e82e5b78dbbd | 233 | modeSwitch = saveSwitch; |
gmfortier | 8:e82e5b78dbbd | 234 | |
gmfortier | 8:e82e5b78dbbd | 235 | } |
gmfortier | 8:e82e5b78dbbd | 236 | else |
Blanglois | 3:29925a0f88da | 237 | { |
gmfortier | 8:e82e5b78dbbd | 238 | if(modeSwitch == 1) |
gmfortier | 8:e82e5b78dbbd | 239 | { |
gmfortier | 8:e82e5b78dbbd | 240 | printf("High plateau begins\n"); |
gmfortier | 8:e82e5b78dbbd | 241 | saveSwitch = 2; |
gmfortier | 8:e82e5b78dbbd | 242 | modeSwitch = 3; |
gmfortier | 8:e82e5b78dbbd | 243 | } |
gmfortier | 8:e82e5b78dbbd | 244 | else if (modeSwitch == 2) |
gmfortier | 8:e82e5b78dbbd | 245 | { |
gmfortier | 8:e82e5b78dbbd | 246 | printf("Low plateau begins\n"); |
gmfortier | 8:e82e5b78dbbd | 247 | saveSwitch = 1; |
gmfortier | 8:e82e5b78dbbd | 248 | modeSwitch = 3; |
gmfortier | 8:e82e5b78dbbd | 249 | } |
gmfortier | 8:e82e5b78dbbd | 250 | } |
Blanglois | 3:29925a0f88da | 251 | } |
gmfortier | 8:e82e5b78dbbd | 252 | |
Blanglois | 3:29925a0f88da | 253 | void commandselect() |
Blanglois | 3:29925a0f88da | 254 | { |
Blanglois | 3:29925a0f88da | 255 | if(PcUart.readable()) |
Blanglois | 3:29925a0f88da | 256 | { |
Blanglois | 3:29925a0f88da | 257 | char command = PcUart.getc(); |
Blanglois | 3:29925a0f88da | 258 | switch(command) |
Blanglois | 7:8698d17a0168 | 259 | { |
Blanglois | 7:8698d17a0168 | 260 | |
Blanglois | 3:29925a0f88da | 261 | case 'w': |
Blanglois | 3:29925a0f88da | 262 | { |
Blanglois | 7:8698d17a0168 | 263 | flow_ticker.detach(); |
gmfortier | 8:e82e5b78dbbd | 264 | printf("Setting parameters\n"); |
Blanglois | 3:29925a0f88da | 265 | |
gmfortier | 8:e82e5b78dbbd | 266 | printf("Enter tension high value in kPa\n"); |
gmfortier | 8:e82e5b78dbbd | 267 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 268 | tensiometer.highValue = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 269 | |
gmfortier | 8:e82e5b78dbbd | 270 | printf("Enter tension low value in kPa\n"); |
gmfortier | 8:e82e5b78dbbd | 271 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 272 | tensiometer.lowValue = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 273 | |
gmfortier | 8:e82e5b78dbbd | 274 | printf("Enter tension rise time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 275 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 276 | tensiometer.riseTime = atoi(buffer); |
Blanglois | 3:29925a0f88da | 277 | |
gmfortier | 8:e82e5b78dbbd | 278 | printf("Enter tension fall time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 279 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 280 | tensiometer.fallTime = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 281 | |
gmfortier | 8:e82e5b78dbbd | 282 | printf("Enter plateau time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 283 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 284 | tensiometer.plateauTime = atoi(buffer); |
Blanglois | 3:29925a0f88da | 285 | |
gmfortier | 8:e82e5b78dbbd | 286 | printf("Enter step time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 287 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 288 | tensiometer.stepTime = atoi(buffer); |
Blanglois | 3:29925a0f88da | 289 | |
gmfortier | 8:e82e5b78dbbd | 290 | printf("Resetting cycle\n"); |
gmfortier | 8:e82e5b78dbbd | 291 | counter = 0; |
gmfortier | 8:e82e5b78dbbd | 292 | tension = tensiometer.lowValue; |
gmfortier | 8:e82e5b78dbbd | 293 | modeSwitch = 1; |
gmfortier | 8:e82e5b78dbbd | 294 | |
gmfortier | 8:e82e5b78dbbd | 295 | flow_ticker.attach(&flow, tensiometer.stepTime); |
Blanglois | 3:29925a0f88da | 296 | break; |
Blanglois | 3:29925a0f88da | 297 | } |
Blanglois | 3:29925a0f88da | 298 | |
Blanglois | 3:29925a0f88da | 299 | case 'i': |
Blanglois | 3:29925a0f88da | 300 | { |
Blanglois | 3:29925a0f88da | 301 | printf("List of parameter values\n"); |
gmfortier | 8:e82e5b78dbbd | 302 | printf("High tension: %d kPa\n", (int)tensiometer.highValue); |
gmfortier | 8:e82e5b78dbbd | 303 | printf("Low tension: %d kPa\n", (int)tensiometer.lowValue); |
gmfortier | 8:e82e5b78dbbd | 304 | printf("Cycle rise time: %d seconds\n", (int)tensiometer.riseTime); |
gmfortier | 8:e82e5b78dbbd | 305 | printf("Cycle fall time: %d seconds\n", (int)tensiometer.fallTime); |
gmfortier | 8:e82e5b78dbbd | 306 | printf("Cycle plateau time: %d seconds\n", (int)tensiometer.plateauTime); |
gmfortier | 8:e82e5b78dbbd | 307 | printf("Step time: %d seconds\n", (int)tensiometer.stepTime); |
gmfortier | 8:e82e5b78dbbd | 308 | if(modeSwitch == 1) |
gmfortier | 8:e82e5b78dbbd | 309 | printf("Cycle currently in rising phase\n"); |
gmfortier | 8:e82e5b78dbbd | 310 | else if(modeSwitch == 2) |
Blanglois | 7:8698d17a0168 | 311 | printf("Cycle currently in falling phase\n"); |
gmfortier | 8:e82e5b78dbbd | 312 | else if(modeSwitch == 3) |
gmfortier | 8:e82e5b78dbbd | 313 | printf("Cycle currently in plateau phase\n"); |
Blanglois | 3:29925a0f88da | 314 | break; |
Blanglois | 3:29925a0f88da | 315 | } |
Blanglois | 3:29925a0f88da | 316 | } |
Blanglois | 3:29925a0f88da | 317 | } |
Blanglois | 3:29925a0f88da | 318 | } |
gmfortier | 8:e82e5b78dbbd | 319 | |
Blanglois | 3:29925a0f88da | 320 | void flow() |
Blanglois | 3:29925a0f88da | 321 | { |
gmfortier | 8:e82e5b78dbbd | 322 | if(modeSwitch == 3) |
gmfortier | 8:e82e5b78dbbd | 323 | { |
gmfortier | 8:e82e5b78dbbd | 324 | counter += tensiometer.stepTime; |
gmfortier | 8:e82e5b78dbbd | 325 | |
gmfortier | 8:e82e5b78dbbd | 326 | if(counter >= tensiometer.plateauTime) |
gmfortier | 8:e82e5b78dbbd | 327 | cycle(); |
gmfortier | 8:e82e5b78dbbd | 328 | } |
Blanglois | 3:29925a0f88da | 329 | else |
Blanglois | 3:29925a0f88da | 330 | { |
gmfortier | 8:e82e5b78dbbd | 331 | if(modeSwitch == 1) |
gmfortier | 8:e82e5b78dbbd | 332 | { |
gmfortier | 8:e82e5b78dbbd | 333 | tension += tensiometer.stepValueRise; |
gmfortier | 8:e82e5b78dbbd | 334 | printf("Rising, tension = %f\n", tension); |
gmfortier | 8:e82e5b78dbbd | 335 | } |
gmfortier | 8:e82e5b78dbbd | 336 | if(modeSwitch == 2) |
Blanglois | 3:29925a0f88da | 337 | { |
gmfortier | 8:e82e5b78dbbd | 338 | tension += tensiometer.stepValueFall; |
gmfortier | 8:e82e5b78dbbd | 339 | printf("Falling, tension = %f\n", tension); |
gmfortier | 8:e82e5b78dbbd | 340 | } |
gmfortier | 8:e82e5b78dbbd | 341 | |
gmfortier | 8:e82e5b78dbbd | 342 | setTension(tension); |
gmfortier | 8:e82e5b78dbbd | 343 | |
gmfortier | 8:e82e5b78dbbd | 344 | if(modeSwitch == 1 && tension >= tensiometer.highValue - 0.001f) |
gmfortier | 8:e82e5b78dbbd | 345 | { |
gmfortier | 8:e82e5b78dbbd | 346 | tension = tensiometer.highValue; |
gmfortier | 8:e82e5b78dbbd | 347 | cycle(); |
gmfortier | 8:e82e5b78dbbd | 348 | } |
gmfortier | 8:e82e5b78dbbd | 349 | else if(modeSwitch == 2 && tension <= tensiometer.lowValue + 0.001f) |
gmfortier | 8:e82e5b78dbbd | 350 | { |
gmfortier | 8:e82e5b78dbbd | 351 | tension = tensiometer.lowValue; |
gmfortier | 8:e82e5b78dbbd | 352 | cycle(); |
Blanglois | 3:29925a0f88da | 353 | } |
gmfortier | 8:e82e5b78dbbd | 354 | } |
gmfortier | 8:e82e5b78dbbd | 355 | } |
gmfortier | 8:e82e5b78dbbd | 356 | |
gmfortier | 8:e82e5b78dbbd | 357 | void setStartingValue() |
gmfortier | 8:e82e5b78dbbd | 358 | { |
gmfortier | 8:e82e5b78dbbd | 359 | int numberOfSteps = (tensiometer.riseTime + tensiometer.fallTime + (2 * tensiometer.plateauTime)) / tensiometer.stepTime; |
gmfortier | 8:e82e5b78dbbd | 360 | printf("Total number of steps : %i\n", numberOfSteps); |
gmfortier | 8:e82e5b78dbbd | 361 | printf("Lenght of cycle (seconds) : %f\n", numberOfSteps * tensiometer.stepTime); |
gmfortier | 8:e82e5b78dbbd | 362 | int offset = tensiometer.offset % numberOfSteps; |
gmfortier | 8:e82e5b78dbbd | 363 | printf("Offset after modulo : %i\n", offset); |
gmfortier | 8:e82e5b78dbbd | 364 | if (offset * tensiometer.stepTime <= tensiometer.riseTime) |
gmfortier | 8:e82e5b78dbbd | 365 | { |
gmfortier | 8:e82e5b78dbbd | 366 | tension = tensiometer.lowValue + (tensiometer.offset * tensiometer.stepValueRise); |
gmfortier | 8:e82e5b78dbbd | 367 | } |
gmfortier | 8:e82e5b78dbbd | 368 | else if (offset * tensiometer.stepTime > tensiometer.riseTime && offset * tensiometer.stepTime <= (tensiometer.riseTime + tensiometer.plateauTime)) |
gmfortier | 8:e82e5b78dbbd | 369 | { |
gmfortier | 8:e82e5b78dbbd | 370 | tension = tensiometer.highValue; |
gmfortier | 8:e82e5b78dbbd | 371 | modeSwitch = 3; |
gmfortier | 8:e82e5b78dbbd | 372 | } |
gmfortier | 8:e82e5b78dbbd | 373 | else if (offset * tensiometer.stepTime > (tensiometer.riseTime + tensiometer.plateauTime) && offset * tensiometer.stepTime <= (tensiometer.riseTime + tensiometer.plateauTime + tensiometer.fallTime)) |
gmfortier | 8:e82e5b78dbbd | 374 | { |
gmfortier | 8:e82e5b78dbbd | 375 | tension = tensiometer.highValue + (tensiometer.offset * tensiometer.stepValueFall); |
gmfortier | 8:e82e5b78dbbd | 376 | modeSwitch = 2; |
Blanglois | 3:29925a0f88da | 377 | } |
gmfortier | 8:e82e5b78dbbd | 378 | else |
gmfortier | 8:e82e5b78dbbd | 379 | { |
gmfortier | 8:e82e5b78dbbd | 380 | tension = tensiometer.lowValue; |
gmfortier | 8:e82e5b78dbbd | 381 | modeSwitch = 3; |
gmfortier | 8:e82e5b78dbbd | 382 | } |
gmfortier | 8:e82e5b78dbbd | 383 | printf("Starting tension : %f\n", tension); |
gmfortier | 8:e82e5b78dbbd | 384 | switch (modeSwitch) |
gmfortier | 8:e82e5b78dbbd | 385 | { |
gmfortier | 8:e82e5b78dbbd | 386 | case 1: |
gmfortier | 8:e82e5b78dbbd | 387 | printf("Starting phase : rising\n"); |
gmfortier | 8:e82e5b78dbbd | 388 | break; |
gmfortier | 8:e82e5b78dbbd | 389 | case 2: |
gmfortier | 8:e82e5b78dbbd | 390 | printf("Starting phase : falling\n"); |
gmfortier | 8:e82e5b78dbbd | 391 | break; |
gmfortier | 8:e82e5b78dbbd | 392 | case 3: |
gmfortier | 8:e82e5b78dbbd | 393 | printf("Starting phase : plateau\n"); |
gmfortier | 8:e82e5b78dbbd | 394 | } |
gmfortier | 8:e82e5b78dbbd | 395 | } |
gmfortier | 8:e82e5b78dbbd | 396 | |
gmfortier | 8:e82e5b78dbbd | 397 | void resetCycle() |
gmfortier | 8:e82e5b78dbbd | 398 | { |
gmfortier | 8:e82e5b78dbbd | 399 | printf("Beginning simulation, tensiometer #%i\n", current_tensiometer); |
gmfortier | 8:e82e5b78dbbd | 400 | modeSwitch = 1; |
gmfortier | 8:e82e5b78dbbd | 401 | saveSwitch = 0; |
gmfortier | 8:e82e5b78dbbd | 402 | counter = 0; |
gmfortier | 8:e82e5b78dbbd | 403 | setStartingValue(); |
gmfortier | 8:e82e5b78dbbd | 404 | flow_ticker.attach(&flow, tensiometer.stepTime); |
gmfortier | 8:e82e5b78dbbd | 405 | command_ticker.attach(&commandselect, 1); |
Blanglois | 3:29925a0f88da | 406 | } |
Blanglois | 3:29925a0f88da | 407 | |
Blanglois | 3:29925a0f88da | 408 | int main() |
Blanglois | 3:29925a0f88da | 409 | { |
gmfortier | 8:e82e5b78dbbd | 410 | /* |
gmfortier | 8:e82e5b78dbbd | 411 | printf("Setting parameters\n"); |
gmfortier | 8:e82e5b78dbbd | 412 | |
gmfortier | 8:e82e5b78dbbd | 413 | printf("Enter tension high value in kPa\n"); |
gmfortier | 8:e82e5b78dbbd | 414 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 415 | highValue = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 416 | |
gmfortier | 8:e82e5b78dbbd | 417 | printf("Enter tension low value in kPa\n"); |
gmfortier | 8:e82e5b78dbbd | 418 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 419 | lowValue = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 420 | |
gmfortier | 8:e82e5b78dbbd | 421 | printf("Enter tension rise time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 422 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 423 | riseTime = atoi(buffer); |
Blanglois | 7:8698d17a0168 | 424 | |
gmfortier | 8:e82e5b78dbbd | 425 | printf("Enter tension fall time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 426 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 427 | fallTime = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 428 | |
gmfortier | 8:e82e5b78dbbd | 429 | printf("Enter plateau time in seconds\n"); |
gmfortier | 8:e82e5b78dbbd | 430 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 431 | plateauTime = atoi(buffer); |
gmfortier | 8:e82e5b78dbbd | 432 | |
gmfortier | 8:e82e5b78dbbd | 433 | printf("Enter step time *in milliseconds*\n"); |
gmfortier | 8:e82e5b78dbbd | 434 | scanf("%s", buffer); |
gmfortier | 8:e82e5b78dbbd | 435 | stepTime = (float)atoi(buffer)/1000; |
gmfortier | 8:e82e5b78dbbd | 436 | |
gmfortier | 8:e82e5b78dbbd | 437 | tension = lowValue; |
gmfortier | 8:e82e5b78dbbd | 438 | stepValue = stepTime * (highValue - lowValue) / riseTime; |
gmfortier | 8:e82e5b78dbbd | 439 | */ |
Blanglois | 7:8698d17a0168 | 440 | |
Blanglois | 3:29925a0f88da | 441 | InitI2CSlaveComm(); |
gmfortier | 8:e82e5b78dbbd | 442 | resetCycle(); |
gmfortier | 8:e82e5b78dbbd | 443 | |
Blanglois | 3:29925a0f88da | 444 | while(1) |
Blanglois | 3:29925a0f88da | 445 | { |
gmfortier | 8:e82e5b78dbbd | 446 | if (mybutton == 0) // Button is pressed |
gmfortier | 8:e82e5b78dbbd | 447 | { |
gmfortier | 8:e82e5b78dbbd | 448 | myled = !myled; // Toggle the LED state |
gmfortier | 8:e82e5b78dbbd | 449 | wait(0.2); // 200 ms |
gmfortier | 8:e82e5b78dbbd | 450 | } |
gmfortier | 8:e82e5b78dbbd | 451 | if (!current_tensiometer == myled) |
gmfortier | 8:e82e5b78dbbd | 452 | { |
gmfortier | 8:e82e5b78dbbd | 453 | current_tensiometer = myled; |
gmfortier | 8:e82e5b78dbbd | 454 | tensiometer = tensiometers[current_tensiometer]; |
gmfortier | 8:e82e5b78dbbd | 455 | resetCycle(); |
gmfortier | 8:e82e5b78dbbd | 456 | } |
gmfortier | 8:e82e5b78dbbd | 457 | I2CSlaveProcess(); |
Blanglois | 3:29925a0f88da | 458 | } |
Blanglois | 0:265fff2cfb0a | 459 | } |