- Muchas notas - Fran Acién

20230512 - COSMOS simple packet with CCSDS and python

TELEMETRY PYTHON_CCSDS_EXAMPLE STATUS BIG_ENDIAN "Telemetry description"
  # Keyword      Name  BitSize Type   ID Description
  APPEND_ITEM CCSDSVER 3 UINT "CCSDS PACKET VERSION NUMBER (SEE CCSDS 133.0-B-1)"
  APPEND_ITEM CCSDSTYPE 1 UINT "CCSDS PACKET TYPE (COMMAND OR TELEMETRY)"
    STATE TLM 0
    STATE CMD 1
  APPEND_ITEM CCSDSSHF 1 UINT "CCSDS SECONDARY HEADER FLAG"
    STATE FALSE 0
    STATE TRUE 1
  APPEND_ID_ITEM CCSDSAPID 11 UINT 1 "CCSDS APPLICATION PROCESS ID"
  APPEND_ITEM CCSDSSEQFLAGS 2 UINT "CCSDS SEQUENCE FLAGS"
    STATE FIRST 0
    STATE CONT 1
    STATE LAST 2
    STATE NOGROUP 3
  APPEND_ITEM CCSDSSEQCNT 14 UINT "CCSDS PACKET SEQUENCE COUNT"
  APPEND_ITEM CCSDSLENGTH 16 UINT "CCSDS PACKET DATA LENGTH"
  APPEND_ITEM POTENTIOMETERVALUE 32 UINT "POTENTIOMETER VALUE" LITTLE_ENDIAN
# Set VARIABLEs here to allow variation in your plugin
# See https://cosmosc2.com/docs/v5/plugins for more information
VARIABLE python_ccsds_example_target_name PYTHON_CCSDS_EXAMPLE

# Modify this according to your actual target connection
# See https://cosmosc2.com/docs/v5/interfaces for more information
TARGET PYTHON_CCSDS_EXAMPLE <%= python_ccsds_example_target_name %>
INTERFACE <%= python_ccsds_example_target_name %>_INT tcpip_client_interface.rb host.docker.internal 8080 8080 10.0 nil LENGTH 32 16 7
  MAP_TARGET <%= python_ccsds_example_target_name %>

from construct import Int32sl

# Generate another telemetry example

CCSDS_header_temp = BitStruct(
  "CCSDS_VERSION" / BitsInteger(3),
  "CCSDS_TYPE" / BitsInteger(1),
  "CCSDS_SECONDARY_HEADER_FLAG" / BitsInteger(1),
  "CCSDS_APID" / BitsInteger(11),
  "CCSDS_SEQUENCE_FLAG" / BitsInteger(2),
  "CCSDS_SEQUENCE_COUNT" / BitsInteger(14)
  )

OBC_TLM = Struct(
  "CCSDS_TM_Packet_Header" / CCSDS_header_temp,
  "CCSDS_PACKET_DATA_LENGTH" / Int16ub,
  "data" / Int32sl
  )

ccsds_header_dict = dict(
  CCSDS_VERSION = 0b0,
  CCSDS_TYPE = 0b0,
  CCSDS_SECONDARY_HEADER_FLAG = 0b0,
  CCSDS_APID = 0b1,
  CCSDS_SEQUENCE_FLAG = 0b11,
  CCSDS_SEQUENCE_COUNT = 0b0
  )

packet = OBC_TLM.build(dict(
  CCSDS_TM_Packet_Header = ccsds_header_dict,
  CCSDS_PACKET_DATA_LENGTH = 3,
  data = 6969
  ))

print(' '.join('{:02x}'.format(x) for x in packet))

#%%

import socket
import time

# Create server

udpPort   = 8080
bufferSize  = 1024;

# Listen for incoming datagrams
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(('', udpPort))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        
        try:
          while True:
              
              time.sleep(1)
              conn.sendall(packet)
              #data = conn.recv(1024)
              
              #print(data.hex())
        except KeyboardInterrupt:
          print('Closing program.\n')
          conn.close()
          time.sleep(5)
          s.close()   #Close socket