Space / Mbed 2 deprecated DORAv4

Dependencies:   mbed

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