Space / Mbed 2 deprecated SC-MIMA-Protocol

Dependencies:   mbed

Committer:
paologiorgio
Date:
Wed Jun 01 11:17:04 2022 +0000
Revision:
0:295db98f7ea0
Protocollo

Who changed what in which revision?

UserRevisionLine numberNew 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 }