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