Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@2:155d07b145c6, 2022-08-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |