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 | } |