Space / Mbed 2 deprecated DORA_lv

Dependencies:   mbed

Committer:
paologiorgio
Date:
Mon Aug 01 17:31:30 2022 +0000
Revision:
2:155d07b145c6
Parent:
1:00cee5df0f76
Dora, 01/08/2022. Versione finale

Who changed what in which revision?

UserRevisionLine numberNew contents of line
paologiorgio 0:8f7c961a5966 1 // Librerie
paologiorgio 0:8f7c961a5966 2 #include "mbed.h"
paologiorgio 0:8f7c961a5966 3 #include <math.h>
paologiorgio 0:8f7c961a5966 4 #include <string.h>
paologiorgio 0:8f7c961a5966 5 #include <stdlib.h>
paologiorgio 1:00cee5df0f76 6 #include <stdbool.h>
paologiorgio 0:8f7c961a5966 7
paologiorgio 0:8f7c961a5966 8 // Macros
paologiorgio 2:155d07b145c6 9 #define config 2 // 0: spacecraft, 1: mima, 2: no diagnostic
paologiorgio 2:155d07b145c6 10 #define PACKETDIM 15 // temperature
paologiorgio 2:155d07b145c6 11 #define word 1
paologiorgio 2:155d07b145c6 12 #define packet 2 // 2 bytes
paologiorgio 1:00cee5df0f76 13 #define channel_size 10 // temeprature channel from sen30202
paologiorgio 2:155d07b145c6 14 #define CMD05_1 40
paologiorgio 2:155d07b145c6 15 #define CMD05_2 41
paologiorgio 2:155d07b145c6 16 #define TLMODE_HSK 0
paologiorgio 2:155d07b145c6 17 #define TLMODE_HSKSD 127
paologiorgio 2:155d07b145c6 18 #define CMD00 0
paologiorgio 2:155d07b145c6 19 #define CMD02 16
paologiorgio 2:155d07b145c6 20 #define TEMP_QUERY 32
paologiorgio 2:155d07b145c6 21 #define CMD15_R 121
paologiorgio 2:155d07b145c6 22 #define CMD15 120
paologiorgio 2:155d07b145c6 23 #define ALL_RELAY_OFF 42
paologiorgio 2:155d07b145c6 24 #define ALL_RELAY_ON 85
paologiorgio 2:155d07b145c6 25 #define ENABLE_12V 1
paologiorgio 2:155d07b145c6 26 #define DISABLE_12V 0
paologiorgio 2:155d07b145c6 27 #define ENABLE_5V 3
paologiorgio 2:155d07b145c6 28 #define DISABLE_5V 2
paologiorgio 2:155d07b145c6 29 #define ENABLE_15V 7
paologiorgio 2:155d07b145c6 30 #define DISABLE_15V 6
paologiorgio 2:155d07b145c6 31 #define ENABLE_24V 15
paologiorgio 2:155d07b145c6 32 #define DISABLE_24V 8
paologiorgio 2:155d07b145c6 33 #define CMD31 241
paologiorgio 2:155d07b145c6 34 #define RESET_GLOBAL_VARS 127
paologiorgio 0:8f7c961a5966 35
paologiorgio 2:155d07b145c6 36 // Definizione periferiche
paologiorgio 2:155d07b145c6 37 Serial spacecraft(PC_1, PC_0);
paologiorgio 2:155d07b145c6 38 //Serial spacecraft(USBTX, USBRX); // se pc connesso direttamente all'stm32
paologiorgio 0:8f7c961a5966 39 Serial mima(PC_4, PC_5);
paologiorgio 2:155d07b145c6 40 /* se si desidera utilizzare il pc come mima
paologiorgio 2:155d07b145c6 41 Serial mima(PC_1, PC_0);
paologiorgio 2:155d07b145c6 42 Serial spacecraft(PC_4, PC_5);
paologiorgio 2:155d07b145c6 43 */
paologiorgio 1:00cee5df0f76 44 Serial max31865(PA_0, PA_1);
paologiorgio 1:00cee5df0f76 45 // L16 Actuonix:
paologiorgio 2:155d07b145c6 46 AnalogOut actuonix(PA_4);
paologiorgio 2:155d07b145c6 47 PwmOut actuonix_dig(PB_3);
paologiorgio 1:00cee5df0f76 48 float offset;
paologiorgio 2:155d07b145c6 49 float offset_dig;
paologiorgio 2:155d07b145c6 50 // Relay
paologiorgio 2:155d07b145c6 51 DigitalOut Relay5V(PA_7);
paologiorgio 2:155d07b145c6 52 DigitalOut Relay12V(PB_4);
paologiorgio 2:155d07b145c6 53 DigitalOut Relay24V(PB_5);
paologiorgio 2:155d07b145c6 54 DigitalOut Relay15_15_5V(PB_10);
paologiorgio 1:00cee5df0f76 55
paologiorgio 1:00cee5df0f76 56 // Buffer: telecommand
paologiorgio 2:155d07b145c6 57 volatile int rxTlcPtr;
paologiorgio 2:155d07b145c6 58 int rxTlcDataCounter = 0;
paologiorgio 2:155d07b145c6 59 char rx_TLC[word+1];
paologiorgio 2:155d07b145c6 60 char data_TLC[word+1];
paologiorgio 1:00cee5df0f76 61
paologiorgio 2:155d07b145c6 62 // Buffer: standard telemetry (1 frame da 16 bit o 2 frame da 16 bit ciascuno)
paologiorgio 2:155d07b145c6 63 volatile int rxTlmPtr;
paologiorgio 1:00cee5df0f76 64 int rxTlmDataCounter = 0;
paologiorgio 2:155d07b145c6 65 char rx_TLM[word+1];
paologiorgio 2:155d07b145c6 66 char data_TLM[word+1];
paologiorgio 1:00cee5df0f76 67
paologiorgio 2:155d07b145c6 68 // Buffer: TLMODE telemetry option 1 (tutte le housekeeping telemetries)
paologiorgio 2:155d07b145c6 69 volatile int rxTlmOpt1Ptr;
paologiorgio 1:00cee5df0f76 70 int rxTlmOpt1DataCounter = 0;
paologiorgio 2:155d07b145c6 71 char rx_TLMOpt1[word+1];
paologiorgio 2:155d07b145c6 72 char data_TLMOpt1[word+1];
paologiorgio 1:00cee5df0f76 73
paologiorgio 2:155d07b145c6 74 // Buffer: TLMODE telemetry option 2 (housekeeping + data dall'interferometro)
paologiorgio 2:155d07b145c6 75 volatile int rxTlmOpt2Ptr;
paologiorgio 1:00cee5df0f76 76 int rxTlmOpt2DataCounter = 0;
paologiorgio 2:155d07b145c6 77 char rx_TLMOpt2[word+1];
paologiorgio 2:155d07b145c6 78 char data_TLMOpt2[word+1];
paologiorgio 0:8f7c961a5966 79
paologiorgio 2:155d07b145c6 80 // Timer: 3 contatori differenti a seconda del numero di bytes da ricevere
paologiorgio 2:155d07b145c6 81 Timer timer;
paologiorgio 2:155d07b145c6 82 Timer rx;
paologiorgio 2:155d07b145c6 83 Timer rx_wide;
paologiorgio 2:155d07b145c6 84 float rxWindow = 6 /*seconds, TBA */, rxTimeStart, rxTimeStop, rxTimeRead; // standard teleemtry + hsk
paologiorgio 2:155d07b145c6 85 float rx_wideWindow = 300 /*seconds, TBA */, rx_wideTimeStart, rx_wideTimeStop, rx_wideTimeRead; // full hsk+scientific data
paologiorgio 2:155d07b145c6 86 float TIMEOUT = 3 /*seconds */, tTimeStart, tTimeStop, tTimeRead; // telecommand
paologiorgio 0:8f7c961a5966 87
paologiorgio 2:155d07b145c6 88 // TLMODE: definizione dei vari flag, assegnazioni di variabili
paologiorgio 1:00cee5df0f76 89 volatile int tlmode_option_1, tlmode_option_2, tlmode_tlm;
paologiorgio 2:155d07b145c6 90 volatile char payload;
paologiorgio 1:00cee5df0f76 91 volatile bool TlcSend;
paologiorgio 2:155d07b145c6 92 volatile bool Spare;
paologiorgio 2:155d07b145c6 93 volatile char dataIn;
paologiorgio 0:8f7c961a5966 94
paologiorgio 1:00cee5df0f76 95 // SC-MIMA communication: TX/RX
paologiorgio 2:155d07b145c6 96 void RxTelecommand(void);
paologiorgio 2:155d07b145c6 97 void TxTelecommand(void);
paologiorgio 2:155d07b145c6 98 void RxTelemetry(void);
paologiorgio 2:155d07b145c6 99 void TxTelemetry(void);
paologiorgio 1:00cee5df0f76 100 // System utility
paologiorgio 0:8f7c961a5966 101 void clearBuffer(char *arr, int arrLen);
paologiorgio 1:00cee5df0f76 102
paologiorgio 2:155d07b145c6 103 // Richiesta temperatura
paologiorgio 1:00cee5df0f76 104 char tempCH1[channel_size];
paologiorgio 1:00cee5df0f76 105 char tempCH2[channel_size];
paologiorgio 1:00cee5df0f76 106 volatile int j; // first channel index
paologiorgio 1:00cee5df0f76 107 volatile int t; // second channel index
paologiorgio 1:00cee5df0f76 108 volatile char caRxPacket[PACKETDIM]; // temperature buffer
paologiorgio 1:00cee5df0f76 109 volatile char nRxCharCount; // temperature char counter
paologiorgio 1:00cee5df0f76 110
paologiorgio 1:00cee5df0f76 111 // Routines dedicate alla ricezione di dati della temperatura (Pt100)
paologiorgio 1:00cee5df0f76 112 void SerialeRxInterrupt(void)
paologiorgio 1:00cee5df0f76 113 {
paologiorgio 2:155d07b145c6 114 char cReadChar;
paologiorgio 2:155d07b145c6 115 while ((max31865.readable()))
paologiorgio 1:00cee5df0f76 116 {
paologiorgio 2:155d07b145c6 117 cReadChar = max31865.getc();
paologiorgio 2:155d07b145c6 118 nRxCharCount++;
paologiorgio 1:00cee5df0f76 119 caRxPacket[nRxCharCount] = cReadChar;
paologiorgio 2:155d07b145c6 120 }
paologiorgio 2:155d07b145c6 121
paologiorgio 2:155d07b145c6 122 if (nRxCharCount == PACKETDIM)
paologiorgio 1:00cee5df0f76 123 {
paologiorgio 1:00cee5df0f76 124 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 125 }
paologiorgio 1:00cee5df0f76 126 }
paologiorgio 0:8f7c961a5966 127
paologiorgio 0:8f7c961a5966 128 // Main
paologiorgio 0:8f7c961a5966 129 int main()
paologiorgio 0:8f7c961a5966 130 {
paologiorgio 2:155d07b145c6 131 // config 0: il mio pc come spacecraft
paologiorgio 2:155d07b145c6 132 // config 1: il mio pc come mima
paologiorgio 2:155d07b145c6 133
paologiorgio 0:8f7c961a5966 134 // Baudrate
paologiorgio 2:155d07b145c6 135 spacecraft.baud(9600);
paologiorgio 0:8f7c961a5966 136 mima.baud(9600);
paologiorgio 0:8f7c961a5966 137 max31865.baud(115200);
paologiorgio 0:8f7c961a5966 138
paologiorgio 1:00cee5df0f76 139 // Diagnostica
paologiorgio 2:155d07b145c6 140 if (config == 0)
paologiorgio 2:155d07b145c6 141 {
paologiorgio 2:155d07b145c6 142 spacecraft.printf(" Avvio Spacecraft... \n\r");
paologiorgio 2:155d07b145c6 143 }
paologiorgio 2:155d07b145c6 144 else if (config == 1)
paologiorgio 2:155d07b145c6 145 {
paologiorgio 2:155d07b145c6 146 mima.printf(" Avvio MIMA... \n\r");
paologiorgio 2:155d07b145c6 147 }
paologiorgio 2:155d07b145c6 148
paologiorgio 1:00cee5df0f76 149 // Setup per temperatura
paologiorgio 1:00cee5df0f76 150 int nIndex;
paologiorgio 1:00cee5df0f76 151 nRxCharCount = 0;
paologiorgio 2:155d07b145c6 152 for (nIndex = 0; nIndex < PACKETDIM; nIndex++)
paologiorgio 0:8f7c961a5966 153 {
paologiorgio 1:00cee5df0f76 154 caRxPacket[nIndex] = 0;
paologiorgio 2:155d07b145c6 155 }
paologiorgio 2:155d07b145c6 156
paologiorgio 2:155d07b145c6 157 // Setup per Actuonix L16->PWM
paologiorgio 2:155d07b145c6 158 actuonix_dig.period_us(1000);
paologiorgio 2:155d07b145c6 159 offset_dig = actuonix_dig.read();
paologiorgio 1:00cee5df0f76 160 offset = actuonix.read();
paologiorgio 2:155d07b145c6 161
paologiorgio 1:00cee5df0f76 162 // Setup per Relay: 1 = OFF (1->OFF, 0->ON)
paologiorgio 2:155d07b145c6 163 Relay5V = 1;
paologiorgio 2:155d07b145c6 164 Relay12V = 1;
paologiorgio 2:155d07b145c6 165 Relay15_15_5V = 1;
paologiorgio 2:155d07b145c6 166 Relay24V = 1;
paologiorgio 2:155d07b145c6 167
paologiorgio 1:00cee5df0f76 168 // Bool flags
paologiorgio 1:00cee5df0f76 169 TlcSend = false;
paologiorgio 2:155d07b145c6 170
paologiorgio 2:155d07b145c6 171 // Interrupts
paologiorgio 1:00cee5df0f76 172 max31865.attach(&SerialeRxInterrupt, Serial::RxIrq);
paologiorgio 1:00cee5df0f76 173 spacecraft.attach(&RxTelecommand, Serial::RxIrq);
paologiorgio 1:00cee5df0f76 174 mima.attach(&RxTelemetry, Serial::RxIrq);
paologiorgio 2:155d07b145c6 175
paologiorgio 2:155d07b145c6 176 // Diagnostica
paologiorgio 2:155d07b145c6 177 if (config == 0)
paologiorgio 2:155d07b145c6 178 {
paologiorgio 2:155d07b145c6 179 spacecraft.printf(" ... Ready to send... \n\r");
paologiorgio 2:155d07b145c6 180 }
paologiorgio 2:155d07b145c6 181 else if (config == 1)
paologiorgio 2:155d07b145c6 182 {
paologiorgio 2:155d07b145c6 183 mima.printf(" ... Ready to send... \n\r");
paologiorgio 2:155d07b145c6 184 }
paologiorgio 1:00cee5df0f76 185
paologiorgio 1:00cee5df0f76 186 // Main loop
paologiorgio 1:00cee5df0f76 187 while (true)
paologiorgio 2:155d07b145c6 188 {
paologiorgio 2:155d07b145c6 189 // Inizializza contatore caratteri in arrivo e flag di ricezione comando Spare
paologiorgio 2:155d07b145c6 190 rxTlcPtr = 0;
paologiorgio 2:155d07b145c6 191 Spare = false;
paologiorgio 2:155d07b145c6 192
paologiorgio 2:155d07b145c6 193 // Setup per RX (uno dei flag verrà attivato solo via invio di un telecomando)
paologiorgio 2:155d07b145c6 194 // se tutti i flag sono su "1", dora non trasmetterà nulla verso spacecraft
paologiorgio 2:155d07b145c6 195 tlmode_option_1 = 1;
paologiorgio 2:155d07b145c6 196 tlmode_option_2 = 1;
paologiorgio 2:155d07b145c6 197 tlmode_tlm = 1;
paologiorgio 2:155d07b145c6 198
paologiorgio 2:155d07b145c6 199 // Timer
paologiorgio 0:8f7c961a5966 200 timer.start();
paologiorgio 2:155d07b145c6 201 tTimeStart = timer.read();
paologiorgio 0:8f7c961a5966 202 tTimeRead = tTimeStart;
paologiorgio 2:155d07b145c6 203
paologiorgio 2:155d07b145c6 204 // Finché non raggiungo la dimensione richiesta (16 bit, 2 byte),
paologiorgio 2:155d07b145c6 205 // resto in attesa di dati da spacecraft, all'interno della finestra di ricezione
paologiorgio 1:00cee5df0f76 206 while ((rxTlcPtr < packet) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 0:8f7c961a5966 207 {
paologiorgio 1:00cee5df0f76 208 tTimeRead = timer.read();
paologiorgio 1:00cee5df0f76 209 }
paologiorgio 2:155d07b145c6 210
paologiorgio 1:00cee5df0f76 211 timer.stop();
paologiorgio 2:155d07b145c6 212
paologiorgio 2:155d07b145c6 213 // Se ho ricevuto 2 byte nella finestra di ricezione, preparo un array di data
paologiorgio 2:155d07b145c6 214 // per ricomporre il frame da 16 bit e inviarlo a mima tramite dora
paologiorgio 1:00cee5df0f76 215 if ((rxTlcPtr == packet) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 2:155d07b145c6 216 {
paologiorgio 2:155d07b145c6 217 __disable_irq();
paologiorgio 2:155d07b145c6 218 memcpy(data_TLC, rx_TLC, rxTlcPtr);
paologiorgio 1:00cee5df0f76 219 rxTlcDataCounter = rxTlcPtr;
paologiorgio 2:155d07b145c6 220
paologiorgio 2:155d07b145c6 221 // Legge il contenuto del payload ignorando il LSB
paologiorgio 2:155d07b145c6 222 payload = data_TLC[1] >> 1;
paologiorgio 2:155d07b145c6 223
paologiorgio 2:155d07b145c6 224 // Diagnostica
paologiorgio 2:155d07b145c6 225 if (config == 0)
paologiorgio 2:155d07b145c6 226 {
paologiorgio 2:155d07b145c6 227 spacecraft.printf("\n\r .... Telecomando ricevuto su DORA! \n\r");
paologiorgio 2:155d07b145c6 228 }
paologiorgio 2:155d07b145c6 229 else if (config == 1)
paologiorgio 2:155d07b145c6 230 {
paologiorgio 2:155d07b145c6 231 mima.printf("\n\r .... Telecomando ricevuto su DORA! \n\r");
paologiorgio 2:155d07b145c6 232 }
paologiorgio 1:00cee5df0f76 233
paologiorgio 2:155d07b145c6 234 // Visualizza i byte inviati
paologiorgio 2:155d07b145c6 235 for (int i = 0; i < sizeof(data_TLC) / sizeof(char); i++)
paologiorgio 0:8f7c961a5966 236 {
paologiorgio 2:155d07b145c6 237 if (config == 0)
paologiorgio 2:155d07b145c6 238 {
paologiorgio 2:155d07b145c6 239 spacecraft.printf("> Carattere: %i \n\r", (int) data_TLC[i]);
paologiorgio 2:155d07b145c6 240 }
paologiorgio 2:155d07b145c6 241 else if (config == 1)
paologiorgio 2:155d07b145c6 242 {
paologiorgio 2:155d07b145c6 243 mima.printf("> Carattere: %i \n\r", (int) data_TLC[i]);
paologiorgio 2:155d07b145c6 244 }
paologiorgio 2:155d07b145c6 245 }
paologiorgio 2:155d07b145c6 246
paologiorgio 2:155d07b145c6 247 // add a null just in case the received data didn't have one at the end
paologiorgio 2:155d07b145c6 248 data_TLC[rxTlcDataCounter] = 0;
paologiorgio 2:155d07b145c6 249
paologiorgio 1:00cee5df0f76 250 // hw control: set-point init
paologiorgio 2:155d07b145c6 251 offset = actuonix.read(); // legge il valore attuale dell'attuatore
paologiorgio 2:155d07b145c6 252 offset_dig = actuonix_dig.read();
paologiorgio 2:155d07b145c6 253
paologiorgio 1:00cee5df0f76 254 // RX settings
paologiorgio 2:155d07b145c6 255 // Si prepara alla ricezione di telemetrie standard in caso di invio di telecomandi
paologiorgio 2:155d07b145c6 256 // differenti dal CMD05 (TLMODE)
paologiorgio 2:155d07b145c6 257 if (((int) data_TLC[0] != CMD05_1) || ((int) data_TLC[0] != CMD05_2))
paologiorgio 1:00cee5df0f76 258 {
paologiorgio 1:00cee5df0f76 259 tlmode_option_1 = 1;
paologiorgio 1:00cee5df0f76 260 tlmode_option_2 = 1;
paologiorgio 1:00cee5df0f76 261 tlmode_tlm = 0;
paologiorgio 1:00cee5df0f76 262 }
paologiorgio 2:155d07b145c6 263
paologiorgio 2:155d07b145c6 264 // Controllo dell'attuatore lineare L16 (comando Spare)
paologiorgio 2:155d07b145c6 265 if ((int) data_TLC[0] == CMD00)
paologiorgio 1:00cee5df0f76 266 {
paologiorgio 2:155d07b145c6 267 offset = (int) payload;
paologiorgio 2:155d07b145c6 268 offset = offset / 100;
paologiorgio 2:155d07b145c6 269
paologiorgio 2:155d07b145c6 270 offset_dig = (int) payload;
paologiorgio 2:155d07b145c6 271 offset_dig = offset_dig / 100;
paologiorgio 2:155d07b145c6 272
paologiorgio 2:155d07b145c6 273 actuonix_dig.write(offset_dig);
paologiorgio 1:00cee5df0f76 274 actuonix.write(offset);
paologiorgio 2:155d07b145c6 275
paologiorgio 2:155d07b145c6 276 Spare = true;
paologiorgio 1:00cee5df0f76 277 }
paologiorgio 2:155d07b145c6 278
paologiorgio 2:155d07b145c6 279 // Richiesta delle temperature. Data: SXXX.XX;YYY.YYP > START/CH1;CH2/END
paologiorgio 2:155d07b145c6 280 // Controllo del flusso di dati proveniente dalla Seriale
paologiorgio 2:155d07b145c6 281 else if (((int) data_TLC[0] == CMD02) && ((int) payload == TEMP_QUERY))
paologiorgio 1:00cee5df0f76 282 {
paologiorgio 1:00cee5df0f76 283 // Cleaning buffers
paologiorgio 2:155d07b145c6 284 clearBuffer(tempCH1, sizeof(tempCH1) / sizeof(char));
paologiorgio 2:155d07b145c6 285 clearBuffer(tempCH2, sizeof(tempCH2) / sizeof(char));
paologiorgio 1:00cee5df0f76 286
paologiorgio 1:00cee5df0f76 287 // Index setup
paologiorgio 1:00cee5df0f76 288 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 289 int y = 0, u = 0;
paologiorgio 2:155d07b145c6 290 t = 0; j = 0; // global
paologiorgio 1:00cee5df0f76 291
paologiorgio 1:00cee5df0f76 292 for (int i = 0; i < PACKETDIM; i++)
paologiorgio 0:8f7c961a5966 293 {
paologiorgio 1:00cee5df0f76 294 if (caRxPacket[i] == 'S')
paologiorgio 1:00cee5df0f76 295 {
paologiorgio 2:155d07b145c6 296 // Indice sul quale cade la prima cifra del canale 1
paologiorgio 1:00cee5df0f76 297 j = i + 1;
paologiorgio 1:00cee5df0f76 298
paologiorgio 1:00cee5df0f76 299 while (j < PACKETDIM)
paologiorgio 1:00cee5df0f76 300 {
paologiorgio 1:00cee5df0f76 301 if (caRxPacket[j] == ';')
paologiorgio 1:00cee5df0f76 302 {
paologiorgio 1:00cee5df0f76 303 break;
paologiorgio 1:00cee5df0f76 304 }
paologiorgio 1:00cee5df0f76 305 else
paologiorgio 1:00cee5df0f76 306 {
paologiorgio 1:00cee5df0f76 307 tempCH1[y++] = caRxPacket[j];
paologiorgio 1:00cee5df0f76 308 }
paologiorgio 1:00cee5df0f76 309
paologiorgio 1:00cee5df0f76 310 j++;
paologiorgio 1:00cee5df0f76 311 }
paologiorgio 1:00cee5df0f76 312
paologiorgio 2:155d07b145c6 313 // Indice sul quale cade la prima cifra del canale 2
paologiorgio 1:00cee5df0f76 314 t = j + 1;
paologiorgio 0:8f7c961a5966 315
paologiorgio 1:00cee5df0f76 316 while (t < PACKETDIM)
paologiorgio 1:00cee5df0f76 317 {
paologiorgio 1:00cee5df0f76 318 if (caRxPacket[t] == 'P')
paologiorgio 1:00cee5df0f76 319 {
paologiorgio 1:00cee5df0f76 320 break;
paologiorgio 1:00cee5df0f76 321 }
paologiorgio 1:00cee5df0f76 322 else
paologiorgio 1:00cee5df0f76 323 {
paologiorgio 1:00cee5df0f76 324 tempCH2[u++] = caRxPacket[t];
paologiorgio 1:00cee5df0f76 325 }
paologiorgio 2:155d07b145c6 326
paologiorgio 1:00cee5df0f76 327 t++;
paologiorgio 1:00cee5df0f76 328 }
paologiorgio 2:155d07b145c6 329
paologiorgio 1:00cee5df0f76 330 break;
paologiorgio 1:00cee5df0f76 331 }
paologiorgio 1:00cee5df0f76 332 }
paologiorgio 2:155d07b145c6 333
paologiorgio 2:155d07b145c6 334 // Invia i dati a Spacecraft
paologiorgio 1:00cee5df0f76 335 spacecraft.puts(tempCH1);
paologiorgio 2:155d07b145c6 336 spacecraft.puts(";"); // split ch1-ch2 data
paologiorgio 1:00cee5df0f76 337 spacecraft.puts(tempCH2);
paologiorgio 2:155d07b145c6 338
paologiorgio 2:155d07b145c6 339 Spare = true;
paologiorgio 1:00cee5df0f76 340 }
paologiorgio 2:155d07b145c6 341 else if (((int) data_TLC[0] == CMD15_R) && ((int) payload == ALL_RELAY_OFF))
paologiorgio 1:00cee5df0f76 342 {
paologiorgio 1:00cee5df0f76 343 Relay5V = 1;
paologiorgio 1:00cee5df0f76 344 Relay12V = 1;
paologiorgio 1:00cee5df0f76 345 Relay15_15_5V = 1;
paologiorgio 1:00cee5df0f76 346 Relay24V = 1;
paologiorgio 2:155d07b145c6 347
paologiorgio 2:155d07b145c6 348 Spare = true;
paologiorgio 1:00cee5df0f76 349 }
paologiorgio 2:155d07b145c6 350 else if (((int) data_TLC[0] == CMD15) && ((int) payload == ALL_RELAY_ON))
paologiorgio 1:00cee5df0f76 351 {
paologiorgio 1:00cee5df0f76 352 Relay5V = 0;
paologiorgio 1:00cee5df0f76 353 Relay12V = 0;
paologiorgio 1:00cee5df0f76 354 Relay15_15_5V = 0;
paologiorgio 2:155d07b145c6 355 Relay24V = 0;
paologiorgio 2:155d07b145c6 356
paologiorgio 2:155d07b145c6 357 Spare = true;
paologiorgio 1:00cee5df0f76 358 }
paologiorgio 2:155d07b145c6 359 else if (((int) data_TLC[0] == CMD15))
paologiorgio 1:00cee5df0f76 360 {
paologiorgio 2:155d07b145c6 361 if (((int) payload == DISABLE_12V))
paologiorgio 0:8f7c961a5966 362 {
paologiorgio 1:00cee5df0f76 363 Relay12V = 1;
paologiorgio 2:155d07b145c6 364 Spare = true;
paologiorgio 1:00cee5df0f76 365 }
paologiorgio 2:155d07b145c6 366 else if (((int) payload == ENABLE_12V))
paologiorgio 1:00cee5df0f76 367 {
paologiorgio 1:00cee5df0f76 368 Relay12V = 0;
paologiorgio 1:00cee5df0f76 369 // since the linear actuator is driven by 12V power
paologiorgio 1:00cee5df0f76 370 offset = actuonix.read();
paologiorgio 2:155d07b145c6 371 offset_dig = actuonix_dig.read();
paologiorgio 2:155d07b145c6 372
paologiorgio 1:00cee5df0f76 373 actuonix.write(offset);
paologiorgio 2:155d07b145c6 374 actuonix.write(offset_dig);
paologiorgio 2:155d07b145c6 375
paologiorgio 2:155d07b145c6 376 Spare = true;
paologiorgio 0:8f7c961a5966 377 }
paologiorgio 2:155d07b145c6 378 else if (((int) payload == DISABLE_5V))
paologiorgio 1:00cee5df0f76 379 {
paologiorgio 2:155d07b145c6 380 Relay5V = 1;
paologiorgio 2:155d07b145c6 381 Spare = true;
paologiorgio 1:00cee5df0f76 382 }
paologiorgio 2:155d07b145c6 383 else if (((int) payload == ENABLE_5V))
paologiorgio 2:155d07b145c6 384 {
paologiorgio 2:155d07b145c6 385 Relay5V = 0;
paologiorgio 2:155d07b145c6 386 Spare = true;
paologiorgio 2:155d07b145c6 387 }
paologiorgio 2:155d07b145c6 388 else if (((int) payload == DISABLE_15V))
paologiorgio 1:00cee5df0f76 389 {
paologiorgio 1:00cee5df0f76 390 Relay15_15_5V = 1;
paologiorgio 2:155d07b145c6 391 Spare = true;
paologiorgio 1:00cee5df0f76 392 }
paologiorgio 2:155d07b145c6 393 else if (((int) payload == ENABLE_15V))
paologiorgio 0:8f7c961a5966 394 {
paologiorgio 1:00cee5df0f76 395 Relay15_15_5V = 0;
paologiorgio 2:155d07b145c6 396 Spare = true;
paologiorgio 1:00cee5df0f76 397 }
paologiorgio 2:155d07b145c6 398 else if (((int) payload == DISABLE_24V))
paologiorgio 1:00cee5df0f76 399 {
paologiorgio 1:00cee5df0f76 400 Relay24V = 1;
paologiorgio 2:155d07b145c6 401 Spare = true;
paologiorgio 1:00cee5df0f76 402 }
paologiorgio 2:155d07b145c6 403 else if (((int) payload == ENABLE_24V))
paologiorgio 1:00cee5df0f76 404 {
paologiorgio 1:00cee5df0f76 405 Relay24V = 0;
paologiorgio 2:155d07b145c6 406 Spare = true;
paologiorgio 0:8f7c961a5966 407 }
paologiorgio 0:8f7c961a5966 408 }
paologiorgio 2:155d07b145c6 409 else if (((int) data_TLC[0] == CMD05_1) && ((int) payload == TLMODE_HSK))
paologiorgio 1:00cee5df0f76 410 {
paologiorgio 1:00cee5df0f76 411 tlmode_option_1 = 0;
paologiorgio 1:00cee5df0f76 412 tlmode_option_2 = 1;
paologiorgio 1:00cee5df0f76 413 tlmode_tlm = 1;
paologiorgio 1:00cee5df0f76 414 rxTlmPtr = 0;
paologiorgio 1:00cee5df0f76 415 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 416 rxTlmOpt2Ptr = 0;
paologiorgio 2:155d07b145c6 417
paologiorgio 2:155d07b145c6 418 if (config == 0)
paologiorgio 2:155d07b145c6 419 {
paologiorgio 2:155d07b145c6 420 spacecraft.printf("\n\r ... Sono entrato in TLMODE 1 ... \n\r");
paologiorgio 2:155d07b145c6 421 }
paologiorgio 2:155d07b145c6 422 else if (config == 1)
paologiorgio 2:155d07b145c6 423 {
paologiorgio 2:155d07b145c6 424 mima.printf("\n\r ... Sono entrato in TLMODE 1 ... \n\r");
paologiorgio 2:155d07b145c6 425 }
paologiorgio 1:00cee5df0f76 426 }
paologiorgio 2:155d07b145c6 427 else if (((int) data_TLC[0] == CMD05_2) && ((int) payload == TLMODE_HSKSD))
paologiorgio 1:00cee5df0f76 428 {
paologiorgio 1:00cee5df0f76 429 tlmode_option_2 = 0;
paologiorgio 1:00cee5df0f76 430 tlmode_option_1 = 1;
paologiorgio 1:00cee5df0f76 431 tlmode_tlm = 1;
paologiorgio 1:00cee5df0f76 432 rxTlmPtr = 0;
paologiorgio 1:00cee5df0f76 433 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 434 rxTlmOpt2Ptr = 0;
paologiorgio 2:155d07b145c6 435
paologiorgio 2:155d07b145c6 436 if (config == 0)
paologiorgio 2:155d07b145c6 437 {
paologiorgio 2:155d07b145c6 438 spacecraft.printf("\n\r ... Sono entrato in TLMODE 2 ... \n\r");
paologiorgio 2:155d07b145c6 439 }
paologiorgio 2:155d07b145c6 440 else if (config == 1)
paologiorgio 2:155d07b145c6 441 {
paologiorgio 2:155d07b145c6 442 mima.printf("\n\r ... Sono entrato in TLMODE 2 ... \n\r");
paologiorgio 2:155d07b145c6 443 }
paologiorgio 1:00cee5df0f76 444 }
paologiorgio 2:155d07b145c6 445
paologiorgio 1:00cee5df0f76 446 // Reset global vars
paologiorgio 2:155d07b145c6 447 else if (((int) data_TLC[0] == CMD31) && ((int) payload == RESET_GLOBAL_VARS))
paologiorgio 0:8f7c961a5966 448 {
paologiorgio 1:00cee5df0f76 449 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 450 rxTlcPtr = 0;
paologiorgio 1:00cee5df0f76 451 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 452 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 453 rxTlcDataCounter = 0;
paologiorgio 1:00cee5df0f76 454 rxTlmOpt1DataCounter = 0;
paologiorgio 1:00cee5df0f76 455 rxTlmOpt2DataCounter = 0;
paologiorgio 1:00cee5df0f76 456 tlmode_tlm = 1;
paologiorgio 1:00cee5df0f76 457 tlmode_option_1 = 1;
paologiorgio 1:00cee5df0f76 458 tlmode_option_2 = 1;
paologiorgio 2:155d07b145c6 459
paologiorgio 2:155d07b145c6 460 for (nIndex = 0; nIndex < PACKETDIM; nIndex++)
paologiorgio 0:8f7c961a5966 461 {
paologiorgio 1:00cee5df0f76 462 caRxPacket[nIndex] = 0;
paologiorgio 2:155d07b145c6 463 }
paologiorgio 2:155d07b145c6 464
paologiorgio 2:155d07b145c6 465 clearBuffer(data_TLC, sizeof(data_TLC) / sizeof(char));
paologiorgio 2:155d07b145c6 466 clearBuffer(data_TLM, sizeof(data_TLM) / sizeof(char));
paologiorgio 2:155d07b145c6 467 clearBuffer(data_TLMOpt1, sizeof(data_TLMOpt1) / sizeof(char));
paologiorgio 2:155d07b145c6 468 clearBuffer(data_TLMOpt2, sizeof(data_TLMOpt2) / sizeof(char));
paologiorgio 1:00cee5df0f76 469
paologiorgio 2:155d07b145c6 470 Spare = true;
paologiorgio 2:155d07b145c6 471
paologiorgio 2:155d07b145c6 472 if (config == 0)
paologiorgio 2:155d07b145c6 473 {
paologiorgio 2:155d07b145c6 474 spacecraft.printf("\n\r ... Reset variabili effettuato! ... \n\r");
paologiorgio 2:155d07b145c6 475 }
paologiorgio 2:155d07b145c6 476 else if (config == 1)
paologiorgio 2:155d07b145c6 477 {
paologiorgio 2:155d07b145c6 478 mima.printf("\n\r ... Reset variabili effettuato! ... \n\r");
paologiorgio 2:155d07b145c6 479 }
paologiorgio 2:155d07b145c6 480 }
paologiorgio 2:155d07b145c6 481
paologiorgio 2:155d07b145c6 482 // Invia il telecomando a MIMA se non è Spare
paologiorgio 2:155d07b145c6 483 if (!Spare)
paologiorgio 2:155d07b145c6 484 {
paologiorgio 2:155d07b145c6 485 TxTelecommand();
paologiorgio 2:155d07b145c6 486 }
paologiorgio 2:155d07b145c6 487 // Telecommand sent, flags set
paologiorgio 2:155d07b145c6 488
paologiorgio 2:155d07b145c6 489 if (config == 0)
paologiorgio 2:155d07b145c6 490 {
paologiorgio 2:155d07b145c6 491 spacecraft.printf("\n\r ... Telecomando inviato a MIMA ... \n\r");
paologiorgio 2:155d07b145c6 492 }
paologiorgio 2:155d07b145c6 493 else if (config == 1)
paologiorgio 2:155d07b145c6 494 {
paologiorgio 2:155d07b145c6 495 mima.printf("\n\r ... Telecomando inviato a MIMA ... \n\r");
paologiorgio 2:155d07b145c6 496 }
paologiorgio 2:155d07b145c6 497
paologiorgio 2:155d07b145c6 498 // Ripulisci il buffer di ricezione telecomando
paologiorgio 2:155d07b145c6 499 clearBuffer(rx_TLC, sizeof(rx_TLC) / sizeof(char));
paologiorgio 2:155d07b145c6 500 clearBuffer(data_TLC, sizeof(data_TLC) / sizeof(char));
paologiorgio 2:155d07b145c6 501
paologiorgio 2:155d07b145c6 502 if (config == 0)
paologiorgio 2:155d07b145c6 503 {
paologiorgio 2:155d07b145c6 504 spacecraft.printf("\n\r ... Ho ripulito i buffer di ricezione TLC .... \n\r");
paologiorgio 2:155d07b145c6 505 }
paologiorgio 2:155d07b145c6 506 else
paologiorgio 2:155d07b145c6 507 {
paologiorgio 2:155d07b145c6 508 mima.printf("\n\r ... Ho ripulito i buffer di ricezione TLC .... \n\r");
paologiorgio 1:00cee5df0f76 509 }
paologiorgio 2:155d07b145c6 510
paologiorgio 2:155d07b145c6 511 __enable_irq(); // now he's ready to receive new data
paologiorgio 2:155d07b145c6 512
paologiorgio 2:155d07b145c6 513 } // end-if:telecommand
paologiorgio 2:155d07b145c6 514 else if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 2:155d07b145c6 515 {
paologiorgio 2:155d07b145c6 516 rxTlcPtr = 0;
paologiorgio 2:155d07b145c6 517 for (int i = 0; i < packet; i++)
paologiorgio 2:155d07b145c6 518 {
paologiorgio 2:155d07b145c6 519 rx_TLC[i] = '\0';
paologiorgio 2:155d07b145c6 520 data_TLC[i] = '\0';
paologiorgio 2:155d07b145c6 521 }
paologiorgio 2:155d07b145c6 522
paologiorgio 2:155d07b145c6 523 if (config == 0)
paologiorgio 2:155d07b145c6 524 {
paologiorgio 2:155d07b145c6 525 spacecraft.printf(" n\r ... Telecommand RX timeout ... \n\r");
paologiorgio 2:155d07b145c6 526 }
paologiorgio 2:155d07b145c6 527 else if (config == 1)
paologiorgio 2:155d07b145c6 528 {
paologiorgio 2:155d07b145c6 529 mima.printf("\n\r ... Telecommand RX timeout ... \n\r");
paologiorgio 2:155d07b145c6 530 }
paologiorgio 2:155d07b145c6 531 } // end-else-if:telecommand+timeout
paologiorgio 0:8f7c961a5966 532
paologiorgio 2:155d07b145c6 533 // Telemetry
paologiorgio 2:155d07b145c6 534 /* DORA si predispone a ricevere lato mima solo se un comando che non sia
paologiorgio 2:155d07b145c6 535 Spare è stato inviato, onde evitare ritardi (sul prossimo telecomando)
paologiorgio 2:155d07b145c6 536 dovuti a Timeout indesiderati. Sostanzialmente attende due byte
paologiorgio 2:155d07b145c6 537 (ricompone il frame) e li invia a spacecraft all'interno della finestra
paologiorgio 2:155d07b145c6 538 di trasmissione. */
paologiorgio 2:155d07b145c6 539 if ((!Spare) && (TlcSend))
paologiorgio 2:155d07b145c6 540 {
paologiorgio 2:155d07b145c6 541 if ((tlmode_option_1 == 1) && (tlmode_option_2 == 1) && (tlmode_tlm == 0)) // standard telemetry
paologiorgio 2:155d07b145c6 542 {
paologiorgio 2:155d07b145c6 543 clearBuffer(data_TLM, sizeof(data_TLM) / sizeof(char));
paologiorgio 2:155d07b145c6 544
paologiorgio 1:00cee5df0f76 545 rx.start();
paologiorgio 2:155d07b145c6 546 rxTimeStart = rx.read();
paologiorgio 1:00cee5df0f76 547 rxTimeRead = rxTimeStart;
paologiorgio 2:155d07b145c6 548
paologiorgio 2:155d07b145c6 549 while (((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 0:8f7c961a5966 550 {
paologiorgio 2:155d07b145c6 551 if (rxTlmPtr == packet)
paologiorgio 2:155d07b145c6 552 {
paologiorgio 2:155d07b145c6 553 __disable_irq();
paologiorgio 2:155d07b145c6 554 memcpy(data_TLM, rx_TLM, rxTlmPtr);
paologiorgio 2:155d07b145c6 555 rxTlmDataCounter = rxTlmPtr;
paologiorgio 2:155d07b145c6 556 rxTlmPtr = 0;
paologiorgio 2:155d07b145c6 557
paologiorgio 2:155d07b145c6 558 data_TLM[rxTlmDataCounter] = 0;
paologiorgio 2:155d07b145c6 559
paologiorgio 2:155d07b145c6 560 TxTelemetry();
paologiorgio 2:155d07b145c6 561 __enable_irq();
paologiorgio 2:155d07b145c6 562
paologiorgio 2:155d07b145c6 563 // Diagnostic
paologiorgio 2:155d07b145c6 564 if (config == 0)
paologiorgio 2:155d07b145c6 565 {
paologiorgio 2:155d07b145c6 566 spacecraft.printf("\n\r ... Ricevuto Telemetry Standard ... \n\r");
paologiorgio 2:155d07b145c6 567 }
paologiorgio 2:155d07b145c6 568 else if (config == 1)
paologiorgio 2:155d07b145c6 569 {
paologiorgio 2:155d07b145c6 570 mima.printf("\n\r ... Ricevuto Telemetry Standard ... \n\r");
paologiorgio 2:155d07b145c6 571 }
paologiorgio 2:155d07b145c6 572 }
paologiorgio 2:155d07b145c6 573 // update
paologiorgio 1:00cee5df0f76 574 rxTimeRead = rx.read();
paologiorgio 1:00cee5df0f76 575 }
paologiorgio 2:155d07b145c6 576
paologiorgio 1:00cee5df0f76 577 rx.stop();
paologiorgio 1:00cee5df0f76 578
paologiorgio 2:155d07b145c6 579 if ((rxTimeRead - rxTimeStart) >= rxWindow)
paologiorgio 0:8f7c961a5966 580 {
paologiorgio 2:155d07b145c6 581 if (config == 0)
paologiorgio 2:155d07b145c6 582 {
paologiorgio 2:155d07b145c6 583 spacecraft.printf("\n\r ... Scattato il timeout in Telemetry ... \n\r");
paologiorgio 2:155d07b145c6 584 }
paologiorgio 2:155d07b145c6 585 else if (config == 1)
paologiorgio 2:155d07b145c6 586 {
paologiorgio 2:155d07b145c6 587 mima.printf("\n\r ... Scattato il timeout in Telemetry ... \n\r");
paologiorgio 2:155d07b145c6 588 }
paologiorgio 2:155d07b145c6 589
paologiorgio 1:00cee5df0f76 590 rxTlmPtr = 0;
paologiorgio 2:155d07b145c6 591
paologiorgio 1:00cee5df0f76 592 for (int i = 0; i < packet; i++)
paologiorgio 1:00cee5df0f76 593 {
paologiorgio 1:00cee5df0f76 594 rx_TLM[i] = '\0';
paologiorgio 1:00cee5df0f76 595 data_TLM[i] = '\0';
paologiorgio 1:00cee5df0f76 596 }
paologiorgio 2:155d07b145c6 597 } // end-else-if:telecommand-send+timeout
paologiorgio 2:155d07b145c6 598
paologiorgio 1:00cee5df0f76 599 TlcSend = false;
paologiorgio 2:155d07b145c6 600 } // end-if-send-telecommand
paologiorgio 2:155d07b145c6 601 else if ((tlmode_option_1 == 0) && (tlmode_option_2 == 1) && (tlmode_tlm == 1)) // all housekeeping teemetries
paologiorgio 2:155d07b145c6 602 {
paologiorgio 2:155d07b145c6 603 clearBuffer(data_TLMOpt1, sizeof(data_TLMOpt1)/sizeof(char));
paologiorgio 2:155d07b145c6 604
paologiorgio 1:00cee5df0f76 605 rx.start();
paologiorgio 2:155d07b145c6 606 rxTimeStart = rx.read();
paologiorgio 1:00cee5df0f76 607 rxTimeRead = rxTimeStart;
paologiorgio 2:155d07b145c6 608
paologiorgio 2:155d07b145c6 609 while (((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 1:00cee5df0f76 610 {
paologiorgio 2:155d07b145c6 611 if (rxTlmOpt1Ptr == packet)
paologiorgio 2:155d07b145c6 612 {
paologiorgio 2:155d07b145c6 613 __disable_irq();
paologiorgio 2:155d07b145c6 614 memcpy(data_TLMOpt1, rx_TLMOpt1, rxTlmOpt1Ptr);
paologiorgio 2:155d07b145c6 615 rxTlmOpt1DataCounter = rxTlmOpt1Ptr;
paologiorgio 2:155d07b145c6 616 rxTlmOpt1Ptr = 0;
paologiorgio 2:155d07b145c6 617
paologiorgio 2:155d07b145c6 618 data_TLMOpt1[rxTlmOpt1DataCounter] = 0;
paologiorgio 2:155d07b145c6 619
paologiorgio 2:155d07b145c6 620 TxTelemetry();
paologiorgio 2:155d07b145c6 621 __enable_irq();
paologiorgio 2:155d07b145c6 622
paologiorgio 2:155d07b145c6 623 // Diagnostic
paologiorgio 2:155d07b145c6 624 if (config == 0)
paologiorgio 2:155d07b145c6 625 {
paologiorgio 2:155d07b145c6 626 spacecraft.printf("\n\r ... Ricevuto Telemetry Opt 1 ... \n\r");
paologiorgio 2:155d07b145c6 627 }
paologiorgio 2:155d07b145c6 628 else if (config == 1)
paologiorgio 2:155d07b145c6 629 {
paologiorgio 2:155d07b145c6 630 mima.printf("\n\r ... Ricevuto Telemetry Opt 1 ... \n\r");
paologiorgio 2:155d07b145c6 631 }
paologiorgio 2:155d07b145c6 632
paologiorgio 2:155d07b145c6 633 }
paologiorgio 2:155d07b145c6 634 // update
paologiorgio 1:00cee5df0f76 635 rxTimeRead = rx.read();
paologiorgio 0:8f7c961a5966 636 }
paologiorgio 2:155d07b145c6 637
paologiorgio 1:00cee5df0f76 638 rx.stop();
paologiorgio 2:155d07b145c6 639
paologiorgio 2:155d07b145c6 640 if ((rxTimeRead - rxTimeStart) >= rxWindow)
paologiorgio 2:155d07b145c6 641 {
paologiorgio 2:155d07b145c6 642 if (config == 0)
paologiorgio 2:155d07b145c6 643 {
paologiorgio 2:155d07b145c6 644 spacecraft.printf("\n\r ... Scattato il timeout in Telemetry Opt 1 ... \n\r");
paologiorgio 2:155d07b145c6 645 }
paologiorgio 2:155d07b145c6 646 else if (config == 1)
paologiorgio 2:155d07b145c6 647 {
paologiorgio 2:155d07b145c6 648 mima.printf("\n\r ... Scattato il timeout in Telemetry Opt 1 ... \n\r");
paologiorgio 2:155d07b145c6 649 }
paologiorgio 1:00cee5df0f76 650
paologiorgio 1:00cee5df0f76 651 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 652 for (int i = 0; i < packet; i++)
paologiorgio 1:00cee5df0f76 653 {
paologiorgio 1:00cee5df0f76 654 rx_TLMOpt1[i] = '\0';
paologiorgio 1:00cee5df0f76 655 data_TLMOpt1[i] = '\0';
paologiorgio 1:00cee5df0f76 656 }
paologiorgio 2:155d07b145c6 657 } // end-else-if:telecommand-send+timeout
paologiorgio 2:155d07b145c6 658
paologiorgio 1:00cee5df0f76 659 TlcSend = false;
paologiorgio 2:155d07b145c6 660 } // end-else-if-send-telecommand
paologiorgio 2:155d07b145c6 661 else if ((tlmode_option_1 == 1) && (tlmode_option_2 == 0) && (tlmode_tlm == 1)) // all hsk + inteferogram data
paologiorgio 2:155d07b145c6 662 {
paologiorgio 2:155d07b145c6 663 clearBuffer(data_TLMOpt2, sizeof(data_TLMOpt2)/sizeof(char));
paologiorgio 2:155d07b145c6 664
paologiorgio 2:155d07b145c6 665 rx_wide.start();
paologiorgio 2:155d07b145c6 666 rx_wideTimeStart = rx_wide.read();
paologiorgio 2:155d07b145c6 667 rx_wideTimeRead = rx_wideTimeStart;
paologiorgio 2:155d07b145c6 668
paologiorgio 2:155d07b145c6 669 while (((rx_wideTimeRead - rx_wideTimeStart) < rx_wideWindow))
paologiorgio 1:00cee5df0f76 670 {
paologiorgio 2:155d07b145c6 671 if (rxTlmOpt2Ptr == packet)
paologiorgio 2:155d07b145c6 672 {
paologiorgio 2:155d07b145c6 673 __disable_irq();
paologiorgio 2:155d07b145c6 674 memcpy(data_TLMOpt2, rx_TLMOpt2, rxTlmOpt2Ptr);
paologiorgio 2:155d07b145c6 675 rxTlmOpt2DataCounter = rxTlmOpt2Ptr;
paologiorgio 2:155d07b145c6 676 rxTlmOpt2Ptr = 0;
paologiorgio 2:155d07b145c6 677
paologiorgio 2:155d07b145c6 678 data_TLMOpt2[rxTlmOpt2DataCounter] = 0;
paologiorgio 2:155d07b145c6 679
paologiorgio 2:155d07b145c6 680 TxTelemetry();
paologiorgio 2:155d07b145c6 681 __enable_irq();
paologiorgio 2:155d07b145c6 682
paologiorgio 2:155d07b145c6 683 // Diagnostic
paologiorgio 2:155d07b145c6 684 if (config == 0)
paologiorgio 2:155d07b145c6 685 {
paologiorgio 2:155d07b145c6 686 spacecraft.printf("\n\r ... Ricevuto Telemetry Opt 2 ... \n\r");
paologiorgio 2:155d07b145c6 687 }
paologiorgio 2:155d07b145c6 688 else if (config == 1)
paologiorgio 2:155d07b145c6 689 {
paologiorgio 2:155d07b145c6 690 mima.printf("\n\r ... Ricevuto Telemetry Opt 2 ... \n\r");
paologiorgio 2:155d07b145c6 691 }
paologiorgio 2:155d07b145c6 692
paologiorgio 2:155d07b145c6 693 }
paologiorgio 2:155d07b145c6 694 // update
paologiorgio 2:155d07b145c6 695 rx_wideTimeRead = rx_wide.read();
paologiorgio 1:00cee5df0f76 696 }
paologiorgio 2:155d07b145c6 697
paologiorgio 1:00cee5df0f76 698 rx.stop();
paologiorgio 2:155d07b145c6 699
paologiorgio 2:155d07b145c6 700 if ((rx_wideTimeRead - rx_wideTimeStart) >= rx_wideWindow)
paologiorgio 2:155d07b145c6 701 {
paologiorgio 2:155d07b145c6 702 if (config == 0)
paologiorgio 2:155d07b145c6 703 {
paologiorgio 2:155d07b145c6 704 spacecraft.printf("\n\r ... Scattato il timeout in Telemetry Opt 2 ... \n\r");
paologiorgio 2:155d07b145c6 705 }
paologiorgio 2:155d07b145c6 706 else if (config == 1)
paologiorgio 2:155d07b145c6 707 {
paologiorgio 2:155d07b145c6 708 mima.printf("\n\r ... Scattato il timeout in Telemetry Opt 2 ... \n\r");
paologiorgio 2:155d07b145c6 709 }
paologiorgio 1:00cee5df0f76 710
paologiorgio 1:00cee5df0f76 711 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 712 for (int i = 0; i < packet; i++)
paologiorgio 1:00cee5df0f76 713 {
paologiorgio 1:00cee5df0f76 714 rx_TLMOpt2[i] = '\0';
paologiorgio 1:00cee5df0f76 715 data_TLMOpt2[i] = '\0';
paologiorgio 1:00cee5df0f76 716 }
paologiorgio 2:155d07b145c6 717 } // end-else-if:telecommand-send+timeout
paologiorgio 2:155d07b145c6 718
paologiorgio 1:00cee5df0f76 719 TlcSend = false;
paologiorgio 2:155d07b145c6 720 } // end-2nd-else-if-send-telecommand
paologiorgio 2:155d07b145c6 721 }
paologiorgio 2:155d07b145c6 722 } // end-while:true
paologiorgio 1:00cee5df0f76 723
paologiorgio 2:155d07b145c6 724 } // end-Main
paologiorgio 1:00cee5df0f76 725
paologiorgio 2:155d07b145c6 726 /* ************************************************************ */
paologiorgio 2:155d07b145c6 727 /* ******* SYSTEM INTERRPUTS MANAGEMENT AND FUNCTIONS ********* */
paologiorgio 2:155d07b145c6 728 /* ************************************************************ */
paologiorgio 1:00cee5df0f76 729
paologiorgio 1:00cee5df0f76 730 // Interrupt: DORA receives a byte from Spacecraft
paologiorgio 2:155d07b145c6 731 void RxTelecommand(void)
paologiorgio 1:00cee5df0f76 732 {
paologiorgio 1:00cee5df0f76 733 char txChar;
paologiorgio 2:155d07b145c6 734 while (spacecraft.readable())
paologiorgio 2:155d07b145c6 735 {
paologiorgio 1:00cee5df0f76 736 txChar = spacecraft.getc();
paologiorgio 2:155d07b145c6 737
paologiorgio 2:155d07b145c6 738 if (rxTlcPtr < packet)
paologiorgio 2:155d07b145c6 739 {
paologiorgio 2:155d07b145c6 740 rx_TLC[rxTlcPtr++] = txChar;
paologiorgio 2:155d07b145c6 741 }
paologiorgio 1:00cee5df0f76 742 }
paologiorgio 1:00cee5df0f76 743 }
paologiorgio 1:00cee5df0f76 744
paologiorgio 1:00cee5df0f76 745 // Interrupt: DORA receives a byte from MIMA
paologiorgio 2:155d07b145c6 746 void RxTelemetry(void)
paologiorgio 1:00cee5df0f76 747 {
paologiorgio 1:00cee5df0f76 748 char rxChar;
paologiorgio 1:00cee5df0f76 749 while (mima.readable())
paologiorgio 1:00cee5df0f76 750 {
paologiorgio 1:00cee5df0f76 751 rxChar = mima.getc();
paologiorgio 1:00cee5df0f76 752
paologiorgio 1:00cee5df0f76 753 if (tlmode_tlm == 0) // Standard telemetry message
paologiorgio 1:00cee5df0f76 754 {
paologiorgio 1:00cee5df0f76 755 rx_TLM[rxTlmPtr++] = rxChar;
paologiorgio 1:00cee5df0f76 756 }
paologiorgio 1:00cee5df0f76 757 else if (tlmode_option_1 == 0) // TLMODE 1 (all housekeeping telemetries)
paologiorgio 1:00cee5df0f76 758 {
paologiorgio 1:00cee5df0f76 759 rx_TLMOpt1[rxTlmOpt1Ptr++] = rxChar;
paologiorgio 1:00cee5df0f76 760 }
paologiorgio 1:00cee5df0f76 761 else if (tlmode_option_2 == 0) // TLMODE 2 (hsk+scientific data)
paologiorgio 1:00cee5df0f76 762 {
paologiorgio 1:00cee5df0f76 763 rx_TLMOpt2[rxTlmOpt2Ptr++] = rxChar;
paologiorgio 0:8f7c961a5966 764 }
paologiorgio 0:8f7c961a5966 765 }
paologiorgio 0:8f7c961a5966 766 }
paologiorgio 0:8f7c961a5966 767
paologiorgio 1:00cee5df0f76 768 // Once received a full telecommand frame, send it to MIMA
paologiorgio 2:155d07b145c6 769 void TxTelecommand(void)
paologiorgio 0:8f7c961a5966 770 {
paologiorgio 2:155d07b145c6 771 for (int i = 0; i < packet; i++)
paologiorgio 2:155d07b145c6 772 {
paologiorgio 2:155d07b145c6 773 mima.putc(data_TLC[i]);
paologiorgio 2:155d07b145c6 774 }
paologiorgio 2:155d07b145c6 775
paologiorgio 1:00cee5df0f76 776 TlcSend = true;
paologiorgio 0:8f7c961a5966 777 }
paologiorgio 0:8f7c961a5966 778
paologiorgio 1:00cee5df0f76 779 // Once received a full telemetry frame, send it to Spacecraft
paologiorgio 2:155d07b145c6 780 void TxTelemetry(void)
paologiorgio 0:8f7c961a5966 781 {
paologiorgio 1:00cee5df0f76 782 if (tlmode_tlm == 0)
paologiorgio 1:00cee5df0f76 783 {
paologiorgio 2:155d07b145c6 784 for (int i = 0; i < packet; i++)
paologiorgio 2:155d07b145c6 785 {
paologiorgio 2:155d07b145c6 786 spacecraft.putc(data_TLM[i]);
paologiorgio 2:155d07b145c6 787 }
paologiorgio 1:00cee5df0f76 788 }
paologiorgio 1:00cee5df0f76 789 else if (tlmode_option_1 == 0)
paologiorgio 1:00cee5df0f76 790 {
paologiorgio 2:155d07b145c6 791 for (int i = 0; i < packet; i++)
paologiorgio 2:155d07b145c6 792 {
paologiorgio 2:155d07b145c6 793 spacecraft.putc(data_TLMOpt1[i]);
paologiorgio 2:155d07b145c6 794 }
paologiorgio 0:8f7c961a5966 795 }
paologiorgio 0:8f7c961a5966 796 else if (tlmode_option_2 == 0)
paologiorgio 0:8f7c961a5966 797 {
paologiorgio 2:155d07b145c6 798 for (int i = 0; i < packet; i++)
paologiorgio 2:155d07b145c6 799 {
paologiorgio 2:155d07b145c6 800 spacecraft.putc(data_TLMOpt2[i]);
paologiorgio 2:155d07b145c6 801 }
paologiorgio 0:8f7c961a5966 802 }
paologiorgio 0:8f7c961a5966 803 }
paologiorgio 0:8f7c961a5966 804
paologiorgio 1:00cee5df0f76 805 // Reset
paologiorgio 1:00cee5df0f76 806 void clearBuffer(char *arr, int arrLen)
paologiorgio 0:8f7c961a5966 807 {
paologiorgio 1:00cee5df0f76 808 int myIndex;
paologiorgio 1:00cee5df0f76 809 for (myIndex = 0; myIndex < arrLen; myIndex++)
paologiorgio 0:8f7c961a5966 810 {
paologiorgio 2:155d07b145c6 811 arr[myIndex] = '\0'; // terminatore
paologiorgio 0:8f7c961a5966 812 }
paologiorgio 0:8f7c961a5966 813 }