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:295db98f7ea0, 2022-06-01 (annotated)
- Committer:
- paologiorgio
- Date:
- Wed Jun 01 11:17:04 2022 +0000
- Revision:
- 0:295db98f7ea0
Protocollo
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| paologiorgio | 0:295db98f7ea0 | 1 | #include "mbed.h" |
| paologiorgio | 0:295db98f7ea0 | 2 | #include <math.h> |
| paologiorgio | 0:295db98f7ea0 | 3 | |
| paologiorgio | 0:295db98f7ea0 | 4 | /*---------------------------- |
| paologiorgio | 0:295db98f7ea0 | 5 | ---------- INFO ----------- */ |
| paologiorgio | 0:295db98f7ea0 | 6 | |
| paologiorgio | 0:295db98f7ea0 | 7 | // DORA SETTING to-do-6 giugno !!! |
| paologiorgio | 0:295db98f7ea0 | 8 | // master-slave: slave MIMA comunica con DORA con collegamento UART (tx, rx, gnd) |
| paologiorgio | 0:295db98f7ea0 | 9 | // PC S/C sends packets to DORA -> MIMA (STM32) -> PC |
| paologiorgio | 0:295db98f7ea0 | 10 | |
| paologiorgio | 0:295db98f7ea0 | 11 | // ------ ------------ |
| paologiorgio | 0:295db98f7ea0 | 12 | // | MIMA | ---- DORA ---- | SPACE/CRAFT | |
| paologiorgio | 0:295db98f7ea0 | 13 | // ------ ------------ |
| paologiorgio | 0:295db98f7ea0 | 14 | |
| paologiorgio | 0:295db98f7ea0 | 15 | /*---------------------------- |
| paologiorgio | 0:295db98f7ea0 | 16 | ---------- DEFINE ----------- */ |
| paologiorgio | 0:295db98f7ea0 | 17 | // definisce dimensione pacchetto inviato da pc |
| paologiorgio | 0:295db98f7ea0 | 18 | // telecommand: 15 bit + 1 di controllo |
| paologiorgio | 0:295db98f7ea0 | 19 | #define PACKETSIZE 20 // lunghezza massima della stringa trasmissibile prima di interrupt |
| paologiorgio | 0:295db98f7ea0 | 20 | #define PACKET 15 // 15 bit, 1 di parità di controllo |
| paologiorgio | 0:295db98f7ea0 | 21 | #define PACKET_CHECKED 16 // COMMAND IDENTIFIER + TAG + PAYLOAD + PARITY CHECK |
| paologiorgio | 0:295db98f7ea0 | 22 | #define IDENTIFIER 5 |
| paologiorgio | 0:295db98f7ea0 | 23 | #define TAG 2 |
| paologiorgio | 0:295db98f7ea0 | 24 | #define PAYLOAD 8 |
| paologiorgio | 0:295db98f7ea0 | 25 | #define CMD_NUM 32 |
| paologiorgio | 0:295db98f7ea0 | 26 | #define OPTION_1 912 // 57*16 |
| paologiorgio | 0:295db98f7ea0 | 27 | #define OPTION_2 90608 // 5663*16 |
| paologiorgio | 0:295db98f7ea0 | 28 | #define tb 7 // bit sampling period |
| paologiorgio | 0:295db98f7ea0 | 29 | |
| paologiorgio | 0:295db98f7ea0 | 30 | /*---------------------------- |
| paologiorgio | 0:295db98f7ea0 | 31 | ---------- INIT ----------- */ |
| paologiorgio | 0:295db98f7ea0 | 32 | // comunicazioni seriali DORA |
| paologiorgio | 0:295db98f7ea0 | 33 | |
| paologiorgio | 0:295db98f7ea0 | 34 | // PIN OCCUPATI: D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10 |
| paologiorgio | 0:295db98f7ea0 | 35 | |
| paologiorgio | 0:295db98f7ea0 | 36 | // ************** CN7 ******************** |
| paologiorgio | 0:295db98f7ea0 | 37 | Serial SC(USBTX, USBRX); // A4 TX, A6 RX - DATA OUT, DATA IN |
| paologiorgio | 0:295db98f7ea0 | 38 | DigitalOut GATE_WRITE_SC(PB_0); // A3 |
| paologiorgio | 0:295db98f7ea0 | 39 | DigitalOut GATE_READ_SC(PA_4); // A2 |
| paologiorgio | 0:295db98f7ea0 | 40 | DigitalOut DATA_CLOCK_OUT_SC(PA_1); // A1 |
| paologiorgio | 0:295db98f7ea0 | 41 | |
| paologiorgio | 0:295db98f7ea0 | 42 | // ************** CN10 ******************* |
| paologiorgio | 0:295db98f7ea0 | 43 | Serial MIMA(PB_6, PA_10); // IN - OUT // TX D1, RX D0 -> DATA_OUT, DATA_IN -> D0 e D1 non vanno bene! Risorse già occupate |
| paologiorgio | 0:295db98f7ea0 | 44 | // PA_8, PA_9, PC_1, PC_0, PA_10, PB_3 // RX, TX |
| paologiorgio | 0:295db98f7ea0 | 45 | DigitalOut GATE_WRITE_MIMA(PA_9); // D8 |
| paologiorgio | 0:295db98f7ea0 | 46 | DigitalOut GATE_READ_MIMA(PC_7); // D9 |
| paologiorgio | 0:295db98f7ea0 | 47 | DigitalOut DATA_CLOCK_OUT_MIMA(PB_6); // D10 |
| paologiorgio | 0:295db98f7ea0 | 48 | |
| paologiorgio | 0:295db98f7ea0 | 49 | // DATA_OUT_CLOCK.write(0) -> wait_ms(7) -> DATA_OUT_CLOCK.write(0) -> wait_ms(7) |
| paologiorgio | 0:295db98f7ea0 | 50 | |
| paologiorgio | 0:295db98f7ea0 | 51 | // informazioni circa il pacchetto trasmesso |
| paologiorgio | 0:295db98f7ea0 | 52 | volatile int nIndex; // indice del pacchetto per lo "spacchettamento" |
| paologiorgio | 0:295db98f7ea0 | 53 | char getPacket[PACKETSIZE]; // buffer - pacchetto inviato di dimensione max PACKETSIZE |
| paologiorgio | 0:295db98f7ea0 | 54 | char PacketChecked[PACKET_CHECKED]; // lato Space/Craft |
| paologiorgio | 0:295db98f7ea0 | 55 | char TLM[OPTION_1]; // lato MIMA per check |
| paologiorgio | 0:295db98f7ea0 | 56 | char TLM_SD[OPTION_2]; // lato MIMA per check |
| paologiorgio | 0:295db98f7ea0 | 57 | char TLM_SC[OPTION_1]; // lato space/craft per check |
| paologiorgio | 0:295db98f7ea0 | 58 | char TLM_SD_SC[OPTION_2]; // lato space/craft per check |
| paologiorgio | 0:295db98f7ea0 | 59 | |
| paologiorgio | 0:295db98f7ea0 | 60 | volatile int LEN; // numero di bit da ricevere per ricezione corretta |
| paologiorgio | 0:295db98f7ea0 | 61 | volatile int commandId; |
| paologiorgio | 0:295db98f7ea0 | 62 | volatile int size; |
| paologiorgio | 0:295db98f7ea0 | 63 | volatile unsigned char data; // in arrivo da MIMA per telemetria |
| paologiorgio | 0:295db98f7ea0 | 64 | |
| paologiorgio | 0:295db98f7ea0 | 65 | int base = 2; // base per l'esponenziale (conversione binary to decimal) |
| paologiorgio | 0:295db98f7ea0 | 66 | int CMD[CMD_NUM]; // CMD in decimale |
| paologiorgio | 0:295db98f7ea0 | 67 | //const char *CODE[] = {}; // LISTA comandi |
| paologiorgio | 0:295db98f7ea0 | 68 | |
| paologiorgio | 0:295db98f7ea0 | 69 | volatile int option_1 = 0; // default |
| paologiorgio | 0:295db98f7ea0 | 70 | volatile int option_2 = 0; |
| paologiorgio | 0:295db98f7ea0 | 71 | |
| paologiorgio | 0:295db98f7ea0 | 72 | /*---------------------------- |
| paologiorgio | 0:295db98f7ea0 | 73 | ---------- SETUP ----------- */ |
| paologiorgio | 0:295db98f7ea0 | 74 | void CMD_REF(void); |
| paologiorgio | 0:295db98f7ea0 | 75 | void init(void); |
| paologiorgio | 0:295db98f7ea0 | 76 | void RxTelecommand(void); |
| paologiorgio | 0:295db98f7ea0 | 77 | void TxTelecommand(void); |
| paologiorgio | 0:295db98f7ea0 | 78 | void RxTelemetry(void); |
| paologiorgio | 0:295db98f7ea0 | 79 | void TxTelemetry(void); |
| paologiorgio | 0:295db98f7ea0 | 80 | |
| paologiorgio | 0:295db98f7ea0 | 81 | /*---------------------------- |
| paologiorgio | 0:295db98f7ea0 | 82 | ---------- MAIN ----------- */ |
| paologiorgio | 0:295db98f7ea0 | 83 | int main() |
| paologiorgio | 0:295db98f7ea0 | 84 | { |
| paologiorgio | 0:295db98f7ea0 | 85 | SC.baud(115200); |
| paologiorgio | 0:295db98f7ea0 | 86 | MIMA.baud(115200); |
| paologiorgio | 0:295db98f7ea0 | 87 | |
| paologiorgio | 0:295db98f7ea0 | 88 | // Setup |
| paologiorgio | 0:295db98f7ea0 | 89 | GATE_READ_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 90 | GATE_WRITE_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 91 | |
| paologiorgio | 0:295db98f7ea0 | 92 | GATE_READ_SC = 1; |
| paologiorgio | 0:295db98f7ea0 | 93 | GATE_WRITE_SC = 1; |
| paologiorgio | 0:295db98f7ea0 | 94 | |
| paologiorgio | 0:295db98f7ea0 | 95 | SC.printf("******* Starting... *******\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 96 | |
| paologiorgio | 0:295db98f7ea0 | 97 | // interrupt quando arriva stringa da PC (space/craft) |
| paologiorgio | 0:295db98f7ea0 | 98 | SC.attach(&RxTelecommand, Serial::RxIrq); |
| paologiorgio | 0:295db98f7ea0 | 99 | // interript quando invia stringa a MIMA |
| paologiorgio | 0:295db98f7ea0 | 100 | MIMA.attach(&TxTelecommand, Serial::TxIrq); |
| paologiorgio | 0:295db98f7ea0 | 101 | // interrupt quando riceve stringa da MIMA |
| paologiorgio | 0:295db98f7ea0 | 102 | MIMA.attach(&RxTelemetry, Serial::RxIrq); |
| paologiorgio | 0:295db98f7ea0 | 103 | // interrupt quando invia stringa a SC |
| paologiorgio | 0:295db98f7ea0 | 104 | SC.attach(&TxTelemetry, Serial::TxIrq); |
| paologiorgio | 0:295db98f7ea0 | 105 | |
| paologiorgio | 0:295db98f7ea0 | 106 | } |
| paologiorgio | 0:295db98f7ea0 | 107 | |
| paologiorgio | 0:295db98f7ea0 | 108 | |
| paologiorgio | 0:295db98f7ea0 | 109 | |
| paologiorgio | 0:295db98f7ea0 | 110 | // ********************************************************************* |
| paologiorgio | 0:295db98f7ea0 | 111 | |
| paologiorgio | 0:295db98f7ea0 | 112 | |
| paologiorgio | 0:295db98f7ea0 | 113 | |
| paologiorgio | 0:295db98f7ea0 | 114 | /*---------------------------- |
| paologiorgio | 0:295db98f7ea0 | 115 | -------- FUNCTIONS --------- */ |
| paologiorgio | 0:295db98f7ea0 | 116 | void CMD_REF(void) |
| paologiorgio | 0:295db98f7ea0 | 117 | { |
| paologiorgio | 0:295db98f7ea0 | 118 | for (int i = 0; i < CMD_NUM; i++) |
| paologiorgio | 0:295db98f7ea0 | 119 | { |
| paologiorgio | 0:295db98f7ea0 | 120 | CMD[i] = i; |
| paologiorgio | 0:295db98f7ea0 | 121 | } |
| paologiorgio | 0:295db98f7ea0 | 122 | } |
| paologiorgio | 0:295db98f7ea0 | 123 | |
| paologiorgio | 0:295db98f7ea0 | 124 | // inizializzazione pacchetto TBC |
| paologiorgio | 0:295db98f7ea0 | 125 | void init(void) |
| paologiorgio | 0:295db98f7ea0 | 126 | { |
| paologiorgio | 0:295db98f7ea0 | 127 | // reset pacchetto |
| paologiorgio | 0:295db98f7ea0 | 128 | nIndex = 0; |
| paologiorgio | 0:295db98f7ea0 | 129 | for (nIndex = 0; nIndex < PACKETSIZE; nIndex++) |
| paologiorgio | 0:295db98f7ea0 | 130 | { |
| paologiorgio | 0:295db98f7ea0 | 131 | getPacket[nIndex] = '\0'; |
| paologiorgio | 0:295db98f7ea0 | 132 | } |
| paologiorgio | 0:295db98f7ea0 | 133 | } |
| paologiorgio | 0:295db98f7ea0 | 134 | |
| paologiorgio | 0:295db98f7ea0 | 135 | // DORA riceve telecomando da MIMA |
| paologiorgio | 0:295db98f7ea0 | 136 | void RxTelecommand(void) |
| paologiorgio | 0:295db98f7ea0 | 137 | { |
| paologiorgio | 0:295db98f7ea0 | 138 | init(); // clear the buffer |
| paologiorgio | 0:295db98f7ea0 | 139 | CMD_REF(); // carica vettore dei comandi |
| paologiorgio | 0:295db98f7ea0 | 140 | |
| paologiorgio | 0:295db98f7ea0 | 141 | while (SC.readable()) // finché sulla porta USB arrivano dati, esegui |
| paologiorgio | 0:295db98f7ea0 | 142 | { |
| paologiorgio | 0:295db98f7ea0 | 143 | SC.gets(getPacket, sizeof(getPacket)); // leggi la stringa in ingresso |
| paologiorgio | 0:295db98f7ea0 | 144 | LEN = strlen(getPacket) - 2; // calcola la sua lunghezza ignorando i tag \r\n |
| paologiorgio | 0:295db98f7ea0 | 145 | |
| paologiorgio | 0:295db98f7ea0 | 146 | if (LEN != PACKET) |
| paologiorgio | 0:295db98f7ea0 | 147 | { |
| paologiorgio | 0:295db98f7ea0 | 148 | // controlla se la stringa ricevuta è consona (16 bit) |
| paologiorgio | 0:295db98f7ea0 | 149 | SC.printf("> Bit number: %i is not equal to 15 - ERROR\n\r", LEN); // diagnostica |
| paologiorgio | 0:295db98f7ea0 | 150 | } |
| paologiorgio | 0:295db98f7ea0 | 151 | else |
| paologiorgio | 0:295db98f7ea0 | 152 | { |
| paologiorgio | 0:295db98f7ea0 | 153 | for (int n = 0; n < LEN; n++) |
| paologiorgio | 0:295db98f7ea0 | 154 | { |
| paologiorgio | 0:295db98f7ea0 | 155 | PacketChecked[n] = getPacket[n]; // riempi il nuovo array |
| paologiorgio | 0:295db98f7ea0 | 156 | } |
| paologiorgio | 0:295db98f7ea0 | 157 | |
| paologiorgio | 0:295db98f7ea0 | 158 | // ***CONTROLLO DEI BIT - LSB: EVEN/ODD *** |
| paologiorgio | 0:295db98f7ea0 | 159 | int ones = 0; |
| paologiorgio | 0:295db98f7ea0 | 160 | int check = 0; |
| paologiorgio | 0:295db98f7ea0 | 161 | while (check < PACKET) |
| paologiorgio | 0:295db98f7ea0 | 162 | { |
| paologiorgio | 0:295db98f7ea0 | 163 | if (getPacket[check] == '1') |
| paologiorgio | 0:295db98f7ea0 | 164 | { |
| paologiorgio | 0:295db98f7ea0 | 165 | ones++; |
| paologiorgio | 0:295db98f7ea0 | 166 | } |
| paologiorgio | 0:295db98f7ea0 | 167 | |
| paologiorgio | 0:295db98f7ea0 | 168 | check++; |
| paologiorgio | 0:295db98f7ea0 | 169 | } |
| paologiorgio | 0:295db98f7ea0 | 170 | |
| paologiorgio | 0:295db98f7ea0 | 171 | char newItem; |
| paologiorgio | 0:295db98f7ea0 | 172 | |
| paologiorgio | 0:295db98f7ea0 | 173 | if (ones % 2 == 0) |
| paologiorgio | 0:295db98f7ea0 | 174 | { |
| paologiorgio | 0:295db98f7ea0 | 175 | newItem = '0'; // If the number of ones in[B0÷B14] bits is even (making the total number of ones even) |
| paologiorgio | 0:295db98f7ea0 | 176 | } |
| paologiorgio | 0:295db98f7ea0 | 177 | else |
| paologiorgio | 0:295db98f7ea0 | 178 | { |
| paologiorgio | 0:295db98f7ea0 | 179 | newItem = '1'; // If the number of ones in[B0÷B14] bits is odd (making the total number of ones even) |
| paologiorgio | 0:295db98f7ea0 | 180 | } |
| paologiorgio | 0:295db98f7ea0 | 181 | |
| paologiorgio | 0:295db98f7ea0 | 182 | int nPacket = PACKET + 1; |
| paologiorgio | 0:295db98f7ea0 | 183 | // shift elements |
| paologiorgio | 0:295db98f7ea0 | 184 | for (int i = nPacket - 1; i >= PACKET_CHECKED; i--) |
| paologiorgio | 0:295db98f7ea0 | 185 | { |
| paologiorgio | 0:295db98f7ea0 | 186 | PacketChecked[i] = PacketChecked[i - 1]; |
| paologiorgio | 0:295db98f7ea0 | 187 | } |
| paologiorgio | 0:295db98f7ea0 | 188 | |
| paologiorgio | 0:295db98f7ea0 | 189 | // insert LSB |
| paologiorgio | 0:295db98f7ea0 | 190 | PacketChecked[PACKET_CHECKED - 1] = newItem; |
| paologiorgio | 0:295db98f7ea0 | 191 | |
| paologiorgio | 0:295db98f7ea0 | 192 | SC.printf("> Send: "); |
| paologiorgio | 0:295db98f7ea0 | 193 | for (int z = 0; z < PACKET_CHECKED; z++) |
| paologiorgio | 0:295db98f7ea0 | 194 | { |
| paologiorgio | 0:295db98f7ea0 | 195 | SC.printf("%c", PacketChecked[z]); |
| paologiorgio | 0:295db98f7ea0 | 196 | } |
| paologiorgio | 0:295db98f7ea0 | 197 | |
| paologiorgio | 0:295db98f7ea0 | 198 | SC.printf("\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 199 | |
| paologiorgio | 0:295db98f7ea0 | 200 | // ************DIAGNOSTICA ************ |
| paologiorgio | 0:295db98f7ea0 | 201 | // un telecommand è formato da 16 bit. i primi 5 sono identificativi, |
| paologiorgio | 0:295db98f7ea0 | 202 | // poi ho due bit che mi specificano se i dati in arrivo sono una o più parole, |
| paologiorgio | 0:295db98f7ea0 | 203 | // dopodiché ho un payload da 8 bit e per concludere ho LSB (parity bit) |
| paologiorgio | 0:295db98f7ea0 | 204 | // MSB IIII TT PPPPPPPP PC |
| paologiorgio | 0:295db98f7ea0 | 205 | |
| paologiorgio | 0:295db98f7ea0 | 206 | // ***COMMAND IDENTIFIER *** |
| paologiorgio | 0:295db98f7ea0 | 207 | int CMDIndex = 0; // puntatore dell'identificativo |
| paologiorgio | 0:295db98f7ea0 | 208 | commandId = 0; |
| paologiorgio | 0:295db98f7ea0 | 209 | // trasformo l'identificatore in numero |
| paologiorgio | 0:295db98f7ea0 | 210 | while (CMDIndex < IDENTIFIER) |
| paologiorgio | 0:295db98f7ea0 | 211 | { |
| paologiorgio | 0:295db98f7ea0 | 212 | if (PacketChecked[CMDIndex] == '1') |
| paologiorgio | 0:295db98f7ea0 | 213 | { |
| paologiorgio | 0:295db98f7ea0 | 214 | int raise = IDENTIFIER - 1 - CMDIndex; |
| paologiorgio | 0:295db98f7ea0 | 215 | commandId += pow((float) base, (float) raise); |
| paologiorgio | 0:295db98f7ea0 | 216 | } |
| paologiorgio | 0:295db98f7ea0 | 217 | else |
| paologiorgio | 0:295db98f7ea0 | 218 | { |
| paologiorgio | 0:295db98f7ea0 | 219 | commandId += 0; |
| paologiorgio | 0:295db98f7ea0 | 220 | } |
| paologiorgio | 0:295db98f7ea0 | 221 | |
| paologiorgio | 0:295db98f7ea0 | 222 | CMDIndex++; |
| paologiorgio | 0:295db98f7ea0 | 223 | } |
| paologiorgio | 0:295db98f7ea0 | 224 | |
| paologiorgio | 0:295db98f7ea0 | 225 | // scorro la lista di comandi disponibli e verifico se il comando trasmesso rientra |
| paologiorgio | 0:295db98f7ea0 | 226 | // nella lista, altrimenti finisco in uno dei 3 SPARE |
| paologiorgio | 0:295db98f7ea0 | 227 | int k = 0; |
| paologiorgio | 0:295db98f7ea0 | 228 | int isElementPresent = 0; |
| paologiorgio | 0:295db98f7ea0 | 229 | while (k < CMD_NUM) |
| paologiorgio | 0:295db98f7ea0 | 230 | { |
| paologiorgio | 0:295db98f7ea0 | 231 | if (commandId == CMD[k]) |
| paologiorgio | 0:295db98f7ea0 | 232 | { |
| paologiorgio | 0:295db98f7ea0 | 233 | isElementPresent = 1; |
| paologiorgio | 0:295db98f7ea0 | 234 | SC.printf("> Telcommand sent belgons to MIMA command list: CMD %i\n\r", k); |
| paologiorgio | 0:295db98f7ea0 | 235 | break; |
| paologiorgio | 0:295db98f7ea0 | 236 | |
| paologiorgio | 0:295db98f7ea0 | 237 | } |
| paologiorgio | 0:295db98f7ea0 | 238 | |
| paologiorgio | 0:295db98f7ea0 | 239 | k++; |
| paologiorgio | 0:295db98f7ea0 | 240 | } |
| paologiorgio | 0:295db98f7ea0 | 241 | |
| paologiorgio | 0:295db98f7ea0 | 242 | if (isElementPresent == '0') |
| paologiorgio | 0:295db98f7ea0 | 243 | { |
| paologiorgio | 0:295db98f7ea0 | 244 | SC.printf("Telecommand sent doesn't exist\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 245 | } |
| paologiorgio | 0:295db98f7ea0 | 246 | |
| paologiorgio | 0:295db98f7ea0 | 247 | // ***TAG *** |
| paologiorgio | 0:295db98f7ea0 | 248 | int B5 = PacketChecked[5]; |
| paologiorgio | 0:295db98f7ea0 | 249 | int B6 = PacketChecked[6]; |
| paologiorgio | 0:295db98f7ea0 | 250 | |
| paologiorgio | 0:295db98f7ea0 | 251 | if (B5 == '0' && B6 == '0') |
| paologiorgio | 0:295db98f7ea0 | 252 | { |
| paologiorgio | 0:295db98f7ea0 | 253 | // Single word telemetry |
| paologiorgio | 0:295db98f7ea0 | 254 | SC.printf("Single word telemetry\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 255 | } |
| paologiorgio | 0:295db98f7ea0 | 256 | else if (B5 == '0' && B6 == '1') |
| paologiorgio | 0:295db98f7ea0 | 257 | { |
| paologiorgio | 0:295db98f7ea0 | 258 | // Multiple words telemetry (1st word) |
| paologiorgio | 0:295db98f7ea0 | 259 | SC.printf("Multiple words telemetry (1st word)\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 260 | } |
| paologiorgio | 0:295db98f7ea0 | 261 | else if (B5 == '1' && B6 == '0') |
| paologiorgio | 0:295db98f7ea0 | 262 | { |
| paologiorgio | 0:295db98f7ea0 | 263 | // Multiple words telemetry (2nd word) |
| paologiorgio | 0:295db98f7ea0 | 264 | SC.printf("Multiple words telemetry (2nd word)\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 265 | } |
| paologiorgio | 0:295db98f7ea0 | 266 | else |
| paologiorgio | 0:295db98f7ea0 | 267 | { |
| paologiorgio | 0:295db98f7ea0 | 268 | // Not used |
| paologiorgio | 0:295db98f7ea0 | 269 | SC.printf("NOT USED\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 270 | } |
| paologiorgio | 0:295db98f7ea0 | 271 | |
| paologiorgio | 0:295db98f7ea0 | 272 | // ***PAYLOAD *** |
| paologiorgio | 0:295db98f7ea0 | 273 | SC.printf("> Payload: "); |
| paologiorgio | 0:295db98f7ea0 | 274 | for (int IndexPayload = 7; IndexPayload <= PACKET; IndexPayload++) |
| paologiorgio | 0:295db98f7ea0 | 275 | { |
| paologiorgio | 0:295db98f7ea0 | 276 | SC.printf("%c", PacketChecked[IndexPayload]); |
| paologiorgio | 0:295db98f7ea0 | 277 | } |
| paologiorgio | 0:295db98f7ea0 | 278 | |
| paologiorgio | 0:295db98f7ea0 | 279 | SC.printf("\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 280 | int B7 = PacketChecked[7]; |
| paologiorgio | 0:295db98f7ea0 | 281 | int B9 = PacketChecked[9]; |
| paologiorgio | 0:295db98f7ea0 | 282 | int B11 = PacketChecked[11]; |
| paologiorgio | 0:295db98f7ea0 | 283 | |
| paologiorgio | 0:295db98f7ea0 | 284 | // ****************************** |
| paologiorgio | 0:295db98f7ea0 | 285 | // ********CHECK CMD01 ********* |
| paologiorgio | 0:295db98f7ea0 | 286 | // ****************************** |
| paologiorgio | 0:295db98f7ea0 | 287 | if (PacketChecked[11] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 288 | PacketChecked[12] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 289 | PacketChecked[13] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 290 | PacketChecked[14] == '1') |
| paologiorgio | 0:295db98f7ea0 | 291 | { |
| paologiorgio | 0:295db98f7ea0 | 292 | SC.printf("> Setting MIMA... Sleeping mode\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 293 | } |
| paologiorgio | 0:295db98f7ea0 | 294 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 295 | PacketChecked[12] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 296 | PacketChecked[13] == '1' && |
| paologiorgio | 0:295db98f7ea0 | 297 | PacketChecked[14] == '0') |
| paologiorgio | 0:295db98f7ea0 | 298 | { |
| paologiorgio | 0:295db98f7ea0 | 299 | SC.printf("> Setting MIMA... Awake mode\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 300 | } |
| paologiorgio | 0:295db98f7ea0 | 301 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 302 | PacketChecked[12] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 303 | PacketChecked[13] == '1' && |
| paologiorgio | 0:295db98f7ea0 | 304 | PacketChecked[14] == '1') |
| paologiorgio | 0:295db98f7ea0 | 305 | { |
| paologiorgio | 0:295db98f7ea0 | 306 | SC.printf("> Setting MIMA... Calibration mode\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 307 | } |
| paologiorgio | 0:295db98f7ea0 | 308 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 309 | PacketChecked[12] == '1' && |
| paologiorgio | 0:295db98f7ea0 | 310 | PacketChecked[13] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 311 | PacketChecked[14] == '0') |
| paologiorgio | 0:295db98f7ea0 | 312 | { |
| paologiorgio | 0:295db98f7ea0 | 313 | SC.printf("> Setting MIMA... Observation mode\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 314 | } |
| paologiorgio | 0:295db98f7ea0 | 315 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 316 | PacketChecked[12] == '1' && |
| paologiorgio | 0:295db98f7ea0 | 317 | PacketChecked[13] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 318 | PacketChecked[14] == '1') |
| paologiorgio | 0:295db98f7ea0 | 319 | { |
| paologiorgio | 0:295db98f7ea0 | 320 | SC.printf("> Setting MIMA... Auto-test mode\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 321 | } |
| paologiorgio | 0:295db98f7ea0 | 322 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:295db98f7ea0 | 323 | PacketChecked[12] == '1' && |
| paologiorgio | 0:295db98f7ea0 | 324 | PacketChecked[13] == '1' && |
| paologiorgio | 0:295db98f7ea0 | 325 | PacketChecked[14] == '0') |
| paologiorgio | 0:295db98f7ea0 | 326 | { |
| paologiorgio | 0:295db98f7ea0 | 327 | SC.printf("> Setting MIMA... Full testing mode\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 328 | } |
| paologiorgio | 0:295db98f7ea0 | 329 | |
| paologiorgio | 0:295db98f7ea0 | 330 | // IR sensor thermal loop |
| paologiorgio | 0:295db98f7ea0 | 331 | if (B7 == '1') |
| paologiorgio | 0:295db98f7ea0 | 332 | { |
| paologiorgio | 0:295db98f7ea0 | 333 | SC.printf("> IR sensor thermal loop...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 334 | SC.printf("IRT1 telemetry: feedback signal in the thermal control loop (default). IRT2 only for monitoring\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 335 | } |
| paologiorgio | 0:295db98f7ea0 | 336 | else |
| paologiorgio | 0:295db98f7ea0 | 337 | { |
| paologiorgio | 0:295db98f7ea0 | 338 | SC.printf("> IR sensor thermal loop...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 339 | SC.printf("IRT2 telemetry: feedback signal in the thermal control. IRT1 only for monitoring\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 340 | } |
| paologiorgio | 0:295db98f7ea0 | 341 | |
| paologiorgio | 0:295db98f7ea0 | 342 | // Laser Diode thermal loop |
| paologiorgio | 0:295db98f7ea0 | 343 | if (B9 == '1') |
| paologiorgio | 0:295db98f7ea0 | 344 | { |
| paologiorgio | 0:295db98f7ea0 | 345 | SC.printf("> Laser Diode thermal loop...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 346 | SC.printf("LDT1 telemetry: feedback signal in the thermal control loop (default). LDT2 only for monitoring\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 347 | } |
| paologiorgio | 0:295db98f7ea0 | 348 | else |
| paologiorgio | 0:295db98f7ea0 | 349 | { |
| paologiorgio | 0:295db98f7ea0 | 350 | SC.printf("> Laser Diode thermal loop...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 351 | SC.printf("LDT2 telemetry: feedback signal in the thermal control. LDT1 only for monitoring\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 352 | |
| paologiorgio | 0:295db98f7ea0 | 353 | } |
| paologiorgio | 0:295db98f7ea0 | 354 | |
| paologiorgio | 0:295db98f7ea0 | 355 | // BlackBody thermal loop |
| paologiorgio | 0:295db98f7ea0 | 356 | if (B11 == '1') |
| paologiorgio | 0:295db98f7ea0 | 357 | { |
| paologiorgio | 0:295db98f7ea0 | 358 | SC.printf("> BlackBody thermal loop...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 359 | SC.printf("BBT1 telemetry: feedback signal in the thermal control loop (default). BBT2 only for monitoring\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 360 | } |
| paologiorgio | 0:295db98f7ea0 | 361 | else |
| paologiorgio | 0:295db98f7ea0 | 362 | { |
| paologiorgio | 0:295db98f7ea0 | 363 | SC.printf("> BlackBody thermal loop...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 364 | SC.printf("BBT2 telemetry: feedback signal in the thermal control. BBT1 only for monitoring\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 365 | } |
| paologiorgio | 0:295db98f7ea0 | 366 | |
| paologiorgio | 0:295db98f7ea0 | 367 | //***********FINE DIAGNOSTICA PACCHETTO*********** |
| paologiorgio | 0:295db98f7ea0 | 368 | } |
| paologiorgio | 0:295db98f7ea0 | 369 | } |
| paologiorgio | 0:295db98f7ea0 | 370 | |
| paologiorgio | 0:295db98f7ea0 | 371 | } |
| paologiorgio | 0:295db98f7ea0 | 372 | |
| paologiorgio | 0:295db98f7ea0 | 373 | // DORA trasmette telecomando a MIMA |
| paologiorgio | 0:295db98f7ea0 | 374 | void TxTelecommand(void) |
| paologiorgio | 0:295db98f7ea0 | 375 | { |
| paologiorgio | 0:295db98f7ea0 | 376 | |
| paologiorgio | 0:295db98f7ea0 | 377 | while (MIMA.writeable()) |
| paologiorgio | 0:295db98f7ea0 | 378 | { |
| paologiorgio | 0:295db98f7ea0 | 379 | GATE_WRITE_MIMA = 0; |
| paologiorgio | 0:295db98f7ea0 | 380 | |
| paologiorgio | 0:295db98f7ea0 | 381 | DATA_CLOCK_OUT_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 382 | wait_ms(7); |
| paologiorgio | 0:295db98f7ea0 | 383 | |
| paologiorgio | 0:295db98f7ea0 | 384 | for (int i = 0; i < PACKET_CHECKED + 1; i++) |
| paologiorgio | 0:295db98f7ea0 | 385 | { |
| paologiorgio | 0:295db98f7ea0 | 386 | DATA_CLOCK_OUT_MIMA = 0; |
| paologiorgio | 0:295db98f7ea0 | 387 | // The data are read on the falling-edge of the DATA_CLOCK_OUT signal |
| paologiorgio | 0:295db98f7ea0 | 388 | MIMA.putc(PacketChecked[i]); |
| paologiorgio | 0:295db98f7ea0 | 389 | wait_ms(7); |
| paologiorgio | 0:295db98f7ea0 | 390 | DATA_CLOCK_OUT_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 391 | wait_ms(7); |
| paologiorgio | 0:295db98f7ea0 | 392 | } |
| paologiorgio | 0:295db98f7ea0 | 393 | } |
| paologiorgio | 0:295db98f7ea0 | 394 | |
| paologiorgio | 0:295db98f7ea0 | 395 | GATE_WRITE_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 396 | |
| paologiorgio | 0:295db98f7ea0 | 397 | } |
| paologiorgio | 0:295db98f7ea0 | 398 | |
| paologiorgio | 0:295db98f7ea0 | 399 | // DORA riceve telemetrie/telemetrie+scientific data da MIMA |
| paologiorgio | 0:295db98f7ea0 | 400 | void RxTelemetry(void) |
| paologiorgio | 0:295db98f7ea0 | 401 | { |
| paologiorgio | 0:295db98f7ea0 | 402 | while (MIMA.readable()) // finché la seriale sul MIMA manda caratteri |
| paologiorgio | 0:295db98f7ea0 | 403 | { |
| paologiorgio | 0:295db98f7ea0 | 404 | GATE_READ_MIMA = 0; |
| paologiorgio | 0:295db98f7ea0 | 405 | |
| paologiorgio | 0:295db98f7ea0 | 406 | // check del payload per scelta del buffer |
| paologiorgio | 0:295db98f7ea0 | 407 | // 00000000 -> Option 1: transfer all Housekeeping and Status telemetries (from TLM00 to TLM56) |
| paologiorgio | 0:295db98f7ea0 | 408 | // 11111111 -> Option 2: transfer telemetries and scientific data packets (from TLM00 to TLM5662) |
| paologiorgio | 0:295db98f7ea0 | 409 | |
| paologiorgio | 0:295db98f7ea0 | 410 | int j = 7; |
| paologiorgio | 0:295db98f7ea0 | 411 | while (j < PACKET_CHECKED) |
| paologiorgio | 0:295db98f7ea0 | 412 | { |
| paologiorgio | 0:295db98f7ea0 | 413 | if (PacketChecked[j] == '0') |
| paologiorgio | 0:295db98f7ea0 | 414 | { |
| paologiorgio | 0:295db98f7ea0 | 415 | j++; |
| paologiorgio | 0:295db98f7ea0 | 416 | } |
| paologiorgio | 0:295db98f7ea0 | 417 | else |
| paologiorgio | 0:295db98f7ea0 | 418 | { |
| paologiorgio | 0:295db98f7ea0 | 419 | option_1 = 1; |
| paologiorgio | 0:295db98f7ea0 | 420 | break; |
| paologiorgio | 0:295db98f7ea0 | 421 | } |
| paologiorgio | 0:295db98f7ea0 | 422 | } |
| paologiorgio | 0:295db98f7ea0 | 423 | |
| paologiorgio | 0:295db98f7ea0 | 424 | int k = 7; |
| paologiorgio | 0:295db98f7ea0 | 425 | while (k < PACKET_CHECKED) |
| paologiorgio | 0:295db98f7ea0 | 426 | { |
| paologiorgio | 0:295db98f7ea0 | 427 | if (PacketChecked[k] == '1') |
| paologiorgio | 0:295db98f7ea0 | 428 | { |
| paologiorgio | 0:295db98f7ea0 | 429 | k++; |
| paologiorgio | 0:295db98f7ea0 | 430 | } |
| paologiorgio | 0:295db98f7ea0 | 431 | else |
| paologiorgio | 0:295db98f7ea0 | 432 | { |
| paologiorgio | 0:295db98f7ea0 | 433 | option_2 = 1; |
| paologiorgio | 0:295db98f7ea0 | 434 | break; |
| paologiorgio | 0:295db98f7ea0 | 435 | } |
| paologiorgio | 0:295db98f7ea0 | 436 | } |
| paologiorgio | 0:295db98f7ea0 | 437 | |
| paologiorgio | 0:295db98f7ea0 | 438 | if (commandId == 5) // TLMODE |
| paologiorgio | 0:295db98f7ea0 | 439 | { |
| paologiorgio | 0:295db98f7ea0 | 440 | if (option_1 == 0) |
| paologiorgio | 0:295db98f7ea0 | 441 | { |
| paologiorgio | 0:295db98f7ea0 | 442 | size = 0; // reset |
| paologiorgio | 0:295db98f7ea0 | 443 | |
| paologiorgio | 0:295db98f7ea0 | 444 | TLM[0] = '\0'; |
| paologiorgio | 0:295db98f7ea0 | 445 | SC.printf("Receiving 57 words...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 446 | |
| paologiorgio | 0:295db98f7ea0 | 447 | while (size < OPTION_1) |
| paologiorgio | 0:295db98f7ea0 | 448 | { |
| paologiorgio | 0:295db98f7ea0 | 449 | DATA_CLOCK_OUT_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 450 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 451 | DATA_CLOCK_OUT_MIMA = 0; |
| paologiorgio | 0:295db98f7ea0 | 452 | data = MIMA.getc(); // prendi carattere in arrivo |
| paologiorgio | 0:295db98f7ea0 | 453 | TLM[size] = data; |
| paologiorgio | 0:295db98f7ea0 | 454 | size++; |
| paologiorgio | 0:295db98f7ea0 | 455 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 456 | |
| paologiorgio | 0:295db98f7ea0 | 457 | if ((size+1) == OPTION_1) |
| paologiorgio | 0:295db98f7ea0 | 458 | { |
| paologiorgio | 0:295db98f7ea0 | 459 | SC.printf("%s", TLM); |
| paologiorgio | 0:295db98f7ea0 | 460 | size = 0; |
| paologiorgio | 0:295db98f7ea0 | 461 | break; |
| paologiorgio | 0:295db98f7ea0 | 462 | } |
| paologiorgio | 0:295db98f7ea0 | 463 | } |
| paologiorgio | 0:295db98f7ea0 | 464 | } |
| paologiorgio | 0:295db98f7ea0 | 465 | else if (option_2 == 0) |
| paologiorgio | 0:295db98f7ea0 | 466 | { |
| paologiorgio | 0:295db98f7ea0 | 467 | size = 0; |
| paologiorgio | 0:295db98f7ea0 | 468 | |
| paologiorgio | 0:295db98f7ea0 | 469 | TLM_SD[0] = '\0'; |
| paologiorgio | 0:295db98f7ea0 | 470 | SC.printf("Receiving 5663 words...\n\r"); |
| paologiorgio | 0:295db98f7ea0 | 471 | |
| paologiorgio | 0:295db98f7ea0 | 472 | while (size < OPTION_2) |
| paologiorgio | 0:295db98f7ea0 | 473 | { |
| paologiorgio | 0:295db98f7ea0 | 474 | DATA_CLOCK_OUT_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 475 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 476 | DATA_CLOCK_OUT_MIMA = 0; |
| paologiorgio | 0:295db98f7ea0 | 477 | data = MIMA.getc(); |
| paologiorgio | 0:295db98f7ea0 | 478 | TLM_SD[size] = data; |
| paologiorgio | 0:295db98f7ea0 | 479 | size++; |
| paologiorgio | 0:295db98f7ea0 | 480 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 481 | |
| paologiorgio | 0:295db98f7ea0 | 482 | |
| paologiorgio | 0:295db98f7ea0 | 483 | if ((size+1) == OPTION_2) |
| paologiorgio | 0:295db98f7ea0 | 484 | { |
| paologiorgio | 0:295db98f7ea0 | 485 | SC.printf("%s", TLM_SD); |
| paologiorgio | 0:295db98f7ea0 | 486 | size = 0; |
| paologiorgio | 0:295db98f7ea0 | 487 | break; |
| paologiorgio | 0:295db98f7ea0 | 488 | } |
| paologiorgio | 0:295db98f7ea0 | 489 | } |
| paologiorgio | 0:295db98f7ea0 | 490 | |
| paologiorgio | 0:295db98f7ea0 | 491 | } |
| paologiorgio | 0:295db98f7ea0 | 492 | } |
| paologiorgio | 0:295db98f7ea0 | 493 | |
| paologiorgio | 0:295db98f7ea0 | 494 | GATE_READ_MIMA = 1; |
| paologiorgio | 0:295db98f7ea0 | 495 | |
| paologiorgio | 0:295db98f7ea0 | 496 | } |
| paologiorgio | 0:295db98f7ea0 | 497 | } |
| paologiorgio | 0:295db98f7ea0 | 498 | |
| paologiorgio | 0:295db98f7ea0 | 499 | |
| paologiorgio | 0:295db98f7ea0 | 500 | // DORA trasmette dati verso Space/craft |
| paologiorgio | 0:295db98f7ea0 | 501 | void TxTelemetry(void) |
| paologiorgio | 0:295db98f7ea0 | 502 | { |
| paologiorgio | 0:295db98f7ea0 | 503 | while(SC.writeable()) |
| paologiorgio | 0:295db98f7ea0 | 504 | { |
| paologiorgio | 0:295db98f7ea0 | 505 | GATE_WRITE_SC = 0; |
| paologiorgio | 0:295db98f7ea0 | 506 | |
| paologiorgio | 0:295db98f7ea0 | 507 | DATA_CLOCK_OUT_SC = 1; |
| paologiorgio | 0:295db98f7ea0 | 508 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 509 | |
| paologiorgio | 0:295db98f7ea0 | 510 | // The data are read on the falling-edge of the DATA_CLOCK_OUT signal |
| paologiorgio | 0:295db98f7ea0 | 511 | if (option_1 == 0) |
| paologiorgio | 0:295db98f7ea0 | 512 | { |
| paologiorgio | 0:295db98f7ea0 | 513 | for (int i = 0; i < OPTION_1; i++) |
| paologiorgio | 0:295db98f7ea0 | 514 | { |
| paologiorgio | 0:295db98f7ea0 | 515 | DATA_CLOCK_OUT_SC = 0; |
| paologiorgio | 0:295db98f7ea0 | 516 | SC.putc(TLM[i]); |
| paologiorgio | 0:295db98f7ea0 | 517 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 518 | DATA_CLOCK_OUT_SC = 1; |
| paologiorgio | 0:295db98f7ea0 | 519 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 520 | } |
| paologiorgio | 0:295db98f7ea0 | 521 | } else if (option_2 == 0) |
| paologiorgio | 0:295db98f7ea0 | 522 | { |
| paologiorgio | 0:295db98f7ea0 | 523 | for (int i = 0; i < OPTION_2; i++) |
| paologiorgio | 0:295db98f7ea0 | 524 | { |
| paologiorgio | 0:295db98f7ea0 | 525 | DATA_CLOCK_OUT_SC = 0; |
| paologiorgio | 0:295db98f7ea0 | 526 | SC.putc(TLM_SD[i]); |
| paologiorgio | 0:295db98f7ea0 | 527 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 528 | DATA_CLOCK_OUT_SC = 1; |
| paologiorgio | 0:295db98f7ea0 | 529 | wait_ms(tb/2); |
| paologiorgio | 0:295db98f7ea0 | 530 | } |
| paologiorgio | 0:295db98f7ea0 | 531 | } |
| paologiorgio | 0:295db98f7ea0 | 532 | |
| paologiorgio | 0:295db98f7ea0 | 533 | GATE_WRITE_SC = 1; |
| paologiorgio | 0:295db98f7ea0 | 534 | } |
| paologiorgio | 0:295db98f7ea0 | 535 | |
| paologiorgio | 0:295db98f7ea0 | 536 | } |