Space / Mbed 2 deprecated DORAv4

Dependencies:   mbed

Committer:
paologiorgio
Date:
Tue Jun 21 18:27:11 2022 +0000
Revision:
2:fcdd048a4a9e
Parent:
1:db73b542b7bc
Child:
3:b58e8c4438cd
DORA rev4, 21 giugno 2022

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 2:fcdd048a4a9e 3 #include <string.h>
paologiorgio 2:fcdd048a4a9e 4 #include <stdlib.h>
paologiorgio 0:c81f86a07902 5
paologiorgio 0:c81f86a07902 6 /*
paologiorgio 0:c81f86a07902 7 TO-DO: i dati arrivano in DigitalIn e DigitalOut, anziché essere della classe Serial.
paologiorgio 0:c81f86a07902 8 Al fine di poter immagazzinare i dati, associo a determinati livelli logici (1/0) dei caratteri,
paologiorgio 0:c81f86a07902 9 riempio il buffer e ritrasmetto con i caratteri riconvertiti
paologiorgio 0:c81f86a07902 10
paologiorgio 0:c81f86a07902 11 comando per azionamento periferiche: SPARE
paologiorgio 1:db73b542b7bc 12
paologiorgio 1:db73b542b7bc 13 modifica sulla ricezione: devo ricevere solo se un certo comando è stato selezionato
paologiorgio 0:c81f86a07902 14 */
paologiorgio 0:c81f86a07902 15
paologiorgio 0:c81f86a07902 16 // ************* INFO *******************
paologiorgio 0:c81f86a07902 17
paologiorgio 0:c81f86a07902 18 // ------ ------------
paologiorgio 0:c81f86a07902 19 // | MIMA | ---- DORA ---- | SPACE/CRAFT |
paologiorgio 0:c81f86a07902 20 // ------ ------------
paologiorgio 0:c81f86a07902 21
paologiorgio 2:fcdd048a4a9e 22 // testato con 26LS31 e 26LS32 + Arduino
paologiorgio 2:fcdd048a4a9e 23
paologiorgio 0:c81f86a07902 24 // ************ DEFINE ******************
paologiorgio 0:c81f86a07902 25 // definisce dimensione pacchetto inviato da pc
paologiorgio 0:c81f86a07902 26 // telecommand: 15 bit + 1 di controllo
paologiorgio 0:c81f86a07902 27 #define PACKETSIZE 20 // lunghezza massima della stringa trasmissibile prima di interrupt
paologiorgio 0:c81f86a07902 28 #define PACKET 15 // 15 bit, 1 di parità di controllo
paologiorgio 0:c81f86a07902 29 #define PACKET_CHECKED 16 // COMMAND IDENTIFIER + TAG + PAYLOAD + PARITY CHECK
paologiorgio 2:fcdd048a4a9e 30 #define TELEMETRY_SIZE 16
paologiorgio 2:fcdd048a4a9e 31 #define PACKETDIM 13
paologiorgio 0:c81f86a07902 32 #define IDENTIFIER 5
paologiorgio 0:c81f86a07902 33 #define TAG 2
paologiorgio 0:c81f86a07902 34 #define PAYLOAD 8
paologiorgio 0:c81f86a07902 35 #define CMD_NUM 32
paologiorgio 2:fcdd048a4a9e 36 #define TLM_OPTION_1 912 // 57 * 16
paologiorgio 2:fcdd048a4a9e 37 #define TLM_OPTION_2 90608 // 5663 * 16
paologiorgio 0:c81f86a07902 38 #define tb 7 // bit sampling period
paologiorgio 0:c81f86a07902 39 #define word 16
paologiorgio 2:fcdd048a4a9e 40 #define CHANNEL 2800
paologiorgio 2:fcdd048a4a9e 41 #define TLM_NUM 57
paologiorgio 0:c81f86a07902 42
paologiorgio 0:c81f86a07902 43
paologiorgio 0:c81f86a07902 44 // ************ CN7+USB ******************
paologiorgio 0:c81f86a07902 45 Serial SC(USBTX, USBRX); // A4 TX, A6 RX - DATA OUT, DATA IN
paologiorgio 0:c81f86a07902 46
paologiorgio 0:c81f86a07902 47 // ************** CN10 *******************
paologiorgio 2:fcdd048a4a9e 48 Serial MIMA(PC_4, PC_5);
paologiorgio 2:fcdd048a4a9e 49 //Serial ARDUINO(PA_0, PA_1);
paologiorgio 2:fcdd048a4a9e 50 Serial MAX31865(PA_9, PC_0);
paologiorgio 2:fcdd048a4a9e 51 Serial ARDUINO(PB_6, PC_10);
paologiorgio 2:fcdd048a4a9e 52
paologiorgio 0:c81f86a07902 53
paologiorgio 0:c81f86a07902 54 // ************** TIMER *****************
paologiorgio 0:c81f86a07902 55 Timer t;
paologiorgio 1:db73b542b7bc 56 float TIMEOUT = 10;
paologiorgio 1:db73b542b7bc 57 float tTimeStart;
paologiorgio 1:db73b542b7bc 58 float tTimeStop;
paologiorgio 1:db73b542b7bc 59 float tTimeRead;
paologiorgio 0:c81f86a07902 60
paologiorgio 0:c81f86a07902 61 // ******* L16 Actuatonix - Relay ********
paologiorgio 0:c81f86a07902 62 PwmOut M1 (PA_6); // D12
paologiorgio 0:c81f86a07902 63 PwmOut M2 (PA_8); // D7
paologiorgio 0:c81f86a07902 64 DigitalOut Relay5V (PA_7); // D11
paologiorgio 0:c81f86a07902 65 DigitalOut Relay12V (PB_4); // D5
paologiorgio 0:c81f86a07902 66 DigitalOut Relay24V (PB_5); // D4
paologiorgio 0:c81f86a07902 67 DigitalOut Relay15_15_5V (PB_10); // D6 | +15, -15, -5
paologiorgio 0:c81f86a07902 68 float offset = 0.0f;
paologiorgio 2:fcdd048a4a9e 69
paologiorgio 2:fcdd048a4a9e 70 // **************** VARS *****************
paologiorgio 2:fcdd048a4a9e 71 volatile int nIndex; // indice per clear del buffer
paologiorgio 2:fcdd048a4a9e 72 char getPacket[PACKETSIZE]; // buffer - pacchetto inviato di dimensione max PACKETSIZE
paologiorgio 2:fcdd048a4a9e 73 char PacketChecked[PACKET_CHECKED]; // lato Space/Craft
paologiorgio 2:fcdd048a4a9e 74 char TLM[TELEMETRY_SIZE]; // telemetry format
paologiorgio 2:fcdd048a4a9e 75 char TLM_HSK[TLM_OPTION_1]; // lato MIMA: CMD05 -> option 1 (ALL HSKP)
paologiorgio 2:fcdd048a4a9e 76 char TLM_HSK_SD[TLM_OPTION_2]; // lato MIMA: CMD05 -> option 2 (HSKP+SD)
paologiorgio 2:fcdd048a4a9e 77
paologiorgio 2:fcdd048a4a9e 78 volatile int LEN; // numero di bit da ricevere per ricezione corretta
paologiorgio 2:fcdd048a4a9e 79 volatile int commandId; // CMDXX per telecomando
paologiorgio 2:fcdd048a4a9e 80 volatile int payloadDec; // trasformo il payload in decimale per comandi spare
paologiorgio 2:fcdd048a4a9e 81 volatile int sizeBuffer; // indice del buffer di ricezione
paologiorgio 2:fcdd048a4a9e 82 volatile unsigned char data; // in arrivo da MIMA per telemetria
paologiorgio 2:fcdd048a4a9e 83 volatile int indexTemp; // indice del buffer di caratteri in arrivo da arduino/max31865
paologiorgio 0:c81f86a07902 84 volatile char ch;
paologiorgio 0:c81f86a07902 85
paologiorgio 2:fcdd048a4a9e 86 int base = 2; // base per l'esponenziale (conversione binary to decimal)
paologiorgio 2:fcdd048a4a9e 87 int CMD[CMD_NUM]; // CMD in decimale
paologiorgio 2:fcdd048a4a9e 88 int TLM_ID[TLM_NUM]; // TLM in decimale
paologiorgio 0:c81f86a07902 89
paologiorgio 2:fcdd048a4a9e 90 volatile int tlmode_option_1; // TLMODE: 57 words
paologiorgio 2:fcdd048a4a9e 91 volatile int tlmode_option_2; // TLMODE: 5663 words (57 + 5606 scientific data word)
paologiorgio 2:fcdd048a4a9e 92 volatile int interferogram_option_1; // TLMODE: 57 words
paologiorgio 2:fcdd048a4a9e 93 volatile int interferogram_option_2; // TLMODE: 5663 words (57 + 5606 scientific data word)
paologiorgio 0:c81f86a07902 94
paologiorgio 2:fcdd048a4a9e 95 volatile int ch1_errorDetected;
paologiorgio 2:fcdd048a4a9e 96 int ch1_intChecksum[word];
paologiorgio 2:fcdd048a4a9e 97 char ch1_checksumWord[word]; // checksum sul pacchetto elaborato
paologiorgio 2:fcdd048a4a9e 98 char ch1_checksumReceived[word]; // checksum ricevuto
paologiorgio 0:c81f86a07902 99
paologiorgio 2:fcdd048a4a9e 100 char CH1_to_string[20]; // *temperatura canale 1
paologiorgio 2:fcdd048a4a9e 101 char CH2_to_string[20]; // *temperatura canale 2
paologiorgio 2:fcdd048a4a9e 102 char tempCH1[10]; // temperatura canale 1
paologiorgio 2:fcdd048a4a9e 103 char tempCH2[10]; // temperatura canale 2
paologiorgio 2:fcdd048a4a9e 104 volatile int indexJ = 0; // indice riempimento canale 1
paologiorgio 2:fcdd048a4a9e 105 volatile int indexT = 0; // indice riempimento canale 2
paologiorgio 2:fcdd048a4a9e 106 volatile float CH1, CH2; // valore in float (da stringa)
paologiorgio 2:fcdd048a4a9e 107 volatile int nRxCharCount; // indice riempimento buffer from:MAX31865
paologiorgio 2:fcdd048a4a9e 108 char caRxPacket[PACKETDIM]; // buffer from:MAX31865
paologiorgio 2:fcdd048a4a9e 109 volatile int temperature_flag; // flag per print su richiesta
paologiorgio 0:c81f86a07902 110
paologiorgio 2:fcdd048a4a9e 111 volatile int ch2_errorDetected; // flag: errore di trasmissione
paologiorgio 2:fcdd048a4a9e 112 int ch2_intChecksum[word]; //
paologiorgio 2:fcdd048a4a9e 113 char ch2_checksumWord[word]; // checksum sul pacchetto elaborato
paologiorgio 2:fcdd048a4a9e 114 char ch2_checksumReceived[word]; // checksum ricevuto
paologiorgio 0:c81f86a07902 115
paologiorgio 0:c81f86a07902 116 // ************** SETUP *******************
paologiorgio 0:c81f86a07902 117 void CMD_REF(); // crea la lista dei comandi
paologiorgio 2:fcdd048a4a9e 118 void TLM_ID_REF(); // crea la lista delle telemetrie
paologiorgio 0:c81f86a07902 119 void clearBuffer(char *arr, int arrLen); // ripulisce il buffer di ricezione
paologiorgio 2:fcdd048a4a9e 120 void clearIntBuffer(int *y, int s);
paologiorgio 2:fcdd048a4a9e 121 void Checksum(char *a); // effettua checksum sui dati del CH1
paologiorgio 2:fcdd048a4a9e 122 void RxTelecommand(); // riceve da Spacecraft
paologiorgio 2:fcdd048a4a9e 123 void TxTelecommand(); // trasmette a MIMA
paologiorgio 2:fcdd048a4a9e 124 void RxTelemetry(); // riceve da MIMA
paologiorgio 2:fcdd048a4a9e 125 void TxTelemetry(); // trasmette a Spacecraft
paologiorgio 2:fcdd048a4a9e 126 void SpareCommand(int command); // controllo L16, Relay, periferiche
paologiorgio 2:fcdd048a4a9e 127 void GetTemperature();
paologiorgio 2:fcdd048a4a9e 128 void ReadTemperature();
paologiorgio 2:fcdd048a4a9e 129 const char* MIMA_OPERATING_MODE(char *s);
paologiorgio 2:fcdd048a4a9e 130 int BinToDec(int t, int dim, char *a);
paologiorgio 0:c81f86a07902 131
paologiorgio 0:c81f86a07902 132 // *********************************************************************
paologiorgio 0:c81f86a07902 133
paologiorgio 0:c81f86a07902 134
paologiorgio 0:c81f86a07902 135 int main()
paologiorgio 0:c81f86a07902 136 {
paologiorgio 2:fcdd048a4a9e 137 // Setup per trasmissione seriale
paologiorgio 0:c81f86a07902 138 SC.baud(115200);
paologiorgio 2:fcdd048a4a9e 139 MAX31865.baud(115200);
paologiorgio 0:c81f86a07902 140 MIMA.baud(9600);
paologiorgio 2:fcdd048a4a9e 141
paologiorgio 2:fcdd048a4a9e 142 SC.printf("******* Test DORA Communication *******\r\n");
paologiorgio 2:fcdd048a4a9e 143
paologiorgio 2:fcdd048a4a9e 144 // Flag per ricezione
paologiorgio 2:fcdd048a4a9e 145 tlmode_option_1 = 1;
paologiorgio 2:fcdd048a4a9e 146 tlmode_option_2 = 1;
paologiorgio 2:fcdd048a4a9e 147
paologiorgio 2:fcdd048a4a9e 148 // Temperatura
paologiorgio 2:fcdd048a4a9e 149 nRxCharCount = 0;
paologiorgio 2:fcdd048a4a9e 150 clearBuffer(caRxPacket,PACKETDIM);
paologiorgio 2:fcdd048a4a9e 151
paologiorgio 2:fcdd048a4a9e 152 // Gestione interrupt seriale
paologiorgio 2:fcdd048a4a9e 153 SC.attach(&RxTelecommand, Serial::RxIrq); // arriva telecomando da PC
paologiorgio 2:fcdd048a4a9e 154 MAX31865.attach(&GetTemperature, Serial::RxIrq); // arriva dato da MAX31865 via Arduino
paologiorgio 0:c81f86a07902 155
paologiorgio 2:fcdd048a4a9e 156 // Ciclo principale
paologiorgio 2:fcdd048a4a9e 157 while (true)
paologiorgio 2:fcdd048a4a9e 158 {
paologiorgio 2:fcdd048a4a9e 159 /* *********************************************************************
paologiorgio 2:fcdd048a4a9e 160 RICEZIONE TEMPERATURA DA MAX31865
paologiorgio 2:fcdd048a4a9e 161 ********************************************************************* */
paologiorgio 2:fcdd048a4a9e 162
paologiorgio 2:fcdd048a4a9e 163 if ((commandId == 0) && (payloadDec == 32) && (temperature_flag == 1))
paologiorgio 2:fcdd048a4a9e 164 {
paologiorgio 2:fcdd048a4a9e 165 ReadTemperature();
paologiorgio 2:fcdd048a4a9e 166 temperature_flag = 0;
paologiorgio 2:fcdd048a4a9e 167 }
paologiorgio 2:fcdd048a4a9e 168
paologiorgio 2:fcdd048a4a9e 169
paologiorgio 2:fcdd048a4a9e 170 /* *********************************************************************
paologiorgio 2:fcdd048a4a9e 171 RICEZIONE DI TELEMETRIE DA MIMA
paologiorgio 2:fcdd048a4a9e 172 ********************************************************************* */
paologiorgio 2:fcdd048a4a9e 173
paologiorgio 2:fcdd048a4a9e 174 sizeBuffer = 0; // reset
paologiorgio 2:fcdd048a4a9e 175 clearBuffer(TLM, sizeof(TLM)/sizeof(TLM[0]));
paologiorgio 2:fcdd048a4a9e 176 clearBuffer(TLM_HSK, sizeof(TLM_HSK)/sizeof(TLM_HSK[0]));
paologiorgio 2:fcdd048a4a9e 177 clearBuffer(TLM_HSK_SD, sizeof(TLM_HSK_SD)/sizeof(TLM_HSK_SD[0]));
paologiorgio 2:fcdd048a4a9e 178
paologiorgio 2:fcdd048a4a9e 179 clearIntBuffer(ch1_intChecksum, sizeof(ch1_intChecksum)/sizeof(ch1_intChecksum[0]));
paologiorgio 2:fcdd048a4a9e 180 clearIntBuffer(ch2_intChecksum, sizeof(ch2_intChecksum)/sizeof(ch2_intChecksum[0]));
paologiorgio 2:fcdd048a4a9e 181 clearBuffer(ch1_checksumWord, sizeof(ch1_checksumWord)/sizeof(ch1_checksumWord[0]));
paologiorgio 2:fcdd048a4a9e 182 clearBuffer(ch2_checksumWord, sizeof(ch2_checksumWord)/sizeof(ch2_checksumWord[0]));
paologiorgio 0:c81f86a07902 183
paologiorgio 2:fcdd048a4a9e 184 t.start();
paologiorgio 2:fcdd048a4a9e 185 tTimeStart = t.read(); // in secondi
paologiorgio 2:fcdd048a4a9e 186 tTimeRead = tTimeStart;
paologiorgio 2:fcdd048a4a9e 187
paologiorgio 2:fcdd048a4a9e 188 MIMA.attach(&RxTelemetry, Serial::RxIrq); // entra in questa routine quando riceve un carattere dalla seriale del SERIAL
paologiorgio 2:fcdd048a4a9e 189
paologiorgio 2:fcdd048a4a9e 190 if (commandId == 5) // TLMODE
paologiorgio 2:fcdd048a4a9e 191 {
paologiorgio 2:fcdd048a4a9e 192 if (tlmode_option_1 == 0)
paologiorgio 2:fcdd048a4a9e 193 {
paologiorgio 2:fcdd048a4a9e 194 while (sizeBuffer < TLM_OPTION_1 && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 2:fcdd048a4a9e 195 {
paologiorgio 2:fcdd048a4a9e 196 tTimeRead = t.read();
paologiorgio 2:fcdd048a4a9e 197 }
paologiorgio 2:fcdd048a4a9e 198
paologiorgio 2:fcdd048a4a9e 199 t.stop();
paologiorgio 0:c81f86a07902 200
paologiorgio 2:fcdd048a4a9e 201 if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 2:fcdd048a4a9e 202 {
paologiorgio 2:fcdd048a4a9e 203 sizeBuffer = 0;
paologiorgio 2:fcdd048a4a9e 204 clearBuffer(TLM_HSK, TLM_OPTION_1);
paologiorgio 2:fcdd048a4a9e 205 //SC.printf("Timestamp: %f\n\r", tTimeRead);
paologiorgio 2:fcdd048a4a9e 206 }
paologiorgio 2:fcdd048a4a9e 207 else
paologiorgio 2:fcdd048a4a9e 208 {
paologiorgio 2:fcdd048a4a9e 209 TxTelemetry();
paologiorgio 2:fcdd048a4a9e 210 }
paologiorgio 2:fcdd048a4a9e 211 }
paologiorgio 2:fcdd048a4a9e 212 else if (tlmode_option_2 == 0)
paologiorgio 2:fcdd048a4a9e 213 {
paologiorgio 2:fcdd048a4a9e 214 while (sizeBuffer < TLM_OPTION_2 && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 2:fcdd048a4a9e 215 {
paologiorgio 2:fcdd048a4a9e 216 tTimeRead = t.read();
paologiorgio 2:fcdd048a4a9e 217 }
paologiorgio 0:c81f86a07902 218
paologiorgio 2:fcdd048a4a9e 219 t.stop();
paologiorgio 2:fcdd048a4a9e 220
paologiorgio 2:fcdd048a4a9e 221 if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 2:fcdd048a4a9e 222 {
paologiorgio 2:fcdd048a4a9e 223 sizeBuffer = 0;
paologiorgio 2:fcdd048a4a9e 224 clearBuffer(TLM_HSK_SD, TLM_OPTION_1);
paologiorgio 2:fcdd048a4a9e 225 //SC.printf("Timestamp: %f\n\r", tTimeRead);
paologiorgio 2:fcdd048a4a9e 226 }
paologiorgio 2:fcdd048a4a9e 227 else
paologiorgio 2:fcdd048a4a9e 228 {
paologiorgio 2:fcdd048a4a9e 229 Checksum(TLM_HSK_SD);
paologiorgio 2:fcdd048a4a9e 230 if (ch1_errorDetected == 0 && ch2_errorDetected == 0) // no checksum error flags
paologiorgio 2:fcdd048a4a9e 231 {
paologiorgio 2:fcdd048a4a9e 232 TxTelemetry();
paologiorgio 2:fcdd048a4a9e 233 }
paologiorgio 2:fcdd048a4a9e 234 }
paologiorgio 2:fcdd048a4a9e 235 }
paologiorgio 2:fcdd048a4a9e 236 }
paologiorgio 2:fcdd048a4a9e 237 }
paologiorgio 0:c81f86a07902 238 }
paologiorgio 0:c81f86a07902 239
paologiorgio 0:c81f86a07902 240
paologiorgio 0:c81f86a07902 241 // *********************************************************************
paologiorgio 0:c81f86a07902 242
paologiorgio 0:c81f86a07902 243
paologiorgio 0:c81f86a07902 244 // ************** FUNCTIONS *******************
paologiorgio 2:fcdd048a4a9e 245 // init CMD
paologiorgio 0:c81f86a07902 246 void CMD_REF()
paologiorgio 0:c81f86a07902 247 {
paologiorgio 0:c81f86a07902 248 for (int i = 0; i < CMD_NUM; i++)
paologiorgio 0:c81f86a07902 249 {
paologiorgio 0:c81f86a07902 250 CMD[i] = i;
paologiorgio 0:c81f86a07902 251 }
paologiorgio 0:c81f86a07902 252 }
paologiorgio 0:c81f86a07902 253
paologiorgio 2:fcdd048a4a9e 254 // init TLM
paologiorgio 2:fcdd048a4a9e 255 void TLM_ID_REF()
paologiorgio 2:fcdd048a4a9e 256 {
paologiorgio 2:fcdd048a4a9e 257 for (int i = 0; i < TLM_NUM; i++)
paologiorgio 2:fcdd048a4a9e 258 {
paologiorgio 2:fcdd048a4a9e 259 TLM_ID[i] = i;
paologiorgio 2:fcdd048a4a9e 260 }
paologiorgio 2:fcdd048a4a9e 261 }
paologiorgio 2:fcdd048a4a9e 262
paologiorgio 0:c81f86a07902 263 // clear
paologiorgio 0:c81f86a07902 264 void clearBuffer(char *arr, int arrLen)
paologiorgio 0:c81f86a07902 265 {
paologiorgio 0:c81f86a07902 266 for (nIndex = 0; nIndex < arrLen; nIndex++)
paologiorgio 0:c81f86a07902 267 {
paologiorgio 0:c81f86a07902 268 arr[nIndex] = '\0';
paologiorgio 0:c81f86a07902 269 }
paologiorgio 0:c81f86a07902 270 }
paologiorgio 0:c81f86a07902 271
paologiorgio 2:fcdd048a4a9e 272 // clear
paologiorgio 2:fcdd048a4a9e 273 void clearIntBuffer(int *y, int s)
paologiorgio 2:fcdd048a4a9e 274 {
paologiorgio 2:fcdd048a4a9e 275 for (nIndex = 0; nIndex < s; nIndex++)
paologiorgio 2:fcdd048a4a9e 276 {
paologiorgio 2:fcdd048a4a9e 277 y[nIndex] = '\0';
paologiorgio 2:fcdd048a4a9e 278 }
paologiorgio 2:fcdd048a4a9e 279 }
paologiorgio 2:fcdd048a4a9e 280
paologiorgio 0:c81f86a07902 281 // DORA riceve telecomando da SC
paologiorgio 0:c81f86a07902 282 void RxTelecommand()
paologiorgio 0:c81f86a07902 283 {
paologiorgio 2:fcdd048a4a9e 284 CMD_REF();
paologiorgio 0:c81f86a07902 285
paologiorgio 2:fcdd048a4a9e 286 while (SC.readable())
paologiorgio 0:c81f86a07902 287 {
paologiorgio 2:fcdd048a4a9e 288 clearBuffer(getPacket, sizeof(getPacket)/sizeof(getPacket[0]));
paologiorgio 2:fcdd048a4a9e 289 SC.gets(getPacket, sizeof(getPacket));
paologiorgio 0:c81f86a07902 290 LEN = strlen(getPacket) - 2; // calcola la sua lunghezza ignorando i tag \r\n
paologiorgio 0:c81f86a07902 291 ch = getPacket[0];
paologiorgio 0:c81f86a07902 292
paologiorgio 0:c81f86a07902 293 if (LEN != PACKET)
paologiorgio 0:c81f86a07902 294 {
paologiorgio 2:fcdd048a4a9e 295 SC.printf("> Bit number: %i is not equal to 15 // no tele-command\n\r", LEN); // diagnostica
paologiorgio 0:c81f86a07902 296 }
paologiorgio 0:c81f86a07902 297 else
paologiorgio 0:c81f86a07902 298 {
paologiorgio 0:c81f86a07902 299 for (int n = 0; n < LEN; n++)
paologiorgio 0:c81f86a07902 300 {
paologiorgio 2:fcdd048a4a9e 301 PacketChecked[n] = getPacket[n];
paologiorgio 0:c81f86a07902 302 }
paologiorgio 0:c81f86a07902 303
paologiorgio 2:fcdd048a4a9e 304 // *** CONTROLLO DEI BIT - LSB: EVEN/ODD ***
paologiorgio 0:c81f86a07902 305 int ones = 0;
paologiorgio 0:c81f86a07902 306 int check = 0;
paologiorgio 0:c81f86a07902 307 while (check < PACKET)
paologiorgio 0:c81f86a07902 308 {
paologiorgio 0:c81f86a07902 309 if (getPacket[check] == '1')
paologiorgio 0:c81f86a07902 310 {
paologiorgio 0:c81f86a07902 311 ones++;
paologiorgio 0:c81f86a07902 312 }
paologiorgio 0:c81f86a07902 313
paologiorgio 0:c81f86a07902 314 check++;
paologiorgio 0:c81f86a07902 315 }
paologiorgio 0:c81f86a07902 316
paologiorgio 0:c81f86a07902 317 char newItem;
paologiorgio 0:c81f86a07902 318
paologiorgio 0:c81f86a07902 319 if (ones % 2 == 0)
paologiorgio 0:c81f86a07902 320 {
paologiorgio 0:c81f86a07902 321 newItem = '0'; // If the number of ones in[B0÷B14] bits is even (making the total number of ones even)
paologiorgio 0:c81f86a07902 322 }
paologiorgio 0:c81f86a07902 323 else
paologiorgio 0:c81f86a07902 324 {
paologiorgio 0:c81f86a07902 325 newItem = '1'; // If the number of ones in[B0÷B14] bits is odd (making the total number of ones even)
paologiorgio 0:c81f86a07902 326 }
paologiorgio 0:c81f86a07902 327
paologiorgio 0:c81f86a07902 328 int nPacket = PACKET + 1;
paologiorgio 0:c81f86a07902 329 // shift elements
paologiorgio 0:c81f86a07902 330 for (int i = nPacket - 1; i >= PACKET_CHECKED; i--)
paologiorgio 0:c81f86a07902 331 {
paologiorgio 0:c81f86a07902 332 PacketChecked[i] = PacketChecked[i - 1];
paologiorgio 0:c81f86a07902 333 }
paologiorgio 0:c81f86a07902 334
paologiorgio 0:c81f86a07902 335 // insert LSB
paologiorgio 0:c81f86a07902 336 PacketChecked[PACKET_CHECKED - 1] = newItem;
paologiorgio 0:c81f86a07902 337
paologiorgio 0:c81f86a07902 338 SC.printf("> Send: ");
paologiorgio 0:c81f86a07902 339 for (int z = 0; z < PACKET_CHECKED; z++)
paologiorgio 0:c81f86a07902 340 {
paologiorgio 0:c81f86a07902 341 SC.printf("%c", PacketChecked[z]);
paologiorgio 0:c81f86a07902 342 }
paologiorgio 0:c81f86a07902 343
paologiorgio 0:c81f86a07902 344 SC.printf("\n\r");
paologiorgio 0:c81f86a07902 345
paologiorgio 0:c81f86a07902 346 // ************DIAGNOSTICA ************
paologiorgio 0:c81f86a07902 347 // un telecommand è formato da 16 bit. i primi 5 sono identificativi,
paologiorgio 0:c81f86a07902 348 // poi ho due bit che mi specificano se i dati in arrivo sono una o più parole,
paologiorgio 0:c81f86a07902 349 // dopodiché ho un payload da 8 bit e per concludere ho LSB (parity bit)
paologiorgio 0:c81f86a07902 350 // MSB IIII TT PPPPPPPP PC
paologiorgio 2:fcdd048a4a9e 351
paologiorgio 2:fcdd048a4a9e 352 /* ** COMMAND IDENTIFIER ** */
paologiorgio 0:c81f86a07902 353 int CMDIndex = 0; // puntatore dell'identificativo
paologiorgio 0:c81f86a07902 354 commandId = 0;
paologiorgio 0:c81f86a07902 355
paologiorgio 0:c81f86a07902 356 int B7 = PacketChecked[7];
paologiorgio 0:c81f86a07902 357 int B9 = PacketChecked[9];
paologiorgio 0:c81f86a07902 358 int B11 = PacketChecked[11];
paologiorgio 0:c81f86a07902 359
paologiorgio 2:fcdd048a4a9e 360 // trasformo l'identificatore in numero decimale intero
paologiorgio 2:fcdd048a4a9e 361 commandId = BinToDec(CMDIndex, IDENTIFIER, PacketChecked);
paologiorgio 0:c81f86a07902 362
paologiorgio 0:c81f86a07902 363 // scorro la lista di comandi disponibli e verifico se il comando trasmesso rientra
paologiorgio 0:c81f86a07902 364 // nella lista, altrimenti finisco in uno dei 3 SPARE
paologiorgio 0:c81f86a07902 365 int k = 0;
paologiorgio 0:c81f86a07902 366 int isElementPresent = 0;
paologiorgio 0:c81f86a07902 367 while (k < CMD_NUM)
paologiorgio 0:c81f86a07902 368 {
paologiorgio 0:c81f86a07902 369 if (commandId == CMD[k])
paologiorgio 0:c81f86a07902 370 {
paologiorgio 0:c81f86a07902 371 isElementPresent = 1;
paologiorgio 0:c81f86a07902 372 SC.printf("> Telcommand sent belgons to MIMA command list: CMD %i\n\r", k);
paologiorgio 0:c81f86a07902 373
paologiorgio 0:c81f86a07902 374 if (k == 2 || k == 15 || k == 30) // CMD02, CMD15, CMD30
paologiorgio 0:c81f86a07902 375 {
paologiorgio 0:c81f86a07902 376 SC.printf("> CMD %i : SPARE\n\r", k);
paologiorgio 0:c81f86a07902 377 }
paologiorgio 0:c81f86a07902 378 else if (k == 0 && PacketChecked[5] == '0' && PacketChecked[6] == '0') // CMD0 - spare
paologiorgio 0:c81f86a07902 379 {
paologiorgio 2:fcdd048a4a9e 380 int counter = 7; // parto dal settimo bit
paologiorgio 2:fcdd048a4a9e 381 payloadDec = 0; // inizializzazione del payload in formato digitale
paologiorgio 0:c81f86a07902 382
paologiorgio 2:fcdd048a4a9e 383 payloadDec = BinToDec(counter, PACKET, PacketChecked);
paologiorgio 0:c81f86a07902 384
paologiorgio 2:fcdd048a4a9e 385 SpareCommand(payloadDec);
paologiorgio 0:c81f86a07902 386 break;
paologiorgio 0:c81f86a07902 387 }
paologiorgio 0:c81f86a07902 388 else if (k == 1) // CMD01
paologiorgio 0:c81f86a07902 389 {
paologiorgio 2:fcdd048a4a9e 390 SC.printf("> CMD %i, CODE: MIMA MODE\n\r", k);
paologiorgio 2:fcdd048a4a9e 391
paologiorgio 2:fcdd048a4a9e 392 SC.printf("%s\n\r", MIMA_OPERATING_MODE(PacketChecked));
paologiorgio 2:fcdd048a4a9e 393
paologiorgio 2:fcdd048a4a9e 394 }
paologiorgio 2:fcdd048a4a9e 395 else if (k == 3)
paologiorgio 2:fcdd048a4a9e 396 {
paologiorgio 2:fcdd048a4a9e 397 SC.printf("> CMD %i, CODE: LDth_On_Off - On/Off of Laser Diode thermal control loop\n\r", k);
paologiorgio 2:fcdd048a4a9e 398 }
paologiorgio 2:fcdd048a4a9e 399 else if (k == 4)
paologiorgio 2:fcdd048a4a9e 400 {
paologiorgio 2:fcdd048a4a9e 401 SC.printf("> CMD %i, CODE: IRth_On_Off - On/Off of IR sensor thermal control loop\n\r", k);
paologiorgio 2:fcdd048a4a9e 402 }
paologiorgio 2:fcdd048a4a9e 403 else if (k == 5)
paologiorgio 2:fcdd048a4a9e 404 {
paologiorgio 2:fcdd048a4a9e 405 int checkZerosIndex = 7;
paologiorgio 2:fcdd048a4a9e 406 while (checkZerosIndex < PACKET_CHECKED)
paologiorgio 0:c81f86a07902 407 {
paologiorgio 2:fcdd048a4a9e 408 if (PacketChecked[checkZerosIndex] == '0')
paologiorgio 2:fcdd048a4a9e 409 {
paologiorgio 2:fcdd048a4a9e 410 tlmode_option_1 = 0;
paologiorgio 2:fcdd048a4a9e 411 checkZerosIndex++;
paologiorgio 2:fcdd048a4a9e 412 }
paologiorgio 2:fcdd048a4a9e 413 else
paologiorgio 2:fcdd048a4a9e 414 {
paologiorgio 2:fcdd048a4a9e 415 tlmode_option_1 = 1;
paologiorgio 2:fcdd048a4a9e 416 break;
paologiorgio 2:fcdd048a4a9e 417 }
paologiorgio 0:c81f86a07902 418 }
paologiorgio 2:fcdd048a4a9e 419
paologiorgio 2:fcdd048a4a9e 420 int checkOnesIndex = 7;
paologiorgio 2:fcdd048a4a9e 421 while (checkOnesIndex < PACKET_CHECKED)
paologiorgio 0:c81f86a07902 422 {
paologiorgio 2:fcdd048a4a9e 423 if (PacketChecked[checkOnesIndex] == '1')
paologiorgio 2:fcdd048a4a9e 424 {
paologiorgio 2:fcdd048a4a9e 425 tlmode_option_2 = 0;
paologiorgio 2:fcdd048a4a9e 426 checkOnesIndex++;
paologiorgio 2:fcdd048a4a9e 427 }
paologiorgio 2:fcdd048a4a9e 428 else
paologiorgio 2:fcdd048a4a9e 429 {
paologiorgio 2:fcdd048a4a9e 430 tlmode_option_2 = 1;
paologiorgio 2:fcdd048a4a9e 431 break;
paologiorgio 2:fcdd048a4a9e 432 }
paologiorgio 0:c81f86a07902 433 }
paologiorgio 2:fcdd048a4a9e 434 }
paologiorgio 2:fcdd048a4a9e 435 else if (k == 6)
paologiorgio 2:fcdd048a4a9e 436 {
paologiorgio 2:fcdd048a4a9e 437 int checkZerosIndex = 7;
paologiorgio 2:fcdd048a4a9e 438 while (checkZerosIndex < PACKET_CHECKED)
paologiorgio 0:c81f86a07902 439 {
paologiorgio 2:fcdd048a4a9e 440 if (PacketChecked[checkZerosIndex] == '0')
paologiorgio 2:fcdd048a4a9e 441 {
paologiorgio 2:fcdd048a4a9e 442 interferogram_option_1 = 0;
paologiorgio 2:fcdd048a4a9e 443 checkZerosIndex++;
paologiorgio 2:fcdd048a4a9e 444 }
paologiorgio 2:fcdd048a4a9e 445 else
paologiorgio 2:fcdd048a4a9e 446 {
paologiorgio 2:fcdd048a4a9e 447 interferogram_option_1 = 1;
paologiorgio 2:fcdd048a4a9e 448 break;
paologiorgio 2:fcdd048a4a9e 449 }
paologiorgio 0:c81f86a07902 450 }
paologiorgio 2:fcdd048a4a9e 451
paologiorgio 2:fcdd048a4a9e 452 int checkOnesIndex = 7;
paologiorgio 2:fcdd048a4a9e 453 while (checkOnesIndex < PACKET_CHECKED)
paologiorgio 0:c81f86a07902 454 {
paologiorgio 2:fcdd048a4a9e 455 if (PacketChecked[checkOnesIndex] == '1')
paologiorgio 2:fcdd048a4a9e 456 {
paologiorgio 2:fcdd048a4a9e 457 interferogram_option_2 = 0;
paologiorgio 2:fcdd048a4a9e 458 checkOnesIndex++;
paologiorgio 2:fcdd048a4a9e 459 }
paologiorgio 2:fcdd048a4a9e 460 else
paologiorgio 2:fcdd048a4a9e 461 {
paologiorgio 2:fcdd048a4a9e 462 interferogram_option_2 = 1;
paologiorgio 2:fcdd048a4a9e 463 break;
paologiorgio 2:fcdd048a4a9e 464 }
paologiorgio 2:fcdd048a4a9e 465 }
paologiorgio 2:fcdd048a4a9e 466
paologiorgio 2:fcdd048a4a9e 467 if (interferogram_option_1 == 0)
paologiorgio 2:fcdd048a4a9e 468 {
paologiorgio 2:fcdd048a4a9e 469 SC.printf("> CMD %i, START interferogram acquisition\n\r", k);
paologiorgio 2:fcdd048a4a9e 470 }
paologiorgio 2:fcdd048a4a9e 471 else if (interferogram_option_2 == 0)
paologiorgio 2:fcdd048a4a9e 472 {
paologiorgio 2:fcdd048a4a9e 473 SC.printf("> CMD %i, STOP interferogram acquisition\n\r", k);
paologiorgio 0:c81f86a07902 474 }
paologiorgio 0:c81f86a07902 475 }
paologiorgio 0:c81f86a07902 476 else if (k == 7) // CMD07
paologiorgio 0:c81f86a07902 477 {
paologiorgio 0:c81f86a07902 478 // IR sensor thermal loop
paologiorgio 0:c81f86a07902 479 if (B7 == '1')
paologiorgio 0:c81f86a07902 480 {
paologiorgio 0:c81f86a07902 481 SC.printf("> IR sensor thermal loop...\n\r");
paologiorgio 0:c81f86a07902 482 SC.printf("IRT1 telemetry: feedback signal in the thermal control loop (default). IRT2 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 483 }
paologiorgio 0:c81f86a07902 484 else
paologiorgio 0:c81f86a07902 485 {
paologiorgio 0:c81f86a07902 486 SC.printf("> IR sensor thermal loop...\n\r");
paologiorgio 0:c81f86a07902 487 SC.printf("IRT2 telemetry: feedback signal in the thermal control. IRT1 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 488 }
paologiorgio 0:c81f86a07902 489
paologiorgio 0:c81f86a07902 490 // Laser Diode thermal loop
paologiorgio 0:c81f86a07902 491 if (B9 == '1')
paologiorgio 0:c81f86a07902 492 {
paologiorgio 0:c81f86a07902 493 SC.printf("> Laser Diode thermal loop...\n\r");
paologiorgio 0:c81f86a07902 494 SC.printf("LDT1 telemetry: feedback signal in the thermal control loop (default). LDT2 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 495 }
paologiorgio 0:c81f86a07902 496 else
paologiorgio 0:c81f86a07902 497 {
paologiorgio 0:c81f86a07902 498 SC.printf("> Laser Diode thermal loop...\n\r");
paologiorgio 0:c81f86a07902 499 SC.printf("LDT2 telemetry: feedback signal in the thermal control. LDT1 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 500
paologiorgio 0:c81f86a07902 501 }
paologiorgio 0:c81f86a07902 502
paologiorgio 0:c81f86a07902 503 // BlackBody thermal loop
paologiorgio 0:c81f86a07902 504 if (B11 == '1')
paologiorgio 0:c81f86a07902 505 {
paologiorgio 0:c81f86a07902 506 SC.printf("> BlackBody thermal loop...\n\r");
paologiorgio 0:c81f86a07902 507 SC.printf("BBT1 telemetry: feedback signal in the thermal control loop (default). BBT2 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 508 }
paologiorgio 0:c81f86a07902 509 else
paologiorgio 0:c81f86a07902 510 {
paologiorgio 0:c81f86a07902 511 SC.printf("> BlackBody thermal loop...\n\r");
paologiorgio 0:c81f86a07902 512 SC.printf("BBT2 telemetry: feedback signal in the thermal control. BBT1 only for monitoring\n\r");
paologiorgio 0:c81f86a07902 513 }
paologiorgio 0:c81f86a07902 514 }
paologiorgio 2:fcdd048a4a9e 515
paologiorgio 2:fcdd048a4a9e 516 else if ((k == 0) && (payloadDec == 32))
paologiorgio 2:fcdd048a4a9e 517 {
paologiorgio 2:fcdd048a4a9e 518 temperature_flag = 1;
paologiorgio 2:fcdd048a4a9e 519 }
paologiorgio 0:c81f86a07902 520
paologiorgio 0:c81f86a07902 521 }
paologiorgio 0:c81f86a07902 522
paologiorgio 0:c81f86a07902 523 k++;
paologiorgio 0:c81f86a07902 524 }
paologiorgio 0:c81f86a07902 525
paologiorgio 0:c81f86a07902 526 if (isElementPresent == '0')
paologiorgio 0:c81f86a07902 527 {
paologiorgio 0:c81f86a07902 528 SC.printf("Telecommand sent doesn't exist\n\r");
paologiorgio 0:c81f86a07902 529 }
paologiorgio 0:c81f86a07902 530
paologiorgio 0:c81f86a07902 531 // ***TAG ***
paologiorgio 0:c81f86a07902 532 int B5 = PacketChecked[5];
paologiorgio 0:c81f86a07902 533 int B6 = PacketChecked[6];
paologiorgio 0:c81f86a07902 534
paologiorgio 0:c81f86a07902 535 if (B5 == '0' && B6 == '0')
paologiorgio 0:c81f86a07902 536 {
paologiorgio 0:c81f86a07902 537 // Single word telemetry
paologiorgio 0:c81f86a07902 538 SC.printf("Single word telemetry\n\r");
paologiorgio 0:c81f86a07902 539 }
paologiorgio 0:c81f86a07902 540 else if (B5 == '0' && B6 == '1')
paologiorgio 0:c81f86a07902 541 {
paologiorgio 0:c81f86a07902 542 // Multiple words telemetry (1st word)
paologiorgio 0:c81f86a07902 543 SC.printf("Multiple words telemetry (1st word)\n\r");
paologiorgio 0:c81f86a07902 544 }
paologiorgio 0:c81f86a07902 545 else if (B5 == '1' && B6 == '0')
paologiorgio 0:c81f86a07902 546 {
paologiorgio 0:c81f86a07902 547 // Multiple words telemetry (2nd word)
paologiorgio 0:c81f86a07902 548 SC.printf("Multiple words telemetry (2nd word)\n\r");
paologiorgio 0:c81f86a07902 549 }
paologiorgio 0:c81f86a07902 550 else
paologiorgio 0:c81f86a07902 551 {
paologiorgio 0:c81f86a07902 552 // Not used
paologiorgio 0:c81f86a07902 553 SC.printf("NOT USED\n\r");
paologiorgio 0:c81f86a07902 554 }
paologiorgio 0:c81f86a07902 555
paologiorgio 2:fcdd048a4a9e 556 // diagnostica: payload
paologiorgio 0:c81f86a07902 557 SC.printf("> Payload: ");
paologiorgio 0:c81f86a07902 558 for (int IndexPayload = 7; IndexPayload < PACKET; IndexPayload++)
paologiorgio 0:c81f86a07902 559 {
paologiorgio 0:c81f86a07902 560 SC.printf("%c", PacketChecked[IndexPayload]);
paologiorgio 0:c81f86a07902 561 }
paologiorgio 0:c81f86a07902 562
paologiorgio 0:c81f86a07902 563 SC.printf("\n\r"); // per leggibilità
paologiorgio 0:c81f86a07902 564
paologiorgio 0:c81f86a07902 565 //***********FINE DIAGNOSTICA PACCHETTO***********
paologiorgio 0:c81f86a07902 566
paologiorgio 0:c81f86a07902 567 }
paologiorgio 0:c81f86a07902 568
paologiorgio 0:c81f86a07902 569 TxTelecommand();
paologiorgio 0:c81f86a07902 570 }
paologiorgio 0:c81f86a07902 571 }
paologiorgio 0:c81f86a07902 572
paologiorgio 2:fcdd048a4a9e 573
paologiorgio 0:c81f86a07902 574 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 575
paologiorgio 2:fcdd048a4a9e 576
paologiorgio 0:c81f86a07902 577 // DORA trasmette telecomando a MIMA
paologiorgio 2:fcdd048a4a9e 578 void TxTelecommand() // Tx Telecommand
paologiorgio 0:c81f86a07902 579 {
paologiorgio 0:c81f86a07902 580 for (int i = 0; i < PACKET_CHECKED + 1; i++)
paologiorgio 0:c81f86a07902 581 {
paologiorgio 0:c81f86a07902 582 MIMA.putc(PacketChecked[i]);
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 2:fcdd048a4a9e 589
paologiorgio 2:fcdd048a4a9e 590 // DORA riceve telemetria da MIMA
paologiorgio 2:fcdd048a4a9e 591 void RxTelemetry(void) // Rx Telemetry
paologiorgio 0:c81f86a07902 592 {
paologiorgio 2:fcdd048a4a9e 593 while((MIMA.readable()))
paologiorgio 2:fcdd048a4a9e 594 {
paologiorgio 2:fcdd048a4a9e 595 data = MIMA.getc(); // prendi carattere in arrivo
paologiorgio 2:fcdd048a4a9e 596
paologiorgio 2:fcdd048a4a9e 597 if (tlmode_option_1 == 0)
paologiorgio 0:c81f86a07902 598 {
paologiorgio 2:fcdd048a4a9e 599 TLM_HSK[sizeBuffer++] = data;
paologiorgio 2:fcdd048a4a9e 600 }
paologiorgio 2:fcdd048a4a9e 601 else if (tlmode_option_2 == 0)
paologiorgio 2:fcdd048a4a9e 602 {
paologiorgio 2:fcdd048a4a9e 603 TLM_HSK_SD[sizeBuffer++] = data;
paologiorgio 2:fcdd048a4a9e 604 }
paologiorgio 2:fcdd048a4a9e 605 else
paologiorgio 2:fcdd048a4a9e 606 {
paologiorgio 2:fcdd048a4a9e 607 TLM[sizeBuffer++] = data;
paologiorgio 2:fcdd048a4a9e 608 }
paologiorgio 0:c81f86a07902 609
paologiorgio 0:c81f86a07902 610 }
paologiorgio 0:c81f86a07902 611 }
paologiorgio 0:c81f86a07902 612
paologiorgio 0:c81f86a07902 613
paologiorgio 0:c81f86a07902 614 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 615
paologiorgio 2:fcdd048a4a9e 616
paologiorgio 0:c81f86a07902 617 // DORA trasmette dati verso Space/craft
paologiorgio 2:fcdd048a4a9e 618 void TxTelemetry() // Tx Telemetry
paologiorgio 0:c81f86a07902 619 {
paologiorgio 2:fcdd048a4a9e 620 if (tlmode_option_1 == 0)
paologiorgio 0:c81f86a07902 621 {
paologiorgio 2:fcdd048a4a9e 622 SC.printf("\n\r> Receiving 57 words (all HSK) from MIMA... \n\r");
paologiorgio 1:db73b542b7bc 623
paologiorgio 2:fcdd048a4a9e 624 for (int i = 0; i < TLM_OPTION_1; i++)
paologiorgio 0:c81f86a07902 625 {
paologiorgio 2:fcdd048a4a9e 626 SC.putc(TLM_HSK[i]);
paologiorgio 2:fcdd048a4a9e 627 ARDUINO.putc(TLM_HSK[i]);
paologiorgio 2:fcdd048a4a9e 628 }
paologiorgio 0:c81f86a07902 629
paologiorgio 2:fcdd048a4a9e 630 // parsing del pacchetto da 16 bit * 57 parole
paologiorgio 1:db73b542b7bc 631 SC.printf("\n\r");
paologiorgio 0:c81f86a07902 632 }
paologiorgio 2:fcdd048a4a9e 633 else if (tlmode_option_2 == 0)
paologiorgio 0:c81f86a07902 634 {
paologiorgio 2:fcdd048a4a9e 635 SC.printf("\n\r> Receiving 5663 words (HSK + Scientific Data) from MIMA... \n\r");
paologiorgio 0:c81f86a07902 636
paologiorgio 2:fcdd048a4a9e 637 for (int i = 0; i < TLM_OPTION_2; i++)
paologiorgio 0:c81f86a07902 638 {
paologiorgio 2:fcdd048a4a9e 639
paologiorgio 2:fcdd048a4a9e 640 SC.putc(TLM_HSK_SD[i]);
paologiorgio 2:fcdd048a4a9e 641 ARDUINO.putc(TLM_HSK_SD[i]);
paologiorgio 0:c81f86a07902 642 }
paologiorgio 0:c81f86a07902 643
paologiorgio 2:fcdd048a4a9e 644 // parsing del pacchetto da 16 bit * 57 parole
paologiorgio 2:fcdd048a4a9e 645 SC.printf("\n\r");
paologiorgio 2:fcdd048a4a9e 646 }
paologiorgio 2:fcdd048a4a9e 647 else
paologiorgio 2:fcdd048a4a9e 648 {
paologiorgio 2:fcdd048a4a9e 649 SC.printf("\n\r> Receiving Telemetry from MIMA... \n\r");
paologiorgio 2:fcdd048a4a9e 650
paologiorgio 2:fcdd048a4a9e 651 for (int i = 0; i < TLM_OPTION_2; i++)
paologiorgio 2:fcdd048a4a9e 652 {
paologiorgio 2:fcdd048a4a9e 653 SC.putc(TLM[i]);
paologiorgio 2:fcdd048a4a9e 654 ARDUINO.putc(TLM[i]);
paologiorgio 2:fcdd048a4a9e 655 }
paologiorgio 2:fcdd048a4a9e 656
paologiorgio 2:fcdd048a4a9e 657 // parsing del pacchetto da 16 bit
paologiorgio 2:fcdd048a4a9e 658 // TLM_parsing(TLM);
paologiorgio 1:db73b542b7bc 659 SC.printf("\n\r");
paologiorgio 0:c81f86a07902 660 }
paologiorgio 0:c81f86a07902 661
paologiorgio 0:c81f86a07902 662 }
paologiorgio 0:c81f86a07902 663
paologiorgio 2:fcdd048a4a9e 664
paologiorgio 2:fcdd048a4a9e 665 /* ***************************************************************** */
paologiorgio 2:fcdd048a4a9e 666
paologiorgio 2:fcdd048a4a9e 667
paologiorgio 2:fcdd048a4a9e 668 void TLM_parsing(char *tlm_buf)
paologiorgio 2:fcdd048a4a9e 669 {
paologiorgio 2:fcdd048a4a9e 670 // identificatore
paologiorgio 2:fcdd048a4a9e 671 int tlm_identifier = BinToDec(0, IDENTIFIER, tlm_buf);
paologiorgio 2:fcdd048a4a9e 672 volatile int single_word = 0, first_word = 0, second_word = 0;
paologiorgio 2:fcdd048a4a9e 673
paologiorgio 2:fcdd048a4a9e 674 if (tlm_buf[5] == '0' && tlm_buf[6] == '0')
paologiorgio 2:fcdd048a4a9e 675 {
paologiorgio 2:fcdd048a4a9e 676 // single word
paologiorgio 2:fcdd048a4a9e 677 single_word = 1;
paologiorgio 2:fcdd048a4a9e 678 }
paologiorgio 2:fcdd048a4a9e 679 else if (tlm_buf[5] == '0' && tlm_buf[6] == '1')
paologiorgio 2:fcdd048a4a9e 680 {
paologiorgio 2:fcdd048a4a9e 681 // 1st word
paologiorgio 2:fcdd048a4a9e 682 first_word = 1;
paologiorgio 2:fcdd048a4a9e 683 }
paologiorgio 2:fcdd048a4a9e 684 else if (tlm_buf[5] == '1' && tlm_buf[6] == '0')
paologiorgio 2:fcdd048a4a9e 685 {
paologiorgio 2:fcdd048a4a9e 686 // 2nd word
paologiorgio 2:fcdd048a4a9e 687 second_word = 1;
paologiorgio 2:fcdd048a4a9e 688 }
paologiorgio 2:fcdd048a4a9e 689 else if (tlm_buf[5] == '1' && tlm_buf[6] == '1')
paologiorgio 2:fcdd048a4a9e 690 {
paologiorgio 2:fcdd048a4a9e 691 // not used
paologiorgio 2:fcdd048a4a9e 692 }
paologiorgio 2:fcdd048a4a9e 693
paologiorgio 2:fcdd048a4a9e 694 if (commandId == 1)
paologiorgio 2:fcdd048a4a9e 695 {
paologiorgio 2:fcdd048a4a9e 696 if ((tlm_identifier == 25) && (first_word == 1))
paologiorgio 2:fcdd048a4a9e 697 {
paologiorgio 2:fcdd048a4a9e 698 SC.printf("%s\n\r", MIMA_OPERATING_MODE(tlm_buf));
paologiorgio 2:fcdd048a4a9e 699 }
paologiorgio 2:fcdd048a4a9e 700 }
paologiorgio 2:fcdd048a4a9e 701 }
paologiorgio 2:fcdd048a4a9e 702
paologiorgio 2:fcdd048a4a9e 703
paologiorgio 2:fcdd048a4a9e 704 /* ***************************************************************** */
paologiorgio 2:fcdd048a4a9e 705
paologiorgio 2:fcdd048a4a9e 706 // integrità dei dati ricevuti da MIMA: Channel 1 - Channel 2
paologiorgio 2:fcdd048a4a9e 707 void Checksum(char *a) // Checksum
paologiorgio 2:fcdd048a4a9e 708 {
paologiorgio 2:fcdd048a4a9e 709 volatile int temp, var, ai_int, aj_int, p = 0;
paologiorgio 2:fcdd048a4a9e 710
paologiorgio 2:fcdd048a4a9e 711 for (int i = word; i < 2*word; i++)
paologiorgio 2:fcdd048a4a9e 712 {
paologiorgio 2:fcdd048a4a9e 713 volatile int ch1_start = i+word;
paologiorgio 2:fcdd048a4a9e 714
paologiorgio 2:fcdd048a4a9e 715 for (int j = ch1_start; j < CHANNEL*word; j+=word)
paologiorgio 2:fcdd048a4a9e 716 {
paologiorgio 2:fcdd048a4a9e 717 if (j == ch1_start)
paologiorgio 2:fcdd048a4a9e 718 {
paologiorgio 2:fcdd048a4a9e 719 ai_int = a[i] - '0'; // '1'/'0' char -> int 1/0
paologiorgio 2:fcdd048a4a9e 720 aj_int = a[j] - '0'; // '1'/'0' char -> int 1/0
paologiorgio 2:fcdd048a4a9e 721 temp = ai_int ^ aj_int; // XOR
paologiorgio 2:fcdd048a4a9e 722 } else
paologiorgio 2:fcdd048a4a9e 723 {
paologiorgio 2:fcdd048a4a9e 724 aj_int = a[j] - '0';
paologiorgio 2:fcdd048a4a9e 725 temp = temp ^ aj_int;
paologiorgio 2:fcdd048a4a9e 726 }
paologiorgio 2:fcdd048a4a9e 727
paologiorgio 2:fcdd048a4a9e 728 }
paologiorgio 2:fcdd048a4a9e 729 ch1_intChecksum[p++] = temp; // vettore del checksum in int
paologiorgio 2:fcdd048a4a9e 730 }
paologiorgio 2:fcdd048a4a9e 731
paologiorgio 2:fcdd048a4a9e 732 for (int i = 0; i < word; i++) // trasformo in char
paologiorgio 2:fcdd048a4a9e 733 {
paologiorgio 2:fcdd048a4a9e 734 if (ch1_intChecksum[i] == 0)
paologiorgio 2:fcdd048a4a9e 735 {
paologiorgio 2:fcdd048a4a9e 736 ch1_checksumWord[i++] = '0';
paologiorgio 2:fcdd048a4a9e 737 }
paologiorgio 2:fcdd048a4a9e 738 else if (ch1_intChecksum[i] == 1)
paologiorgio 2:fcdd048a4a9e 739 {
paologiorgio 2:fcdd048a4a9e 740 ch1_checksumWord[i++] = '1';
paologiorgio 2:fcdd048a4a9e 741 }
paologiorgio 2:fcdd048a4a9e 742 }
paologiorgio 2:fcdd048a4a9e 743
paologiorgio 2:fcdd048a4a9e 744 // confronto tra checksum ricevuto e checksum elaborato
paologiorgio 2:fcdd048a4a9e 745 volatile int t = 0;
paologiorgio 2:fcdd048a4a9e 746 for (int i = (CHANNEL+1)*word; i < (CHANNEL+2)*word; i++)
paologiorgio 2:fcdd048a4a9e 747 {
paologiorgio 2:fcdd048a4a9e 748 ch1_checksumReceived[t++] = TLM_HSK_SD[i];
paologiorgio 2:fcdd048a4a9e 749 }
paologiorgio 2:fcdd048a4a9e 750
paologiorgio 2:fcdd048a4a9e 751 ch1_errorDetected = 0;
paologiorgio 2:fcdd048a4a9e 752
paologiorgio 2:fcdd048a4a9e 753 for (int i = 0; i < sizeof(ch1_checksumWord)/sizeof(ch1_checksumWord[0]); i++)
paologiorgio 2:fcdd048a4a9e 754 {
paologiorgio 2:fcdd048a4a9e 755 if (ch1_checksumWord[i] != ch1_checksumReceived[i])
paologiorgio 2:fcdd048a4a9e 756 {
paologiorgio 2:fcdd048a4a9e 757 ch1_errorDetected = 1;
paologiorgio 2:fcdd048a4a9e 758 SC.printf("\n\r> CH1 Channel Checksum ERROR detected: BIT n. %i\n\r", (i+1));
paologiorgio 2:fcdd048a4a9e 759 break;
paologiorgio 2:fcdd048a4a9e 760 }
paologiorgio 2:fcdd048a4a9e 761 }
paologiorgio 2:fcdd048a4a9e 762
paologiorgio 2:fcdd048a4a9e 763
paologiorgio 2:fcdd048a4a9e 764 /***** CHANNEL 2 *****/
paologiorgio 2:fcdd048a4a9e 765
paologiorgio 2:fcdd048a4a9e 766 p = 0;
paologiorgio 2:fcdd048a4a9e 767 int ch2_limit = (2*CHANNEL+4);
paologiorgio 2:fcdd048a4a9e 768 for (int i = (CHANNEL+4)*word; i < ch2_limit*word; i++)
paologiorgio 2:fcdd048a4a9e 769 {
paologiorgio 2:fcdd048a4a9e 770 volatile int ch2_start = i+word;
paologiorgio 2:fcdd048a4a9e 771
paologiorgio 2:fcdd048a4a9e 772 for (int j = ch2_start; j < (ch2_limit+CHANNEL)*word; j+=word)
paologiorgio 2:fcdd048a4a9e 773 {
paologiorgio 2:fcdd048a4a9e 774 if (j == ch2_start)
paologiorgio 2:fcdd048a4a9e 775 {
paologiorgio 2:fcdd048a4a9e 776 ai_int = a[i] - '0'; // '1'/'0' char -> int 1/0
paologiorgio 2:fcdd048a4a9e 777 aj_int = a[j] - '0'; // '1'/'0' char -> int 1/0
paologiorgio 2:fcdd048a4a9e 778 temp = ai_int ^ aj_int; // XOR
paologiorgio 2:fcdd048a4a9e 779 } else
paologiorgio 2:fcdd048a4a9e 780 {
paologiorgio 2:fcdd048a4a9e 781 aj_int = a[j] - '0';
paologiorgio 2:fcdd048a4a9e 782 temp = temp ^ aj_int;
paologiorgio 2:fcdd048a4a9e 783 }
paologiorgio 2:fcdd048a4a9e 784
paologiorgio 2:fcdd048a4a9e 785 }
paologiorgio 2:fcdd048a4a9e 786 ch2_intChecksum[p++] = temp; // vettore del checksum in int
paologiorgio 2:fcdd048a4a9e 787 }
paologiorgio 2:fcdd048a4a9e 788
paologiorgio 2:fcdd048a4a9e 789 for (int i = 0; i < word; i++) // trasformo in char
paologiorgio 2:fcdd048a4a9e 790 {
paologiorgio 2:fcdd048a4a9e 791 if (ch2_intChecksum[i] == 0)
paologiorgio 2:fcdd048a4a9e 792 {
paologiorgio 2:fcdd048a4a9e 793 ch2_checksumWord[i++] = '0';
paologiorgio 2:fcdd048a4a9e 794 }
paologiorgio 2:fcdd048a4a9e 795 else if (ch1_intChecksum[i] == 1)
paologiorgio 2:fcdd048a4a9e 796 {
paologiorgio 2:fcdd048a4a9e 797 ch2_checksumWord[i++] = '1';
paologiorgio 2:fcdd048a4a9e 798 }
paologiorgio 2:fcdd048a4a9e 799 }
paologiorgio 2:fcdd048a4a9e 800
paologiorgio 2:fcdd048a4a9e 801 // confronto tra checksum ricevuto e checksum elaborato
paologiorgio 2:fcdd048a4a9e 802 t = 0;
paologiorgio 2:fcdd048a4a9e 803 for (int i = (CHANNEL+4)*word; i < (2*CHANNEL+4)*word; i++)
paologiorgio 2:fcdd048a4a9e 804 {
paologiorgio 2:fcdd048a4a9e 805 ch2_checksumReceived[t++] = TLM_HSK_SD[i];
paologiorgio 2:fcdd048a4a9e 806 }
paologiorgio 2:fcdd048a4a9e 807
paologiorgio 2:fcdd048a4a9e 808 ch2_errorDetected = 0; // flag
paologiorgio 2:fcdd048a4a9e 809
paologiorgio 2:fcdd048a4a9e 810 for (int i = 0; i < sizeof(ch2_checksumWord)/sizeof(ch2_checksumWord[0]); i++)
paologiorgio 2:fcdd048a4a9e 811 {
paologiorgio 2:fcdd048a4a9e 812 if (ch2_checksumWord[i] != ch2_checksumReceived[i])
paologiorgio 2:fcdd048a4a9e 813 {
paologiorgio 2:fcdd048a4a9e 814 ch2_errorDetected = 1;
paologiorgio 2:fcdd048a4a9e 815 SC.printf("\n\r> CH2 Channel Checksum ERROR detected: BIT n. %i\n\r", (i+1));
paologiorgio 2:fcdd048a4a9e 816 break;
paologiorgio 2:fcdd048a4a9e 817 }
paologiorgio 2:fcdd048a4a9e 818 }
paologiorgio 2:fcdd048a4a9e 819 }
paologiorgio 2:fcdd048a4a9e 820
paologiorgio 2:fcdd048a4a9e 821
paologiorgio 0:c81f86a07902 822 /* ***************************************************************** */
paologiorgio 0:c81f86a07902 823
paologiorgio 0:c81f86a07902 824 // controllo dell'attuatore e dei relay
paologiorgio 2:fcdd048a4a9e 825 void SpareCommand(int command) // Spare command (Relay, L16)
paologiorgio 2:fcdd048a4a9e 826 {
paologiorgio 2:fcdd048a4a9e 827 if((command == 128) && (offset < 1.0f))
paologiorgio 2:fcdd048a4a9e 828 {
paologiorgio 2:fcdd048a4a9e 829 offset += 0.2f;
paologiorgio 2:fcdd048a4a9e 830 M1.write(offset);
paologiorgio 2:fcdd048a4a9e 831 M2.write(offset);
paologiorgio 2:fcdd048a4a9e 832 SC.printf("> Duty Cycle %.2f / estensione \n\r", offset);
paologiorgio 2:fcdd048a4a9e 833 }
paologiorgio 2:fcdd048a4a9e 834 else if((command == 64) && (offset > 0.0f))
paologiorgio 2:fcdd048a4a9e 835 {
paologiorgio 2:fcdd048a4a9e 836 offset -= 0.2f;
paologiorgio 2:fcdd048a4a9e 837 M1.write(offset);
paologiorgio 2:fcdd048a4a9e 838 M2.write(offset);
paologiorgio 2:fcdd048a4a9e 839 SC.printf("> Duty Cycle %.2f / estensione \n\r", offset);
paologiorgio 2:fcdd048a4a9e 840 }
paologiorgio 2:fcdd048a4a9e 841 else if (command == 1)
paologiorgio 2:fcdd048a4a9e 842 {
paologiorgio 2:fcdd048a4a9e 843 Relay5V = 0;
paologiorgio 2:fcdd048a4a9e 844 SC.printf("\r\nRelay 5V ON\r\n");
paologiorgio 2:fcdd048a4a9e 845 }
paologiorgio 2:fcdd048a4a9e 846 else if (command == 0)
paologiorgio 2:fcdd048a4a9e 847 {
paologiorgio 2:fcdd048a4a9e 848 Relay5V = 1;
paologiorgio 2:fcdd048a4a9e 849 SC.printf("\r\nRelay 5V OFF\r\n");
paologiorgio 2:fcdd048a4a9e 850 }
paologiorgio 2:fcdd048a4a9e 851 else if (command == 3)
paologiorgio 2:fcdd048a4a9e 852 {
paologiorgio 2:fcdd048a4a9e 853 Relay12V = 0;
paologiorgio 2:fcdd048a4a9e 854 SC.printf("\r\nRelay 12V ON\r\n");
paologiorgio 2:fcdd048a4a9e 855 }
paologiorgio 2:fcdd048a4a9e 856 else if (command == 2)
paologiorgio 2:fcdd048a4a9e 857 {
paologiorgio 2:fcdd048a4a9e 858 Relay12V = 1;
paologiorgio 2:fcdd048a4a9e 859 SC.printf("\r\nRelay 12V OFF\r\n");
paologiorgio 2:fcdd048a4a9e 860 }
paologiorgio 2:fcdd048a4a9e 861 else if (command == 7)
paologiorgio 2:fcdd048a4a9e 862 {
paologiorgio 2:fcdd048a4a9e 863 Relay15_15_5V = 0;
paologiorgio 2:fcdd048a4a9e 864 SC.printf("\r\nRelay +15V, -15V, -5V ON\r\n");
paologiorgio 2:fcdd048a4a9e 865 }
paologiorgio 2:fcdd048a4a9e 866 else if (command == 6)
paologiorgio 2:fcdd048a4a9e 867 {
paologiorgio 2:fcdd048a4a9e 868 Relay15_15_5V = 1;
paologiorgio 2:fcdd048a4a9e 869 SC.printf("\r\nRelay +15V, -15V, -5V OFF\r\n");
paologiorgio 2:fcdd048a4a9e 870 }
paologiorgio 2:fcdd048a4a9e 871 else if (command == 15)
paologiorgio 2:fcdd048a4a9e 872 {
paologiorgio 2:fcdd048a4a9e 873 Relay24V = 0;
paologiorgio 2:fcdd048a4a9e 874 SC.printf("\r\nRelay 24V ON\r\n");
paologiorgio 2:fcdd048a4a9e 875 }
paologiorgio 2:fcdd048a4a9e 876 else if (command == 8)
paologiorgio 2:fcdd048a4a9e 877 {
paologiorgio 2:fcdd048a4a9e 878 Relay24V = 1;
paologiorgio 2:fcdd048a4a9e 879 SC.printf("\r\nRelay 24V OFF\r\n");
paologiorgio 2:fcdd048a4a9e 880 }
paologiorgio 2:fcdd048a4a9e 881 else if (command == 255)
paologiorgio 2:fcdd048a4a9e 882 {
paologiorgio 2:fcdd048a4a9e 883 Relay5V = 1;
paologiorgio 2:fcdd048a4a9e 884 Relay12V = 1;
paologiorgio 2:fcdd048a4a9e 885 Relay15_15_5V = 1; // +15, -15, -5
paologiorgio 2:fcdd048a4a9e 886 Relay24V = 1;
paologiorgio 2:fcdd048a4a9e 887 offset = 0.0f;
paologiorgio 0:c81f86a07902 888
paologiorgio 2:fcdd048a4a9e 889 SC.printf("**** SHUTTING DOWN ALL RELAYS... ****\n\r");
paologiorgio 2:fcdd048a4a9e 890 M1.write(offset);
paologiorgio 2:fcdd048a4a9e 891 M2.write(offset);
paologiorgio 2:fcdd048a4a9e 892 SC.printf("> Duty Cycle %.2f / extension \n\r", offset);
paologiorgio 2:fcdd048a4a9e 893 }
paologiorgio 2:fcdd048a4a9e 894 else if ((command == 128) || (command == 64) && (Relay12V == 1))
paologiorgio 2:fcdd048a4a9e 895 {
paologiorgio 2:fcdd048a4a9e 896 offset = 0.0f;
paologiorgio 0:c81f86a07902 897 M1.write(offset);
paologiorgio 0:c81f86a07902 898 M2.write(offset);
paologiorgio 2:fcdd048a4a9e 899 }
paologiorgio 2:fcdd048a4a9e 900 }
paologiorgio 2:fcdd048a4a9e 901
paologiorgio 2:fcdd048a4a9e 902
paologiorgio 2:fcdd048a4a9e 903 /* ***************************************************************** */
paologiorgio 2:fcdd048a4a9e 904
paologiorgio 2:fcdd048a4a9e 905 // (t = indice da cui partire, dim = dimensione array, *a = array in input)
paologiorgio 2:fcdd048a4a9e 906 int BinToDec(int t, int dim, char *a) // Binary to decimal conversion
paologiorgio 2:fcdd048a4a9e 907 {
paologiorgio 2:fcdd048a4a9e 908 volatile int result = 0;
paologiorgio 2:fcdd048a4a9e 909
paologiorgio 2:fcdd048a4a9e 910 while (t < dim)
paologiorgio 2:fcdd048a4a9e 911 {
paologiorgio 2:fcdd048a4a9e 912 if (a[t] == '1')
paologiorgio 2:fcdd048a4a9e 913 {
paologiorgio 2:fcdd048a4a9e 914 int raise = dim - 1 - t;
paologiorgio 2:fcdd048a4a9e 915 result += pow((float) base, (float) raise);
paologiorgio 2:fcdd048a4a9e 916 }
paologiorgio 2:fcdd048a4a9e 917 else
paologiorgio 2:fcdd048a4a9e 918 {
paologiorgio 2:fcdd048a4a9e 919 result += 0;
paologiorgio 2:fcdd048a4a9e 920 }
paologiorgio 2:fcdd048a4a9e 921 t++;
paologiorgio 2:fcdd048a4a9e 922 }
paologiorgio 2:fcdd048a4a9e 923 return result;
paologiorgio 2:fcdd048a4a9e 924 }
paologiorgio 2:fcdd048a4a9e 925
paologiorgio 2:fcdd048a4a9e 926
paologiorgio 2:fcdd048a4a9e 927 /* ***************************************************************** */
paologiorgio 2:fcdd048a4a9e 928
paologiorgio 2:fcdd048a4a9e 929
paologiorgio 2:fcdd048a4a9e 930 // TEMPERATURA
paologiorgio 2:fcdd048a4a9e 931 void GetTemperature(void) // Get temperature from MAX31865-Arduino
paologiorgio 2:fcdd048a4a9e 932 {
paologiorgio 2:fcdd048a4a9e 933 char cReadChar;
paologiorgio 2:fcdd048a4a9e 934
paologiorgio 2:fcdd048a4a9e 935 while((MAX31865.readable()))
paologiorgio 2:fcdd048a4a9e 936 {
paologiorgio 2:fcdd048a4a9e 937 cReadChar = MAX31865.getc();
paologiorgio 2:fcdd048a4a9e 938 nRxCharCount++;
paologiorgio 2:fcdd048a4a9e 939 caRxPacket[nRxCharCount] = cReadChar;
paologiorgio 2:fcdd048a4a9e 940 }
paologiorgio 0:c81f86a07902 941 }
paologiorgio 2:fcdd048a4a9e 942
paologiorgio 2:fcdd048a4a9e 943
paologiorgio 2:fcdd048a4a9e 944 /* ***************************************************************** */
paologiorgio 2:fcdd048a4a9e 945
paologiorgio 2:fcdd048a4a9e 946
paologiorgio 2:fcdd048a4a9e 947 void ReadTemperature(void) // Read temperature float value
paologiorgio 2:fcdd048a4a9e 948 {
paologiorgio 2:fcdd048a4a9e 949 nRxCharCount = 0; // indice
paologiorgio 2:fcdd048a4a9e 950
paologiorgio 2:fcdd048a4a9e 951 int y = 0, u = 0; // indici
paologiorgio 2:fcdd048a4a9e 952
paologiorgio 2:fcdd048a4a9e 953 for (int i = 0; i < PACKETDIM; i++)
paologiorgio 2:fcdd048a4a9e 954 {
paologiorgio 2:fcdd048a4a9e 955 if (caRxPacket[i] == 'S')
paologiorgio 2:fcdd048a4a9e 956 {
paologiorgio 2:fcdd048a4a9e 957 indexJ = i + 1;
paologiorgio 2:fcdd048a4a9e 958
paologiorgio 2:fcdd048a4a9e 959 while (indexJ < PACKETDIM)
paologiorgio 2:fcdd048a4a9e 960 {
paologiorgio 2:fcdd048a4a9e 961 if (caRxPacket[indexJ] == ';')
paologiorgio 2:fcdd048a4a9e 962 {
paologiorgio 2:fcdd048a4a9e 963 break;
paologiorgio 2:fcdd048a4a9e 964 }
paologiorgio 2:fcdd048a4a9e 965 else
paologiorgio 2:fcdd048a4a9e 966 {
paologiorgio 2:fcdd048a4a9e 967 tempCH1[y++] = caRxPacket[indexJ];
paologiorgio 2:fcdd048a4a9e 968 }
paologiorgio 2:fcdd048a4a9e 969
paologiorgio 2:fcdd048a4a9e 970 indexJ++;
paologiorgio 2:fcdd048a4a9e 971 } // se trova ; esce dall'istruzione e salva il valore di uscita dell'indice
paologiorgio 2:fcdd048a4a9e 972
paologiorgio 2:fcdd048a4a9e 973 indexT = indexJ + 1;
paologiorgio 2:fcdd048a4a9e 974
paologiorgio 2:fcdd048a4a9e 975 while (indexT < PACKETDIM)
paologiorgio 2:fcdd048a4a9e 976 {
paologiorgio 2:fcdd048a4a9e 977 if (caRxPacket[indexT] == 'P')
paologiorgio 2:fcdd048a4a9e 978 {
paologiorgio 2:fcdd048a4a9e 979 break;
paologiorgio 2:fcdd048a4a9e 980 }
paologiorgio 2:fcdd048a4a9e 981 else
paologiorgio 2:fcdd048a4a9e 982 {
paologiorgio 2:fcdd048a4a9e 983 tempCH2[u++] = caRxPacket[indexT];
paologiorgio 2:fcdd048a4a9e 984 }
paologiorgio 2:fcdd048a4a9e 985
paologiorgio 2:fcdd048a4a9e 986 indexT++;
paologiorgio 2:fcdd048a4a9e 987 }
paologiorgio 2:fcdd048a4a9e 988
paologiorgio 2:fcdd048a4a9e 989 // trasforma il dato da sequenza di caratteri a numero float utile per analisi
paologiorgio 2:fcdd048a4a9e 990
paologiorgio 2:fcdd048a4a9e 991 strcpy(CH1_to_string, tempCH1);
paologiorgio 2:fcdd048a4a9e 992 CH1 = atof(CH1_to_string);
paologiorgio 2:fcdd048a4a9e 993
paologiorgio 2:fcdd048a4a9e 994 strcpy(CH2_to_string, tempCH2);
paologiorgio 2:fcdd048a4a9e 995 CH2 = atof(CH2_to_string);
paologiorgio 2:fcdd048a4a9e 996
paologiorgio 2:fcdd048a4a9e 997 SC.printf("> TEMPERATURE - CH1: %4.8f[Celsius], CH2: %4.8f[Celsius]\n\r", CH1, CH2);
paologiorgio 2:fcdd048a4a9e 998
paologiorgio 2:fcdd048a4a9e 999 break;
paologiorgio 2:fcdd048a4a9e 1000 }
paologiorgio 2:fcdd048a4a9e 1001 }
paologiorgio 2:fcdd048a4a9e 1002
paologiorgio 2:fcdd048a4a9e 1003 wait_ms(150); // pausa per garantire sincronizzazione tra riempimento buffer e svuotamento
paologiorgio 2:fcdd048a4a9e 1004 }
paologiorgio 2:fcdd048a4a9e 1005
paologiorgio 2:fcdd048a4a9e 1006
paologiorgio 2:fcdd048a4a9e 1007 /* ***************************************************************** */ // MIMA OPERATING MODE
paologiorgio 2:fcdd048a4a9e 1008
paologiorgio 2:fcdd048a4a9e 1009
paologiorgio 2:fcdd048a4a9e 1010 const char* MIMA_OPERATING_MODE(char *s)
paologiorgio 2:fcdd048a4a9e 1011 {
paologiorgio 2:fcdd048a4a9e 1012 if (s[7] == '0' && s[8] == '0' && s[9] == '0' && s[10] == '1')
paologiorgio 2:fcdd048a4a9e 1013 {
paologiorgio 2:fcdd048a4a9e 1014 return "> Setting MIMA... Sleeping mode";
paologiorgio 2:fcdd048a4a9e 1015 }
paologiorgio 2:fcdd048a4a9e 1016 else if (s[7] == '0' && s[8] == '0' && s[9] == '1' && s[10] == '0')
paologiorgio 2:fcdd048a4a9e 1017 {
paologiorgio 2:fcdd048a4a9e 1018 return "> Setting MIMA... Awake mode";
paologiorgio 2:fcdd048a4a9e 1019 }
paologiorgio 2:fcdd048a4a9e 1020 else if (s[7] == '0' && s[8] == '0' && s[9] == '1' && s[10] == '1')
paologiorgio 2:fcdd048a4a9e 1021 {
paologiorgio 2:fcdd048a4a9e 1022 return "> Setting MIMA... Calibration mode";
paologiorgio 2:fcdd048a4a9e 1023 }
paologiorgio 2:fcdd048a4a9e 1024 else if (s[7] == '0' && s[8] == '1' && s[9] == '0' && s[10] == '0')
paologiorgio 2:fcdd048a4a9e 1025 {
paologiorgio 2:fcdd048a4a9e 1026 return "> Setting MIMA... Observation mode";
paologiorgio 2:fcdd048a4a9e 1027 }
paologiorgio 2:fcdd048a4a9e 1028 else if (s[7] == '0' && s[8] == '1' && s[9] == '0' && s[10] == '1')
paologiorgio 2:fcdd048a4a9e 1029 {
paologiorgio 2:fcdd048a4a9e 1030 return "> Setting MIMA... Auto-test mode";
paologiorgio 2:fcdd048a4a9e 1031 }
paologiorgio 2:fcdd048a4a9e 1032 else if (s[7] == '0' && s[8] == '1' && s[9] == '1' && s[10] == '0')
paologiorgio 2:fcdd048a4a9e 1033 {
paologiorgio 2:fcdd048a4a9e 1034 return "> Setting MIMA... Full testing mode";
paologiorgio 2:fcdd048a4a9e 1035 }
paologiorgio 2:fcdd048a4a9e 1036
paologiorgio 2:fcdd048a4a9e 1037 return "\0";
paologiorgio 2:fcdd048a4a9e 1038 }
paologiorgio 2:fcdd048a4a9e 1039
paologiorgio 2:fcdd048a4a9e 1040
paologiorgio 2:fcdd048a4a9e 1041 /* ***************************************************************** */