Space / Mbed 2 deprecated DORAv3

Dependencies:   mbed

Committer:
paologiorgio
Date:
Thu Jun 09 10:43:58 2022 +0000
Revision:
0:c81f86a07902
Child:
1:db73b542b7bc
DORA v2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
paologiorgio 0:c81f86a07902 1 #include "mbed.h"
paologiorgio 0:c81f86a07902 2 #include <math.h>
paologiorgio 0:c81f86a07902 3
paologiorgio 0:c81f86a07902 4 /*
paologiorgio 0:c81f86a07902 5 TO-DO: i dati arrivano in DigitalIn e DigitalOut, anziché essere della classe Serial.
paologiorgio 0:c81f86a07902 6 Al fine di poter immagazzinare i dati, associo a determinati livelli logici (1/0) dei caratteri,
paologiorgio 0:c81f86a07902 7 riempio il buffer e ritrasmetto con i caratteri riconvertiti
paologiorgio 0:c81f86a07902 8
paologiorgio 0:c81f86a07902 9 comando per azionamento periferiche: SPARE
paologiorgio 0:c81f86a07902 10 */
paologiorgio 0:c81f86a07902 11
paologiorgio 0:c81f86a07902 12 // ************* INFO *******************
paologiorgio 0:c81f86a07902 13 // master-slave: slave MIMA comunica con DORA con collegamento UART (tx, rx, gnd)
paologiorgio 0:c81f86a07902 14 // PC S/C sends packets to DORA -> MIMA (STM32) -> PC
paologiorgio 0:c81f86a07902 15
paologiorgio 0:c81f86a07902 16 // ------ ------------
paologiorgio 0:c81f86a07902 17 // | MIMA | ---- DORA ---- | SPACE/CRAFT |
paologiorgio 0:c81f86a07902 18 // ------ ------------
paologiorgio 0:c81f86a07902 19
paologiorgio 0:c81f86a07902 20 // ************ DEFINE ******************
paologiorgio 0:c81f86a07902 21 // definisce dimensione pacchetto inviato da pc
paologiorgio 0:c81f86a07902 22 // telecommand: 15 bit + 1 di controllo
paologiorgio 0:c81f86a07902 23 #define PACKETSIZE 20 // lunghezza massima della stringa trasmissibile prima di interrupt
paologiorgio 0:c81f86a07902 24 #define PACKET 15 // 15 bit, 1 di parità di controllo
paologiorgio 0:c81f86a07902 25 #define PACKET_CHECKED 16 // COMMAND IDENTIFIER + TAG + PAYLOAD + PARITY CHECK
paologiorgio 0:c81f86a07902 26 #define IDENTIFIER 5
paologiorgio 0:c81f86a07902 27 #define TAG 2
paologiorgio 0:c81f86a07902 28 #define PAYLOAD 8
paologiorgio 0:c81f86a07902 29 #define CMD_NUM 32
paologiorgio 0:c81f86a07902 30 #define OPTION_1 10 // 57 * 16
paologiorgio 0:c81f86a07902 31 #define OPTION_2 90608 // 5663 * 16
paologiorgio 0:c81f86a07902 32 #define tb 7 // bit sampling period
paologiorgio 0:c81f86a07902 33 #define BufferXOR 175 // 2800/16 - 1
paologiorgio 0:c81f86a07902 34 #define TIMEOUT 15000 // milliseconds
paologiorgio 0:c81f86a07902 35 #define word 16
paologiorgio 0:c81f86a07902 36
paologiorgio 0:c81f86a07902 37
paologiorgio 0:c81f86a07902 38 // ************ CN7+USB ******************
paologiorgio 0:c81f86a07902 39 Serial SC(USBTX, USBRX); // A4 TX, A6 RX - DATA OUT, DATA IN
paologiorgio 0:c81f86a07902 40
paologiorgio 0:c81f86a07902 41 // ************** CN10 *******************
paologiorgio 0:c81f86a07902 42 Serial MIMA(PC_4, PC_5); // TERZO - TERZULTIMO -> D0 e D1 non vanno bene! Risorse già occupate
paologiorgio 0:c81f86a07902 43
paologiorgio 0:c81f86a07902 44 // ************** TIMER *****************
paologiorgio 0:c81f86a07902 45 Timer t;
paologiorgio 0:c81f86a07902 46
paologiorgio 0:c81f86a07902 47 // ******* L16 Actuatonix - Relay ********
paologiorgio 0:c81f86a07902 48 PwmOut M1 (PA_6); // D12
paologiorgio 0:c81f86a07902 49 PwmOut M2 (PA_8); // D7
paologiorgio 0:c81f86a07902 50 DigitalOut Relay5V (PA_7); // D11
paologiorgio 0:c81f86a07902 51 DigitalOut Relay12V (PB_4); // D5
paologiorgio 0:c81f86a07902 52 DigitalOut Relay24V (PB_5); // D4
paologiorgio 0:c81f86a07902 53 DigitalOut Relay15_15_5V (PB_10); // D6 | +15, -15, -5
paologiorgio 0:c81f86a07902 54 float offset = 0.0f;
paologiorgio 0:c81f86a07902 55 volatile char ch;
paologiorgio 0:c81f86a07902 56
paologiorgio 0:c81f86a07902 57 // DATA_OUT_CLOCK.write(0) -> wait_ms(7) -> DATA_OUT_CLOCK.write(0) -> wait_ms(7)
paologiorgio 0:c81f86a07902 58
paologiorgio 0:c81f86a07902 59 // *********** VARIABLES *****************
paologiorgio 0:c81f86a07902 60 volatile int nIndex; // indice del pacchetto per lo "spacchettamento"
paologiorgio 0:c81f86a07902 61 char getPacket[PACKETSIZE]; // buffer - pacchetto inviato di dimensione max PACKETSIZE
paologiorgio 0:c81f86a07902 62 char PacketChecked[PACKET_CHECKED]; // lato Space/Craft
paologiorgio 0:c81f86a07902 63 char TLM[OPTION_1]; // lato MIMA per check
paologiorgio 0:c81f86a07902 64 char TLM_SD[OPTION_2]; // lato MIMA per check
paologiorgio 0:c81f86a07902 65
paologiorgio 0:c81f86a07902 66
paologiorgio 0:c81f86a07902 67 volatile int LEN; // numero di bit da ricevere per ricezione corretta
paologiorgio 0:c81f86a07902 68 volatile int commandId;
paologiorgio 0:c81f86a07902 69 volatile int payloadDec;
paologiorgio 0:c81f86a07902 70 volatile int size;
paologiorgio 0:c81f86a07902 71 volatile unsigned char data; // in arrivo da MIMA per telemetria
paologiorgio 0:c81f86a07902 72
paologiorgio 0:c81f86a07902 73 int base = 2; // base per l'esponenziale (conversione binary to decimal)
paologiorgio 0:c81f86a07902 74 int CMD[CMD_NUM]; // CMD in decimale
paologiorgio 0:c81f86a07902 75
paologiorgio 0:c81f86a07902 76 volatile int option_1 = 0; // default
paologiorgio 0:c81f86a07902 77 volatile int option_2 = 0;
paologiorgio 0:c81f86a07902 78
paologiorgio 0:c81f86a07902 79 int tempCheck[word]; // temp
paologiorgio 0:c81f86a07902 80 char checksumWord[word]; // checksum sul pacchetto elaborato
paologiorgio 0:c81f86a07902 81 char checksumReceived[word]; // checksum ricevuto
paologiorgio 0:c81f86a07902 82
paologiorgio 0:c81f86a07902 83 // ************** SETUP *******************
paologiorgio 0:c81f86a07902 84 void CMD_REF(); // crea la lista dei comandi
paologiorgio 0:c81f86a07902 85 void clearBuffer(char *arr, int arrLen); // ripulisce il buffer di ricezione
paologiorgio 0:c81f86a07902 86 void checksum(char *a, int aSize); // effettua checksum
paologiorgio 0:c81f86a07902 87 void RxTelecommand();
paologiorgio 0:c81f86a07902 88 void TxTelecommand();
paologiorgio 0:c81f86a07902 89 void RxTelemetry();
paologiorgio 0:c81f86a07902 90 void TxTelemetry();
paologiorgio 0:c81f86a07902 91 void ActuatorControl(int command); // controllo L16 e Relay
paologiorgio 0:c81f86a07902 92
paologiorgio 0:c81f86a07902 93
paologiorgio 0:c81f86a07902 94 // *********************************************************************
paologiorgio 0:c81f86a07902 95
paologiorgio 0:c81f86a07902 96
paologiorgio 0:c81f86a07902 97 // ************** MAIN *******************
paologiorgio 0:c81f86a07902 98 int main()
paologiorgio 0:c81f86a07902 99 {
paologiorgio 0:c81f86a07902 100 // baudrate
paologiorgio 0:c81f86a07902 101 SC.baud(115200);
paologiorgio 0:c81f86a07902 102 MIMA.baud(9600);
paologiorgio 0:c81f86a07902 103
paologiorgio 0:c81f86a07902 104 // Setup PWM
paologiorgio 0:c81f86a07902 105 M1.period_us(1000);
paologiorgio 0:c81f86a07902 106 M2.period_us(1000);
paologiorgio 0:c81f86a07902 107
paologiorgio 0:c81f86a07902 108 // Setup Relay: default (pull-up)
paologiorgio 0:c81f86a07902 109 Relay5V = 1;
paologiorgio 0:c81f86a07902 110 Relay12V = 1;
paologiorgio 0:c81f86a07902 111 Relay15_15_5V = 1; // +15, -15, -5
paologiorgio 0:c81f86a07902 112 Relay24V = 1;
paologiorgio 0:c81f86a07902 113
paologiorgio 0:c81f86a07902 114 // diagnostic
paologiorgio 0:c81f86a07902 115 SC.printf("*******Starting... *******\n\r");
paologiorgio 0:c81f86a07902 116
paologiorgio 0:c81f86a07902 117 // interrupt
paologiorgio 0:c81f86a07902 118 SC.attach(&RxTelecommand, Serial::RxIrq);
paologiorgio 0:c81f86a07902 119 MIMA.attach(&RxTelemetry, Serial::RxIrq);
paologiorgio 0:c81f86a07902 120
paologiorgio 0:c81f86a07902 121 }
paologiorgio 0:c81f86a07902 122
paologiorgio 0:c81f86a07902 123
paologiorgio 0:c81f86a07902 124 // *********************************************************************
paologiorgio 0:c81f86a07902 125
paologiorgio 0:c81f86a07902 126
paologiorgio 0:c81f86a07902 127 // ************** FUNCTIONS *******************
paologiorgio 0:c81f86a07902 128 void CMD_REF()
paologiorgio 0:c81f86a07902 129 {
paologiorgio 0:c81f86a07902 130 for (int i = 0; i < CMD_NUM; i++)
paologiorgio 0:c81f86a07902 131 {
paologiorgio 0:c81f86a07902 132 CMD[i] = i;
paologiorgio 0:c81f86a07902 133 }
paologiorgio 0:c81f86a07902 134 }
paologiorgio 0:c81f86a07902 135
paologiorgio 0:c81f86a07902 136 // clear
paologiorgio 0:c81f86a07902 137 void clearBuffer(char *arr, int arrLen)
paologiorgio 0:c81f86a07902 138 {
paologiorgio 0:c81f86a07902 139 // reset pacchetto
paologiorgio 0:c81f86a07902 140 nIndex = 0;
paologiorgio 0:c81f86a07902 141 for (nIndex = 0; nIndex < arrLen; nIndex++)
paologiorgio 0:c81f86a07902 142 {
paologiorgio 0:c81f86a07902 143 arr[nIndex] = '\0';
paologiorgio 0:c81f86a07902 144 }
paologiorgio 0:c81f86a07902 145 }
paologiorgio 0:c81f86a07902 146
paologiorgio 0:c81f86a07902 147 // DORA riceve telecomando da SC
paologiorgio 0:c81f86a07902 148 void RxTelecommand()
paologiorgio 0:c81f86a07902 149 {
paologiorgio 0:c81f86a07902 150 CMD_REF(); // carica vettore dei comandi
paologiorgio 0:c81f86a07902 151
paologiorgio 0:c81f86a07902 152 while (SC.readable()) // finché sulla porta USB arrivano dati, esegui
paologiorgio 0:c81f86a07902 153 {
paologiorgio 0:c81f86a07902 154 clearBuffer(getPacket, sizeof(getPacket) / sizeof(getPacket[0])); // clear the buffer
paologiorgio 0:c81f86a07902 155 SC.gets(getPacket, sizeof(getPacket)); // leggi la stringa in ingresso
paologiorgio 0:c81f86a07902 156 LEN = strlen(getPacket) - 2; // calcola la sua lunghezza ignorando i tag \r\n
paologiorgio 0:c81f86a07902 157 ch = getPacket[0];
paologiorgio 0:c81f86a07902 158
paologiorgio 0:c81f86a07902 159 if (LEN != PACKET)
paologiorgio 0:c81f86a07902 160 {
paologiorgio 0:c81f86a07902 161 if (LEN == 1)
paologiorgio 0:c81f86a07902 162 {
paologiorgio 0:c81f86a07902 163 SC.printf("> Bit number: %i is not equal to 15 // no tele-command\n\r", LEN); // diagnostica
paologiorgio 0:c81f86a07902 164 }
paologiorgio 0:c81f86a07902 165 }
paologiorgio 0:c81f86a07902 166 else
paologiorgio 0:c81f86a07902 167 {
paologiorgio 0:c81f86a07902 168 for (int n = 0; n < LEN; n++)
paologiorgio 0:c81f86a07902 169 {
paologiorgio 0:c81f86a07902 170 PacketChecked[n] = getPacket[n]; // riempi il nuovo array
paologiorgio 0:c81f86a07902 171 }
paologiorgio 0:c81f86a07902 172
paologiorgio 0:c81f86a07902 173 // ***CONTROLLO DEI BIT - LSB: EVEN/ODD ***
paologiorgio 0:c81f86a07902 174 int ones = 0;
paologiorgio 0:c81f86a07902 175 int check = 0;
paologiorgio 0:c81f86a07902 176 while (check < PACKET)
paologiorgio 0:c81f86a07902 177 {
paologiorgio 0:c81f86a07902 178 if (getPacket[check] == '1')
paologiorgio 0:c81f86a07902 179 {
paologiorgio 0:c81f86a07902 180 ones++;
paologiorgio 0:c81f86a07902 181 }
paologiorgio 0:c81f86a07902 182
paologiorgio 0:c81f86a07902 183 check++;
paologiorgio 0:c81f86a07902 184 }
paologiorgio 0:c81f86a07902 185
paologiorgio 0:c81f86a07902 186 char newItem;
paologiorgio 0:c81f86a07902 187
paologiorgio 0:c81f86a07902 188 if (ones % 2 == 0)
paologiorgio 0:c81f86a07902 189 {
paologiorgio 0:c81f86a07902 190 newItem = '0'; // If the number of ones in[B0÷B14] bits is even (making the total number of ones even)
paologiorgio 0:c81f86a07902 191 }
paologiorgio 0:c81f86a07902 192 else
paologiorgio 0:c81f86a07902 193 {
paologiorgio 0:c81f86a07902 194 newItem = '1'; // If the number of ones in[B0÷B14] bits is odd (making the total number of ones even)
paologiorgio 0:c81f86a07902 195 }
paologiorgio 0:c81f86a07902 196
paologiorgio 0:c81f86a07902 197 int nPacket = PACKET + 1;
paologiorgio 0:c81f86a07902 198 // shift elements
paologiorgio 0:c81f86a07902 199 for (int i = nPacket - 1; i >= PACKET_CHECKED; i--)
paologiorgio 0:c81f86a07902 200 {
paologiorgio 0:c81f86a07902 201 PacketChecked[i] = PacketChecked[i - 1];
paologiorgio 0:c81f86a07902 202 }
paologiorgio 0:c81f86a07902 203
paologiorgio 0:c81f86a07902 204 // insert LSB
paologiorgio 0:c81f86a07902 205 PacketChecked[PACKET_CHECKED - 1] = newItem;
paologiorgio 0:c81f86a07902 206
paologiorgio 0:c81f86a07902 207 SC.printf("> Send: ");
paologiorgio 0:c81f86a07902 208 for (int z = 0; z < PACKET_CHECKED; z++)
paologiorgio 0:c81f86a07902 209 {
paologiorgio 0:c81f86a07902 210 SC.printf("%c", PacketChecked[z]);
paologiorgio 0:c81f86a07902 211 }
paologiorgio 0:c81f86a07902 212
paologiorgio 0:c81f86a07902 213 SC.printf("\n\r");
paologiorgio 0:c81f86a07902 214
paologiorgio 0:c81f86a07902 215 // ************DIAGNOSTICA ************
paologiorgio 0:c81f86a07902 216 // un telecommand è formato da 16 bit. i primi 5 sono identificativi,
paologiorgio 0:c81f86a07902 217 // poi ho due bit che mi specificano se i dati in arrivo sono una o più parole,
paologiorgio 0:c81f86a07902 218 // dopodiché ho un payload da 8 bit e per concludere ho LSB (parity bit)
paologiorgio 0:c81f86a07902 219 // MSB IIII TT PPPPPPPP PC
paologiorgio 0:c81f86a07902 220
paologiorgio 0:c81f86a07902 221 // ***COMMAND IDENTIFIER ***
paologiorgio 0:c81f86a07902 222 int CMDIndex = 0; // puntatore dell'identificativo
paologiorgio 0:c81f86a07902 223 commandId = 0;
paologiorgio 0:c81f86a07902 224
paologiorgio 0:c81f86a07902 225 int B7 = PacketChecked[7];
paologiorgio 0:c81f86a07902 226 int B9 = PacketChecked[9];
paologiorgio 0:c81f86a07902 227 int B11 = PacketChecked[11];
paologiorgio 0:c81f86a07902 228
paologiorgio 0:c81f86a07902 229 // trasformo l'identificatore in numero
paologiorgio 0:c81f86a07902 230 while (CMDIndex < IDENTIFIER)
paologiorgio 0:c81f86a07902 231 {
paologiorgio 0:c81f86a07902 232 if (PacketChecked[CMDIndex] == '1')
paologiorgio 0:c81f86a07902 233 {
paologiorgio 0:c81f86a07902 234 int raise = IDENTIFIER - 1 - CMDIndex;
paologiorgio 0:c81f86a07902 235 commandId += pow((float) base, (float) raise);
paologiorgio 0:c81f86a07902 236 }
paologiorgio 0:c81f86a07902 237 else
paologiorgio 0:c81f86a07902 238 {
paologiorgio 0:c81f86a07902 239 commandId += 0;
paologiorgio 0:c81f86a07902 240 }
paologiorgio 0:c81f86a07902 241
paologiorgio 0:c81f86a07902 242 CMDIndex++;
paologiorgio 0:c81f86a07902 243 }
paologiorgio 0:c81f86a07902 244
paologiorgio 0:c81f86a07902 245 // scorro la lista di comandi disponibli e verifico se il comando trasmesso rientra
paologiorgio 0:c81f86a07902 246 // nella lista, altrimenti finisco in uno dei 3 SPARE
paologiorgio 0:c81f86a07902 247 int k = 0;
paologiorgio 0:c81f86a07902 248 int isElementPresent = 0;
paologiorgio 0:c81f86a07902 249 while (k < CMD_NUM)
paologiorgio 0:c81f86a07902 250 {
paologiorgio 0:c81f86a07902 251 if (commandId == CMD[k])
paologiorgio 0:c81f86a07902 252 {
paologiorgio 0:c81f86a07902 253 isElementPresent = 1;
paologiorgio 0:c81f86a07902 254 SC.printf("> Telcommand sent belgons to MIMA command list: CMD %i\n\r", k);
paologiorgio 0:c81f86a07902 255
paologiorgio 0:c81f86a07902 256 if (k == 2 || k == 15 || k == 30) // CMD02, CMD15, CMD30
paologiorgio 0:c81f86a07902 257 {
paologiorgio 0:c81f86a07902 258 SC.printf("> CMD %i : SPARE\n\r", k);
paologiorgio 0:c81f86a07902 259 }
paologiorgio 0:c81f86a07902 260 else if (k == 0 && PacketChecked[5] == '0' && PacketChecked[6] == '0') // CMD0 - spare
paologiorgio 0:c81f86a07902 261 {
paologiorgio 0:c81f86a07902 262 payloadDec = 0; // inizializzazione del payload in formato digitale
paologiorgio 0:c81f86a07902 263 int counter = 7; // parto dal settimo bit
paologiorgio 0:c81f86a07902 264
paologiorgio 0:c81f86a07902 265 while (counter < PACKET)
paologiorgio 0:c81f86a07902 266 {
paologiorgio 0:c81f86a07902 267 if (PacketChecked[counter] == '1')
paologiorgio 0:c81f86a07902 268 {
paologiorgio 0:c81f86a07902 269 int raise = PACKET - 1 - counter;
paologiorgio 0:c81f86a07902 270 payloadDec += pow((float) base, (float) raise);
paologiorgio 0:c81f86a07902 271 }
paologiorgio 0:c81f86a07902 272 else
paologiorgio 0:c81f86a07902 273 {
paologiorgio 0:c81f86a07902 274 payloadDec += 0;
paologiorgio 0:c81f86a07902 275 }
paologiorgio 0:c81f86a07902 276
paologiorgio 0:c81f86a07902 277 counter++;
paologiorgio 0:c81f86a07902 278 }
paologiorgio 0:c81f86a07902 279
paologiorgio 0:c81f86a07902 280 ActuatorControl(payloadDec);
paologiorgio 0:c81f86a07902 281 break;
paologiorgio 0:c81f86a07902 282 }
paologiorgio 0:c81f86a07902 283 else if (k == 1) // CMD01
paologiorgio 0:c81f86a07902 284 {
paologiorgio 0:c81f86a07902 285 if (PacketChecked[11] == '0' &&
paologiorgio 0:c81f86a07902 286 PacketChecked[12] == '0' &&
paologiorgio 0:c81f86a07902 287 PacketChecked[13] == '0' &&
paologiorgio 0:c81f86a07902 288 PacketChecked[14] == '1')
paologiorgio 0:c81f86a07902 289 {
paologiorgio 0:c81f86a07902 290 SC.printf("> Setting MIMA... Sleeping mode\n\r");
paologiorgio 0:c81f86a07902 291 }
paologiorgio 0:c81f86a07902 292 else if (PacketChecked[11] == '0' &&
paologiorgio 0:c81f86a07902 293 PacketChecked[12] == '0' &&
paologiorgio 0:c81f86a07902 294 PacketChecked[13] == '1' &&
paologiorgio 0:c81f86a07902 295 PacketChecked[14] == '0')
paologiorgio 0:c81f86a07902 296 {
paologiorgio 0:c81f86a07902 297 SC.printf("> Setting MIMA... Awake mode\n\r");
paologiorgio 0:c81f86a07902 298 }
paologiorgio 0:c81f86a07902 299 else if (PacketChecked[11] == '0' &&
paologiorgio 0:c81f86a07902 300 PacketChecked[12] == '0' &&
paologiorgio 0:c81f86a07902 301 PacketChecked[13] == '1' &&
paologiorgio 0:c81f86a07902 302 PacketChecked[14] == '1')
paologiorgio 0:c81f86a07902 303 {
paologiorgio 0:c81f86a07902 304 SC.printf("> Setting MIMA... Calibration mode\n\r");
paologiorgio 0:c81f86a07902 305 }
paologiorgio 0:c81f86a07902 306 else if (PacketChecked[11] == '0' &&
paologiorgio 0:c81f86a07902 307 PacketChecked[12] == '1' &&
paologiorgio 0:c81f86a07902 308 PacketChecked[13] == '0' &&
paologiorgio 0:c81f86a07902 309 PacketChecked[14] == '0')
paologiorgio 0:c81f86a07902 310 {
paologiorgio 0:c81f86a07902 311 SC.printf("> Setting MIMA... Observation mode\n\r");
paologiorgio 0:c81f86a07902 312 }
paologiorgio 0:c81f86a07902 313 else if (PacketChecked[11] == '0' &&
paologiorgio 0:c81f86a07902 314 PacketChecked[12] == '1' &&
paologiorgio 0:c81f86a07902 315 PacketChecked[13] == '0' &&
paologiorgio 0:c81f86a07902 316 PacketChecked[14] == '1')
paologiorgio 0:c81f86a07902 317 {
paologiorgio 0:c81f86a07902 318 SC.printf("> Setting MIMA... Auto-test mode\n\r");
paologiorgio 0:c81f86a07902 319 }
paologiorgio 0:c81f86a07902 320 else if (PacketChecked[11] == '0' &&
paologiorgio 0:c81f86a07902 321 PacketChecked[12] == '1' &&
paologiorgio 0:c81f86a07902 322 PacketChecked[13] == '1' &&
paologiorgio 0:c81f86a07902 323 PacketChecked[14] == '0')
paologiorgio 0:c81f86a07902 324 {
paologiorgio 0:c81f86a07902 325 SC.printf("> Setting MIMA... Full testing mode\n\r");
paologiorgio 0:c81f86a07902 326 }
paologiorgio 0:c81f86a07902 327 }
paologiorgio 0:c81f86a07902 328 else if (k == 7) // CMD07
paologiorgio 0:c81f86a07902 329 {
paologiorgio 0:c81f86a07902 330 // IR sensor thermal loop
paologiorgio 0:c81f86a07902 331 if (B7 == '1')
paologiorgio 0:c81f86a07902 332 {
paologiorgio 0:c81f86a07902 333 SC.printf("> IR sensor thermal loop...\n\r");
paologiorgio 0:c81f86a07902 334 SC.printf("IRT1 telemetry: feedback signal in the thermal control loop (default). IRT2 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 335 }
paologiorgio 0:c81f86a07902 336 else
paologiorgio 0:c81f86a07902 337 {
paologiorgio 0:c81f86a07902 338 SC.printf("> IR sensor thermal loop...\n\r");
paologiorgio 0:c81f86a07902 339 SC.printf("IRT2 telemetry: feedback signal in the thermal control. IRT1 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 340 }
paologiorgio 0:c81f86a07902 341
paologiorgio 0:c81f86a07902 342 // Laser Diode thermal loop
paologiorgio 0:c81f86a07902 343 if (B9 == '1')
paologiorgio 0:c81f86a07902 344 {
paologiorgio 0:c81f86a07902 345 SC.printf("> Laser Diode thermal loop...\n\r");
paologiorgio 0:c81f86a07902 346 SC.printf("LDT1 telemetry: feedback signal in the thermal control loop (default). LDT2 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 347 }
paologiorgio 0:c81f86a07902 348 else
paologiorgio 0:c81f86a07902 349 {
paologiorgio 0:c81f86a07902 350 SC.printf("> Laser Diode thermal loop...\n\r");
paologiorgio 0:c81f86a07902 351 SC.printf("LDT2 telemetry: feedback signal in the thermal control. LDT1 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 352
paologiorgio 0:c81f86a07902 353 }
paologiorgio 0:c81f86a07902 354
paologiorgio 0:c81f86a07902 355 // BlackBody thermal loop
paologiorgio 0:c81f86a07902 356 if (B11 == '1')
paologiorgio 0:c81f86a07902 357 {
paologiorgio 0:c81f86a07902 358 SC.printf("> BlackBody thermal loop...\n\r");
paologiorgio 0:c81f86a07902 359 SC.printf("BBT1 telemetry: feedback signal in the thermal control loop (default). BBT2 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 360 }
paologiorgio 0:c81f86a07902 361 else
paologiorgio 0:c81f86a07902 362 {
paologiorgio 0:c81f86a07902 363 SC.printf("> BlackBody thermal loop...\n\r");
paologiorgio 0:c81f86a07902 364 SC.printf("BBT2 telemetry: feedback signal in the thermal control. BBT1 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 365 }
paologiorgio 0:c81f86a07902 366 }
paologiorgio 0:c81f86a07902 367
paologiorgio 0:c81f86a07902 368 }
paologiorgio 0:c81f86a07902 369
paologiorgio 0:c81f86a07902 370 k++;
paologiorgio 0:c81f86a07902 371 }
paologiorgio 0:c81f86a07902 372
paologiorgio 0:c81f86a07902 373 if (isElementPresent == '0')
paologiorgio 0:c81f86a07902 374 {
paologiorgio 0:c81f86a07902 375 SC.printf("Telecommand sent doesn't exist\n\r");
paologiorgio 0:c81f86a07902 376 }
paologiorgio 0:c81f86a07902 377
paologiorgio 0:c81f86a07902 378 // ***TAG ***
paologiorgio 0:c81f86a07902 379 int B5 = PacketChecked[5];
paologiorgio 0:c81f86a07902 380 int B6 = PacketChecked[6];
paologiorgio 0:c81f86a07902 381
paologiorgio 0:c81f86a07902 382 if (B5 == '0' && B6 == '0')
paologiorgio 0:c81f86a07902 383 {
paologiorgio 0:c81f86a07902 384 // Single word telemetry
paologiorgio 0:c81f86a07902 385 SC.printf("Single word telemetry\n\r");
paologiorgio 0:c81f86a07902 386 }
paologiorgio 0:c81f86a07902 387 else if (B5 == '0' && B6 == '1')
paologiorgio 0:c81f86a07902 388 {
paologiorgio 0:c81f86a07902 389 // Multiple words telemetry (1st word)
paologiorgio 0:c81f86a07902 390 SC.printf("Multiple words telemetry (1st word)\n\r");
paologiorgio 0:c81f86a07902 391 }
paologiorgio 0:c81f86a07902 392 else if (B5 == '1' && B6 == '0')
paologiorgio 0:c81f86a07902 393 {
paologiorgio 0:c81f86a07902 394 // Multiple words telemetry (2nd word)
paologiorgio 0:c81f86a07902 395 SC.printf("Multiple words telemetry (2nd word)\n\r");
paologiorgio 0:c81f86a07902 396 }
paologiorgio 0:c81f86a07902 397 else
paologiorgio 0:c81f86a07902 398 {
paologiorgio 0:c81f86a07902 399 // Not used
paologiorgio 0:c81f86a07902 400 SC.printf("NOT USED\n\r");
paologiorgio 0:c81f86a07902 401 }
paologiorgio 0:c81f86a07902 402
paologiorgio 0:c81f86a07902 403 // ***PAYLOAD ***
paologiorgio 0:c81f86a07902 404 SC.printf("> Payload: ");
paologiorgio 0:c81f86a07902 405 for (int IndexPayload = 7; IndexPayload < PACKET; IndexPayload++)
paologiorgio 0:c81f86a07902 406 {
paologiorgio 0:c81f86a07902 407 SC.printf("%c", PacketChecked[IndexPayload]);
paologiorgio 0:c81f86a07902 408 }
paologiorgio 0:c81f86a07902 409
paologiorgio 0:c81f86a07902 410 SC.printf("\n\r"); // per leggibilità
paologiorgio 0:c81f86a07902 411
paologiorgio 0:c81f86a07902 412 //***********FINE DIAGNOSTICA PACCHETTO***********
paologiorgio 0:c81f86a07902 413
paologiorgio 0:c81f86a07902 414 }
paologiorgio 0:c81f86a07902 415
paologiorgio 0:c81f86a07902 416 TxTelecommand();
paologiorgio 0:c81f86a07902 417 }
paologiorgio 0:c81f86a07902 418 }
paologiorgio 0:c81f86a07902 419
paologiorgio 0:c81f86a07902 420 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 421
paologiorgio 0:c81f86a07902 422 // DORA trasmette telecomando a MIMA
paologiorgio 0:c81f86a07902 423 void TxTelecommand()
paologiorgio 0:c81f86a07902 424 {
paologiorgio 0:c81f86a07902 425 for (int i = 0; i < PACKET_CHECKED + 1; i++)
paologiorgio 0:c81f86a07902 426 {
paologiorgio 0:c81f86a07902 427 MIMA.putc(PacketChecked[i]);
paologiorgio 0:c81f86a07902 428 }
paologiorgio 0:c81f86a07902 429 }
paologiorgio 0:c81f86a07902 430
paologiorgio 0:c81f86a07902 431
paologiorgio 0:c81f86a07902 432 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 433
paologiorgio 0:c81f86a07902 434 // DORA riceve telemetrie/telemetrie+scientific data da MIMA
paologiorgio 0:c81f86a07902 435 void RxTelemetry()
paologiorgio 0:c81f86a07902 436 {
paologiorgio 0:c81f86a07902 437 // aggiungere timeout, perché non so se raggiungo il numero dei caratteri
paologiorgio 0:c81f86a07902 438
paologiorgio 0:c81f86a07902 439 while (MIMA.readable())
paologiorgio 0:c81f86a07902 440 {
paologiorgio 0:c81f86a07902 441 t.start();
paologiorgio 0:c81f86a07902 442
paologiorgio 0:c81f86a07902 443 // char prova = MIMA.getc();
paologiorgio 0:c81f86a07902 444 // SC.printf("> Text: %c\n\r", prova);
paologiorgio 0:c81f86a07902 445 // check del payload per scelta del buffer
paologiorgio 0:c81f86a07902 446 // 00000000 -> Option 1: transfer all Housekeeping and Status telemetries (from TLM00 to TLM56)
paologiorgio 0:c81f86a07902 447 // 11111111 -> Option 2: transfer telemetries and scientific data packets (from TLM00 to TLM5662)
paologiorgio 0:c81f86a07902 448
paologiorgio 0:c81f86a07902 449 int j = 7;
paologiorgio 0:c81f86a07902 450 while (j < PACKET_CHECKED)
paologiorgio 0:c81f86a07902 451 {
paologiorgio 0:c81f86a07902 452 if (PacketChecked[j] == '0')
paologiorgio 0:c81f86a07902 453 {
paologiorgio 0:c81f86a07902 454 j++;
paologiorgio 0:c81f86a07902 455 }
paologiorgio 0:c81f86a07902 456 else
paologiorgio 0:c81f86a07902 457 {
paologiorgio 0:c81f86a07902 458 option_1 = 1;
paologiorgio 0:c81f86a07902 459 break;
paologiorgio 0:c81f86a07902 460 }
paologiorgio 0:c81f86a07902 461 }
paologiorgio 0:c81f86a07902 462
paologiorgio 0:c81f86a07902 463 int k = 7;
paologiorgio 0:c81f86a07902 464 while (k < PACKET_CHECKED)
paologiorgio 0:c81f86a07902 465 {
paologiorgio 0:c81f86a07902 466 if (PacketChecked[k] == '1')
paologiorgio 0:c81f86a07902 467 {
paologiorgio 0:c81f86a07902 468 k++;
paologiorgio 0:c81f86a07902 469 }
paologiorgio 0:c81f86a07902 470 else
paologiorgio 0:c81f86a07902 471 {
paologiorgio 0:c81f86a07902 472 option_2 = 1;
paologiorgio 0:c81f86a07902 473 break;
paologiorgio 0:c81f86a07902 474 }
paologiorgio 0:c81f86a07902 475 }
paologiorgio 0:c81f86a07902 476
paologiorgio 0:c81f86a07902 477 if (commandId == 5) // TLMODE
paologiorgio 0:c81f86a07902 478 {
paologiorgio 0:c81f86a07902 479 // STARTCH1 - 2800 scientific points - CHECKSUM - ENDCH1
paologiorgio 0:c81f86a07902 480 // STARTCH2 - 2800 scientific points - CHECKSUM - ENDCH2
paologiorgio 0:c81f86a07902 481 // 5606 words
paologiorgio 0:c81f86a07902 482 if (option_1 == 0)
paologiorgio 0:c81f86a07902 483 {
paologiorgio 0:c81f86a07902 484 size = 0; // reset
paologiorgio 0:c81f86a07902 485 clearBuffer(TLM, sizeof(TLM) / sizeof(TLM[0]));
paologiorgio 0:c81f86a07902 486
paologiorgio 0:c81f86a07902 487 if (t.read() < TIMEOUT)
paologiorgio 0:c81f86a07902 488 {
paologiorgio 0:c81f86a07902 489 while (size < OPTION_1)
paologiorgio 0:c81f86a07902 490 {
paologiorgio 0:c81f86a07902 491 data = MIMA.getc(); // prendi carattere in arrivo
paologiorgio 0:c81f86a07902 492 TLM[size++] = data;
paologiorgio 0:c81f86a07902 493 }
paologiorgio 0:c81f86a07902 494 }
paologiorgio 0:c81f86a07902 495 else
paologiorgio 0:c81f86a07902 496 {
paologiorgio 0:c81f86a07902 497 t.stop();
paologiorgio 0:c81f86a07902 498 SC.printf("> Time elapsed: %.2f\n\r", t.read());
paologiorgio 0:c81f86a07902 499 clearBuffer(TLM, sizeof(TLM) / sizeof(TLM[0]));
paologiorgio 0:c81f86a07902 500 }
paologiorgio 0:c81f86a07902 501 }
paologiorgio 0:c81f86a07902 502 else if (option_2 == 0)
paologiorgio 0:c81f86a07902 503 {
paologiorgio 0:c81f86a07902 504 size = 0;
paologiorgio 0:c81f86a07902 505 clearBuffer(TLM_SD, sizeof(TLM_SD) / sizeof(TLM_SD[0]));
paologiorgio 0:c81f86a07902 506
paologiorgio 0:c81f86a07902 507 t.start();
paologiorgio 0:c81f86a07902 508 if (t.read() < TIMEOUT)
paologiorgio 0:c81f86a07902 509 {
paologiorgio 0:c81f86a07902 510 while (size < OPTION_2)
paologiorgio 0:c81f86a07902 511 {
paologiorgio 0:c81f86a07902 512 data = MIMA.getc(); // prendi carattere in arrivo
paologiorgio 0:c81f86a07902 513 TLM_SD[size++] = data;
paologiorgio 0:c81f86a07902 514 }
paologiorgio 0:c81f86a07902 515 //checksum(TLM_SD, OPTION_2);
paologiorgio 0:c81f86a07902 516 }
paologiorgio 0:c81f86a07902 517 else
paologiorgio 0:c81f86a07902 518 {
paologiorgio 0:c81f86a07902 519 t.stop();
paologiorgio 0:c81f86a07902 520 clearBuffer(TLM_SD, sizeof(TLM_SD) / sizeof(TLM_SD[0]));
paologiorgio 0:c81f86a07902 521 }
paologiorgio 0:c81f86a07902 522 }
paologiorgio 0:c81f86a07902 523
paologiorgio 0:c81f86a07902 524 TxTelemetry();
paologiorgio 0:c81f86a07902 525 }
paologiorgio 0:c81f86a07902 526 }
paologiorgio 0:c81f86a07902 527 }
paologiorgio 0:c81f86a07902 528
paologiorgio 0:c81f86a07902 529 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 530
paologiorgio 0:c81f86a07902 531 // integrità dei dati ricevuti da MIMA
paologiorgio 0:c81f86a07902 532 void checksum(char *a, int aSize)
paologiorgio 0:c81f86a07902 533 {
paologiorgio 0:c81f86a07902 534 volatile int temp;
paologiorgio 0:c81f86a07902 535 volatile int var;
paologiorgio 0:c81f86a07902 536 volatile int p = 0;
paologiorgio 0:c81f86a07902 537
paologiorgio 0:c81f86a07902 538 for (int i = word; i < 2*word; i++)
paologiorgio 0:c81f86a07902 539 {
paologiorgio 0:c81f86a07902 540 for (int j = 2*i; j < aSize; j+=i)
paologiorgio 0:c81f86a07902 541 {
paologiorgio 0:c81f86a07902 542 if (j == 2*i)
paologiorgio 0:c81f86a07902 543 {
paologiorgio 0:c81f86a07902 544 temp = (int)(a[i] ^ a[j]);
paologiorgio 0:c81f86a07902 545 } else
paologiorgio 0:c81f86a07902 546 {
paologiorgio 0:c81f86a07902 547 temp = temp ^ (int)a[j];
paologiorgio 0:c81f86a07902 548 }
paologiorgio 0:c81f86a07902 549
paologiorgio 0:c81f86a07902 550 }
paologiorgio 0:c81f86a07902 551
paologiorgio 0:c81f86a07902 552 tempCheck[p++] = temp; // vettore del checksum in int
paologiorgio 0:c81f86a07902 553 }
paologiorgio 0:c81f86a07902 554
paologiorgio 0:c81f86a07902 555 for (int i = 0; i < word; i++) // trasformo in char
paologiorgio 0:c81f86a07902 556 {
paologiorgio 0:c81f86a07902 557 if (tempCheck[i] == 0 || tempCheck[i] == 48)
paologiorgio 0:c81f86a07902 558 {
paologiorgio 0:c81f86a07902 559 checksumWord[i++] = '0';
paologiorgio 0:c81f86a07902 560 }
paologiorgio 0:c81f86a07902 561 else if (tempCheck[i] == 1 || tempCheck[i] == 49)
paologiorgio 0:c81f86a07902 562 {
paologiorgio 0:c81f86a07902 563 checksumWord[i++] = '1';
paologiorgio 0:c81f86a07902 564 }
paologiorgio 0:c81f86a07902 565 }
paologiorgio 0:c81f86a07902 566
paologiorgio 0:c81f86a07902 567
paologiorgio 0:c81f86a07902 568 volatile int t = 0;
paologiorgio 0:c81f86a07902 569 // confronto
paologiorgio 0:c81f86a07902 570 for (int i = 2801*word; i < 2802*16; i++)
paologiorgio 0:c81f86a07902 571 {
paologiorgio 0:c81f86a07902 572 checksumReceived[t++] = TLM_SD[i];
paologiorgio 0:c81f86a07902 573 }
paologiorgio 0:c81f86a07902 574
paologiorgio 0:c81f86a07902 575 for (int i = 0; i < word; i++)
paologiorgio 0:c81f86a07902 576 {
paologiorgio 0:c81f86a07902 577 if (checksumWord[i] != checksumReceived[i])
paologiorgio 0:c81f86a07902 578 {
paologiorgio 0:c81f86a07902 579 SC.printf("\n\r> ERROR detected: BIT n. %i\n\r", i+1);
paologiorgio 0:c81f86a07902 580 break;
paologiorgio 0:c81f86a07902 581 }
paologiorgio 0:c81f86a07902 582 }
paologiorgio 0:c81f86a07902 583
paologiorgio 0:c81f86a07902 584
paologiorgio 0:c81f86a07902 585 }
paologiorgio 0:c81f86a07902 586
paologiorgio 0:c81f86a07902 587 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 588
paologiorgio 0:c81f86a07902 589 // DORA trasmette dati verso Space/craft
paologiorgio 0:c81f86a07902 590 void TxTelemetry()
paologiorgio 0:c81f86a07902 591 {
paologiorgio 0:c81f86a07902 592 // The data are read on the falling-edge of the DATA_CLOCK_OUT signal
paologiorgio 0:c81f86a07902 593 if (option_1 == 0)
paologiorgio 0:c81f86a07902 594 {
paologiorgio 0:c81f86a07902 595 SC.printf("\n\r> Receiving 57 words from MIMA... \n\r");
paologiorgio 0:c81f86a07902 596
paologiorgio 0:c81f86a07902 597 for (int i = 0; i < OPTION_1; i++)
paologiorgio 0:c81f86a07902 598 {
paologiorgio 0:c81f86a07902 599 SC.putc(TLM[i]);
paologiorgio 0:c81f86a07902 600 }
paologiorgio 0:c81f86a07902 601
paologiorgio 0:c81f86a07902 602 /*SC.printf("\n\r> Receiving 57 words from DORA... \n\r");
paologiorgio 0:c81f86a07902 603
paologiorgio 0:c81f86a07902 604 for (int i = 0; i < OPTION_1; i++)
paologiorgio 0:c81f86a07902 605 {
paologiorgio 0:c81f86a07902 606 ARDUINO.putc(DEVICE.putc(TLM[i]));
paologiorgio 0:c81f86a07902 607 }
paologiorgio 0:c81f86a07902 608 */
paologiorgio 0:c81f86a07902 609 }
paologiorgio 0:c81f86a07902 610 else if (option_2 == 0)
paologiorgio 0:c81f86a07902 611 {
paologiorgio 0:c81f86a07902 612 SC.printf("Receiving 5663 words...\n\r");
paologiorgio 0:c81f86a07902 613
paologiorgio 0:c81f86a07902 614 for (int i = 0; i < OPTION_2; i++)
paologiorgio 0:c81f86a07902 615 {
paologiorgio 0:c81f86a07902 616 SC.putc(TLM_SD[i]);
paologiorgio 0:c81f86a07902 617 }
paologiorgio 0:c81f86a07902 618
paologiorgio 0:c81f86a07902 619 /*
paologiorgio 0:c81f86a07902 620 SC.printf("\n\r> Receiving 5663 words from DORA... \n\r");
paologiorgio 0:c81f86a07902 621
paologiorgio 0:c81f86a07902 622 for (int i = 0; i < OPTION_2; i++)
paologiorgio 0:c81f86a07902 623 {
paologiorgio 0:c81f86a07902 624 ARDUINO.putc(DEVICE.putc(TLM_SD[i]));
paologiorgio 0:c81f86a07902 625 }
paologiorgio 0:c81f86a07902 626 */
paologiorgio 0:c81f86a07902 627 }
paologiorgio 0:c81f86a07902 628
paologiorgio 0:c81f86a07902 629 }
paologiorgio 0:c81f86a07902 630
paologiorgio 0:c81f86a07902 631 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 632
paologiorgio 0:c81f86a07902 633 // controllo dell'attuatore e dei relay
paologiorgio 0:c81f86a07902 634 void ActuatorControl(int command)
paologiorgio 0:c81f86a07902 635 {
paologiorgio 0:c81f86a07902 636 SC.printf("\n\r *** L16 ACTUATONIX - RELAY CONTROL *** \n\r"); // leggibilità
paologiorgio 0:c81f86a07902 637
paologiorgio 0:c81f86a07902 638 // *** estensione/ritrazione dell'attuatore ***
paologiorgio 0:c81f86a07902 639 if((command == 128) && (offset < 1.0f)) {
paologiorgio 0:c81f86a07902 640 offset += 0.2f;
paologiorgio 0:c81f86a07902 641 } else if((command == 64) && (offset > 0.0f)) {
paologiorgio 0:c81f86a07902 642 offset -= 0.2f;
paologiorgio 0:c81f86a07902 643
paologiorgio 0:c81f86a07902 644 // *** gestione accensione/spegnimento relay alimentazione ***
paologiorgio 0:c81f86a07902 645 } // Relay 5V
paologiorgio 0:c81f86a07902 646 else if (command == 1) {
paologiorgio 0:c81f86a07902 647 Relay5V = 0;
paologiorgio 0:c81f86a07902 648 SC.printf("\r\nRelay 5V ON\r\n");
paologiorgio 0:c81f86a07902 649 } else if (command == 0) {
paologiorgio 0:c81f86a07902 650 Relay5V = 1;
paologiorgio 0:c81f86a07902 651 SC.printf("\r\nRelay 5V OFF\r\n");
paologiorgio 0:c81f86a07902 652
paologiorgio 0:c81f86a07902 653 // Relay 12V
paologiorgio 0:c81f86a07902 654 } else if (command == 3) {
paologiorgio 0:c81f86a07902 655 Relay12V = 0;
paologiorgio 0:c81f86a07902 656 SC.printf("\r\nRelay 12V ON\r\n");
paologiorgio 0:c81f86a07902 657
paologiorgio 0:c81f86a07902 658 } else if (command == 2) {
paologiorgio 0:c81f86a07902 659 Relay12V = 1;
paologiorgio 0:c81f86a07902 660 SC.printf("\r\nRelay 12V OFF\r\n");
paologiorgio 0:c81f86a07902 661
paologiorgio 0:c81f86a07902 662 // Relay +15V, -15V, -5V
paologiorgio 0:c81f86a07902 663 } else if (command == 7) {
paologiorgio 0:c81f86a07902 664 Relay15_15_5V = 0;
paologiorgio 0:c81f86a07902 665 SC.printf("\r\nRelay +15V, -15V, -5V ON\r\n");
paologiorgio 0:c81f86a07902 666
paologiorgio 0:c81f86a07902 667 } else if (command == 6) {
paologiorgio 0:c81f86a07902 668 Relay15_15_5V = 1;
paologiorgio 0:c81f86a07902 669 SC.printf("\r\nRelay +15V, -15V, -5V OFF\r\n");
paologiorgio 0:c81f86a07902 670
paologiorgio 0:c81f86a07902 671 // Relay 24V
paologiorgio 0:c81f86a07902 672 } else if (command == 15) {
paologiorgio 0:c81f86a07902 673 Relay24V = 0;
paologiorgio 0:c81f86a07902 674 SC.printf("\r\nRelay 24V ON\r\n");
paologiorgio 0:c81f86a07902 675
paologiorgio 0:c81f86a07902 676 } else if (command == 8) {
paologiorgio 0:c81f86a07902 677 Relay24V = 1;
paologiorgio 0:c81f86a07902 678 SC.printf("\r\nRelay 24V OFF\r\n");
paologiorgio 0:c81f86a07902 679
paologiorgio 0:c81f86a07902 680 // RESET
paologiorgio 0:c81f86a07902 681 } else if (command == 255) {
paologiorgio 0:c81f86a07902 682 // spegni tutto
paologiorgio 0:c81f86a07902 683 Relay5V = 1;
paologiorgio 0:c81f86a07902 684 Relay12V = 1;
paologiorgio 0:c81f86a07902 685 Relay15_15_5V = 1; // +15, -15, -5
paologiorgio 0:c81f86a07902 686 Relay24V = 1;
paologiorgio 0:c81f86a07902 687 }
paologiorgio 0:c81f86a07902 688
paologiorgio 0:c81f86a07902 689 M1.write(offset);
paologiorgio 0:c81f86a07902 690 M2.write(offset);
paologiorgio 0:c81f86a07902 691
paologiorgio 0:c81f86a07902 692 SC.printf("> Duty Cycle %.2f / estensione \n \r", offset);
paologiorgio 0:c81f86a07902 693 }