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:c81f86a07902, 2022-06-09 (annotated)
- Committer:
- paologiorgio
- Date:
- Thu Jun 09 10:43:58 2022 +0000
- Revision:
- 0:c81f86a07902
- Child:
- 1:db73b542b7bc
DORA v2
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| paologiorgio | 0:c81f86a07902 | 1 | #include "mbed.h" |
| paologiorgio | 0:c81f86a07902 | 2 | #include <math.h> |
| paologiorgio | 0:c81f86a07902 | 3 | |
| paologiorgio | 0:c81f86a07902 | 4 | /* |
| paologiorgio | 0:c81f86a07902 | 5 | TO-DO: i dati arrivano in DigitalIn e DigitalOut, anziché essere della classe Serial. |
| paologiorgio | 0:c81f86a07902 | 6 | Al fine di poter immagazzinare i dati, associo a determinati livelli logici (1/0) dei caratteri, |
| paologiorgio | 0:c81f86a07902 | 7 | riempio il buffer e ritrasmetto con i caratteri riconvertiti |
| paologiorgio | 0:c81f86a07902 | 8 | |
| paologiorgio | 0:c81f86a07902 | 9 | comando per azionamento periferiche: SPARE |
| paologiorgio | 0:c81f86a07902 | 10 | */ |
| paologiorgio | 0:c81f86a07902 | 11 | |
| paologiorgio | 0:c81f86a07902 | 12 | // ************* INFO ******************* |
| paologiorgio | 0:c81f86a07902 | 13 | // master-slave: slave MIMA comunica con DORA con collegamento UART (tx, rx, gnd) |
| paologiorgio | 0:c81f86a07902 | 14 | // PC S/C sends packets to DORA -> MIMA (STM32) -> PC |
| paologiorgio | 0:c81f86a07902 | 15 | |
| paologiorgio | 0:c81f86a07902 | 16 | // ------ ------------ |
| paologiorgio | 0:c81f86a07902 | 17 | // | MIMA | ---- DORA ---- | SPACE/CRAFT | |
| paologiorgio | 0:c81f86a07902 | 18 | // ------ ------------ |
| paologiorgio | 0:c81f86a07902 | 19 | |
| paologiorgio | 0:c81f86a07902 | 20 | // ************ DEFINE ****************** |
| paologiorgio | 0:c81f86a07902 | 21 | // definisce dimensione pacchetto inviato da pc |
| paologiorgio | 0:c81f86a07902 | 22 | // telecommand: 15 bit + 1 di controllo |
| paologiorgio | 0:c81f86a07902 | 23 | #define PACKETSIZE 20 // lunghezza massima della stringa trasmissibile prima di interrupt |
| paologiorgio | 0:c81f86a07902 | 24 | #define PACKET 15 // 15 bit, 1 di parità di controllo |
| paologiorgio | 0:c81f86a07902 | 25 | #define PACKET_CHECKED 16 // COMMAND IDENTIFIER + TAG + PAYLOAD + PARITY CHECK |
| paologiorgio | 0:c81f86a07902 | 26 | #define IDENTIFIER 5 |
| paologiorgio | 0:c81f86a07902 | 27 | #define TAG 2 |
| paologiorgio | 0:c81f86a07902 | 28 | #define PAYLOAD 8 |
| paologiorgio | 0:c81f86a07902 | 29 | #define CMD_NUM 32 |
| paologiorgio | 0:c81f86a07902 | 30 | #define OPTION_1 10 // 57 * 16 |
| paologiorgio | 0:c81f86a07902 | 31 | #define OPTION_2 90608 // 5663 * 16 |
| paologiorgio | 0:c81f86a07902 | 32 | #define tb 7 // bit sampling period |
| paologiorgio | 0:c81f86a07902 | 33 | #define BufferXOR 175 // 2800/16 - 1 |
| paologiorgio | 0:c81f86a07902 | 34 | #define TIMEOUT 15000 // milliseconds |
| paologiorgio | 0:c81f86a07902 | 35 | #define word 16 |
| paologiorgio | 0:c81f86a07902 | 36 | |
| paologiorgio | 0:c81f86a07902 | 37 | |
| paologiorgio | 0:c81f86a07902 | 38 | // ************ CN7+USB ****************** |
| paologiorgio | 0:c81f86a07902 | 39 | Serial SC(USBTX, USBRX); // A4 TX, A6 RX - DATA OUT, DATA IN |
| paologiorgio | 0:c81f86a07902 | 40 | |
| paologiorgio | 0:c81f86a07902 | 41 | // ************** CN10 ******************* |
| paologiorgio | 0:c81f86a07902 | 42 | Serial MIMA(PC_4, PC_5); // TERZO - TERZULTIMO -> D0 e D1 non vanno bene! Risorse già occupate |
| paologiorgio | 0:c81f86a07902 | 43 | |
| paologiorgio | 0:c81f86a07902 | 44 | // ************** TIMER ***************** |
| paologiorgio | 0:c81f86a07902 | 45 | Timer t; |
| paologiorgio | 0:c81f86a07902 | 46 | |
| paologiorgio | 0:c81f86a07902 | 47 | // ******* L16 Actuatonix - Relay ******** |
| paologiorgio | 0:c81f86a07902 | 48 | PwmOut M1 (PA_6); // D12 |
| paologiorgio | 0:c81f86a07902 | 49 | PwmOut M2 (PA_8); // D7 |
| paologiorgio | 0:c81f86a07902 | 50 | DigitalOut Relay5V (PA_7); // D11 |
| paologiorgio | 0:c81f86a07902 | 51 | DigitalOut Relay12V (PB_4); // D5 |
| paologiorgio | 0:c81f86a07902 | 52 | DigitalOut Relay24V (PB_5); // D4 |
| paologiorgio | 0:c81f86a07902 | 53 | DigitalOut Relay15_15_5V (PB_10); // D6 | +15, -15, -5 |
| paologiorgio | 0:c81f86a07902 | 54 | float offset = 0.0f; |
| paologiorgio | 0:c81f86a07902 | 55 | volatile char ch; |
| paologiorgio | 0:c81f86a07902 | 56 | |
| paologiorgio | 0:c81f86a07902 | 57 | // DATA_OUT_CLOCK.write(0) -> wait_ms(7) -> DATA_OUT_CLOCK.write(0) -> wait_ms(7) |
| paologiorgio | 0:c81f86a07902 | 58 | |
| paologiorgio | 0:c81f86a07902 | 59 | // *********** VARIABLES ***************** |
| paologiorgio | 0:c81f86a07902 | 60 | volatile int nIndex; // indice del pacchetto per lo "spacchettamento" |
| paologiorgio | 0:c81f86a07902 | 61 | char getPacket[PACKETSIZE]; // buffer - pacchetto inviato di dimensione max PACKETSIZE |
| paologiorgio | 0:c81f86a07902 | 62 | char PacketChecked[PACKET_CHECKED]; // lato Space/Craft |
| paologiorgio | 0:c81f86a07902 | 63 | char TLM[OPTION_1]; // lato MIMA per check |
| paologiorgio | 0:c81f86a07902 | 64 | char TLM_SD[OPTION_2]; // lato MIMA per check |
| paologiorgio | 0:c81f86a07902 | 65 | |
| paologiorgio | 0:c81f86a07902 | 66 | |
| paologiorgio | 0:c81f86a07902 | 67 | volatile int LEN; // numero di bit da ricevere per ricezione corretta |
| paologiorgio | 0:c81f86a07902 | 68 | volatile int commandId; |
| paologiorgio | 0:c81f86a07902 | 69 | volatile int payloadDec; |
| paologiorgio | 0:c81f86a07902 | 70 | volatile int size; |
| paologiorgio | 0:c81f86a07902 | 71 | volatile unsigned char data; // in arrivo da MIMA per telemetria |
| paologiorgio | 0:c81f86a07902 | 72 | |
| paologiorgio | 0:c81f86a07902 | 73 | int base = 2; // base per l'esponenziale (conversione binary to decimal) |
| paologiorgio | 0:c81f86a07902 | 74 | int CMD[CMD_NUM]; // CMD in decimale |
| paologiorgio | 0:c81f86a07902 | 75 | |
| paologiorgio | 0:c81f86a07902 | 76 | volatile int option_1 = 0; // default |
| paologiorgio | 0:c81f86a07902 | 77 | volatile int option_2 = 0; |
| paologiorgio | 0:c81f86a07902 | 78 | |
| paologiorgio | 0:c81f86a07902 | 79 | int tempCheck[word]; // temp |
| paologiorgio | 0:c81f86a07902 | 80 | char checksumWord[word]; // checksum sul pacchetto elaborato |
| paologiorgio | 0:c81f86a07902 | 81 | char checksumReceived[word]; // checksum ricevuto |
| paologiorgio | 0:c81f86a07902 | 82 | |
| paologiorgio | 0:c81f86a07902 | 83 | // ************** SETUP ******************* |
| paologiorgio | 0:c81f86a07902 | 84 | void CMD_REF(); // crea la lista dei comandi |
| paologiorgio | 0:c81f86a07902 | 85 | void clearBuffer(char *arr, int arrLen); // ripulisce il buffer di ricezione |
| paologiorgio | 0:c81f86a07902 | 86 | void checksum(char *a, int aSize); // effettua checksum |
| paologiorgio | 0:c81f86a07902 | 87 | void RxTelecommand(); |
| paologiorgio | 0:c81f86a07902 | 88 | void TxTelecommand(); |
| paologiorgio | 0:c81f86a07902 | 89 | void RxTelemetry(); |
| paologiorgio | 0:c81f86a07902 | 90 | void TxTelemetry(); |
| paologiorgio | 0:c81f86a07902 | 91 | void ActuatorControl(int command); // controllo L16 e Relay |
| paologiorgio | 0:c81f86a07902 | 92 | |
| paologiorgio | 0:c81f86a07902 | 93 | |
| paologiorgio | 0:c81f86a07902 | 94 | // ********************************************************************* |
| paologiorgio | 0:c81f86a07902 | 95 | |
| paologiorgio | 0:c81f86a07902 | 96 | |
| paologiorgio | 0:c81f86a07902 | 97 | // ************** MAIN ******************* |
| paologiorgio | 0:c81f86a07902 | 98 | int main() |
| paologiorgio | 0:c81f86a07902 | 99 | { |
| paologiorgio | 0:c81f86a07902 | 100 | // baudrate |
| paologiorgio | 0:c81f86a07902 | 101 | SC.baud(115200); |
| paologiorgio | 0:c81f86a07902 | 102 | MIMA.baud(9600); |
| paologiorgio | 0:c81f86a07902 | 103 | |
| paologiorgio | 0:c81f86a07902 | 104 | // Setup PWM |
| paologiorgio | 0:c81f86a07902 | 105 | M1.period_us(1000); |
| paologiorgio | 0:c81f86a07902 | 106 | M2.period_us(1000); |
| paologiorgio | 0:c81f86a07902 | 107 | |
| paologiorgio | 0:c81f86a07902 | 108 | // Setup Relay: default (pull-up) |
| paologiorgio | 0:c81f86a07902 | 109 | Relay5V = 1; |
| paologiorgio | 0:c81f86a07902 | 110 | Relay12V = 1; |
| paologiorgio | 0:c81f86a07902 | 111 | Relay15_15_5V = 1; // +15, -15, -5 |
| paologiorgio | 0:c81f86a07902 | 112 | Relay24V = 1; |
| paologiorgio | 0:c81f86a07902 | 113 | |
| paologiorgio | 0:c81f86a07902 | 114 | // diagnostic |
| paologiorgio | 0:c81f86a07902 | 115 | SC.printf("*******Starting... *******\n\r"); |
| paologiorgio | 0:c81f86a07902 | 116 | |
| paologiorgio | 0:c81f86a07902 | 117 | // interrupt |
| paologiorgio | 0:c81f86a07902 | 118 | SC.attach(&RxTelecommand, Serial::RxIrq); |
| paologiorgio | 0:c81f86a07902 | 119 | MIMA.attach(&RxTelemetry, Serial::RxIrq); |
| paologiorgio | 0:c81f86a07902 | 120 | |
| paologiorgio | 0:c81f86a07902 | 121 | } |
| paologiorgio | 0:c81f86a07902 | 122 | |
| paologiorgio | 0:c81f86a07902 | 123 | |
| paologiorgio | 0:c81f86a07902 | 124 | // ********************************************************************* |
| paologiorgio | 0:c81f86a07902 | 125 | |
| paologiorgio | 0:c81f86a07902 | 126 | |
| paologiorgio | 0:c81f86a07902 | 127 | // ************** FUNCTIONS ******************* |
| paologiorgio | 0:c81f86a07902 | 128 | void CMD_REF() |
| paologiorgio | 0:c81f86a07902 | 129 | { |
| paologiorgio | 0:c81f86a07902 | 130 | for (int i = 0; i < CMD_NUM; i++) |
| paologiorgio | 0:c81f86a07902 | 131 | { |
| paologiorgio | 0:c81f86a07902 | 132 | CMD[i] = i; |
| paologiorgio | 0:c81f86a07902 | 133 | } |
| paologiorgio | 0:c81f86a07902 | 134 | } |
| paologiorgio | 0:c81f86a07902 | 135 | |
| paologiorgio | 0:c81f86a07902 | 136 | // clear |
| paologiorgio | 0:c81f86a07902 | 137 | void clearBuffer(char *arr, int arrLen) |
| paologiorgio | 0:c81f86a07902 | 138 | { |
| paologiorgio | 0:c81f86a07902 | 139 | // reset pacchetto |
| paologiorgio | 0:c81f86a07902 | 140 | nIndex = 0; |
| paologiorgio | 0:c81f86a07902 | 141 | for (nIndex = 0; nIndex < arrLen; nIndex++) |
| paologiorgio | 0:c81f86a07902 | 142 | { |
| paologiorgio | 0:c81f86a07902 | 143 | arr[nIndex] = '\0'; |
| paologiorgio | 0:c81f86a07902 | 144 | } |
| paologiorgio | 0:c81f86a07902 | 145 | } |
| paologiorgio | 0:c81f86a07902 | 146 | |
| paologiorgio | 0:c81f86a07902 | 147 | // DORA riceve telecomando da SC |
| paologiorgio | 0:c81f86a07902 | 148 | void RxTelecommand() |
| paologiorgio | 0:c81f86a07902 | 149 | { |
| paologiorgio | 0:c81f86a07902 | 150 | CMD_REF(); // carica vettore dei comandi |
| paologiorgio | 0:c81f86a07902 | 151 | |
| paologiorgio | 0:c81f86a07902 | 152 | while (SC.readable()) // finché sulla porta USB arrivano dati, esegui |
| paologiorgio | 0:c81f86a07902 | 153 | { |
| paologiorgio | 0:c81f86a07902 | 154 | clearBuffer(getPacket, sizeof(getPacket) / sizeof(getPacket[0])); // clear the buffer |
| paologiorgio | 0:c81f86a07902 | 155 | SC.gets(getPacket, sizeof(getPacket)); // leggi la stringa in ingresso |
| paologiorgio | 0:c81f86a07902 | 156 | LEN = strlen(getPacket) - 2; // calcola la sua lunghezza ignorando i tag \r\n |
| paologiorgio | 0:c81f86a07902 | 157 | ch = getPacket[0]; |
| paologiorgio | 0:c81f86a07902 | 158 | |
| paologiorgio | 0:c81f86a07902 | 159 | if (LEN != PACKET) |
| paologiorgio | 0:c81f86a07902 | 160 | { |
| paologiorgio | 0:c81f86a07902 | 161 | if (LEN == 1) |
| paologiorgio | 0:c81f86a07902 | 162 | { |
| paologiorgio | 0:c81f86a07902 | 163 | SC.printf("> Bit number: %i is not equal to 15 // no tele-command\n\r", LEN); // diagnostica |
| paologiorgio | 0:c81f86a07902 | 164 | } |
| paologiorgio | 0:c81f86a07902 | 165 | } |
| paologiorgio | 0:c81f86a07902 | 166 | else |
| paologiorgio | 0:c81f86a07902 | 167 | { |
| paologiorgio | 0:c81f86a07902 | 168 | for (int n = 0; n < LEN; n++) |
| paologiorgio | 0:c81f86a07902 | 169 | { |
| paologiorgio | 0:c81f86a07902 | 170 | PacketChecked[n] = getPacket[n]; // riempi il nuovo array |
| paologiorgio | 0:c81f86a07902 | 171 | } |
| paologiorgio | 0:c81f86a07902 | 172 | |
| paologiorgio | 0:c81f86a07902 | 173 | // ***CONTROLLO DEI BIT - LSB: EVEN/ODD *** |
| paologiorgio | 0:c81f86a07902 | 174 | int ones = 0; |
| paologiorgio | 0:c81f86a07902 | 175 | int check = 0; |
| paologiorgio | 0:c81f86a07902 | 176 | while (check < PACKET) |
| paologiorgio | 0:c81f86a07902 | 177 | { |
| paologiorgio | 0:c81f86a07902 | 178 | if (getPacket[check] == '1') |
| paologiorgio | 0:c81f86a07902 | 179 | { |
| paologiorgio | 0:c81f86a07902 | 180 | ones++; |
| paologiorgio | 0:c81f86a07902 | 181 | } |
| paologiorgio | 0:c81f86a07902 | 182 | |
| paologiorgio | 0:c81f86a07902 | 183 | check++; |
| paologiorgio | 0:c81f86a07902 | 184 | } |
| paologiorgio | 0:c81f86a07902 | 185 | |
| paologiorgio | 0:c81f86a07902 | 186 | char newItem; |
| paologiorgio | 0:c81f86a07902 | 187 | |
| paologiorgio | 0:c81f86a07902 | 188 | if (ones % 2 == 0) |
| paologiorgio | 0:c81f86a07902 | 189 | { |
| paologiorgio | 0:c81f86a07902 | 190 | newItem = '0'; // If the number of ones in[B0÷B14] bits is even (making the total number of ones even) |
| paologiorgio | 0:c81f86a07902 | 191 | } |
| paologiorgio | 0:c81f86a07902 | 192 | else |
| paologiorgio | 0:c81f86a07902 | 193 | { |
| paologiorgio | 0:c81f86a07902 | 194 | newItem = '1'; // If the number of ones in[B0÷B14] bits is odd (making the total number of ones even) |
| paologiorgio | 0:c81f86a07902 | 195 | } |
| paologiorgio | 0:c81f86a07902 | 196 | |
| paologiorgio | 0:c81f86a07902 | 197 | int nPacket = PACKET + 1; |
| paologiorgio | 0:c81f86a07902 | 198 | // shift elements |
| paologiorgio | 0:c81f86a07902 | 199 | for (int i = nPacket - 1; i >= PACKET_CHECKED; i--) |
| paologiorgio | 0:c81f86a07902 | 200 | { |
| paologiorgio | 0:c81f86a07902 | 201 | PacketChecked[i] = PacketChecked[i - 1]; |
| paologiorgio | 0:c81f86a07902 | 202 | } |
| paologiorgio | 0:c81f86a07902 | 203 | |
| paologiorgio | 0:c81f86a07902 | 204 | // insert LSB |
| paologiorgio | 0:c81f86a07902 | 205 | PacketChecked[PACKET_CHECKED - 1] = newItem; |
| paologiorgio | 0:c81f86a07902 | 206 | |
| paologiorgio | 0:c81f86a07902 | 207 | SC.printf("> Send: "); |
| paologiorgio | 0:c81f86a07902 | 208 | for (int z = 0; z < PACKET_CHECKED; z++) |
| paologiorgio | 0:c81f86a07902 | 209 | { |
| paologiorgio | 0:c81f86a07902 | 210 | SC.printf("%c", PacketChecked[z]); |
| paologiorgio | 0:c81f86a07902 | 211 | } |
| paologiorgio | 0:c81f86a07902 | 212 | |
| paologiorgio | 0:c81f86a07902 | 213 | SC.printf("\n\r"); |
| paologiorgio | 0:c81f86a07902 | 214 | |
| paologiorgio | 0:c81f86a07902 | 215 | // ************DIAGNOSTICA ************ |
| paologiorgio | 0:c81f86a07902 | 216 | // un telecommand è formato da 16 bit. i primi 5 sono identificativi, |
| paologiorgio | 0:c81f86a07902 | 217 | // poi ho due bit che mi specificano se i dati in arrivo sono una o più parole, |
| paologiorgio | 0:c81f86a07902 | 218 | // dopodiché ho un payload da 8 bit e per concludere ho LSB (parity bit) |
| paologiorgio | 0:c81f86a07902 | 219 | // MSB IIII TT PPPPPPPP PC |
| paologiorgio | 0:c81f86a07902 | 220 | |
| paologiorgio | 0:c81f86a07902 | 221 | // ***COMMAND IDENTIFIER *** |
| paologiorgio | 0:c81f86a07902 | 222 | int CMDIndex = 0; // puntatore dell'identificativo |
| paologiorgio | 0:c81f86a07902 | 223 | commandId = 0; |
| paologiorgio | 0:c81f86a07902 | 224 | |
| paologiorgio | 0:c81f86a07902 | 225 | int B7 = PacketChecked[7]; |
| paologiorgio | 0:c81f86a07902 | 226 | int B9 = PacketChecked[9]; |
| paologiorgio | 0:c81f86a07902 | 227 | int B11 = PacketChecked[11]; |
| paologiorgio | 0:c81f86a07902 | 228 | |
| paologiorgio | 0:c81f86a07902 | 229 | // trasformo l'identificatore in numero |
| paologiorgio | 0:c81f86a07902 | 230 | while (CMDIndex < IDENTIFIER) |
| paologiorgio | 0:c81f86a07902 | 231 | { |
| paologiorgio | 0:c81f86a07902 | 232 | if (PacketChecked[CMDIndex] == '1') |
| paologiorgio | 0:c81f86a07902 | 233 | { |
| paologiorgio | 0:c81f86a07902 | 234 | int raise = IDENTIFIER - 1 - CMDIndex; |
| paologiorgio | 0:c81f86a07902 | 235 | commandId += pow((float) base, (float) raise); |
| paologiorgio | 0:c81f86a07902 | 236 | } |
| paologiorgio | 0:c81f86a07902 | 237 | else |
| paologiorgio | 0:c81f86a07902 | 238 | { |
| paologiorgio | 0:c81f86a07902 | 239 | commandId += 0; |
| paologiorgio | 0:c81f86a07902 | 240 | } |
| paologiorgio | 0:c81f86a07902 | 241 | |
| paologiorgio | 0:c81f86a07902 | 242 | CMDIndex++; |
| paologiorgio | 0:c81f86a07902 | 243 | } |
| paologiorgio | 0:c81f86a07902 | 244 | |
| paologiorgio | 0:c81f86a07902 | 245 | // scorro la lista di comandi disponibli e verifico se il comando trasmesso rientra |
| paologiorgio | 0:c81f86a07902 | 246 | // nella lista, altrimenti finisco in uno dei 3 SPARE |
| paologiorgio | 0:c81f86a07902 | 247 | int k = 0; |
| paologiorgio | 0:c81f86a07902 | 248 | int isElementPresent = 0; |
| paologiorgio | 0:c81f86a07902 | 249 | while (k < CMD_NUM) |
| paologiorgio | 0:c81f86a07902 | 250 | { |
| paologiorgio | 0:c81f86a07902 | 251 | if (commandId == CMD[k]) |
| paologiorgio | 0:c81f86a07902 | 252 | { |
| paologiorgio | 0:c81f86a07902 | 253 | isElementPresent = 1; |
| paologiorgio | 0:c81f86a07902 | 254 | SC.printf("> Telcommand sent belgons to MIMA command list: CMD %i\n\r", k); |
| paologiorgio | 0:c81f86a07902 | 255 | |
| paologiorgio | 0:c81f86a07902 | 256 | if (k == 2 || k == 15 || k == 30) // CMD02, CMD15, CMD30 |
| paologiorgio | 0:c81f86a07902 | 257 | { |
| paologiorgio | 0:c81f86a07902 | 258 | SC.printf("> CMD %i : SPARE\n\r", k); |
| paologiorgio | 0:c81f86a07902 | 259 | } |
| paologiorgio | 0:c81f86a07902 | 260 | else if (k == 0 && PacketChecked[5] == '0' && PacketChecked[6] == '0') // CMD0 - spare |
| paologiorgio | 0:c81f86a07902 | 261 | { |
| paologiorgio | 0:c81f86a07902 | 262 | payloadDec = 0; // inizializzazione del payload in formato digitale |
| paologiorgio | 0:c81f86a07902 | 263 | int counter = 7; // parto dal settimo bit |
| paologiorgio | 0:c81f86a07902 | 264 | |
| paologiorgio | 0:c81f86a07902 | 265 | while (counter < PACKET) |
| paologiorgio | 0:c81f86a07902 | 266 | { |
| paologiorgio | 0:c81f86a07902 | 267 | if (PacketChecked[counter] == '1') |
| paologiorgio | 0:c81f86a07902 | 268 | { |
| paologiorgio | 0:c81f86a07902 | 269 | int raise = PACKET - 1 - counter; |
| paologiorgio | 0:c81f86a07902 | 270 | payloadDec += pow((float) base, (float) raise); |
| paologiorgio | 0:c81f86a07902 | 271 | } |
| paologiorgio | 0:c81f86a07902 | 272 | else |
| paologiorgio | 0:c81f86a07902 | 273 | { |
| paologiorgio | 0:c81f86a07902 | 274 | payloadDec += 0; |
| paologiorgio | 0:c81f86a07902 | 275 | } |
| paologiorgio | 0:c81f86a07902 | 276 | |
| paologiorgio | 0:c81f86a07902 | 277 | counter++; |
| paologiorgio | 0:c81f86a07902 | 278 | } |
| paologiorgio | 0:c81f86a07902 | 279 | |
| paologiorgio | 0:c81f86a07902 | 280 | ActuatorControl(payloadDec); |
| paologiorgio | 0:c81f86a07902 | 281 | break; |
| paologiorgio | 0:c81f86a07902 | 282 | } |
| paologiorgio | 0:c81f86a07902 | 283 | else if (k == 1) // CMD01 |
| paologiorgio | 0:c81f86a07902 | 284 | { |
| paologiorgio | 0:c81f86a07902 | 285 | if (PacketChecked[11] == '0' && |
| paologiorgio | 0:c81f86a07902 | 286 | PacketChecked[12] == '0' && |
| paologiorgio | 0:c81f86a07902 | 287 | PacketChecked[13] == '0' && |
| paologiorgio | 0:c81f86a07902 | 288 | PacketChecked[14] == '1') |
| paologiorgio | 0:c81f86a07902 | 289 | { |
| paologiorgio | 0:c81f86a07902 | 290 | SC.printf("> Setting MIMA... Sleeping mode\n\r"); |
| paologiorgio | 0:c81f86a07902 | 291 | } |
| paologiorgio | 0:c81f86a07902 | 292 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:c81f86a07902 | 293 | PacketChecked[12] == '0' && |
| paologiorgio | 0:c81f86a07902 | 294 | PacketChecked[13] == '1' && |
| paologiorgio | 0:c81f86a07902 | 295 | PacketChecked[14] == '0') |
| paologiorgio | 0:c81f86a07902 | 296 | { |
| paologiorgio | 0:c81f86a07902 | 297 | SC.printf("> Setting MIMA... Awake mode\n\r"); |
| paologiorgio | 0:c81f86a07902 | 298 | } |
| paologiorgio | 0:c81f86a07902 | 299 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:c81f86a07902 | 300 | PacketChecked[12] == '0' && |
| paologiorgio | 0:c81f86a07902 | 301 | PacketChecked[13] == '1' && |
| paologiorgio | 0:c81f86a07902 | 302 | PacketChecked[14] == '1') |
| paologiorgio | 0:c81f86a07902 | 303 | { |
| paologiorgio | 0:c81f86a07902 | 304 | SC.printf("> Setting MIMA... Calibration mode\n\r"); |
| paologiorgio | 0:c81f86a07902 | 305 | } |
| paologiorgio | 0:c81f86a07902 | 306 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:c81f86a07902 | 307 | PacketChecked[12] == '1' && |
| paologiorgio | 0:c81f86a07902 | 308 | PacketChecked[13] == '0' && |
| paologiorgio | 0:c81f86a07902 | 309 | PacketChecked[14] == '0') |
| paologiorgio | 0:c81f86a07902 | 310 | { |
| paologiorgio | 0:c81f86a07902 | 311 | SC.printf("> Setting MIMA... Observation mode\n\r"); |
| paologiorgio | 0:c81f86a07902 | 312 | } |
| paologiorgio | 0:c81f86a07902 | 313 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:c81f86a07902 | 314 | PacketChecked[12] == '1' && |
| paologiorgio | 0:c81f86a07902 | 315 | PacketChecked[13] == '0' && |
| paologiorgio | 0:c81f86a07902 | 316 | PacketChecked[14] == '1') |
| paologiorgio | 0:c81f86a07902 | 317 | { |
| paologiorgio | 0:c81f86a07902 | 318 | SC.printf("> Setting MIMA... Auto-test mode\n\r"); |
| paologiorgio | 0:c81f86a07902 | 319 | } |
| paologiorgio | 0:c81f86a07902 | 320 | else if (PacketChecked[11] == '0' && |
| paologiorgio | 0:c81f86a07902 | 321 | PacketChecked[12] == '1' && |
| paologiorgio | 0:c81f86a07902 | 322 | PacketChecked[13] == '1' && |
| paologiorgio | 0:c81f86a07902 | 323 | PacketChecked[14] == '0') |
| paologiorgio | 0:c81f86a07902 | 324 | { |
| paologiorgio | 0:c81f86a07902 | 325 | SC.printf("> Setting MIMA... Full testing mode\n\r"); |
| paologiorgio | 0:c81f86a07902 | 326 | } |
| paologiorgio | 0:c81f86a07902 | 327 | } |
| paologiorgio | 0:c81f86a07902 | 328 | else if (k == 7) // CMD07 |
| paologiorgio | 0:c81f86a07902 | 329 | { |
| paologiorgio | 0:c81f86a07902 | 330 | // IR sensor thermal loop |
| paologiorgio | 0:c81f86a07902 | 331 | if (B7 == '1') |
| paologiorgio | 0:c81f86a07902 | 332 | { |
| paologiorgio | 0:c81f86a07902 | 333 | SC.printf("> IR sensor thermal loop...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 334 | SC.printf("IRT1 telemetry: feedback signal in the thermal control loop (default). IRT2 only for monitoring\n\r"); |
| paologiorgio | 0:c81f86a07902 | 335 | } |
| paologiorgio | 0:c81f86a07902 | 336 | else |
| paologiorgio | 0:c81f86a07902 | 337 | { |
| paologiorgio | 0:c81f86a07902 | 338 | SC.printf("> IR sensor thermal loop...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 339 | SC.printf("IRT2 telemetry: feedback signal in the thermal control. IRT1 only for monitoring\n\r"); |
| paologiorgio | 0:c81f86a07902 | 340 | } |
| paologiorgio | 0:c81f86a07902 | 341 | |
| paologiorgio | 0:c81f86a07902 | 342 | // Laser Diode thermal loop |
| paologiorgio | 0:c81f86a07902 | 343 | if (B9 == '1') |
| paologiorgio | 0:c81f86a07902 | 344 | { |
| paologiorgio | 0:c81f86a07902 | 345 | SC.printf("> Laser Diode thermal loop...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 346 | SC.printf("LDT1 telemetry: feedback signal in the thermal control loop (default). LDT2 only for monitoring\n\r"); |
| paologiorgio | 0:c81f86a07902 | 347 | } |
| paologiorgio | 0:c81f86a07902 | 348 | else |
| paologiorgio | 0:c81f86a07902 | 349 | { |
| paologiorgio | 0:c81f86a07902 | 350 | SC.printf("> Laser Diode thermal loop...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 351 | SC.printf("LDT2 telemetry: feedback signal in the thermal control. LDT1 only for monitoring\n\r"); |
| paologiorgio | 0:c81f86a07902 | 352 | |
| paologiorgio | 0:c81f86a07902 | 353 | } |
| paologiorgio | 0:c81f86a07902 | 354 | |
| paologiorgio | 0:c81f86a07902 | 355 | // BlackBody thermal loop |
| paologiorgio | 0:c81f86a07902 | 356 | if (B11 == '1') |
| paologiorgio | 0:c81f86a07902 | 357 | { |
| paologiorgio | 0:c81f86a07902 | 358 | SC.printf("> BlackBody thermal loop...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 359 | SC.printf("BBT1 telemetry: feedback signal in the thermal control loop (default). BBT2 only for monitoring\n\r"); |
| paologiorgio | 0:c81f86a07902 | 360 | } |
| paologiorgio | 0:c81f86a07902 | 361 | else |
| paologiorgio | 0:c81f86a07902 | 362 | { |
| paologiorgio | 0:c81f86a07902 | 363 | SC.printf("> BlackBody thermal loop...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 364 | SC.printf("BBT2 telemetry: feedback signal in the thermal control. BBT1 only for monitoring\n\r"); |
| paologiorgio | 0:c81f86a07902 | 365 | } |
| paologiorgio | 0:c81f86a07902 | 366 | } |
| paologiorgio | 0:c81f86a07902 | 367 | |
| paologiorgio | 0:c81f86a07902 | 368 | } |
| paologiorgio | 0:c81f86a07902 | 369 | |
| paologiorgio | 0:c81f86a07902 | 370 | k++; |
| paologiorgio | 0:c81f86a07902 | 371 | } |
| paologiorgio | 0:c81f86a07902 | 372 | |
| paologiorgio | 0:c81f86a07902 | 373 | if (isElementPresent == '0') |
| paologiorgio | 0:c81f86a07902 | 374 | { |
| paologiorgio | 0:c81f86a07902 | 375 | SC.printf("Telecommand sent doesn't exist\n\r"); |
| paologiorgio | 0:c81f86a07902 | 376 | } |
| paologiorgio | 0:c81f86a07902 | 377 | |
| paologiorgio | 0:c81f86a07902 | 378 | // ***TAG *** |
| paologiorgio | 0:c81f86a07902 | 379 | int B5 = PacketChecked[5]; |
| paologiorgio | 0:c81f86a07902 | 380 | int B6 = PacketChecked[6]; |
| paologiorgio | 0:c81f86a07902 | 381 | |
| paologiorgio | 0:c81f86a07902 | 382 | if (B5 == '0' && B6 == '0') |
| paologiorgio | 0:c81f86a07902 | 383 | { |
| paologiorgio | 0:c81f86a07902 | 384 | // Single word telemetry |
| paologiorgio | 0:c81f86a07902 | 385 | SC.printf("Single word telemetry\n\r"); |
| paologiorgio | 0:c81f86a07902 | 386 | } |
| paologiorgio | 0:c81f86a07902 | 387 | else if (B5 == '0' && B6 == '1') |
| paologiorgio | 0:c81f86a07902 | 388 | { |
| paologiorgio | 0:c81f86a07902 | 389 | // Multiple words telemetry (1st word) |
| paologiorgio | 0:c81f86a07902 | 390 | SC.printf("Multiple words telemetry (1st word)\n\r"); |
| paologiorgio | 0:c81f86a07902 | 391 | } |
| paologiorgio | 0:c81f86a07902 | 392 | else if (B5 == '1' && B6 == '0') |
| paologiorgio | 0:c81f86a07902 | 393 | { |
| paologiorgio | 0:c81f86a07902 | 394 | // Multiple words telemetry (2nd word) |
| paologiorgio | 0:c81f86a07902 | 395 | SC.printf("Multiple words telemetry (2nd word)\n\r"); |
| paologiorgio | 0:c81f86a07902 | 396 | } |
| paologiorgio | 0:c81f86a07902 | 397 | else |
| paologiorgio | 0:c81f86a07902 | 398 | { |
| paologiorgio | 0:c81f86a07902 | 399 | // Not used |
| paologiorgio | 0:c81f86a07902 | 400 | SC.printf("NOT USED\n\r"); |
| paologiorgio | 0:c81f86a07902 | 401 | } |
| paologiorgio | 0:c81f86a07902 | 402 | |
| paologiorgio | 0:c81f86a07902 | 403 | // ***PAYLOAD *** |
| paologiorgio | 0:c81f86a07902 | 404 | SC.printf("> Payload: "); |
| paologiorgio | 0:c81f86a07902 | 405 | for (int IndexPayload = 7; IndexPayload < PACKET; IndexPayload++) |
| paologiorgio | 0:c81f86a07902 | 406 | { |
| paologiorgio | 0:c81f86a07902 | 407 | SC.printf("%c", PacketChecked[IndexPayload]); |
| paologiorgio | 0:c81f86a07902 | 408 | } |
| paologiorgio | 0:c81f86a07902 | 409 | |
| paologiorgio | 0:c81f86a07902 | 410 | SC.printf("\n\r"); // per leggibilità |
| paologiorgio | 0:c81f86a07902 | 411 | |
| paologiorgio | 0:c81f86a07902 | 412 | //***********FINE DIAGNOSTICA PACCHETTO*********** |
| paologiorgio | 0:c81f86a07902 | 413 | |
| paologiorgio | 0:c81f86a07902 | 414 | } |
| paologiorgio | 0:c81f86a07902 | 415 | |
| paologiorgio | 0:c81f86a07902 | 416 | TxTelecommand(); |
| paologiorgio | 0:c81f86a07902 | 417 | } |
| paologiorgio | 0:c81f86a07902 | 418 | } |
| paologiorgio | 0:c81f86a07902 | 419 | |
| paologiorgio | 0:c81f86a07902 | 420 | /* ***************************************************************** */ |
| paologiorgio | 0:c81f86a07902 | 421 | |
| paologiorgio | 0:c81f86a07902 | 422 | // DORA trasmette telecomando a MIMA |
| paologiorgio | 0:c81f86a07902 | 423 | void TxTelecommand() |
| paologiorgio | 0:c81f86a07902 | 424 | { |
| paologiorgio | 0:c81f86a07902 | 425 | for (int i = 0; i < PACKET_CHECKED + 1; i++) |
| paologiorgio | 0:c81f86a07902 | 426 | { |
| paologiorgio | 0:c81f86a07902 | 427 | MIMA.putc(PacketChecked[i]); |
| paologiorgio | 0:c81f86a07902 | 428 | } |
| paologiorgio | 0:c81f86a07902 | 429 | } |
| paologiorgio | 0:c81f86a07902 | 430 | |
| paologiorgio | 0:c81f86a07902 | 431 | |
| paologiorgio | 0:c81f86a07902 | 432 | /* ***************************************************************** */ |
| paologiorgio | 0:c81f86a07902 | 433 | |
| paologiorgio | 0:c81f86a07902 | 434 | // DORA riceve telemetrie/telemetrie+scientific data da MIMA |
| paologiorgio | 0:c81f86a07902 | 435 | void RxTelemetry() |
| paologiorgio | 0:c81f86a07902 | 436 | { |
| paologiorgio | 0:c81f86a07902 | 437 | // aggiungere timeout, perché non so se raggiungo il numero dei caratteri |
| paologiorgio | 0:c81f86a07902 | 438 | |
| paologiorgio | 0:c81f86a07902 | 439 | while (MIMA.readable()) |
| paologiorgio | 0:c81f86a07902 | 440 | { |
| paologiorgio | 0:c81f86a07902 | 441 | t.start(); |
| paologiorgio | 0:c81f86a07902 | 442 | |
| paologiorgio | 0:c81f86a07902 | 443 | // char prova = MIMA.getc(); |
| paologiorgio | 0:c81f86a07902 | 444 | // SC.printf("> Text: %c\n\r", prova); |
| paologiorgio | 0:c81f86a07902 | 445 | // check del payload per scelta del buffer |
| paologiorgio | 0:c81f86a07902 | 446 | // 00000000 -> Option 1: transfer all Housekeeping and Status telemetries (from TLM00 to TLM56) |
| paologiorgio | 0:c81f86a07902 | 447 | // 11111111 -> Option 2: transfer telemetries and scientific data packets (from TLM00 to TLM5662) |
| paologiorgio | 0:c81f86a07902 | 448 | |
| paologiorgio | 0:c81f86a07902 | 449 | int j = 7; |
| paologiorgio | 0:c81f86a07902 | 450 | while (j < PACKET_CHECKED) |
| paologiorgio | 0:c81f86a07902 | 451 | { |
| paologiorgio | 0:c81f86a07902 | 452 | if (PacketChecked[j] == '0') |
| paologiorgio | 0:c81f86a07902 | 453 | { |
| paologiorgio | 0:c81f86a07902 | 454 | j++; |
| paologiorgio | 0:c81f86a07902 | 455 | } |
| paologiorgio | 0:c81f86a07902 | 456 | else |
| paologiorgio | 0:c81f86a07902 | 457 | { |
| paologiorgio | 0:c81f86a07902 | 458 | option_1 = 1; |
| paologiorgio | 0:c81f86a07902 | 459 | break; |
| paologiorgio | 0:c81f86a07902 | 460 | } |
| paologiorgio | 0:c81f86a07902 | 461 | } |
| paologiorgio | 0:c81f86a07902 | 462 | |
| paologiorgio | 0:c81f86a07902 | 463 | int k = 7; |
| paologiorgio | 0:c81f86a07902 | 464 | while (k < PACKET_CHECKED) |
| paologiorgio | 0:c81f86a07902 | 465 | { |
| paologiorgio | 0:c81f86a07902 | 466 | if (PacketChecked[k] == '1') |
| paologiorgio | 0:c81f86a07902 | 467 | { |
| paologiorgio | 0:c81f86a07902 | 468 | k++; |
| paologiorgio | 0:c81f86a07902 | 469 | } |
| paologiorgio | 0:c81f86a07902 | 470 | else |
| paologiorgio | 0:c81f86a07902 | 471 | { |
| paologiorgio | 0:c81f86a07902 | 472 | option_2 = 1; |
| paologiorgio | 0:c81f86a07902 | 473 | break; |
| paologiorgio | 0:c81f86a07902 | 474 | } |
| paologiorgio | 0:c81f86a07902 | 475 | } |
| paologiorgio | 0:c81f86a07902 | 476 | |
| paologiorgio | 0:c81f86a07902 | 477 | if (commandId == 5) // TLMODE |
| paologiorgio | 0:c81f86a07902 | 478 | { |
| paologiorgio | 0:c81f86a07902 | 479 | // STARTCH1 - 2800 scientific points - CHECKSUM - ENDCH1 |
| paologiorgio | 0:c81f86a07902 | 480 | // STARTCH2 - 2800 scientific points - CHECKSUM - ENDCH2 |
| paologiorgio | 0:c81f86a07902 | 481 | // 5606 words |
| paologiorgio | 0:c81f86a07902 | 482 | if (option_1 == 0) |
| paologiorgio | 0:c81f86a07902 | 483 | { |
| paologiorgio | 0:c81f86a07902 | 484 | size = 0; // reset |
| paologiorgio | 0:c81f86a07902 | 485 | clearBuffer(TLM, sizeof(TLM) / sizeof(TLM[0])); |
| paologiorgio | 0:c81f86a07902 | 486 | |
| paologiorgio | 0:c81f86a07902 | 487 | if (t.read() < TIMEOUT) |
| paologiorgio | 0:c81f86a07902 | 488 | { |
| paologiorgio | 0:c81f86a07902 | 489 | while (size < OPTION_1) |
| paologiorgio | 0:c81f86a07902 | 490 | { |
| paologiorgio | 0:c81f86a07902 | 491 | data = MIMA.getc(); // prendi carattere in arrivo |
| paologiorgio | 0:c81f86a07902 | 492 | TLM[size++] = data; |
| paologiorgio | 0:c81f86a07902 | 493 | } |
| paologiorgio | 0:c81f86a07902 | 494 | } |
| paologiorgio | 0:c81f86a07902 | 495 | else |
| paologiorgio | 0:c81f86a07902 | 496 | { |
| paologiorgio | 0:c81f86a07902 | 497 | t.stop(); |
| paologiorgio | 0:c81f86a07902 | 498 | SC.printf("> Time elapsed: %.2f\n\r", t.read()); |
| paologiorgio | 0:c81f86a07902 | 499 | clearBuffer(TLM, sizeof(TLM) / sizeof(TLM[0])); |
| paologiorgio | 0:c81f86a07902 | 500 | } |
| paologiorgio | 0:c81f86a07902 | 501 | } |
| paologiorgio | 0:c81f86a07902 | 502 | else if (option_2 == 0) |
| paologiorgio | 0:c81f86a07902 | 503 | { |
| paologiorgio | 0:c81f86a07902 | 504 | size = 0; |
| paologiorgio | 0:c81f86a07902 | 505 | clearBuffer(TLM_SD, sizeof(TLM_SD) / sizeof(TLM_SD[0])); |
| paologiorgio | 0:c81f86a07902 | 506 | |
| paologiorgio | 0:c81f86a07902 | 507 | t.start(); |
| paologiorgio | 0:c81f86a07902 | 508 | if (t.read() < TIMEOUT) |
| paologiorgio | 0:c81f86a07902 | 509 | { |
| paologiorgio | 0:c81f86a07902 | 510 | while (size < OPTION_2) |
| paologiorgio | 0:c81f86a07902 | 511 | { |
| paologiorgio | 0:c81f86a07902 | 512 | data = MIMA.getc(); // prendi carattere in arrivo |
| paologiorgio | 0:c81f86a07902 | 513 | TLM_SD[size++] = data; |
| paologiorgio | 0:c81f86a07902 | 514 | } |
| paologiorgio | 0:c81f86a07902 | 515 | //checksum(TLM_SD, OPTION_2); |
| paologiorgio | 0:c81f86a07902 | 516 | } |
| paologiorgio | 0:c81f86a07902 | 517 | else |
| paologiorgio | 0:c81f86a07902 | 518 | { |
| paologiorgio | 0:c81f86a07902 | 519 | t.stop(); |
| paologiorgio | 0:c81f86a07902 | 520 | clearBuffer(TLM_SD, sizeof(TLM_SD) / sizeof(TLM_SD[0])); |
| paologiorgio | 0:c81f86a07902 | 521 | } |
| paologiorgio | 0:c81f86a07902 | 522 | } |
| paologiorgio | 0:c81f86a07902 | 523 | |
| paologiorgio | 0:c81f86a07902 | 524 | TxTelemetry(); |
| paologiorgio | 0:c81f86a07902 | 525 | } |
| paologiorgio | 0:c81f86a07902 | 526 | } |
| paologiorgio | 0:c81f86a07902 | 527 | } |
| paologiorgio | 0:c81f86a07902 | 528 | |
| paologiorgio | 0:c81f86a07902 | 529 | /* ***************************************************************** */ |
| paologiorgio | 0:c81f86a07902 | 530 | |
| paologiorgio | 0:c81f86a07902 | 531 | // integrità dei dati ricevuti da MIMA |
| paologiorgio | 0:c81f86a07902 | 532 | void checksum(char *a, int aSize) |
| paologiorgio | 0:c81f86a07902 | 533 | { |
| paologiorgio | 0:c81f86a07902 | 534 | volatile int temp; |
| paologiorgio | 0:c81f86a07902 | 535 | volatile int var; |
| paologiorgio | 0:c81f86a07902 | 536 | volatile int p = 0; |
| paologiorgio | 0:c81f86a07902 | 537 | |
| paologiorgio | 0:c81f86a07902 | 538 | for (int i = word; i < 2*word; i++) |
| paologiorgio | 0:c81f86a07902 | 539 | { |
| paologiorgio | 0:c81f86a07902 | 540 | for (int j = 2*i; j < aSize; j+=i) |
| paologiorgio | 0:c81f86a07902 | 541 | { |
| paologiorgio | 0:c81f86a07902 | 542 | if (j == 2*i) |
| paologiorgio | 0:c81f86a07902 | 543 | { |
| paologiorgio | 0:c81f86a07902 | 544 | temp = (int)(a[i] ^ a[j]); |
| paologiorgio | 0:c81f86a07902 | 545 | } else |
| paologiorgio | 0:c81f86a07902 | 546 | { |
| paologiorgio | 0:c81f86a07902 | 547 | temp = temp ^ (int)a[j]; |
| paologiorgio | 0:c81f86a07902 | 548 | } |
| paologiorgio | 0:c81f86a07902 | 549 | |
| paologiorgio | 0:c81f86a07902 | 550 | } |
| paologiorgio | 0:c81f86a07902 | 551 | |
| paologiorgio | 0:c81f86a07902 | 552 | tempCheck[p++] = temp; // vettore del checksum in int |
| paologiorgio | 0:c81f86a07902 | 553 | } |
| paologiorgio | 0:c81f86a07902 | 554 | |
| paologiorgio | 0:c81f86a07902 | 555 | for (int i = 0; i < word; i++) // trasformo in char |
| paologiorgio | 0:c81f86a07902 | 556 | { |
| paologiorgio | 0:c81f86a07902 | 557 | if (tempCheck[i] == 0 || tempCheck[i] == 48) |
| paologiorgio | 0:c81f86a07902 | 558 | { |
| paologiorgio | 0:c81f86a07902 | 559 | checksumWord[i++] = '0'; |
| paologiorgio | 0:c81f86a07902 | 560 | } |
| paologiorgio | 0:c81f86a07902 | 561 | else if (tempCheck[i] == 1 || tempCheck[i] == 49) |
| paologiorgio | 0:c81f86a07902 | 562 | { |
| paologiorgio | 0:c81f86a07902 | 563 | checksumWord[i++] = '1'; |
| paologiorgio | 0:c81f86a07902 | 564 | } |
| paologiorgio | 0:c81f86a07902 | 565 | } |
| paologiorgio | 0:c81f86a07902 | 566 | |
| paologiorgio | 0:c81f86a07902 | 567 | |
| paologiorgio | 0:c81f86a07902 | 568 | volatile int t = 0; |
| paologiorgio | 0:c81f86a07902 | 569 | // confronto |
| paologiorgio | 0:c81f86a07902 | 570 | for (int i = 2801*word; i < 2802*16; i++) |
| paologiorgio | 0:c81f86a07902 | 571 | { |
| paologiorgio | 0:c81f86a07902 | 572 | checksumReceived[t++] = TLM_SD[i]; |
| paologiorgio | 0:c81f86a07902 | 573 | } |
| paologiorgio | 0:c81f86a07902 | 574 | |
| paologiorgio | 0:c81f86a07902 | 575 | for (int i = 0; i < word; i++) |
| paologiorgio | 0:c81f86a07902 | 576 | { |
| paologiorgio | 0:c81f86a07902 | 577 | if (checksumWord[i] != checksumReceived[i]) |
| paologiorgio | 0:c81f86a07902 | 578 | { |
| paologiorgio | 0:c81f86a07902 | 579 | SC.printf("\n\r> ERROR detected: BIT n. %i\n\r", i+1); |
| paologiorgio | 0:c81f86a07902 | 580 | break; |
| paologiorgio | 0:c81f86a07902 | 581 | } |
| paologiorgio | 0:c81f86a07902 | 582 | } |
| paologiorgio | 0:c81f86a07902 | 583 | |
| paologiorgio | 0:c81f86a07902 | 584 | |
| paologiorgio | 0:c81f86a07902 | 585 | } |
| paologiorgio | 0:c81f86a07902 | 586 | |
| paologiorgio | 0:c81f86a07902 | 587 | /* ***************************************************************** */ |
| paologiorgio | 0:c81f86a07902 | 588 | |
| paologiorgio | 0:c81f86a07902 | 589 | // DORA trasmette dati verso Space/craft |
| paologiorgio | 0:c81f86a07902 | 590 | void TxTelemetry() |
| paologiorgio | 0:c81f86a07902 | 591 | { |
| paologiorgio | 0:c81f86a07902 | 592 | // The data are read on the falling-edge of the DATA_CLOCK_OUT signal |
| paologiorgio | 0:c81f86a07902 | 593 | if (option_1 == 0) |
| paologiorgio | 0:c81f86a07902 | 594 | { |
| paologiorgio | 0:c81f86a07902 | 595 | SC.printf("\n\r> Receiving 57 words from MIMA... \n\r"); |
| paologiorgio | 0:c81f86a07902 | 596 | |
| paologiorgio | 0:c81f86a07902 | 597 | for (int i = 0; i < OPTION_1; i++) |
| paologiorgio | 0:c81f86a07902 | 598 | { |
| paologiorgio | 0:c81f86a07902 | 599 | SC.putc(TLM[i]); |
| paologiorgio | 0:c81f86a07902 | 600 | } |
| paologiorgio | 0:c81f86a07902 | 601 | |
| paologiorgio | 0:c81f86a07902 | 602 | /*SC.printf("\n\r> Receiving 57 words from DORA... \n\r"); |
| paologiorgio | 0:c81f86a07902 | 603 | |
| paologiorgio | 0:c81f86a07902 | 604 | for (int i = 0; i < OPTION_1; i++) |
| paologiorgio | 0:c81f86a07902 | 605 | { |
| paologiorgio | 0:c81f86a07902 | 606 | ARDUINO.putc(DEVICE.putc(TLM[i])); |
| paologiorgio | 0:c81f86a07902 | 607 | } |
| paologiorgio | 0:c81f86a07902 | 608 | */ |
| paologiorgio | 0:c81f86a07902 | 609 | } |
| paologiorgio | 0:c81f86a07902 | 610 | else if (option_2 == 0) |
| paologiorgio | 0:c81f86a07902 | 611 | { |
| paologiorgio | 0:c81f86a07902 | 612 | SC.printf("Receiving 5663 words...\n\r"); |
| paologiorgio | 0:c81f86a07902 | 613 | |
| paologiorgio | 0:c81f86a07902 | 614 | for (int i = 0; i < OPTION_2; i++) |
| paologiorgio | 0:c81f86a07902 | 615 | { |
| paologiorgio | 0:c81f86a07902 | 616 | SC.putc(TLM_SD[i]); |
| paologiorgio | 0:c81f86a07902 | 617 | } |
| paologiorgio | 0:c81f86a07902 | 618 | |
| paologiorgio | 0:c81f86a07902 | 619 | /* |
| paologiorgio | 0:c81f86a07902 | 620 | SC.printf("\n\r> Receiving 5663 words from DORA... \n\r"); |
| paologiorgio | 0:c81f86a07902 | 621 | |
| paologiorgio | 0:c81f86a07902 | 622 | for (int i = 0; i < OPTION_2; i++) |
| paologiorgio | 0:c81f86a07902 | 623 | { |
| paologiorgio | 0:c81f86a07902 | 624 | ARDUINO.putc(DEVICE.putc(TLM_SD[i])); |
| paologiorgio | 0:c81f86a07902 | 625 | } |
| paologiorgio | 0:c81f86a07902 | 626 | */ |
| paologiorgio | 0:c81f86a07902 | 627 | } |
| paologiorgio | 0:c81f86a07902 | 628 | |
| paologiorgio | 0:c81f86a07902 | 629 | } |
| paologiorgio | 0:c81f86a07902 | 630 | |
| paologiorgio | 0:c81f86a07902 | 631 | /* ***************************************************************** */ |
| paologiorgio | 0:c81f86a07902 | 632 | |
| paologiorgio | 0:c81f86a07902 | 633 | // controllo dell'attuatore e dei relay |
| paologiorgio | 0:c81f86a07902 | 634 | void ActuatorControl(int command) |
| paologiorgio | 0:c81f86a07902 | 635 | { |
| paologiorgio | 0:c81f86a07902 | 636 | SC.printf("\n\r *** L16 ACTUATONIX - RELAY CONTROL *** \n\r"); // leggibilità |
| paologiorgio | 0:c81f86a07902 | 637 | |
| paologiorgio | 0:c81f86a07902 | 638 | // *** estensione/ritrazione dell'attuatore *** |
| paologiorgio | 0:c81f86a07902 | 639 | if((command == 128) && (offset < 1.0f)) { |
| paologiorgio | 0:c81f86a07902 | 640 | offset += 0.2f; |
| paologiorgio | 0:c81f86a07902 | 641 | } else if((command == 64) && (offset > 0.0f)) { |
| paologiorgio | 0:c81f86a07902 | 642 | offset -= 0.2f; |
| paologiorgio | 0:c81f86a07902 | 643 | |
| paologiorgio | 0:c81f86a07902 | 644 | // *** gestione accensione/spegnimento relay alimentazione *** |
| paologiorgio | 0:c81f86a07902 | 645 | } // Relay 5V |
| paologiorgio | 0:c81f86a07902 | 646 | else if (command == 1) { |
| paologiorgio | 0:c81f86a07902 | 647 | Relay5V = 0; |
| paologiorgio | 0:c81f86a07902 | 648 | SC.printf("\r\nRelay 5V ON\r\n"); |
| paologiorgio | 0:c81f86a07902 | 649 | } else if (command == 0) { |
| paologiorgio | 0:c81f86a07902 | 650 | Relay5V = 1; |
| paologiorgio | 0:c81f86a07902 | 651 | SC.printf("\r\nRelay 5V OFF\r\n"); |
| paologiorgio | 0:c81f86a07902 | 652 | |
| paologiorgio | 0:c81f86a07902 | 653 | // Relay 12V |
| paologiorgio | 0:c81f86a07902 | 654 | } else if (command == 3) { |
| paologiorgio | 0:c81f86a07902 | 655 | Relay12V = 0; |
| paologiorgio | 0:c81f86a07902 | 656 | SC.printf("\r\nRelay 12V ON\r\n"); |
| paologiorgio | 0:c81f86a07902 | 657 | |
| paologiorgio | 0:c81f86a07902 | 658 | } else if (command == 2) { |
| paologiorgio | 0:c81f86a07902 | 659 | Relay12V = 1; |
| paologiorgio | 0:c81f86a07902 | 660 | SC.printf("\r\nRelay 12V OFF\r\n"); |
| paologiorgio | 0:c81f86a07902 | 661 | |
| paologiorgio | 0:c81f86a07902 | 662 | // Relay +15V, -15V, -5V |
| paologiorgio | 0:c81f86a07902 | 663 | } else if (command == 7) { |
| paologiorgio | 0:c81f86a07902 | 664 | Relay15_15_5V = 0; |
| paologiorgio | 0:c81f86a07902 | 665 | SC.printf("\r\nRelay +15V, -15V, -5V ON\r\n"); |
| paologiorgio | 0:c81f86a07902 | 666 | |
| paologiorgio | 0:c81f86a07902 | 667 | } else if (command == 6) { |
| paologiorgio | 0:c81f86a07902 | 668 | Relay15_15_5V = 1; |
| paologiorgio | 0:c81f86a07902 | 669 | SC.printf("\r\nRelay +15V, -15V, -5V OFF\r\n"); |
| paologiorgio | 0:c81f86a07902 | 670 | |
| paologiorgio | 0:c81f86a07902 | 671 | // Relay 24V |
| paologiorgio | 0:c81f86a07902 | 672 | } else if (command == 15) { |
| paologiorgio | 0:c81f86a07902 | 673 | Relay24V = 0; |
| paologiorgio | 0:c81f86a07902 | 674 | SC.printf("\r\nRelay 24V ON\r\n"); |
| paologiorgio | 0:c81f86a07902 | 675 | |
| paologiorgio | 0:c81f86a07902 | 676 | } else if (command == 8) { |
| paologiorgio | 0:c81f86a07902 | 677 | Relay24V = 1; |
| paologiorgio | 0:c81f86a07902 | 678 | SC.printf("\r\nRelay 24V OFF\r\n"); |
| paologiorgio | 0:c81f86a07902 | 679 | |
| paologiorgio | 0:c81f86a07902 | 680 | // RESET |
| paologiorgio | 0:c81f86a07902 | 681 | } else if (command == 255) { |
| paologiorgio | 0:c81f86a07902 | 682 | // spegni tutto |
| paologiorgio | 0:c81f86a07902 | 683 | Relay5V = 1; |
| paologiorgio | 0:c81f86a07902 | 684 | Relay12V = 1; |
| paologiorgio | 0:c81f86a07902 | 685 | Relay15_15_5V = 1; // +15, -15, -5 |
| paologiorgio | 0:c81f86a07902 | 686 | Relay24V = 1; |
| paologiorgio | 0:c81f86a07902 | 687 | } |
| paologiorgio | 0:c81f86a07902 | 688 | |
| paologiorgio | 0:c81f86a07902 | 689 | M1.write(offset); |
| paologiorgio | 0:c81f86a07902 | 690 | M2.write(offset); |
| paologiorgio | 0:c81f86a07902 | 691 | |
| paologiorgio | 0:c81f86a07902 | 692 | SC.printf("> Duty Cycle %.2f / estensione \n \r", offset); |
| paologiorgio | 0:c81f86a07902 | 693 | } |