diff --git a/README.md b/README.md index 3c578c9..85d0dcd 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,9 @@ SpaceLab Packet Decoder is a software to decode audio records from the satellite Until now, this program supports the satellites below: * FloripaSat-1 (launched in December 2019) -* FloripaSat-2 (to be launched on 2022) +* GOLDS-UFSC (to be launched on 2025) * Aldebaran-1 (to be launched on TBC) +* Catarina-A1 (to be launched on 2025) ## Dependencies diff --git a/spacelab_decoder/data/satellites/catarina-a1.json b/spacelab_decoder/data/satellites/catarina-a1.json new file mode 100644 index 0000000..f62fcf2 --- /dev/null +++ b/spacelab_decoder/data/satellites/catarina-a1.json @@ -0,0 +1,1121 @@ +{ + "name": "Catarina-A1", + "links": [ + { + "name": "Beacon", + "types": [ + { + "name": "EPS data", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 0, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Timestamp", + "initial_pos": 8, + "final_pos": 11, + "value": 0, + "conversion": "int((pkt[8] << 24) | (pkt[9] << 16) | (pkt[10] << 8) | pkt[11])", + "unit": "sec" + }, + { + "name": "Battery cell 1 voltage", + "initial_pos": 12, + "final_pos": 13, + "value": 0, + "conversion": "int((pkt[12] << 8) << pkt[13])", + "unit": "mV" + }, + { + "name": "Battery cell 2 voltage", + "initial_pos": 14, + "final_pos": 15, + "value": 0, + "conversion": "int((pkt[14] << 8) << pkt[15])", + "unit": "mV" + }, + { + "name": "Battery current", + "initial_pos": 16, + "final_pos": 17, + "value": 0, + "conversion": "int((pkt[16] << 8) | pkt[17])", + "unit": "mA" + }, + { + "name": "Battery charge", + "initial_pos": 18, + "final_pos": 19, + "value": 0, + "conversion": "int((pkt[18] << 8) | pkt[19])", + "unit": "mAh" + }, + { + "name": "Battery cell 1 temperature", + "initial_pos": 20, + "final_pos": 21, + "value": 0, + "conversion": "int((pkt[20] << 8) | pkt[21])", + "unit": "K" + }, + { + "name": "Battery cell 2 temperature", + "initial_pos": 22, + "final_pos": 23, + "value": 0, + "conversion": "int((pkt[22] << 8) | pkt[23])", + "unit": "K" + }, + { + "name": "Battery monitor temperature", + "initial_pos": 24, + "final_pos": 25, + "value": 0, + "conversion": "int((pkt[24] << 8) | pkt[25])", + "unit": "K" + }, + { + "name": "Solar panel voltage (-Y and +X)", + "initial_pos": 26, + "final_pos": 27, + "value": 0, + "conversion": "int((pkt[26] << 8) | pkt[27])", + "unit": "mV" + }, + { + "name": "Solar panel voltage (-X and +Z)", + "initial_pos": 28, + "final_pos": 29, + "value": 0, + "conversion": "int((pkt[28] << 8) | pkt[29])", + "unit": "mV" + }, + { + "name": "Solar panel voltage (-Z and +Y)", + "initial_pos": 30, + "final_pos": 31, + "value": 0, + "conversion": "int((pkt[30] << 8) | pkt[31])", + "unit": "mV" + }, + { + "name": "Solar panel current (-Y)", + "initial_pos": 32, + "final_pos": 33, + "value": 0, + "conversion": "int((pkt[32] << 8) | pkt[33])", + "unit": "mA" + }, + { + "name": "Solar panel current (+Y)", + "initial_pos": 34, + "final_pos": 35, + "value": 0, + "conversion": "int((pkt[34] << 8) | pkt[35])", + "unit": "mA" + }, + { + "name": "Solar panel current (-X)", + "initial_pos": 36, + "final_pos": 37, + "value": 0, + "conversion": "int((pkt[36] << 8) | pkt[37])", + "unit": "mA" + }, + { + "name": "Solar panel current (+X)", + "initial_pos": 38, + "final_pos": 39, + "value": 0, + "conversion": "int((pkt[38] << 8) | pkt[39])", + "unit": "mA" + }, + { + "name": "Solar panel current (-Z)", + "initial_pos": 40, + "final_pos": 41, + "value": 0, + "conversion": "int((pkt[40] << 8) | pkt[41])", + "unit": "mA" + }, + { + "name": "Solar panel current (+Z)", + "initial_pos": 42, + "final_pos": 43, + "value": 0, + "conversion": "int((pkt[42] << 8) | pkt[43])", + "unit": "mA" + }, + { + "name": "EPS uC temperature", + "initial_pos": 44, + "final_pos": 45, + "value": 0, + "conversion": "int((pkt[44] << 8) | pkt[45])", + "unit": "K" + } + ] + }, + { + "name": "TTC data", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 1, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Timestamp", + "initial_pos": 8, + "final_pos": 11, + "value": 0, + "conversion": "int((pkt[8] << 24) | (pkt[9] << 16) | (pkt[10] << 8) | pkt[11])", + "unit": "sec" + }, + { + "name": "TTC uC temperature", + "initial_pos": 12, + "final_pos": 13, + "value": 0, + "conversion": "int((pkt[12] << 8) | pkt[13])", + "unit": "K" + }, + { + "name": "Reset counter", + "initial_pos": 14, + "final_pos": 15, + "value": 0, + "conversion": "int((pkt[14] << 8) | pkt[15])", + "unit": "" + }, + { + "name": "Last reset cause", + "initial_pos": 16, + "final_pos": 16, + "value": 0, + "conversion": "int(pkt[16])", + "unit": "" + }, + { + "name": "Beacon radio temperature", + "initial_pos": 17, + "final_pos": 18, + "value": 0, + "conversion": "int((pkt[17] << 8) | pkt[18])", + "unit": "K" + } + ] + } + ] + }, + { + "name": "Downlink", + "types": [ + { + "name": "General telemetry", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 32, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Time counter", + "initial_pos": 8, + "final_pos": 11, + "value": 0, + "conversion": "int((pkt[8] << 24) | (pkt[9] << 16) | (pkt[10] << 8) | pkt[11])", + "unit": "sec" + }, + { + "name": "OBDH uC temperature", + "initial_pos": 12, + "final_pos": 13, + "value": 0, + "conversion": "int((pkt[12] << 8) | pkt[13])", + "unit": "K" + }, + { + "name": "OBDH input current", + "initial_pos": 14, + "final_pos": 15, + "value": 0, + "conversion": "int((pkt[14] << 8) | pkt[15])", + "unit": "mA" + }, + { + "name": "OBDH input voltage", + "initial_pos": 16, + "final_pos": 17, + "value": 0, + "conversion": "int((pkt[16] << 8) | pkt[17])", + "unit": "mV" + }, + { + "name": "OBDH last reset cause", + "initial_pos": 18, + "final_pos": 18, + "value": 0, + "conversion": "int(pkt[18])", + "unit": "" + }, + { + "name": "OBDH reset counter", + "initial_pos": 19, + "final_pos": 20, + "value": 0, + "conversion": "int((pkt[19] << 8) | pkt[20])", + "unit": "" + }, + { + "name": "Last valid telecommand", + "initial_pos": 21, + "final_pos": 21, + "value": 0, + "conversion": "int(pkt[21])", + "unit": "" + }, + { + "name": "Radio temperature", + "initial_pos": 22, + "final_pos": 23, + "value": 0, + "conversion": "int((pkt[22] << 8) | pkt[23])", + "unit": "K" + }, + { + "name": "Last valid TC RSSI", + "initial_pos": 24, + "final_pos": 25, + "value": 0, + "conversion": "int((pkt[24] << 8) | pkt[25])", + "unit": "dB" + }, + { + "name": "Antenna temperature", + "initial_pos": 26, + "final_pos": 27, + "value": 0, + "conversion": "int((pkt[26] << 8) | pkt[27])", + "unit": "K" + }, + { + "name": "Antenna status", + "initial_pos": 28, + "final_pos": 29, + "value": 0, + "conversion": "int((pkt[28] << 8) | pkt[29])", + "unit": "" + }, + { + "name": "Payloads status", + "initial_pos": 30, + "final_pos": 30, + "value": 0, + "conversion": "int(pkt[30])", + "unit": "" + }, + { + "name": "EPS uC temperature", + "initial_pos": 31, + "final_pos": 32, + "value": 0, + "conversion": "int((pkt[31] << 8) | pkt[32])", + "unit": "K" + }, + { + "name": "EPS current", + "initial_pos": 33, + "final_pos": 34, + "value": 0, + "conversion": "int((pkt[33] << 8) | pkt[34])", + "unit": "mA" + }, + { + "name": "EPS last reset cause", + "initial_pos": 35, + "final_pos": 35, + "value": 0, + "conversion": "int(pkt[35])", + "unit": "" + }, + { + "name": "EPS reset counter", + "initial_pos": 36, + "final_pos": 37, + "value": 0, + "conversion": "int((pkt[36] << 8) | pkt[37])", + "unit": "" + }, + { + "name": "Solar panel voltage (-Y and +X)", + "initial_pos": 38, + "final_pos": 39, + "value": 0, + "conversion": "int((pkt[38] << 8) | pkt[39])", + "unit": "mV" + }, + { + "name": "Solar panel voltage (-X and +Z)", + "initial_pos": 40, + "final_pos": 41, + "value": 0, + "conversion": "int((pkt[40] << 8) | pkt[41])", + "unit": "mV" + }, + { + "name": "Solar panel voltage (-Z and +Y)", + "initial_pos": 42, + "final_pos": 43, + "value": 0, + "conversion": "int((pkt[42] << 8) | pkt[43])", + "unit": "mV" + }, + { + "name": "Solar panel current (-Y)", + "initial_pos": 44, + "final_pos": 45, + "value": 0, + "conversion": "int((pkt[44] << 8) | pkt[45])", + "unit": "mA" + }, + { + "name": "Solar panel current (+Y)", + "initial_pos": 46, + "final_pos": 47, + "value": 0, + "conversion": "int((pkt[46] << 8) | pkt[47])", + "unit": "" + }, + { + "name": "Solar panel current (-X)", + "initial_pos": 48, + "final_pos": 49, + "value": 0, + "conversion": "int((pkt[48] << 8) | pkt[49])", + "unit": "" + }, + { + "name": "Solar panel current (+X)", + "initial_pos": 50, + "final_pos": 51, + "value": 0, + "conversion": "int((pkt[50] << 8) | pkt[51])", + "unit": "" + }, + { + "name": "Solar panel current (-Z)", + "initial_pos": 52, + "final_pos": 53, + "value": 0, + "conversion": "int((pkt[52] << 8) | pkt[53])", + "unit": "" + }, + { + "name": "Solar panel current (+Z)", + "initial_pos": 54, + "final_pos": 55, + "value": 0, + "conversion": "int((pkt[54] << 8) | pkt[55])", + "unit": "" + }, + { + "name": "MPPT 1 duty cycle", + "initial_pos": 55, + "final_pos": 55, + "value": 0, + "conversion": "int(pkt[55])", + "unit": "%" + }, + { + "name": "MPPT 2 duty cycle", + "initial_pos": 56, + "final_pos": 56, + "value": 0, + "conversion": "int(pkt[56])", + "unit": "%" + }, + { + "name": "MPPT 3 duty cycle", + "initial_pos": 57, + "final_pos": 57, + "value": 0, + "conversion": "int(pkt[57])", + "unit": "%" + }, + { + "name": "Main power bus voltage", + "initial_pos": 58, + "final_pos": 59, + "value": 0, + "conversion": "int((pkt[58] << 8) | pkt[59])", + "unit": "mV" + }, + { + "name": "Batteries voltage", + "initial_pos": 60, + "final_pos": 61, + "value": 0, + "conversion": "int((pkt[60] << 8) | pkt[61])", + "unit": "mV" + }, + { + "name": "Batteries current", + "initial_pos": 62, + "final_pos": 63, + "value": 0, + "conversion": "int((pkt[62] << 8) | pkt[63])", + "unit": "mA" + }, + { + "name": "Batteries average current", + "initial_pos": 64, + "final_pos": 65, + "value": 0, + "conversion": "int((pkt[64] << 8) | pkt[65])", + "unit": "mA" + }, + { + "name": "Batteries accumulated current", + "initial_pos": 66, + "final_pos": 67, + "value": 0, + "conversion": "int((pkt[66] << 8) | pkt[67])", + "unit": "mA" + }, + { + "name": "Batteries charge", + "initial_pos": 68, + "final_pos": 69, + "value": 0, + "conversion": "int((pkt[68] << 8) | pkt[69])", + "unit": "mAh" + }, + { + "name": "Battery monitor IC temperature", + "initial_pos": 70, + "final_pos": 71, + "value": 0, + "conversion": "int((pkt[70] << 8) | pkt[71])", + "unit": "K" + }, + { + "name": "Battery heater 1 duty cycle", + "initial_pos": 72, + "final_pos": 72, + "value": 0, + "conversion": "int(pkt[72])", + "unit": "%" + }, + { + "name": "Battery heater 2 duty cycle", + "initial_pos": 73, + "final_pos": 73, + "value": 0, + "conversion": "int(pkt[73])", + "unit": "%" + }, + { + "name": "Payload EDC status", + "initial_pos": 74, + "final_pos": 74, + "value": 0, + "conversion": "int(pkt[74])", + "unit": "" + }, + { + "name": "Radiation instrument status", + "initial_pos": 75, + "final_pos": 75, + "value": 0, + "conversion": "int(pkt[75])", + "unit": "" + }, + { + "name": "Radiation monitor status", + "initial_pos": 76, + "final_pos": 76, + "value": 0, + "conversion": "int(pkt[76])", + "unit": "" + } + ] + }, + { + "name": "Ping answer", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 33, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Requester callsign", + "initial_pos": 8, + "final_pos": 14, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[8:15]])", + "unit": "" + } + ] + }, + { + "name": "Data request answer", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 34, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Requester callsign", + "initial_pos": 8, + "final_pos": 14, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[8:15]])", + "unit": "" + }, + { + "name": "Data type ID", + "initial_pos": 15, + "final_pos": 15, + "value": 0, + "conversion": "int(pkt[15])", + "unit": "" + }, + { + "name": "Timestamp", + "initial_pos": 16, + "final_pos": 19, + "value": 0, + "conversion": "int((pkt[16] << 24) | (pkt[17] << 16) | (pkt[18] << 8) | pkt[19])", + "unit": "sec" + }, + { + "name": "Data", + "initial_pos": 20, + "final_pos": 39, + "value": 0, + "conversion": "str(pkt[20:40])", + "unit": "" + } + ] + }, + { + "name": "Message broadcast", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 35, + "conversion": "", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Requester callsign", + "initial_pos": 8, + "final_pos": 14, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[8:15]])", + "unit": "" + }, + { + "name": "Destination callsign", + "initial_pos": 15, + "final_pos": 21, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[15:22]])", + "unit": "" + }, + { + "name": "Message", + "initial_pos": 22, + "final_pos": 59, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[22:60]])", + "unit": "" + } + ] + }, + { + "name": "Payload data (EDC info)", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 36, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Payload ID", + "initial_pos": 8, + "final_pos": 8, + "value": 0, + "conversion": "int(pkt[8])", + "unit": "" + }, + { + "name": "PTT signal receiving time", + "initial_pos": 9, + "final_pos": 12, + "value": 0, + "conversion": "int((pkt[9] << 24) | (pkt[10] << 16) | (pkt[11] << 8) | pkt[12])", + "unit": "sec" + }, + { + "name": "Error code", + "initial_pos": 13, + "final_pos": 13, + "value": 0, + "conversion": "int(pkt[13])", + "unit": "" + }, + { + "name": "Carrier frequency", + "initial_pos": 14, + "final_pos": 15, + "value": 0, + "conversion": "int((pkt[14] << 8) | pkt[15])", + "unit": "MHz" + }, + { + "name": "Carrier amplitude at ADC interface", + "initial_pos": 16, + "final_pos": 17, + "value": 0, + "conversion": "int((pkt[16] << 8) | pkt[17])", + "unit": "" + }, + { + "name": "User message length", + "initial_pos": 18, + "final_pos": 18, + "value": 0, + "conversion": "int(pkt[18])", + "unit": "bytes" + }, + { + "name": "User message", + "initial_pos": 19, + "final_pos": 53, + "value": 0, + "conversion": "str(pkt[19:54])", + "unit": "" + }, + { + "name": "Current time (J2000 epoch)", + "initial_pos": 54, + "final_pos": 57, + "value": 0, + "conversion": "int((pkt[54] << 24) | (pkt[55] << 16) | (pkt[56] << 8) | pkt[57])", + "unit": "sec" + }, + { + "name": "Elapsed time since last reset", + "initial_pos": 58, + "final_pos": 61, + "value": 0, + "conversion": "int((pkt[58] << 24) | (pkt[59] << 16) | (pkt[60] << 8) | pkt[61])", + "unit": "sec" + }, + { + "name": "System current supply", + "initial_pos": 62, + "final_pos": 63, + "value": 0, + "conversion": "int((pkt[62] << 8) | pkt[63])", + "unit": "mA" + }, + { + "name": "System voltage supply", + "initial_pos": 64, + "final_pos": 65, + "value": 0, + "conversion": "int((pkt[64] << 8) | pkt[65])", + "unit": "mV" + }, + { + "name": "EDC board temperature", + "initial_pos": 66, + "final_pos": 66, + "value": 0, + "conversion": "int(pkt[66])", + "unit": "oC" + }, + { + "name": "RF front end LO", + "initial_pos": 67, + "final_pos": 67, + "value": 0, + "conversion": "int(pkt[67])", + "unit": "" + }, + { + "name": "RMS level at front-end output", + "initial_pos": 68, + "final_pos": 69, + "value": 0, + "conversion": "int((pkt[69] << 8) | pkt[69])", + "unit": "" + }, + { + "name": "Generated PTT packages since last initialization", + "initial_pos": 70, + "final_pos": 70, + "value": 0, + "conversion": "int(pkt[70])", + "unit": "" + }, + { + "name": "Max", + "initial_pos": 71, + "final_pos": 71, + "value": 0, + "conversion": "int(pkt[71])", + "unit": "" + }, + { + "name": "Memory error count", + "initial_pos": 72, + "final_pos": 72, + "value": 0, + "conversion": "int(pkt[72])", + "unit": "" + }, + { + "name": "Current time", + "initial_pos": 73, + "final_pos": 76, + "value": 0, + "conversion": "int((pkt[73] << 24) | (pkt[74] << 16) | (pkt[75] << 8) | pkt[76])", + "unit": "sec" + }, + { + "name": "Number of PTT packets available for reading", + "initial_pos": 77, + "final_pos": 77, + "value": 0, + "conversion": "int(pkt[77])", + "unit": "" + }, + { + "name": "PTT decoder task status", + "initial_pos": 78, + "final_pos": 78, + "value": 0, + "conversion": "int(pkt[78])", + "unit": "" + }, + { + "name": "ADC sampler state", + "initial_pos": 79, + "final_pos": 79, + "value": 0, + "conversion": "int(pkt[79])", + "unit": "" + } + ] + }, + { + "name": "Payload data (EDC samples)", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 39, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Payload ID", + "initial_pos": 8, + "final_pos": 8, + "value": 0, + "conversion": "int(pkt[8])", + "unit": "" + }, + { + "name": "Elapsed time (J2000 epoch)", + "initial_pos": 9, + "final_pos": 12, + "value": 0, + "conversion": "int((pkt[9] << 24) | (pkt[10] << 16) | (pkt[11] << 8) | pkt[12])", + "unit": "" + }, + { + "name": "ADC sample packet number", + "initial_pos": 13, + "final_pos": 13, + "value": 0, + "conversion": "int(pkt[13])", + "unit": "" + }, + { + "name": "ADC I-sample 0", + "initial_pos": 14, + "final_pos": 15, + "value": 0, + "conversion": "int((pkt[14] << 8) | pkt[15])", + "unit": "" + }, + { + "name": "ADC Q-sample 0", + "initial_pos": 16, + "final_pos": 17, + "value": 0, + "conversion": "int((pkt[16] << 8) | pkt[17])", + "unit": "" + }, + { + "name": "ADC I-sample 1", + "initial_pos": 18, + "final_pos": 19, + "value": 0, + "conversion": "int((pkt[18] << 8) | pkt[19])", + "unit": "" + }, + { + "name": "ADC Q-sample 1", + "initial_pos": 20, + "final_pos": 21, + "value": 0, + "conversion": "int((pkt[20] << 8) | pkt[21])", + "unit": "" + }, + { + "name": "ADC I-sample 2", + "initial_pos": 22, + "final_pos": 23, + "value": 0, + "conversion": "int((pkt[22] << 8) | pkt[23])", + "unit": "" + }, + { + "name": "ADC Q-sample 2", + "initial_pos": 24, + "final_pos": 25, + "value": 0, + "conversion": "int((pkt[24] << 8) | pkt[25])", + "unit": "" + }, + { + "name": "ADC I-sample 3", + "initial_pos": 26, + "final_pos": 27, + "value": 0, + "conversion": "int((pkt[26] << 8) | pkt[27])", + "unit": "" + }, + { + "name": "ADC Q-sample 3", + "initial_pos": 28, + "final_pos": 29, + "value": 0, + "conversion": "int((pkt[28] << 8) | pkt[29])", + "unit": "" + }, + { + "name": "ADC I-sample 4", + "initial_pos": 30, + "final_pos": 31, + "value": 0, + "conversion": "int((pkt[30] << 8) | pkt[31])", + "unit": "" + }, + { + "name": "ADC Q-sample 4", + "initial_pos": 32, + "final_pos": 33, + "value": 0, + "conversion": "int((pkt[32] << 8) | pkt[33])", + "unit": "" + } + ] + }, + { + "name": "TC feedback", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 37, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Requester callsign", + "initial_pos": 8, + "final_pos": 14, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[8:15]])", + "unit": "" + }, + { + "name": "TC packet ID", + "initial_pos": 15, + "final_pos": 15, + "value": 0, + "conversion": "int(pkt[15])", + "unit": "" + }, + { + "name": "Timestamp", + "initial_pos": 16, + "final_pos": 19, + "value": 0, + "conversion": "int((pkt[16] << 24) | (pkt[17] << 16) | (pkt[18] << 8) | pkt[19])", + "unit": "sec" + } + ] + }, + { + "name": "Parameter value", + "fields": [ + { + "name": "ID", + "initial_pos": 0, + "final_pos": 0, + "value": 38, + "conversion": "int(pkt[0])", + "unit": "" + }, + { + "name": "Source callsign", + "initial_pos": 1, + "final_pos": 7, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[1:8]])", + "unit": "" + }, + { + "name": "Requester callsign", + "initial_pos": 8, + "final_pos": 14, + "value": 0, + "conversion": "\"\".join([chr(val) for val in pkt[8:15]])", + "unit": "" + }, + { + "name": "Subsystem ID", + "initial_pos": 15, + "final_pos": 15, + "value": 0, + "conversion": "int(pkt[15])", + "unit": "" + }, + { + "name": "Parameter ID", + "initial_pos": 16, + "final_pos": 16, + "value": 0, + "conversion": "int(pkt[16])", + "unit": "" + }, + { + "name": "Parameter value", + "initial_pos": 17, + "final_pos": 20, + "value": 0, + "conversion": "int((pkt[17] << 24) | (pkt[18] << 16) | (pkt[19] << 8) | pkt[20])", + "unit": "" + } + ] + } + ] + } + ] +} diff --git a/spacelab_decoder/spacelabdecoder.py b/spacelab_decoder/spacelabdecoder.py index 475c86a..6971781 100644 --- a/spacelab_decoder/spacelabdecoder.py +++ b/spacelab_decoder/spacelabdecoder.py @@ -70,6 +70,8 @@ _SAT_JSON_GOLDS_UFSC_SYSTEM = '/usr/share/spacelab_decoder/golds-ufsc.json' _SAT_JSON_ALDEBARAN_1_LOCAL = os.path.abspath(os.path.dirname(__file__)) + '/data/satellites/aldebaran-1.json' _SAT_JSON_ALDEBARAN_1_SYSTEM = '/usr/share/spacelab_decoder/aldebaran-1.json' +_SAT_JSON_CATARINA_A1_LOCAL = os.path.abspath(os.path.dirname(__file__)) + '/data/satellites/catarina-a1.json' +_SAT_JSON_CATARINA_A1_SYSTEM = '/usr/share/spacelab_decoder/catarina-a1.json' _SAT_JSON_SPACELAB_TXER_LOCAL = os.path.abspath(os.path.dirname(__file__)) + '/data/satellites/spacelab-transmitter.json' _SAT_JSON_SPACELAB_TXER_SYSTEM = '/usr/share/spacelab_decoder/spacelab-transmitter.json' @@ -183,6 +185,7 @@ def _build_widgets(self): self.liststore_satellite.append(["FloripaSat-1"]) self.liststore_satellite.append(["GOLDS-UFSC"]) self.liststore_satellite.append(["Aldebaran-1"]) + self.liststore_satellite.append(["Catarina-A1"]) self.liststore_satellite.append(["SpaceLab-Transmitter"]) self.combobox_satellite = self.builder.get_object("combobox_satellite") cell = Gtk.CellRendererText() @@ -542,6 +545,11 @@ def _decode_packet(self, pkt): else: sat_json = _SAT_JSON_ALDEBARAN_1_SYSTEM elif self.combobox_satellite.get_active() == 3: + if os.path.isfile(_SAT_JSON_CATARINA_A1_LOCAL): + sat_json = _SAT_JSON_CATARINA_A1_LOCAL + else: + sat_json = _SAT_JSON_CATARINA_A1_SYSTEM + elif self.combobox_satellite.get_active() == 4: if os.path.isfile(_SAT_JSON_SPACELAB_TXER_LOCAL): sat_json = _SAT_JSON_SPACELAB_TXER_LOCAL else: diff --git a/spacelab_decoder/version.py b/spacelab_decoder/version.py index 28ef2c6..2c5516f 100644 --- a/spacelab_decoder/version.py +++ b/spacelab_decoder/version.py @@ -24,7 +24,7 @@ __copyright__ = "Copyright The SpaceLab-Decoder Contributors" __credits__ = ["Gabriel Mariano Marcelino - PU5GMA"] __license__ = "GPLv3" -__version__ = "0.3.19" +__version__ = "0.3.20" __maintainer__ = "Gabriel Mariano Marcelino - PU5GMA" __email__ = "gabriel.mm8@gmail.com" __status__ = "Development"