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