Space / Mbed 2 deprecated DORA_lv

Dependencies:   mbed

Committer:
paologiorgio
Date:
Thu Jun 30 08:34:30 2022 +0000
Revision:
0:8f7c961a5966
Child:
1:00cee5df0f76
DoraV5

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 0:8f7c961a5966 6 #include "tlc_tlm_list.h"
paologiorgio 0:8f7c961a5966 7
paologiorgio 0:8f7c961a5966 8 // Macros
paologiorgio 0:8f7c961a5966 9 #define cmd_num 32
paologiorgio 0:8f7c961a5966 10 #define buf_max_size 512
paologiorgio 0:8f7c961a5966 11 #define tlc_to_tx 16
paologiorgio 0:8f7c961a5966 12 #define tlm_size 16
paologiorgio 0:8f7c961a5966 13 #define tlm_hsk_size 912
paologiorgio 0:8f7c961a5966 14 #define tlm_hsk_sd_size 90608
paologiorgio 0:8f7c961a5966 15 #define identifier_field 5
paologiorgio 0:8f7c961a5966 16 #define max31865_buf_size 13
paologiorgio 0:8f7c961a5966 17 #define channel_size 5
paologiorgio 0:8f7c961a5966 18 #define size 1
paologiorgio 0:8f7c961a5966 19
paologiorgio 0:8f7c961a5966 20 // Serial e periferiche
paologiorgio 0:8f7c961a5966 21 Serial spacecraft(USBTX, USBRX);
paologiorgio 0:8f7c961a5966 22 Serial mima(PC_4, PC_5);
paologiorgio 0:8f7c961a5966 23 Serial max31865(PA_9, PA_10);
paologiorgio 0:8f7c961a5966 24
paologiorgio 0:8f7c961a5966 25 // Buffer
paologiorgio 0:8f7c961a5966 26 volatile int sizeBuffer;
paologiorgio 0:8f7c961a5966 27 int CMD[cmd_num];
paologiorgio 0:8f7c961a5966 28 char TLM[tlm_size];
paologiorgio 0:8f7c961a5966 29 char TLM_HSK[tlm_hsk_size];
paologiorgio 0:8f7c961a5966 30 char TLM_HSK_SD[tlm_hsk_sd_size];
paologiorgio 0:8f7c961a5966 31 char tlc_rx[buf_max_size];
paologiorgio 0:8f7c961a5966 32 char caRxPacket[max31865_buf_size];
paologiorgio 0:8f7c961a5966 33 char tempCH1[channel_size];
paologiorgio 0:8f7c961a5966 34 char tempCH2[channel_size];
paologiorgio 0:8f7c961a5966 35 char CH1_to_string[2*channel_size];
paologiorgio 0:8f7c961a5966 36 char CH2_to_string[2*channel_size];
paologiorgio 0:8f7c961a5966 37
paologiorgio 0:8f7c961a5966 38 // L16 Actuonix - Relay (spare commands)
paologiorgio 0:8f7c961a5966 39 PwmOut M1 (PA_6);
paologiorgio 0:8f7c961a5966 40 PwmOut M2 (PA_8);
paologiorgio 0:8f7c961a5966 41 DigitalOut Relay5V (PA_7);
paologiorgio 0:8f7c961a5966 42 DigitalOut Relay12V (PB_4);
paologiorgio 0:8f7c961a5966 43 DigitalOut Relay24V (PB_5);
paologiorgio 0:8f7c961a5966 44 DigitalOut Relay15_15_5V (PB_10);
paologiorgio 0:8f7c961a5966 45 float offset = 0.0f;
paologiorgio 0:8f7c961a5966 46
paologiorgio 0:8f7c961a5966 47 // Timer
paologiorgio 0:8f7c961a5966 48 Timer timer;
paologiorgio 0:8f7c961a5966 49 float TIMEOUT = 10, tTimeStart, tTimeStop, tTimeRead;
paologiorgio 0:8f7c961a5966 50
paologiorgio 0:8f7c961a5966 51 // Vars definitions
paologiorgio 0:8f7c961a5966 52 int temperature_flag;
paologiorgio 0:8f7c961a5966 53 volatile int payload_to_dec;
paologiorgio 0:8f7c961a5966 54 volatile int tlmode_option_1;
paologiorgio 0:8f7c961a5966 55 volatile int tlmode_option_2;
paologiorgio 0:8f7c961a5966 56 volatile int commandId;
paologiorgio 0:8f7c961a5966 57 volatile int nRxCharCount;
paologiorgio 0:8f7c961a5966 58 volatile int tlc_rx_length;
paologiorgio 0:8f7c961a5966 59 volatile int checkZerosIndex, checkOnesIndex;
paologiorgio 0:8f7c961a5966 60 volatile float CH1, CH2;
paologiorgio 0:8f7c961a5966 61 volatile int increment_read;
paologiorgio 0:8f7c961a5966 62 volatile int indexJ, indexT;
paologiorgio 0:8f7c961a5966 63
paologiorgio 0:8f7c961a5966 64 // Functions
paologiorgio 0:8f7c961a5966 65 void RxTelecommand();
paologiorgio 0:8f7c961a5966 66 void TxTelecommand();
paologiorgio 0:8f7c961a5966 67 void RxTelemetry();
paologiorgio 0:8f7c961a5966 68 void TxTelemetry();
paologiorgio 0:8f7c961a5966 69 void TxTemperature();
paologiorgio 0:8f7c961a5966 70 void RxTemperature();
paologiorgio 0:8f7c961a5966 71 void SpareCommand(int command);
paologiorgio 0:8f7c961a5966 72 void printMyArray(Telecommand *myArray);
paologiorgio 0:8f7c961a5966 73 void clearBuffer(char *arr, int arrLen);
paologiorgio 0:8f7c961a5966 74 void checksum_tlc(Telecommand *toCheck_tlc);
paologiorgio 0:8f7c961a5966 75 void checksum_tlm(Telemetry *toCheck_tlm);
paologiorgio 0:8f7c961a5966 76 int BinToDec(int t, int dim, char *a);
paologiorgio 0:8f7c961a5966 77
paologiorgio 0:8f7c961a5966 78 // Main
paologiorgio 0:8f7c961a5966 79 int main()
paologiorgio 0:8f7c961a5966 80 {
paologiorgio 0:8f7c961a5966 81 // Baudrate
paologiorgio 0:8f7c961a5966 82 spacecraft.baud(115200);
paologiorgio 0:8f7c961a5966 83 mima.baud(9600);
paologiorgio 0:8f7c961a5966 84 max31865.baud(115200);
paologiorgio 0:8f7c961a5966 85
paologiorgio 0:8f7c961a5966 86 // Interrupts
paologiorgio 0:8f7c961a5966 87 spacecraft.attach(&RxTelecommand, Serial::RxIrq);
paologiorgio 0:8f7c961a5966 88 //max31865.attach(&RxTemperature, Serial::RxIrq);
paologiorgio 0:8f7c961a5966 89
paologiorgio 0:8f7c961a5966 90 while (true)
paologiorgio 0:8f7c961a5966 91 {
paologiorgio 0:8f7c961a5966 92 /**********************************************************************
paologiorgio 0:8f7c961a5966 93 RICEZIONE DEI DATI DI TEMPERATURA
paologiorgio 0:8f7c961a5966 94 **********************************************************************/
paologiorgio 0:8f7c961a5966 95
paologiorgio 0:8f7c961a5966 96 if ((commandId == 0) && (payload_to_dec == 32) && (temperature_flag == 1))
paologiorgio 0:8f7c961a5966 97 {
paologiorgio 0:8f7c961a5966 98 TxTemperature();
paologiorgio 0:8f7c961a5966 99 increment_read++;
paologiorgio 0:8f7c961a5966 100
paologiorgio 0:8f7c961a5966 101 if (increment_read == 40)
paologiorgio 0:8f7c961a5966 102 {
paologiorgio 0:8f7c961a5966 103 temperature_flag = 0;
paologiorgio 0:8f7c961a5966 104 }
paologiorgio 0:8f7c961a5966 105 }
paologiorgio 0:8f7c961a5966 106
paologiorgio 0:8f7c961a5966 107 /**********************************************************************
paologiorgio 0:8f7c961a5966 108 RICEZIONE DI TELEMETRIE DA MIMA
paologiorgio 0:8f7c961a5966 109 **********************************************************************/
paologiorgio 0:8f7c961a5966 110
paologiorgio 0:8f7c961a5966 111 // Scrittura del telecomando
paologiorgio 0:8f7c961a5966 112 cmd00[(size-1)].PAYLOAD = "00000000";
paologiorgio 0:8f7c961a5966 113 if (cmd00[(size-1)].PAYLOAD != '\0')
paologiorgio 0:8f7c961a5966 114 {
paologiorgio 0:8f7c961a5966 115 checksum_tlc(&cmd00[(size-1)]);
paologiorgio 0:8f7c961a5966 116 printMyArray(&cmd00[(size-1)]);
paologiorgio 0:8f7c961a5966 117 }
paologiorgio 0:8f7c961a5966 118
paologiorgio 0:8f7c961a5966 119 // In arrivo da periferica mima
paologiorgio 0:8f7c961a5966 120 sizeBuffer = 0; // reset
paologiorgio 0:8f7c961a5966 121 clearBuffer(TLM, sizeof(TLM)/sizeof(TLM[0]));
paologiorgio 0:8f7c961a5966 122 clearBuffer(TLM_HSK, sizeof(TLM_HSK)/sizeof(TLM_HSK[0]));
paologiorgio 0:8f7c961a5966 123 clearBuffer(TLM_HSK_SD, sizeof(TLM_HSK_SD)/sizeof(TLM_HSK_SD[0]));
paologiorgio 0:8f7c961a5966 124
paologiorgio 0:8f7c961a5966 125 timer.start();
paologiorgio 0:8f7c961a5966 126 tTimeStart = timer.read();
paologiorgio 0:8f7c961a5966 127 tTimeRead = tTimeStart;
paologiorgio 0:8f7c961a5966 128
paologiorgio 0:8f7c961a5966 129 // Interrupt: entra nella routine quando riceve dalla seriale
paologiorgio 0:8f7c961a5966 130 mima.attach(&RxTelemetry, Serial::RxIrq);
paologiorgio 0:8f7c961a5966 131
paologiorgio 0:8f7c961a5966 132 // Diagnostica del pacchetto ricevuto
paologiorgio 0:8f7c961a5966 133 if (commandId == 5)
paologiorgio 0:8f7c961a5966 134 {
paologiorgio 0:8f7c961a5966 135 /* Ricezione di tutte le telemetrie. 57 parole da 16 bit contenenti
paologiorgio 0:8f7c961a5966 136 tutte le telemetrie di tipo HOUSEKEEPING. */
paologiorgio 0:8f7c961a5966 137 if (tlmode_option_1 == 0)
paologiorgio 0:8f7c961a5966 138 {
paologiorgio 0:8f7c961a5966 139 while ((sizeBuffer < tlm_hsk_size) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 0:8f7c961a5966 140 {
paologiorgio 0:8f7c961a5966 141 tTimeRead = timer.read();
paologiorgio 0:8f7c961a5966 142 }
paologiorgio 0:8f7c961a5966 143
paologiorgio 0:8f7c961a5966 144 timer.stop();
paologiorgio 0:8f7c961a5966 145
paologiorgio 0:8f7c961a5966 146 if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 0:8f7c961a5966 147 {
paologiorgio 0:8f7c961a5966 148 sizeBuffer = 0;
paologiorgio 0:8f7c961a5966 149 clearBuffer(TLM_HSK, tlm_hsk_size);
paologiorgio 0:8f7c961a5966 150 }
paologiorgio 0:8f7c961a5966 151 else
paologiorgio 0:8f7c961a5966 152 {
paologiorgio 0:8f7c961a5966 153 TxTelemetry();
paologiorgio 0:8f7c961a5966 154 }
paologiorgio 0:8f7c961a5966 155 }
paologiorgio 0:8f7c961a5966 156 /* Ricezione di tutte le telemetrie e dati scientifici
paologiorgio 0:8f7c961a5966 157 5663 parole da 16 bit così strutturate: 57 HSKP data packets,
paologiorgio 0:8f7c961a5966 158 5606 di scientific data dell'interferometro su MIMA, */
paologiorgio 0:8f7c961a5966 159 else if (tlmode_option_2 == 0)
paologiorgio 0:8f7c961a5966 160 {
paologiorgio 0:8f7c961a5966 161 while ((sizeBuffer < tlm_hsk_sd_size) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 0:8f7c961a5966 162 {
paologiorgio 0:8f7c961a5966 163 tTimeRead = timer.read();
paologiorgio 0:8f7c961a5966 164 }
paologiorgio 0:8f7c961a5966 165
paologiorgio 0:8f7c961a5966 166 timer.stop();
paologiorgio 0:8f7c961a5966 167
paologiorgio 0:8f7c961a5966 168 if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 0:8f7c961a5966 169 {
paologiorgio 0:8f7c961a5966 170 sizeBuffer = 0;
paologiorgio 0:8f7c961a5966 171 clearBuffer(TLM_HSK_SD, tlm_hsk_sd_size);
paologiorgio 0:8f7c961a5966 172 }
paologiorgio 0:8f7c961a5966 173 else
paologiorgio 0:8f7c961a5966 174 {
paologiorgio 0:8f7c961a5966 175 TxTelemetry();
paologiorgio 0:8f7c961a5966 176 }
paologiorgio 0:8f7c961a5966 177 }
paologiorgio 0:8f7c961a5966 178 }
paologiorgio 0:8f7c961a5966 179 /* Ricezione di un dato di telemetria da 16 bit. */
paologiorgio 0:8f7c961a5966 180 else
paologiorgio 0:8f7c961a5966 181 {
paologiorgio 0:8f7c961a5966 182 while ((sizeBuffer < tlm_size) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 0:8f7c961a5966 183 {
paologiorgio 0:8f7c961a5966 184 tTimeRead = timer.read();
paologiorgio 0:8f7c961a5966 185 }
paologiorgio 0:8f7c961a5966 186
paologiorgio 0:8f7c961a5966 187 timer.stop();
paologiorgio 0:8f7c961a5966 188
paologiorgio 0:8f7c961a5966 189 if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 0:8f7c961a5966 190 {
paologiorgio 0:8f7c961a5966 191 sizeBuffer = 0;
paologiorgio 0:8f7c961a5966 192 clearBuffer(TLM, tlm_size);
paologiorgio 0:8f7c961a5966 193 }
paologiorgio 0:8f7c961a5966 194 else
paologiorgio 0:8f7c961a5966 195 {
paologiorgio 0:8f7c961a5966 196 TxTelemetry();
paologiorgio 0:8f7c961a5966 197 }
paologiorgio 0:8f7c961a5966 198 }
paologiorgio 0:8f7c961a5966 199 }
paologiorgio 0:8f7c961a5966 200 }
paologiorgio 0:8f7c961a5966 201
paologiorgio 0:8f7c961a5966 202
paologiorgio 0:8f7c961a5966 203 /* Gestione delle routine di ricezione e trasmissione del driver */
paologiorgio 0:8f7c961a5966 204
paologiorgio 0:8f7c961a5966 205 // DORA riceve telecomando da Space/craft
paologiorgio 0:8f7c961a5966 206 void RxTelecommand()
paologiorgio 0:8f7c961a5966 207 {
paologiorgio 0:8f7c961a5966 208 while (spacecraft.readable())
paologiorgio 0:8f7c961a5966 209 {
paologiorgio 0:8f7c961a5966 210 clearBuffer(tlc_rx, sizeof(tlc_rx) / sizeof(tlc_rx[0]));
paologiorgio 0:8f7c961a5966 211 spacecraft.gets(tlc_rx, sizeof(tlc_rx));
paologiorgio 0:8f7c961a5966 212 tlc_rx_length = strlen(tlc_rx) - 2; // rimozione tag di NR
paologiorgio 0:8f7c961a5966 213
paologiorgio 0:8f7c961a5966 214 if (tlc_rx_length == tlc_to_tx)
paologiorgio 0:8f7c961a5966 215 {
paologiorgio 0:8f7c961a5966 216 int bit_B0 = 0, bit_B7 = 7, k = 0;
paologiorgio 0:8f7c961a5966 217 commandId = 0; // init
paologiorgio 0:8f7c961a5966 218 payload_to_dec = 0; // init
paologiorgio 0:8f7c961a5966 219
paologiorgio 0:8f7c961a5966 220 commandId = BinToDec(bit_B0, identifier_field, tlc_rx);
paologiorgio 0:8f7c961a5966 221 payload_to_dec = BinToDec(bit_B7, (tlc_to_tx - 1), tlc_rx);
paologiorgio 0:8f7c961a5966 222
paologiorgio 0:8f7c961a5966 223 k = commandId;
paologiorgio 0:8f7c961a5966 224
paologiorgio 0:8f7c961a5966 225 if (k == 2 || k == 15 || k == 30)
paologiorgio 0:8f7c961a5966 226 {
paologiorgio 0:8f7c961a5966 227 // Spare
paologiorgio 0:8f7c961a5966 228 break;
paologiorgio 0:8f7c961a5966 229 }
paologiorgio 0:8f7c961a5966 230
paologiorgio 0:8f7c961a5966 231 /* Gestiione della lettura della temperatura */
paologiorgio 0:8f7c961a5966 232 else if ((k == 0) && (tlc_rx[5] == '0') && (tlc_rx[6] == '0') && (payload_to_dec == 32))
paologiorgio 0:8f7c961a5966 233 {
paologiorgio 0:8f7c961a5966 234 temperature_flag = 1;
paologiorgio 0:8f7c961a5966 235 break;
paologiorgio 0:8f7c961a5966 236 }
paologiorgio 0:8f7c961a5966 237
paologiorgio 0:8f7c961a5966 238 /* Gestione delle perifieriche HW: relay, attuatori, alimentazione */
paologiorgio 0:8f7c961a5966 239 else if ((k == 0) && (tlc_rx[5] == '0') && (tlc_rx[6] == '0'))
paologiorgio 0:8f7c961a5966 240 {
paologiorgio 0:8f7c961a5966 241 //SpareCommand(payload_to_dec);
paologiorgio 0:8f7c961a5966 242 break;
paologiorgio 0:8f7c961a5966 243 }
paologiorgio 0:8f7c961a5966 244 else if (k == 5)
paologiorgio 0:8f7c961a5966 245 {
paologiorgio 0:8f7c961a5966 246 /* Istruzione che serve a scorrere il Payload e a settare un determinato flag
paologiorgio 0:8f7c961a5966 247 per consentire a DORA di aprire o meno determinati canali di comunicazione
paologiorgio 0:8f7c961a5966 248 (buffer da riempire). */
paologiorgio 0:8f7c961a5966 249 checkZerosIndex = bit_B7;
paologiorgio 0:8f7c961a5966 250
paologiorgio 0:8f7c961a5966 251 while (checkZerosIndex < tlc_to_tx)
paologiorgio 0:8f7c961a5966 252 {
paologiorgio 0:8f7c961a5966 253 if (tlc_rx[checkZerosIndex] == '0')
paologiorgio 0:8f7c961a5966 254 {
paologiorgio 0:8f7c961a5966 255 tlmode_option_1 = 0;
paologiorgio 0:8f7c961a5966 256 checkZerosIndex++;
paologiorgio 0:8f7c961a5966 257 }
paologiorgio 0:8f7c961a5966 258 else
paologiorgio 0:8f7c961a5966 259 {
paologiorgio 0:8f7c961a5966 260 tlmode_option_1 = 1;
paologiorgio 0:8f7c961a5966 261 break;
paologiorgio 0:8f7c961a5966 262 }
paologiorgio 0:8f7c961a5966 263 }
paologiorgio 0:8f7c961a5966 264
paologiorgio 0:8f7c961a5966 265 checkOnesIndex = bit_B7;
paologiorgio 0:8f7c961a5966 266 while (checkOnesIndex < tlc_to_tx)
paologiorgio 0:8f7c961a5966 267 {
paologiorgio 0:8f7c961a5966 268 if (tlc_rx[checkOnesIndex] == '1')
paologiorgio 0:8f7c961a5966 269 {
paologiorgio 0:8f7c961a5966 270 tlmode_option_2 = 0;
paologiorgio 0:8f7c961a5966 271 checkOnesIndex++;
paologiorgio 0:8f7c961a5966 272 }
paologiorgio 0:8f7c961a5966 273 else
paologiorgio 0:8f7c961a5966 274 {
paologiorgio 0:8f7c961a5966 275 tlmode_option_2 = 1;
paologiorgio 0:8f7c961a5966 276 break;
paologiorgio 0:8f7c961a5966 277 }
paologiorgio 0:8f7c961a5966 278 }
paologiorgio 0:8f7c961a5966 279 }
paologiorgio 0:8f7c961a5966 280 }
paologiorgio 0:8f7c961a5966 281 TxTelecommand();
paologiorgio 0:8f7c961a5966 282 }
paologiorgio 0:8f7c961a5966 283 }
paologiorgio 0:8f7c961a5966 284
paologiorgio 0:8f7c961a5966 285 // Trasmetti il pacchetto
paologiorgio 0:8f7c961a5966 286 void TxTelecommand()
paologiorgio 0:8f7c961a5966 287 {
paologiorgio 0:8f7c961a5966 288 for (int i = 0; i < tlc_to_tx + 1; i++)
paologiorgio 0:8f7c961a5966 289 {
paologiorgio 0:8f7c961a5966 290 mima.putc(tlc_rx[i]);
paologiorgio 0:8f7c961a5966 291 }
paologiorgio 0:8f7c961a5966 292 }
paologiorgio 0:8f7c961a5966 293
paologiorgio 0:8f7c961a5966 294 // Riceve dalla seriale mima
paologiorgio 0:8f7c961a5966 295 void RxTelemetry()
paologiorgio 0:8f7c961a5966 296 {
paologiorgio 0:8f7c961a5966 297 char data;
paologiorgio 0:8f7c961a5966 298
paologiorgio 0:8f7c961a5966 299 while((mima.readable()))
paologiorgio 0:8f7c961a5966 300 {
paologiorgio 0:8f7c961a5966 301 data = mima.getc();
paologiorgio 0:8f7c961a5966 302
paologiorgio 0:8f7c961a5966 303 if (tlmode_option_1 == 0)
paologiorgio 0:8f7c961a5966 304 {
paologiorgio 0:8f7c961a5966 305 TLM_HSK[sizeBuffer++] = data;
paologiorgio 0:8f7c961a5966 306 }
paologiorgio 0:8f7c961a5966 307 else if (tlmode_option_2 == 0)
paologiorgio 0:8f7c961a5966 308 {
paologiorgio 0:8f7c961a5966 309 TLM_HSK_SD[sizeBuffer++] = data;
paologiorgio 0:8f7c961a5966 310 }
paologiorgio 0:8f7c961a5966 311 else
paologiorgio 0:8f7c961a5966 312 {
paologiorgio 0:8f7c961a5966 313 TLM[sizeBuffer++] = data;
paologiorgio 0:8f7c961a5966 314 }
paologiorgio 0:8f7c961a5966 315
paologiorgio 0:8f7c961a5966 316 }
paologiorgio 0:8f7c961a5966 317 }
paologiorgio 0:8f7c961a5966 318
paologiorgio 0:8f7c961a5966 319 // Dora trasmette il pacchetto allo space/craft
paologiorgio 0:8f7c961a5966 320 void TxTelemetry()
paologiorgio 0:8f7c961a5966 321 {
paologiorgio 0:8f7c961a5966 322 if (tlmode_option_1 == 0)
paologiorgio 0:8f7c961a5966 323 {
paologiorgio 0:8f7c961a5966 324 for (int i = 0; i < tlm_hsk_size; i++)
paologiorgio 0:8f7c961a5966 325 {
paologiorgio 0:8f7c961a5966 326 spacecraft.putc(TLM_HSK[i]);
paologiorgio 0:8f7c961a5966 327 }
paologiorgio 0:8f7c961a5966 328 }
paologiorgio 0:8f7c961a5966 329 else if (tlmode_option_2 == 0)
paologiorgio 0:8f7c961a5966 330 {
paologiorgio 0:8f7c961a5966 331 for (int i = 0; i < tlm_hsk_sd_size; i++)
paologiorgio 0:8f7c961a5966 332 {
paologiorgio 0:8f7c961a5966 333 spacecraft.putc(TLM_HSK_SD[i]);
paologiorgio 0:8f7c961a5966 334 }
paologiorgio 0:8f7c961a5966 335 }
paologiorgio 0:8f7c961a5966 336 else
paologiorgio 0:8f7c961a5966 337 {
paologiorgio 0:8f7c961a5966 338 for (int i = 0; i < tlm_size; i++)
paologiorgio 0:8f7c961a5966 339 {
paologiorgio 0:8f7c961a5966 340 spacecraft.putc(TLM[i]);
paologiorgio 0:8f7c961a5966 341 }
paologiorgio 0:8f7c961a5966 342 }
paologiorgio 0:8f7c961a5966 343
paologiorgio 0:8f7c961a5966 344 }
paologiorgio 0:8f7c961a5966 345
paologiorgio 0:8f7c961a5966 346 /* Routines dedicate alla ricezione di dati della temperatura (Pt100) */
paologiorgio 0:8f7c961a5966 347
paologiorgio 0:8f7c961a5966 348 void RxTemperature()
paologiorgio 0:8f7c961a5966 349 {
paologiorgio 0:8f7c961a5966 350 char cReadChar;
paologiorgio 0:8f7c961a5966 351
paologiorgio 0:8f7c961a5966 352 while((max31865.readable()))
paologiorgio 0:8f7c961a5966 353 {
paologiorgio 0:8f7c961a5966 354 cReadChar = max31865.getc();
paologiorgio 0:8f7c961a5966 355 nRxCharCount++;
paologiorgio 0:8f7c961a5966 356 caRxPacket[nRxCharCount] = cReadChar;
paologiorgio 0:8f7c961a5966 357 }
paologiorgio 0:8f7c961a5966 358 }
paologiorgio 0:8f7c961a5966 359
paologiorgio 0:8f7c961a5966 360 void TxTemperature(void)
paologiorgio 0:8f7c961a5966 361 {
paologiorgio 0:8f7c961a5966 362 nRxCharCount = 0; // reset dell'indice del buffer
paologiorgio 0:8f7c961a5966 363
paologiorgio 0:8f7c961a5966 364 int y = 0, u = 0; // indici dei buffer temporanei per i due canali
paologiorgio 0:8f7c961a5966 365
paologiorgio 0:8f7c961a5966 366 for (int i = 0; i < max31865_buf_size; i++)
paologiorgio 0:8f7c961a5966 367 {
paologiorgio 0:8f7c961a5966 368 if (caRxPacket[i] == 'S')
paologiorgio 0:8f7c961a5966 369 {
paologiorgio 0:8f7c961a5966 370 indexJ = i + 1;
paologiorgio 0:8f7c961a5966 371
paologiorgio 0:8f7c961a5966 372 while (indexJ < max31865_buf_size)
paologiorgio 0:8f7c961a5966 373 {
paologiorgio 0:8f7c961a5966 374 if (caRxPacket[indexJ] == ';')
paologiorgio 0:8f7c961a5966 375 {
paologiorgio 0:8f7c961a5966 376 break;
paologiorgio 0:8f7c961a5966 377 }
paologiorgio 0:8f7c961a5966 378 else
paologiorgio 0:8f7c961a5966 379 {
paologiorgio 0:8f7c961a5966 380 tempCH1[y++] = caRxPacket[indexJ];
paologiorgio 0:8f7c961a5966 381 }
paologiorgio 0:8f7c961a5966 382
paologiorgio 0:8f7c961a5966 383 indexJ++;
paologiorgio 0:8f7c961a5966 384 } // se trova ; esce dall'istruzione e salva il valore di uscita dell'indice
paologiorgio 0:8f7c961a5966 385
paologiorgio 0:8f7c961a5966 386 indexT = indexJ + 1;
paologiorgio 0:8f7c961a5966 387
paologiorgio 0:8f7c961a5966 388 while (indexT < max31865_buf_size)
paologiorgio 0:8f7c961a5966 389 {
paologiorgio 0:8f7c961a5966 390 if (caRxPacket[indexT] == 'P')
paologiorgio 0:8f7c961a5966 391 {
paologiorgio 0:8f7c961a5966 392 break;
paologiorgio 0:8f7c961a5966 393 }
paologiorgio 0:8f7c961a5966 394 else
paologiorgio 0:8f7c961a5966 395 {
paologiorgio 0:8f7c961a5966 396 tempCH2[u++] = caRxPacket[indexT];
paologiorgio 0:8f7c961a5966 397 }
paologiorgio 0:8f7c961a5966 398
paologiorgio 0:8f7c961a5966 399 indexT++;
paologiorgio 0:8f7c961a5966 400 }
paologiorgio 0:8f7c961a5966 401
paologiorgio 0:8f7c961a5966 402 // trasforma il dato da sequenza di caratteri a numero float utile per analisi
paologiorgio 0:8f7c961a5966 403
paologiorgio 0:8f7c961a5966 404 strcpy(CH1_to_string, tempCH1);
paologiorgio 0:8f7c961a5966 405 CH1 = atof(CH1_to_string);
paologiorgio 0:8f7c961a5966 406
paologiorgio 0:8f7c961a5966 407 strcpy(CH2_to_string, tempCH2);
paologiorgio 0:8f7c961a5966 408 CH2 = atof(CH2_to_string);
paologiorgio 0:8f7c961a5966 409
paologiorgio 0:8f7c961a5966 410 spacecraft.printf("> TEMPERATURE - CH1: %4.8f[Celsius], CH2: %4.8f[Celsius]\n\r", CH1, CH2);
paologiorgio 0:8f7c961a5966 411
paologiorgio 0:8f7c961a5966 412 break;
paologiorgio 0:8f7c961a5966 413 }
paologiorgio 0:8f7c961a5966 414 }
paologiorgio 0:8f7c961a5966 415
paologiorgio 0:8f7c961a5966 416 wait_ms(150); // pausa per garantire sincronizzazione tra riempimento buffer e svuotamento
paologiorgio 0:8f7c961a5966 417 }
paologiorgio 0:8f7c961a5966 418
paologiorgio 0:8f7c961a5966 419 /* Comandi spare/not used */
paologiorgio 0:8f7c961a5966 420
paologiorgio 0:8f7c961a5966 421 void SpareCommand(int command) // Spare command (Relay, L16)
paologiorgio 0:8f7c961a5966 422 {
paologiorgio 0:8f7c961a5966 423 if((command == 128) && (offset < 1.0f))
paologiorgio 0:8f7c961a5966 424 {
paologiorgio 0:8f7c961a5966 425 offset += 0.2f;
paologiorgio 0:8f7c961a5966 426 M1.write(offset);
paologiorgio 0:8f7c961a5966 427 M2.write(offset);
paologiorgio 0:8f7c961a5966 428 spacecraft.printf("> Duty Cycle %.2f / estensione \n\r", offset);
paologiorgio 0:8f7c961a5966 429 }
paologiorgio 0:8f7c961a5966 430 else if((command == 64) && (offset > 0.0f))
paologiorgio 0:8f7c961a5966 431 {
paologiorgio 0:8f7c961a5966 432 offset -= 0.2f;
paologiorgio 0:8f7c961a5966 433 M1.write(offset);
paologiorgio 0:8f7c961a5966 434 M2.write(offset);
paologiorgio 0:8f7c961a5966 435 spacecraft.printf("> Duty Cycle %.2f / estensione \n\r", offset);
paologiorgio 0:8f7c961a5966 436 }
paologiorgio 0:8f7c961a5966 437 else if (command == 1)
paologiorgio 0:8f7c961a5966 438 {
paologiorgio 0:8f7c961a5966 439 Relay5V = 0;
paologiorgio 0:8f7c961a5966 440 spacecraft.printf("\r\nRelay 5V ON\r\n");
paologiorgio 0:8f7c961a5966 441 }
paologiorgio 0:8f7c961a5966 442 else if (command == 0)
paologiorgio 0:8f7c961a5966 443 {
paologiorgio 0:8f7c961a5966 444 Relay5V = 1;
paologiorgio 0:8f7c961a5966 445 spacecraft.printf("\r\nRelay 5V OFF\r\n");
paologiorgio 0:8f7c961a5966 446 }
paologiorgio 0:8f7c961a5966 447 else if (command == 3)
paologiorgio 0:8f7c961a5966 448 {
paologiorgio 0:8f7c961a5966 449 Relay12V = 0;
paologiorgio 0:8f7c961a5966 450 spacecraft.printf("\r\nRelay 12V ON\r\n");
paologiorgio 0:8f7c961a5966 451 }
paologiorgio 0:8f7c961a5966 452 else if (command == 2)
paologiorgio 0:8f7c961a5966 453 {
paologiorgio 0:8f7c961a5966 454 Relay12V = 1;
paologiorgio 0:8f7c961a5966 455 spacecraft.printf("\r\nRelay 12V OFF\r\n");
paologiorgio 0:8f7c961a5966 456 }
paologiorgio 0:8f7c961a5966 457 else if (command == 7)
paologiorgio 0:8f7c961a5966 458 {
paologiorgio 0:8f7c961a5966 459 Relay15_15_5V = 0;
paologiorgio 0:8f7c961a5966 460 spacecraft.printf("\r\nRelay +15V, -15V, -5V ON\r\n");
paologiorgio 0:8f7c961a5966 461 }
paologiorgio 0:8f7c961a5966 462 else if (command == 6)
paologiorgio 0:8f7c961a5966 463 {
paologiorgio 0:8f7c961a5966 464 Relay15_15_5V = 1;
paologiorgio 0:8f7c961a5966 465 spacecraft.printf("\r\nRelay +15V, -15V, -5V OFF\r\n");
paologiorgio 0:8f7c961a5966 466 }
paologiorgio 0:8f7c961a5966 467 else if (command == 15)
paologiorgio 0:8f7c961a5966 468 {
paologiorgio 0:8f7c961a5966 469 Relay24V = 0;
paologiorgio 0:8f7c961a5966 470 spacecraft.printf("\r\nRelay 24V ON\r\n");
paologiorgio 0:8f7c961a5966 471 }
paologiorgio 0:8f7c961a5966 472 else if (command == 8)
paologiorgio 0:8f7c961a5966 473 {
paologiorgio 0:8f7c961a5966 474 Relay24V = 1;
paologiorgio 0:8f7c961a5966 475 spacecraft.printf("\r\nRelay 24V OFF\r\n");
paologiorgio 0:8f7c961a5966 476 }
paologiorgio 0:8f7c961a5966 477 else if (command == 255)
paologiorgio 0:8f7c961a5966 478 {
paologiorgio 0:8f7c961a5966 479 Relay5V = 1;
paologiorgio 0:8f7c961a5966 480 Relay12V = 1;
paologiorgio 0:8f7c961a5966 481 Relay15_15_5V = 1; // +15, -15, -5
paologiorgio 0:8f7c961a5966 482 Relay24V = 1;
paologiorgio 0:8f7c961a5966 483 offset = 0.0f;
paologiorgio 0:8f7c961a5966 484
paologiorgio 0:8f7c961a5966 485 spacecraft.printf("**** SHUTTING DOWN ALL RELAYS... ****\n\r");
paologiorgio 0:8f7c961a5966 486 M1.write(offset);
paologiorgio 0:8f7c961a5966 487 M2.write(offset);
paologiorgio 0:8f7c961a5966 488 spacecraft.printf("> Duty Cycle %.2f / extension \n\r", offset);
paologiorgio 0:8f7c961a5966 489 }
paologiorgio 0:8f7c961a5966 490 else if ((command == 128) || (command == 64) && (Relay12V == 1))
paologiorgio 0:8f7c961a5966 491 {
paologiorgio 0:8f7c961a5966 492 offset = 0.0f;
paologiorgio 0:8f7c961a5966 493 M1.write(offset);
paologiorgio 0:8f7c961a5966 494 M2.write(offset);
paologiorgio 0:8f7c961a5966 495 }
paologiorgio 0:8f7c961a5966 496 }
paologiorgio 0:8f7c961a5966 497
paologiorgio 0:8f7c961a5966 498 /* Funzionalità di sistema */
paologiorgio 0:8f7c961a5966 499
paologiorgio 0:8f7c961a5966 500 // Funzione che serve a ripulire un buffer di caratteri
paologiorgio 0:8f7c961a5966 501 void clearBuffer(char *arr, int arrLen)
paologiorgio 0:8f7c961a5966 502 {
paologiorgio 0:8f7c961a5966 503 int nIndex;
paologiorgio 0:8f7c961a5966 504
paologiorgio 0:8f7c961a5966 505 for (nIndex = 0; nIndex < arrLen; nIndex++)
paologiorgio 0:8f7c961a5966 506 {
paologiorgio 0:8f7c961a5966 507 arr[nIndex] = '\0';
paologiorgio 0:8f7c961a5966 508 }
paologiorgio 0:8f7c961a5966 509 }
paologiorgio 0:8f7c961a5966 510
paologiorgio 0:8f7c961a5966 511 // Inizializzazione del set di identificativi dello Spacecraft
paologiorgio 0:8f7c961a5966 512 void CMD_REF()
paologiorgio 0:8f7c961a5966 513 {
paologiorgio 0:8f7c961a5966 514 int id = 0;
paologiorgio 0:8f7c961a5966 515
paologiorgio 0:8f7c961a5966 516 for (int i = 0; i < cmd_num; i++)
paologiorgio 0:8f7c961a5966 517 {
paologiorgio 0:8f7c961a5966 518 CMD[id++] = i;
paologiorgio 0:8f7c961a5966 519 }
paologiorgio 0:8f7c961a5966 520 }
paologiorgio 0:8f7c961a5966 521
paologiorgio 0:8f7c961a5966 522 // Trasformazione da binario a decimale per una sequenza di bit in un array
paologiorgio 0:8f7c961a5966 523 int BinToDec(int t, int dim, char *a)
paologiorgio 0:8f7c961a5966 524 {
paologiorgio 0:8f7c961a5966 525 volatile int result = 0;
paologiorgio 0:8f7c961a5966 526
paologiorgio 0:8f7c961a5966 527 while (t < dim)
paologiorgio 0:8f7c961a5966 528 {
paologiorgio 0:8f7c961a5966 529 if (a[t] == '1')
paologiorgio 0:8f7c961a5966 530 {
paologiorgio 0:8f7c961a5966 531 int raise = dim - 1 - t;
paologiorgio 0:8f7c961a5966 532 result += pow((float) 2, (float) raise);
paologiorgio 0:8f7c961a5966 533 }
paologiorgio 0:8f7c961a5966 534 else
paologiorgio 0:8f7c961a5966 535 {
paologiorgio 0:8f7c961a5966 536 result += 0;
paologiorgio 0:8f7c961a5966 537 }
paologiorgio 0:8f7c961a5966 538 t++;
paologiorgio 0:8f7c961a5966 539 }
paologiorgio 0:8f7c961a5966 540 return result;
paologiorgio 0:8f7c961a5966 541 }
paologiorgio 0:8f7c961a5966 542
paologiorgio 0:8f7c961a5966 543 // Print
paologiorgio 0:8f7c961a5966 544 void printMyArray(Telecommand *myArray)
paologiorgio 0:8f7c961a5966 545 {
paologiorgio 0:8f7c961a5966 546 for (int i = 0; i < sizeof(myArray)/sizeof(myArray[0]); i++)
paologiorgio 0:8f7c961a5966 547 {
paologiorgio 0:8f7c961a5966 548 mima.puts(myArray[i].ID);
paologiorgio 0:8f7c961a5966 549 mima.puts(myArray[i].TAG);
paologiorgio 0:8f7c961a5966 550 mima.puts(myArray[i].PAYLOAD);
paologiorgio 0:8f7c961a5966 551 mima.putc(myArray[i].LSB);
paologiorgio 0:8f7c961a5966 552
paologiorgio 0:8f7c961a5966 553 spacecraft.printf("\n\r");
paologiorgio 0:8f7c961a5966 554 }
paologiorgio 0:8f7c961a5966 555 }
paologiorgio 0:8f7c961a5966 556
paologiorgio 0:8f7c961a5966 557
paologiorgio 0:8f7c961a5966 558 // Checksum per telecomandi
paologiorgio 0:8f7c961a5966 559 void checksum_tlc(Telecommand *toCheck_tlc)
paologiorgio 0:8f7c961a5966 560 {
paologiorgio 0:8f7c961a5966 561 int ones_tlc = 0;
paologiorgio 0:8f7c961a5966 562
paologiorgio 0:8f7c961a5966 563 for (int i = 0; i < sizeof(toCheck_tlc)/sizeof(toCheck_tlc[0]); i++)
paologiorgio 0:8f7c961a5966 564 {
paologiorgio 0:8f7c961a5966 565 // contatore degli "1" nel campo "identifier"
paologiorgio 0:8f7c961a5966 566 for (int j = 0; i < sizeof(toCheck_tlc[i].ID)/sizeof(toCheck_tlc[i].ID[0]); j++)
paologiorgio 0:8f7c961a5966 567 {
paologiorgio 0:8f7c961a5966 568 if (toCheck_tlc[i].ID[j] == '1')
paologiorgio 0:8f7c961a5966 569 {
paologiorgio 0:8f7c961a5966 570 ones_tlc++;
paologiorgio 0:8f7c961a5966 571 }
paologiorgio 0:8f7c961a5966 572 }
paologiorgio 0:8f7c961a5966 573
paologiorgio 0:8f7c961a5966 574 // contatore degli "1" nel campo "tag"
paologiorgio 0:8f7c961a5966 575 for (int k = 0; i < sizeof(toCheck_tlc[i].TAG)/sizeof(toCheck_tlc[i].TAG[0]); k++)
paologiorgio 0:8f7c961a5966 576 {
paologiorgio 0:8f7c961a5966 577 if (toCheck_tlc[i].TAG[k] == '1')
paologiorgio 0:8f7c961a5966 578 {
paologiorgio 0:8f7c961a5966 579 ones_tlc++;
paologiorgio 0:8f7c961a5966 580 }
paologiorgio 0:8f7c961a5966 581 }
paologiorgio 0:8f7c961a5966 582
paologiorgio 0:8f7c961a5966 583 // contatore degli "1" nel campo "payload" (da assegnare nel file main)
paologiorgio 0:8f7c961a5966 584 for (int l = 0; i < sizeof(toCheck_tlc[i].TAG)/sizeof(toCheck_tlc[i].TAG[0]); l++)
paologiorgio 0:8f7c961a5966 585 {
paologiorgio 0:8f7c961a5966 586 if (toCheck_tlc[i].PAYLOAD[l] == '1')
paologiorgio 0:8f7c961a5966 587 {
paologiorgio 0:8f7c961a5966 588 ones_tlc++;
paologiorgio 0:8f7c961a5966 589 }
paologiorgio 0:8f7c961a5966 590 }
paologiorgio 0:8f7c961a5966 591
paologiorgio 0:8f7c961a5966 592 // Scrivi LSB
paologiorgio 0:8f7c961a5966 593 if (ones_tlc % 2 == 0)
paologiorgio 0:8f7c961a5966 594 {
paologiorgio 0:8f7c961a5966 595 toCheck_tlc[i].LSB = '0'; // If the number of ones in[B0÷B14] bits is even
paologiorgio 0:8f7c961a5966 596 }
paologiorgio 0:8f7c961a5966 597 else
paologiorgio 0:8f7c961a5966 598 {
paologiorgio 0:8f7c961a5966 599 toCheck_tlc[i].LSB = '1'; // If the number of ones in[B0÷B14] bits is odd
paologiorgio 0:8f7c961a5966 600 }
paologiorgio 0:8f7c961a5966 601
paologiorgio 0:8f7c961a5966 602
paologiorgio 0:8f7c961a5966 603 }
paologiorgio 0:8f7c961a5966 604 }
paologiorgio 0:8f7c961a5966 605
paologiorgio 0:8f7c961a5966 606 // Checksum per telemetrie housekeeping
paologiorgio 0:8f7c961a5966 607 void checksum_tlm(Telemetry *toCheck_tlm)
paologiorgio 0:8f7c961a5966 608 {
paologiorgio 0:8f7c961a5966 609 int ones_tlm = 0;
paologiorgio 0:8f7c961a5966 610
paologiorgio 0:8f7c961a5966 611 for (int i = 0; i < sizeof(toCheck_tlm)/sizeof(toCheck_tlm[0]); i++)
paologiorgio 0:8f7c961a5966 612 {
paologiorgio 0:8f7c961a5966 613 // contatore degli "1" nel campo "identifier"
paologiorgio 0:8f7c961a5966 614 for (int j = 0; i < sizeof(toCheck_tlm[i].ID)/sizeof(toCheck_tlm[i].ID[0]); j++)
paologiorgio 0:8f7c961a5966 615 {
paologiorgio 0:8f7c961a5966 616 if (toCheck_tlm[i].ID[j] == '1')
paologiorgio 0:8f7c961a5966 617 {
paologiorgio 0:8f7c961a5966 618 ones_tlm++;
paologiorgio 0:8f7c961a5966 619 }
paologiorgio 0:8f7c961a5966 620 }
paologiorgio 0:8f7c961a5966 621
paologiorgio 0:8f7c961a5966 622 // contatore degli "1" nel campo "tag"
paologiorgio 0:8f7c961a5966 623 for (int k = 0; i < sizeof(toCheck_tlm[i].TAG)/sizeof(toCheck_tlm[i].TAG[0]); k++)
paologiorgio 0:8f7c961a5966 624 {
paologiorgio 0:8f7c961a5966 625 if (toCheck_tlm[i].TAG[k] == '1')
paologiorgio 0:8f7c961a5966 626 {
paologiorgio 0:8f7c961a5966 627 ones_tlm++;
paologiorgio 0:8f7c961a5966 628 }
paologiorgio 0:8f7c961a5966 629 }
paologiorgio 0:8f7c961a5966 630
paologiorgio 0:8f7c961a5966 631 // contatore degli "1" nel campo "payload" (da assegnare nel file main)
paologiorgio 0:8f7c961a5966 632 for (int l = 0; i < sizeof(toCheck_tlm[i].TAG)/sizeof(toCheck_tlm[i].TAG[0]); l++)
paologiorgio 0:8f7c961a5966 633 {
paologiorgio 0:8f7c961a5966 634 if (toCheck_tlm[i].PAYLOAD[l] == '1')
paologiorgio 0:8f7c961a5966 635 {
paologiorgio 0:8f7c961a5966 636 ones_tlm++;
paologiorgio 0:8f7c961a5966 637 }
paologiorgio 0:8f7c961a5966 638 }
paologiorgio 0:8f7c961a5966 639
paologiorgio 0:8f7c961a5966 640 // Scrivi LSB
paologiorgio 0:8f7c961a5966 641 if (ones_tlm % 2 == 0)
paologiorgio 0:8f7c961a5966 642 {
paologiorgio 0:8f7c961a5966 643 toCheck_tlm[i].LSB = '0'; // If the number of ones in[B0÷B14] bits is even
paologiorgio 0:8f7c961a5966 644 }
paologiorgio 0:8f7c961a5966 645 else
paologiorgio 0:8f7c961a5966 646 {
paologiorgio 0:8f7c961a5966 647 toCheck_tlm[i].LSB = '1'; // If the number of ones in[B0÷B14] bits is odd
paologiorgio 0:8f7c961a5966 648 }
paologiorgio 0:8f7c961a5966 649
paologiorgio 0:8f7c961a5966 650
paologiorgio 0:8f7c961a5966 651 }
paologiorgio 0:8f7c961a5966 652 }