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