Space / Mbed 2 deprecated DORA_lv

Dependencies:   mbed

Committer:
paologiorgio
Date:
Fri Jul 15 14:00:59 2022 +0000
Revision:
1:00cee5df0f76
Parent:
0:8f7c961a5966
Child:
2:155d07b145c6
Dora-150722

Who changed what in which revision?

UserRevisionLine numberNew contents of line
paologiorgio 1:00cee5df0f76 1
paologiorgio 1:00cee5df0f76 2 // in data 13/07/2022 abbiamo testato spacecraft-mima avendo come spacecraft
paologiorgio 1:00cee5df0f76 3 // la seriale che parla su STM, mentre mima l'usb del pc
paologiorgio 1:00cee5df0f76 4
paologiorgio 0:8f7c961a5966 5 // Librerie
paologiorgio 0:8f7c961a5966 6 #include "mbed.h"
paologiorgio 0:8f7c961a5966 7 #include <math.h>
paologiorgio 0:8f7c961a5966 8 #include <string.h>
paologiorgio 0:8f7c961a5966 9 #include <stdlib.h>
paologiorgio 1:00cee5df0f76 10 #include <stdbool.h>
paologiorgio 0:8f7c961a5966 11
paologiorgio 0:8f7c961a5966 12 // Macros
paologiorgio 1:00cee5df0f76 13 #define PACKETDIM 15 // temperature
paologiorgio 1:00cee5df0f76 14 #define word 1
paologiorgio 1:00cee5df0f76 15 #define packet 2 // 2 bytes
paologiorgio 1:00cee5df0f76 16 #define hsk_buf 113
paologiorgio 1:00cee5df0f76 17 #define hsk_rx 114 // 114 bytes - 57 telemetry words(housekeeping)
paologiorgio 1:00cee5df0f76 18 #define hsk_sd_buf 11211
paologiorgio 1:00cee5df0f76 19 #define hsk_sd 11212 // 11212 bytes - 5606 interferogram data words
paologiorgio 1:00cee5df0f76 20 #define channel_size 10 // temeprature channel from sen30202
paologiorgio 0:8f7c961a5966 21
paologiorgio 0:8f7c961a5966 22 // Serial e periferiche
paologiorgio 1:00cee5df0f76 23 Serial spacecraft(USBTX, USBRX); // switchare questo e le print con mima
paologiorgio 0:8f7c961a5966 24 Serial mima(PC_4, PC_5);
paologiorgio 1:00cee5df0f76 25 Serial max31865(PA_0, PA_1);
paologiorgio 1:00cee5df0f76 26 // L16 Actuonix:
paologiorgio 1:00cee5df0f76 27 PwmOut actuonix (PB_3);
paologiorgio 1:00cee5df0f76 28 float offset;
paologiorgio 1:00cee5df0f76 29 // Relay: configurazione pull-up
paologiorgio 0:8f7c961a5966 30 DigitalOut Relay5V (PA_7);
paologiorgio 0:8f7c961a5966 31 DigitalOut Relay12V (PB_4);
paologiorgio 0:8f7c961a5966 32 DigitalOut Relay24V (PB_5);
paologiorgio 0:8f7c961a5966 33 DigitalOut Relay15_15_5V (PB_10);
paologiorgio 1:00cee5df0f76 34
paologiorgio 1:00cee5df0f76 35 // Buffer: telecommand
paologiorgio 1:00cee5df0f76 36 volatile int rxTlcPtr; // telecommand receiving buffer
paologiorgio 1:00cee5df0f76 37 int rxTlcDataCounter = 0;
paologiorgio 1:00cee5df0f76 38 char rx_TLC[word+1]; // buffer
paologiorgio 1:00cee5df0f76 39 char data_TLC[word+1]; // telecommand
paologiorgio 1:00cee5df0f76 40
paologiorgio 1:00cee5df0f76 41 // Buffer: standard telemetry
paologiorgio 1:00cee5df0f76 42 volatile int rxTlmPtr;
paologiorgio 1:00cee5df0f76 43 int rxTlmDataCounter = 0;
paologiorgio 1:00cee5df0f76 44 char rx_TLM[word+1]; // buffer
paologiorgio 1:00cee5df0f76 45 char data_TLM[word+1]; // standard telemetry
paologiorgio 1:00cee5df0f76 46
paologiorgio 1:00cee5df0f76 47 // Buffer: TLMODE telemetry option 1
paologiorgio 1:00cee5df0f76 48 volatile int rxTlmOpt1Ptr;
paologiorgio 1:00cee5df0f76 49 int rxTlmOpt1DataCounter = 0;
paologiorgio 1:00cee5df0f76 50 char rx_TLMOpt1[hsk_buf+1];
paologiorgio 1:00cee5df0f76 51 char data_TLMOpt1[hsk_buf+1];
paologiorgio 1:00cee5df0f76 52
paologiorgio 1:00cee5df0f76 53 // Buffer: TLMODE telemetry option 1
paologiorgio 1:00cee5df0f76 54 volatile int rxTlmOpt2Ptr;
paologiorgio 1:00cee5df0f76 55 int rxTlmOpt2DataCounter = 0;
paologiorgio 1:00cee5df0f76 56 char rx_TLMOpt2[hsk_sd_buf+1];
paologiorgio 1:00cee5df0f76 57 char data_TLMOpt2[hsk_sd_buf+1];
paologiorgio 0:8f7c961a5966 58
paologiorgio 0:8f7c961a5966 59 // Timer
paologiorgio 1:00cee5df0f76 60 Timer timer; // telecommand
paologiorgio 1:00cee5df0f76 61 Timer rx; // rx window
paologiorgio 1:00cee5df0f76 62 float rxWindow = 300 /* seconds */, rxTimeStart, rxTimeStop, rxTimeRead;
paologiorgio 1:00cee5df0f76 63 float TIMEOUT = 10 /* seconds */, tTimeStart, tTimeStop, tTimeRead;
paologiorgio 0:8f7c961a5966 64
paologiorgio 1:00cee5df0f76 65 // TLMODE
paologiorgio 1:00cee5df0f76 66 volatile int tlmode_option_1, tlmode_option_2, tlmode_tlm;
paologiorgio 1:00cee5df0f76 67 volatile bool TlcSend;
paologiorgio 0:8f7c961a5966 68
paologiorgio 1:00cee5df0f76 69 // SC-MIMA communication: TX/RX
paologiorgio 0:8f7c961a5966 70 void RxTelecommand();
paologiorgio 0:8f7c961a5966 71 void TxTelecommand();
paologiorgio 0:8f7c961a5966 72 void RxTelemetry();
paologiorgio 0:8f7c961a5966 73 void TxTelemetry();
paologiorgio 1:00cee5df0f76 74 // System utility
paologiorgio 0:8f7c961a5966 75 void clearBuffer(char *arr, int arrLen);
paologiorgio 1:00cee5df0f76 76
paologiorgio 1:00cee5df0f76 77 // Temperature settings
paologiorgio 1:00cee5df0f76 78 char tempCH1[channel_size];
paologiorgio 1:00cee5df0f76 79 char tempCH2[channel_size];
paologiorgio 1:00cee5df0f76 80 volatile int j; // first channel index
paologiorgio 1:00cee5df0f76 81 volatile int t; // second channel index
paologiorgio 1:00cee5df0f76 82 volatile char caRxPacket[PACKETDIM]; // temperature buffer
paologiorgio 1:00cee5df0f76 83 volatile char nRxCharCount; // temperature char counter
paologiorgio 1:00cee5df0f76 84
paologiorgio 1:00cee5df0f76 85 // Routines dedicate alla ricezione di dati della temperatura (Pt100)
paologiorgio 1:00cee5df0f76 86 void SerialeRxInterrupt(void)
paologiorgio 1:00cee5df0f76 87 {
paologiorgio 1:00cee5df0f76 88 char cReadChar;
paologiorgio 1:00cee5df0f76 89 while((max31865.readable()))
paologiorgio 1:00cee5df0f76 90 {
paologiorgio 1:00cee5df0f76 91 cReadChar = max31865.getc();
paologiorgio 1:00cee5df0f76 92 nRxCharCount++;
paologiorgio 1:00cee5df0f76 93 caRxPacket[nRxCharCount] = cReadChar;
paologiorgio 1:00cee5df0f76 94 }
paologiorgio 1:00cee5df0f76 95
paologiorgio 1:00cee5df0f76 96 if (nRxCharCount == PACKETDIM) // if it reaches max -> reset
paologiorgio 1:00cee5df0f76 97 {
paologiorgio 1:00cee5df0f76 98 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 99 }
paologiorgio 1:00cee5df0f76 100 }
paologiorgio 0:8f7c961a5966 101
paologiorgio 0:8f7c961a5966 102 // Main
paologiorgio 0:8f7c961a5966 103 int main()
paologiorgio 0:8f7c961a5966 104 {
paologiorgio 0:8f7c961a5966 105 // Baudrate
paologiorgio 0:8f7c961a5966 106 spacecraft.baud(115200);
paologiorgio 1:00cee5df0f76 107 //spacecraft.baud(9600);
paologiorgio 0:8f7c961a5966 108 mima.baud(9600);
paologiorgio 1:00cee5df0f76 109 //mima.baud(115200);
paologiorgio 0:8f7c961a5966 110 max31865.baud(115200);
paologiorgio 0:8f7c961a5966 111
paologiorgio 1:00cee5df0f76 112 // Diagnostica
paologiorgio 1:00cee5df0f76 113 spacecraft.printf(" Avvio Spacecraft... \n\r");
paologiorgio 1:00cee5df0f76 114 //mima.printf(" Avvio MIMA... \n\r");
paologiorgio 0:8f7c961a5966 115
paologiorgio 1:00cee5df0f76 116 // Setup per temperatura
paologiorgio 1:00cee5df0f76 117 int nIndex;
paologiorgio 1:00cee5df0f76 118 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 119 for(nIndex = 0; nIndex < PACKETDIM; nIndex++)
paologiorgio 0:8f7c961a5966 120 {
paologiorgio 1:00cee5df0f76 121 caRxPacket[nIndex] = 0;
paologiorgio 1:00cee5df0f76 122 }
paologiorgio 1:00cee5df0f76 123
paologiorgio 1:00cee5df0f76 124 // Setup per Actuonix L16
paologiorgio 1:00cee5df0f76 125 actuonix.period_us(1000);
paologiorgio 1:00cee5df0f76 126 offset = actuonix.read();
paologiorgio 1:00cee5df0f76 127
paologiorgio 1:00cee5df0f76 128 // Setup per Relay: 1 = OFF (1->OFF, 0->ON)
paologiorgio 1:00cee5df0f76 129 Relay5V = 1;
paologiorgio 1:00cee5df0f76 130 Relay12V = 1;
paologiorgio 1:00cee5df0f76 131 Relay15_15_5V = 1;
paologiorgio 1:00cee5df0f76 132 Relay24V = 1;
paologiorgio 1:00cee5df0f76 133
paologiorgio 1:00cee5df0f76 134 // Bool flags
paologiorgio 1:00cee5df0f76 135 TlcSend = false;
paologiorgio 1:00cee5df0f76 136
paologiorgio 1:00cee5df0f76 137 // Interrupt routine
paologiorgio 1:00cee5df0f76 138 max31865.attach(&SerialeRxInterrupt, Serial::RxIrq);
paologiorgio 1:00cee5df0f76 139 spacecraft.attach(&RxTelecommand, Serial::RxIrq);
paologiorgio 1:00cee5df0f76 140 mima.attach(&RxTelemetry, Serial::RxIrq);
paologiorgio 1:00cee5df0f76 141
paologiorgio 1:00cee5df0f76 142 // Main loop
paologiorgio 1:00cee5df0f76 143 while (true)
paologiorgio 1:00cee5df0f76 144 {
paologiorgio 1:00cee5df0f76 145 // Telecommand
paologiorgio 0:8f7c961a5966 146 timer.start();
paologiorgio 1:00cee5df0f76 147 tTimeStart = timer.read(); // in secondi
paologiorgio 0:8f7c961a5966 148 tTimeRead = tTimeStart;
paologiorgio 0:8f7c961a5966 149
paologiorgio 1:00cee5df0f76 150 while ((rxTlcPtr < packet) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 0:8f7c961a5966 151 {
paologiorgio 1:00cee5df0f76 152 tTimeRead = timer.read();
paologiorgio 1:00cee5df0f76 153 }
paologiorgio 1:00cee5df0f76 154
paologiorgio 1:00cee5df0f76 155 timer.stop();
paologiorgio 1:00cee5df0f76 156
paologiorgio 1:00cee5df0f76 157 if ((rxTlcPtr == packet) && ((tTimeRead - tTimeStart) < TIMEOUT))
paologiorgio 1:00cee5df0f76 158 {
paologiorgio 1:00cee5df0f76 159 __disable_irq(); // disable interrupts so data doesn't arrive while we are doing this
paologiorgio 1:00cee5df0f76 160 memcpy(data_TLC, rx_TLC, rxTlcPtr);
paologiorgio 1:00cee5df0f76 161 rxTlcDataCounter = rxTlcPtr;
paologiorgio 1:00cee5df0f76 162 rxTlcPtr = 0;
paologiorgio 1:00cee5df0f76 163 //__enable_irq(); // re-enable interrupts
paologiorgio 1:00cee5df0f76 164
paologiorgio 1:00cee5df0f76 165 data_TLC[1] = data_TLC[1] >> 1; // read payload data ignoring the LSB
paologiorgio 1:00cee5df0f76 166
paologiorgio 1:00cee5df0f76 167 spacecraft.printf("\n\r .... Telecomando ricevuto su DORA! \n\r");
paologiorgio 1:00cee5df0f76 168
paologiorgio 1:00cee5df0f76 169 for (int i = 0; i < sizeof(data_TLC)/sizeof(char); i++)
paologiorgio 0:8f7c961a5966 170 {
paologiorgio 1:00cee5df0f76 171 spacecraft.printf("> Carattere: %f \n\r", (float)data_TLC[i]);
paologiorgio 1:00cee5df0f76 172 }
paologiorgio 1:00cee5df0f76 173
paologiorgio 1:00cee5df0f76 174 data_TLC[rxTlcDataCounter] = 0; // add a null just in case the received data didn't have one at the end
paologiorgio 1:00cee5df0f76 175
paologiorgio 1:00cee5df0f76 176 // hw control: set-point init
paologiorgio 1:00cee5df0f76 177 offset = 0;
paologiorgio 1:00cee5df0f76 178
paologiorgio 1:00cee5df0f76 179 // RX settings
paologiorgio 1:00cee5df0f76 180 if (((float)data_TLC[0] != 40) || ((float)data_TLC[0] != 41))
paologiorgio 1:00cee5df0f76 181 {
paologiorgio 1:00cee5df0f76 182 tlmode_option_1 = 1;
paologiorgio 1:00cee5df0f76 183 tlmode_option_2 = 1;
paologiorgio 1:00cee5df0f76 184 tlmode_tlm = 0;
paologiorgio 1:00cee5df0f76 185 }
paologiorgio 1:00cee5df0f76 186
paologiorgio 1:00cee5df0f76 187 // L16 setpoint
paologiorgio 1:00cee5df0f76 188 if ((float)data_TLC[0] == 0)
paologiorgio 1:00cee5df0f76 189 {
paologiorgio 1:00cee5df0f76 190 offset = (float)data_TLC[1];
paologiorgio 1:00cee5df0f76 191 offset = offset/100;
paologiorgio 1:00cee5df0f76 192 actuonix.write(offset);
paologiorgio 1:00cee5df0f76 193 }
paologiorgio 1:00cee5df0f76 194 // Temperature request
paologiorgio 1:00cee5df0f76 195 else if (((float)data_TLC[0] == 16) && ((float)data_TLC[1] == 32))
paologiorgio 1:00cee5df0f76 196 {
paologiorgio 1:00cee5df0f76 197 // Cleaning buffers
paologiorgio 1:00cee5df0f76 198 clearBuffer(tempCH1, sizeof(tempCH1)/sizeof(char));
paologiorgio 1:00cee5df0f76 199 clearBuffer(tempCH2, sizeof(tempCH2)/sizeof(char));
paologiorgio 1:00cee5df0f76 200
paologiorgio 1:00cee5df0f76 201 // Index setup
paologiorgio 1:00cee5df0f76 202 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 203 int y = 0, u = 0;
paologiorgio 1:00cee5df0f76 204 t = 0; j = 0;
paologiorgio 1:00cee5df0f76 205
paologiorgio 1:00cee5df0f76 206 for (int i = 0; i < PACKETDIM; i++)
paologiorgio 0:8f7c961a5966 207 {
paologiorgio 1:00cee5df0f76 208 if (caRxPacket[i] == 'S')
paologiorgio 1:00cee5df0f76 209 {
paologiorgio 1:00cee5df0f76 210 j = i + 1;
paologiorgio 1:00cee5df0f76 211
paologiorgio 1:00cee5df0f76 212 while (j < PACKETDIM)
paologiorgio 1:00cee5df0f76 213 {
paologiorgio 1:00cee5df0f76 214 if (caRxPacket[j] == ';')
paologiorgio 1:00cee5df0f76 215 {
paologiorgio 1:00cee5df0f76 216 break;
paologiorgio 1:00cee5df0f76 217 }
paologiorgio 1:00cee5df0f76 218 else
paologiorgio 1:00cee5df0f76 219 {
paologiorgio 1:00cee5df0f76 220 tempCH1[y++] = caRxPacket[j];
paologiorgio 1:00cee5df0f76 221 }
paologiorgio 1:00cee5df0f76 222
paologiorgio 1:00cee5df0f76 223 j++;
paologiorgio 1:00cee5df0f76 224 }
paologiorgio 1:00cee5df0f76 225
paologiorgio 1:00cee5df0f76 226 t = j + 1;
paologiorgio 0:8f7c961a5966 227
paologiorgio 1:00cee5df0f76 228 while (t < PACKETDIM)
paologiorgio 1:00cee5df0f76 229 {
paologiorgio 1:00cee5df0f76 230 if (caRxPacket[t] == 'P')
paologiorgio 1:00cee5df0f76 231 {
paologiorgio 1:00cee5df0f76 232 break;
paologiorgio 1:00cee5df0f76 233 }
paologiorgio 1:00cee5df0f76 234 else
paologiorgio 1:00cee5df0f76 235 {
paologiorgio 1:00cee5df0f76 236 tempCH2[u++] = caRxPacket[t];
paologiorgio 1:00cee5df0f76 237 }
paologiorgio 1:00cee5df0f76 238 t++;
paologiorgio 1:00cee5df0f76 239 }
paologiorgio 1:00cee5df0f76 240 break;
paologiorgio 1:00cee5df0f76 241 }
paologiorgio 1:00cee5df0f76 242 }
paologiorgio 1:00cee5df0f76 243 // Send
paologiorgio 1:00cee5df0f76 244 spacecraft.puts(tempCH1);
paologiorgio 1:00cee5df0f76 245 spacecraft.puts(";");
paologiorgio 1:00cee5df0f76 246 spacecraft.puts(tempCH2);
paologiorgio 1:00cee5df0f76 247 }
paologiorgio 1:00cee5df0f76 248 else if (((float)data_TLC[0] == 121) && ((float)data_TLC[1] == 42))
paologiorgio 1:00cee5df0f76 249 {
paologiorgio 1:00cee5df0f76 250 Relay5V = 1;
paologiorgio 1:00cee5df0f76 251 Relay12V = 1;
paologiorgio 1:00cee5df0f76 252 Relay15_15_5V = 1;
paologiorgio 1:00cee5df0f76 253 Relay24V = 1;
paologiorgio 1:00cee5df0f76 254 }
paologiorgio 1:00cee5df0f76 255 else if (((float)data_TLC[0] == 120) && ((float)data_TLC[1] == 85))
paologiorgio 1:00cee5df0f76 256 {
paologiorgio 1:00cee5df0f76 257 Relay5V = 0;
paologiorgio 1:00cee5df0f76 258 Relay12V = 0;
paologiorgio 1:00cee5df0f76 259 Relay15_15_5V = 0;
paologiorgio 1:00cee5df0f76 260 Relay24V = 0;
paologiorgio 1:00cee5df0f76 261 }
paologiorgio 1:00cee5df0f76 262 else if (((float)data_TLC[0] == 120)) // Relay
paologiorgio 1:00cee5df0f76 263 {
paologiorgio 1:00cee5df0f76 264 if (((float)data_TLC[1] == 0))
paologiorgio 0:8f7c961a5966 265 {
paologiorgio 1:00cee5df0f76 266 Relay12V = 1;
paologiorgio 1:00cee5df0f76 267 }
paologiorgio 1:00cee5df0f76 268 else if (((float)data_TLC[1] == 1))
paologiorgio 1:00cee5df0f76 269 {
paologiorgio 1:00cee5df0f76 270 Relay12V = 0;
paologiorgio 1:00cee5df0f76 271 // since the linear actuator is driven by 12V power
paologiorgio 1:00cee5df0f76 272 offset = actuonix.read();
paologiorgio 1:00cee5df0f76 273 actuonix.write(offset);
paologiorgio 1:00cee5df0f76 274 }
paologiorgio 1:00cee5df0f76 275 else if (((float)data_TLC[1] == 2))
paologiorgio 1:00cee5df0f76 276 {
paologiorgio 1:00cee5df0f76 277 Relay5V = 1;
paologiorgio 0:8f7c961a5966 278 }
paologiorgio 1:00cee5df0f76 279 else if (((float)data_TLC[1] == 3))
paologiorgio 1:00cee5df0f76 280 {
paologiorgio 1:00cee5df0f76 281 Relay5V = 0;
paologiorgio 1:00cee5df0f76 282 }
paologiorgio 1:00cee5df0f76 283 else if (((float)data_TLC[1] == 6))
paologiorgio 1:00cee5df0f76 284 {
paologiorgio 1:00cee5df0f76 285 Relay15_15_5V = 1;
paologiorgio 1:00cee5df0f76 286 }
paologiorgio 1:00cee5df0f76 287 else if (((float)data_TLC[1] == 7))
paologiorgio 0:8f7c961a5966 288 {
paologiorgio 1:00cee5df0f76 289 Relay15_15_5V = 0;
paologiorgio 1:00cee5df0f76 290 }
paologiorgio 1:00cee5df0f76 291 else if (((float)data_TLC[1] == 8))
paologiorgio 1:00cee5df0f76 292 {
paologiorgio 1:00cee5df0f76 293 Relay24V = 1;
paologiorgio 1:00cee5df0f76 294 }
paologiorgio 1:00cee5df0f76 295 else if (((float)data_TLC[1] == 15))
paologiorgio 1:00cee5df0f76 296 {
paologiorgio 1:00cee5df0f76 297 Relay24V = 0;
paologiorgio 0:8f7c961a5966 298 }
paologiorgio 0:8f7c961a5966 299 }
paologiorgio 1:00cee5df0f76 300 else if (((float)data_TLC[0] == 40) && ((float)data_TLC[1] == 24))
paologiorgio 1:00cee5df0f76 301 {
paologiorgio 1:00cee5df0f76 302 tlmode_option_1 = 0;
paologiorgio 1:00cee5df0f76 303 tlmode_option_2 = 1;
paologiorgio 1:00cee5df0f76 304 tlmode_tlm = 1;
paologiorgio 1:00cee5df0f76 305 rxTlmPtr = 0;
paologiorgio 1:00cee5df0f76 306 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 307 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 308 spacecraft.printf("> Sono entrato in TLMODE 1 \n\r");
paologiorgio 1:00cee5df0f76 309 }
paologiorgio 1:00cee5df0f76 310 else if (((float)data_TLC[0] == 41) && ((float)data_TLC[1] == 127))
paologiorgio 1:00cee5df0f76 311 {
paologiorgio 1:00cee5df0f76 312 tlmode_option_2 = 0;
paologiorgio 1:00cee5df0f76 313 tlmode_option_1 = 1;
paologiorgio 1:00cee5df0f76 314 tlmode_tlm = 1;
paologiorgio 1:00cee5df0f76 315 rxTlmPtr = 0;
paologiorgio 1:00cee5df0f76 316 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 317 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 318 spacecraft.printf("> Sono entrato in TLMODE 2 \n\r");
paologiorgio 1:00cee5df0f76 319 }
paologiorgio 1:00cee5df0f76 320 // Reset global vars
paologiorgio 1:00cee5df0f76 321 else if (((float)data_TLC[0] == 241) && ((float)data_TLC[1] == 127))
paologiorgio 0:8f7c961a5966 322 {
paologiorgio 1:00cee5df0f76 323 nRxCharCount = 0;
paologiorgio 1:00cee5df0f76 324 rxTlcPtr = 0;
paologiorgio 1:00cee5df0f76 325 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 326 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 327 rxTlcDataCounter = 0;
paologiorgio 1:00cee5df0f76 328 rxTlmOpt1DataCounter = 0;
paologiorgio 1:00cee5df0f76 329 rxTlmOpt2DataCounter = 0;
paologiorgio 1:00cee5df0f76 330 tlmode_tlm = 1;
paologiorgio 1:00cee5df0f76 331 tlmode_option_1 = 1;
paologiorgio 1:00cee5df0f76 332 tlmode_option_2 = 1;
paologiorgio 1:00cee5df0f76 333
paologiorgio 1:00cee5df0f76 334 for(nIndex = 0; nIndex < PACKETDIM; nIndex++)
paologiorgio 0:8f7c961a5966 335 {
paologiorgio 1:00cee5df0f76 336 caRxPacket[nIndex] = 0;
paologiorgio 1:00cee5df0f76 337 }
paologiorgio 1:00cee5df0f76 338
paologiorgio 1:00cee5df0f76 339 clearBuffer(data_TLC, sizeof(data_TLC)/sizeof(char));
paologiorgio 1:00cee5df0f76 340 clearBuffer(data_TLM, sizeof(data_TLM)/sizeof(char));
paologiorgio 1:00cee5df0f76 341 clearBuffer(data_TLMOpt1, sizeof(data_TLMOpt1)/sizeof(char));
paologiorgio 1:00cee5df0f76 342 clearBuffer(data_TLMOpt2, sizeof(data_TLMOpt2)/sizeof(char));
paologiorgio 1:00cee5df0f76 343
paologiorgio 1:00cee5df0f76 344 spacecraft.printf(".... Reset variabili effettuato! \n\r");
paologiorgio 1:00cee5df0f76 345 }
paologiorgio 1:00cee5df0f76 346
paologiorgio 1:00cee5df0f76 347 // Send after setting flags and clear
paologiorgio 1:00cee5df0f76 348 TxTelecommand();
paologiorgio 1:00cee5df0f76 349 spacecraft.printf(".... Telecomando inviato a MIMA ....");
paologiorgio 1:00cee5df0f76 350 __enable_irq(); // *********************************************************************
paologiorgio 1:00cee5df0f76 351 clearBuffer(rx_TLC, sizeof(rx_TLC)/sizeof(char));
paologiorgio 1:00cee5df0f76 352 clearBuffer(data_TLC, sizeof(data_TLC)/sizeof(char));
paologiorgio 1:00cee5df0f76 353
paologiorgio 1:00cee5df0f76 354 spacecraft.printf(".... Ho ripulito i buffer di ricezione TLC .... \n\r");
paologiorgio 1:00cee5df0f76 355
paologiorgio 1:00cee5df0f76 356 /* *********************************************************** */
paologiorgio 1:00cee5df0f76 357
paologiorgio 1:00cee5df0f76 358 //__disable_irq(); // da lavorare su queste chiamate perché se da un lato prevengono
paologiorgio 1:00cee5df0f76 359 // blocco del telecomando durante ricezione, dall'altro impediscono al comando di telemetria di ricevere
paologiorgio 1:00cee5df0f76 360
paologiorgio 1:00cee5df0f76 361 if ((TlcSend) && (tlmode_option_1 == 1) && (tlmode_option_2 == 1) && (tlmode_tlm == 0))
paologiorgio 1:00cee5df0f76 362 {
paologiorgio 1:00cee5df0f76 363 clearBuffer(data_TLM, sizeof(data_TLM)/sizeof(char));
paologiorgio 0:8f7c961a5966 364
paologiorgio 1:00cee5df0f76 365 // Standard telemetry frame
paologiorgio 1:00cee5df0f76 366 rx.start();
paologiorgio 1:00cee5df0f76 367 rxTimeStart = rx.read();
paologiorgio 1:00cee5df0f76 368 rxTimeRead = rxTimeStart;
paologiorgio 1:00cee5df0f76 369
paologiorgio 1:00cee5df0f76 370 while ((rxTlmPtr < packet) && ((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 0:8f7c961a5966 371 {
paologiorgio 1:00cee5df0f76 372 rxTimeRead = rx.read();
paologiorgio 1:00cee5df0f76 373 }
paologiorgio 1:00cee5df0f76 374
paologiorgio 1:00cee5df0f76 375 rx.stop();
paologiorgio 1:00cee5df0f76 376
paologiorgio 1:00cee5df0f76 377 if ((rxTlmPtr == packet) && ((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 1:00cee5df0f76 378 {
paologiorgio 1:00cee5df0f76 379 __disable_irq();
paologiorgio 1:00cee5df0f76 380 memcpy(data_TLM, rx_TLM, rxTlmPtr);
paologiorgio 1:00cee5df0f76 381 rxTlmDataCounter = rxTlmPtr;
paologiorgio 1:00cee5df0f76 382 rxTlmPtr = 0;
paologiorgio 1:00cee5df0f76 383 //__enable_irq();
paologiorgio 1:00cee5df0f76 384
paologiorgio 1:00cee5df0f76 385 data_TLM[rxTlmDataCounter] = 0;
paologiorgio 1:00cee5df0f76 386
paologiorgio 1:00cee5df0f76 387 TxTelemetry();
paologiorgio 1:00cee5df0f76 388 __enable_irq(); // ***************************************************
paologiorgio 1:00cee5df0f76 389 spacecraft.printf("\n\r Ricevuto Telemetry Standard \n\r");
paologiorgio 1:00cee5df0f76 390
paologiorgio 0:8f7c961a5966 391 }
paologiorgio 1:00cee5df0f76 392 else if ((rxTimeRead - rxTimeStart) >= rxWindow)
paologiorgio 0:8f7c961a5966 393 {
paologiorgio 1:00cee5df0f76 394 spacecraft.printf("\n\r !!! Scattato il timeout in Telemetry !!! \n\r");
paologiorgio 1:00cee5df0f76 395 rxTlmPtr = 0;
paologiorgio 1:00cee5df0f76 396 for (int i = 0; i < packet; i++)
paologiorgio 1:00cee5df0f76 397 {
paologiorgio 1:00cee5df0f76 398 rx_TLM[i] = '\0';
paologiorgio 1:00cee5df0f76 399 data_TLM[i] = '\0';
paologiorgio 1:00cee5df0f76 400 }
paologiorgio 1:00cee5df0f76 401 } // end-else-if:telecommand-send+timeout
paologiorgio 1:00cee5df0f76 402
paologiorgio 1:00cee5df0f76 403 TlcSend = false;
paologiorgio 1:00cee5df0f76 404 } // end-if-send-telecommand
paologiorgio 1:00cee5df0f76 405 else if ((TlcSend) && (tlmode_option_1 == 0) && (tlmode_option_2 == 1) && (tlmode_tlm == 1))
paologiorgio 1:00cee5df0f76 406 {
paologiorgio 1:00cee5df0f76 407 spacecraft.printf("\n\r > Sono entrato in TLMODE 1 - TX Telemetry \n\r");
paologiorgio 1:00cee5df0f76 408 clearBuffer(data_TLMOpt1, sizeof(data_TLMOpt1)/sizeof(char));
paologiorgio 1:00cee5df0f76 409
paologiorgio 1:00cee5df0f76 410 rx.start();
paologiorgio 1:00cee5df0f76 411 rxTimeStart = rx.read();
paologiorgio 1:00cee5df0f76 412 rxTimeRead = rxTimeStart;
paologiorgio 1:00cee5df0f76 413
paologiorgio 1:00cee5df0f76 414 while ((rxTlmOpt1Ptr < hsk_rx) && ((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 1:00cee5df0f76 415 {
paologiorgio 1:00cee5df0f76 416 rxTimeRead = rx.read();
paologiorgio 0:8f7c961a5966 417 }
paologiorgio 1:00cee5df0f76 418
paologiorgio 1:00cee5df0f76 419 rx.stop();
paologiorgio 1:00cee5df0f76 420
paologiorgio 1:00cee5df0f76 421 if ((rxTlmOpt1Ptr == hsk_rx) && ((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 1:00cee5df0f76 422 {
paologiorgio 1:00cee5df0f76 423 __disable_irq();
paologiorgio 1:00cee5df0f76 424 memcpy(data_TLMOpt1, rx_TLMOpt1, rxTlmOpt1Ptr);
paologiorgio 1:00cee5df0f76 425 rxTlmOpt1DataCounter = rxTlmOpt1Ptr;
paologiorgio 1:00cee5df0f76 426 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 427 //__enable_irq();
paologiorgio 1:00cee5df0f76 428
paologiorgio 1:00cee5df0f76 429 data_TLMOpt1[rxTlmOpt1DataCounter] = 0;
paologiorgio 1:00cee5df0f76 430
paologiorgio 1:00cee5df0f76 431 TxTelemetry();
paologiorgio 1:00cee5df0f76 432 __enable_irq(); // ***************************************************
paologiorgio 1:00cee5df0f76 433 spacecraft.printf("\n\r > Ricevuto Telemetry Opt 1 \n\r");
paologiorgio 1:00cee5df0f76 434
paologiorgio 1:00cee5df0f76 435 }
paologiorgio 1:00cee5df0f76 436 else if ((rxTimeRead - rxTimeStart) >= rxWindow)
paologiorgio 1:00cee5df0f76 437 {
paologiorgio 1:00cee5df0f76 438 mima.printf("\n\r !!! Scattato il timeout in Telemetry Opt 1 !!! \n\r");
paologiorgio 1:00cee5df0f76 439 rxTlmOpt1Ptr = 0;
paologiorgio 1:00cee5df0f76 440 for (int i = 0; i < packet; i++)
paologiorgio 1:00cee5df0f76 441 {
paologiorgio 1:00cee5df0f76 442 rx_TLMOpt1[i] = '\0';
paologiorgio 1:00cee5df0f76 443 data_TLMOpt1[i] = '\0';
paologiorgio 1:00cee5df0f76 444 }
paologiorgio 1:00cee5df0f76 445 }
paologiorgio 1:00cee5df0f76 446 TlcSend = false;
paologiorgio 1:00cee5df0f76 447 } // end-else-if-send-telecommand
paologiorgio 1:00cee5df0f76 448 else if ((TlcSend) && (tlmode_option_1 == 1) && (tlmode_option_2 == 0) && (tlmode_tlm == 1))
paologiorgio 1:00cee5df0f76 449 {
paologiorgio 1:00cee5df0f76 450 spacecraft.printf("\n\r > Sono entrato in TLMODE 2 - TX Telemetry \n\r");
paologiorgio 1:00cee5df0f76 451 clearBuffer(data_TLMOpt2, sizeof(data_TLMOpt2)/sizeof(char));
paologiorgio 1:00cee5df0f76 452
paologiorgio 1:00cee5df0f76 453 rx.start();
paologiorgio 1:00cee5df0f76 454 rxTimeStart = rx.read();
paologiorgio 1:00cee5df0f76 455 rxTimeRead = rxTimeStart;
paologiorgio 1:00cee5df0f76 456
paologiorgio 1:00cee5df0f76 457 while ((rxTlmOpt2Ptr < hsk_sd) && ((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 1:00cee5df0f76 458 {
paologiorgio 1:00cee5df0f76 459 rxTimeRead = rx.read();
paologiorgio 1:00cee5df0f76 460 }
paologiorgio 1:00cee5df0f76 461
paologiorgio 1:00cee5df0f76 462 rx.stop();
paologiorgio 1:00cee5df0f76 463
paologiorgio 1:00cee5df0f76 464 if ((rxTlmOpt2Ptr == hsk_sd) && ((rxTimeRead - rxTimeStart) < rxWindow))
paologiorgio 1:00cee5df0f76 465 {
paologiorgio 1:00cee5df0f76 466 __disable_irq();
paologiorgio 1:00cee5df0f76 467 memcpy(data_TLMOpt2, rx_TLMOpt2, rxTlmOpt2Ptr);
paologiorgio 1:00cee5df0f76 468 rxTlmOpt2DataCounter = rxTlmOpt2Ptr;
paologiorgio 1:00cee5df0f76 469 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 470 //__enable_irq();
paologiorgio 1:00cee5df0f76 471
paologiorgio 1:00cee5df0f76 472 data_TLMOpt2[rxTlmOpt2DataCounter] = 0;
paologiorgio 1:00cee5df0f76 473
paologiorgio 1:00cee5df0f76 474 TxTelemetry();
paologiorgio 1:00cee5df0f76 475 __enable_irq(); // ***************************************************
paologiorgio 1:00cee5df0f76 476 spacecraft.printf("\n\r Ricevuto Telemetry Opt 2 \n\r");
paologiorgio 0:8f7c961a5966 477
paologiorgio 1:00cee5df0f76 478 }
paologiorgio 1:00cee5df0f76 479 else if ((rxTimeRead - rxTimeStart) >= rxWindow)
paologiorgio 1:00cee5df0f76 480 {
paologiorgio 1:00cee5df0f76 481 spacecraft.printf("\n\r !!! Scattato il timeout in Telemetry Opt 2 !!! \n\r");
paologiorgio 1:00cee5df0f76 482 rxTlmOpt2Ptr = 0;
paologiorgio 1:00cee5df0f76 483 for (int i = 0; i < packet; i++)
paologiorgio 1:00cee5df0f76 484 {
paologiorgio 1:00cee5df0f76 485 rx_TLMOpt2[i] = '\0';
paologiorgio 1:00cee5df0f76 486 data_TLMOpt2[i] = '\0';
paologiorgio 1:00cee5df0f76 487 }
paologiorgio 1:00cee5df0f76 488 }
paologiorgio 1:00cee5df0f76 489 TlcSend = false;
paologiorgio 1:00cee5df0f76 490 } // end-2nd-else-if-send-telecommand
paologiorgio 1:00cee5df0f76 491
paologiorgio 1:00cee5df0f76 492 spacecraft.printf("\n\r .... Ho inviato il telecomando entro la finestra di timeout .... \n\r");
paologiorgio 1:00cee5df0f76 493 spacecraft.printf(" *************************************** \n\r");
paologiorgio 1:00cee5df0f76 494
paologiorgio 1:00cee5df0f76 495 //__enable_irq();
paologiorgio 1:00cee5df0f76 496
paologiorgio 1:00cee5df0f76 497 } // end-if:telecommand
paologiorgio 1:00cee5df0f76 498 else if ((tTimeRead - tTimeStart) >= TIMEOUT)
paologiorgio 1:00cee5df0f76 499 {
paologiorgio 1:00cee5df0f76 500 rxTlcPtr = 0;
paologiorgio 1:00cee5df0f76 501 for (int i = 0; i < packet; i++)
paologiorgio 0:8f7c961a5966 502 {
paologiorgio 1:00cee5df0f76 503 rx_TLC[i] = '\0';
paologiorgio 1:00cee5df0f76 504 data_TLC[i] = '\0';
paologiorgio 0:8f7c961a5966 505 }
paologiorgio 1:00cee5df0f76 506
paologiorgio 1:00cee5df0f76 507 spacecraft.printf(" .... Telecomando non inviato: timeout, riprovare! \n\r");
paologiorgio 1:00cee5df0f76 508 } // end-else-if:telecommand+timeout
paologiorgio 1:00cee5df0f76 509 } // end-while:true
paologiorgio 1:00cee5df0f76 510 } // end-Main
paologiorgio 1:00cee5df0f76 511
paologiorgio 1:00cee5df0f76 512
paologiorgio 1:00cee5df0f76 513 /* ************************************************************* */
paologiorgio 1:00cee5df0f76 514 /* ******** SYSTEM INTERRPUTS MANAGEMENT AND FUNCTIONS ********* */
paologiorgio 1:00cee5df0f76 515 /* ************************************************************* */
paologiorgio 1:00cee5df0f76 516
paologiorgio 1:00cee5df0f76 517 // Interrupt: DORA receives a byte from Spacecraft
paologiorgio 1:00cee5df0f76 518 void RxTelecommand()
paologiorgio 1:00cee5df0f76 519 {
paologiorgio 1:00cee5df0f76 520 char txChar;
paologiorgio 1:00cee5df0f76 521 while (spacecraft.readable())
paologiorgio 1:00cee5df0f76 522 {
paologiorgio 1:00cee5df0f76 523 txChar = spacecraft.getc();
paologiorgio 1:00cee5df0f76 524 rx_TLC[rxTlcPtr++] = txChar;
paologiorgio 1:00cee5df0f76 525 }
paologiorgio 1:00cee5df0f76 526 }
paologiorgio 1:00cee5df0f76 527
paologiorgio 1:00cee5df0f76 528 // Interrupt: DORA receives a byte from MIMA
paologiorgio 1:00cee5df0f76 529 void RxTelemetry()
paologiorgio 1:00cee5df0f76 530 {
paologiorgio 1:00cee5df0f76 531 char rxChar;
paologiorgio 1:00cee5df0f76 532 while (mima.readable())
paologiorgio 1:00cee5df0f76 533 {
paologiorgio 1:00cee5df0f76 534 rxChar = mima.getc();
paologiorgio 1:00cee5df0f76 535
paologiorgio 1:00cee5df0f76 536 if (tlmode_tlm == 0) // Standard telemetry message
paologiorgio 1:00cee5df0f76 537 {
paologiorgio 1:00cee5df0f76 538 rx_TLM[rxTlmPtr++] = rxChar;
paologiorgio 1:00cee5df0f76 539 }
paologiorgio 1:00cee5df0f76 540 else if (tlmode_option_1 == 0) // TLMODE 1 (all housekeeping telemetries)
paologiorgio 1:00cee5df0f76 541 {
paologiorgio 1:00cee5df0f76 542 rx_TLMOpt1[rxTlmOpt1Ptr++] = rxChar;
paologiorgio 1:00cee5df0f76 543 }
paologiorgio 1:00cee5df0f76 544 else if (tlmode_option_2 == 0) // TLMODE 2 (hsk+scientific data)
paologiorgio 1:00cee5df0f76 545 {
paologiorgio 1:00cee5df0f76 546 rx_TLMOpt2[rxTlmOpt2Ptr++] = rxChar;
paologiorgio 0:8f7c961a5966 547 }
paologiorgio 0:8f7c961a5966 548 }
paologiorgio 0:8f7c961a5966 549 }
paologiorgio 0:8f7c961a5966 550
paologiorgio 1:00cee5df0f76 551 // Once received a full telecommand frame, send it to MIMA
paologiorgio 1:00cee5df0f76 552 void TxTelecommand()
paologiorgio 0:8f7c961a5966 553 {
paologiorgio 1:00cee5df0f76 554 mima.puts(data_TLC);
paologiorgio 1:00cee5df0f76 555 TlcSend = true;
paologiorgio 0:8f7c961a5966 556 }
paologiorgio 0:8f7c961a5966 557
paologiorgio 1:00cee5df0f76 558 // Once received a full telemetry frame, send it to Spacecraft
paologiorgio 0:8f7c961a5966 559 void TxTelemetry()
paologiorgio 0:8f7c961a5966 560 {
paologiorgio 1:00cee5df0f76 561 if (tlmode_tlm == 0)
paologiorgio 1:00cee5df0f76 562 {
paologiorgio 1:00cee5df0f76 563 spacecraft.puts(data_TLM);
paologiorgio 1:00cee5df0f76 564 }
paologiorgio 1:00cee5df0f76 565 else if (tlmode_option_1 == 0)
paologiorgio 1:00cee5df0f76 566 {
paologiorgio 1:00cee5df0f76 567 spacecraft.puts(data_TLMOpt1);
paologiorgio 0:8f7c961a5966 568 }
paologiorgio 0:8f7c961a5966 569 else if (tlmode_option_2 == 0)
paologiorgio 0:8f7c961a5966 570 {
paologiorgio 1:00cee5df0f76 571 spacecraft.puts(data_TLMOpt2);
paologiorgio 0:8f7c961a5966 572 }
paologiorgio 0:8f7c961a5966 573 }
paologiorgio 0:8f7c961a5966 574
paologiorgio 1:00cee5df0f76 575 // Reset
paologiorgio 1:00cee5df0f76 576 void clearBuffer(char *arr, int arrLen)
paologiorgio 0:8f7c961a5966 577 {
paologiorgio 1:00cee5df0f76 578 int myIndex;
paologiorgio 1:00cee5df0f76 579 for (myIndex = 0; myIndex < arrLen; myIndex++)
paologiorgio 0:8f7c961a5966 580 {
paologiorgio 1:00cee5df0f76 581 arr[myIndex] = '\0'; // terminatore
paologiorgio 0:8f7c961a5966 582 }
paologiorgio 0:8f7c961a5966 583 }