/** Functions and tasks related to TeleCommand handling. * * @file * @author P. LEROY * * A group of functions to handle TeleCommands:\n * action launching\n * TC parsing\n * ... * */ #include "timegen_misc.h" #include void timegen_timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ) { struct grgpio_regs_str *grgpio_regs = (struct grgpio_regs_str *) REGS_ADDR_GRGPIO; grgpio_regs->io_port_direction_register = grgpio_regs->io_port_direction_register | 0x08; // [0001 1000], 0 = output disabled, 1 = output enabled if ( (grgpio_regs->io_port_output_register & 0x08) == 0x08 ) { grgpio_regs->io_port_output_register = grgpio_regs->io_port_output_register & 0xf7; } else { grgpio_regs->io_port_output_register = grgpio_regs->io_port_output_register | 0x08; } rtems_event_send( rtems_id_updt, RTEMS_EVENT_0 ); } void initCoarseTime() { coarseTime = 0x00; } rtems_task updt_task( rtems_task_argument unused ) { rtems_event_set event_out; rtems_id send_queue_id; get_message_queue_id_send( &send_queue_id ); BOOT_PRINTF("in UPDT *** waiting for SpaceWire ticks\n") while(1) { // wait for an RTEMS_EVENT rtems_event_receive( RTEMS_EVENT_0, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // increment the coarse time coarseTime = coarseTime + 1; PRINTF2("next valid coarseTime = 0x%x *** %d s\n", coarseTime, coarseTime) rtems_task_wake_after(70); // 10 ms * 70 = 700 ms send_tc_lfr_update_time( send_queue_id ); } } int send_tc_lfr_update_time(rtems_id queue_id ) { rtems_status_code status; unsigned char messageSize; Packet_TC_LFR_UPDATE_TIME_WITH_OVERHEAD_t packet; unsigned char crcAsTwoBytes[2]; // OVERHEAD packet.targetLogicalAddress = DESTINATION_ID_LFR; packet.protocolIdentifier = CCSDS_PROTOCOLE_ID; packet.reserved = DEFAULT_RESERVED; packet.userApplication = CCSDS_USER_APP; // TIME PACKET packet.update_time.packetID[0] = (unsigned char) (TC_LFR_PACKET_ID >> 8); packet.update_time.packetID[1] = (unsigned char) (TC_LFR_PACKET_ID ); packet.update_time.packetSequenceControl[0] = (unsigned char) (TC_LFR_PACKET_SEQUENCE_CONTROL >> 8); packet.update_time.packetSequenceControl[1] = (unsigned char) (TC_LFR_PACKET_SEQUENCE_CONTROL ); packet.update_time.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_LFR_UPDATE_TIME >> 8); packet.update_time.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_LFR_UPDATE_TIME ); packet.update_time.ccsdsSecHeaderFlag_pusVersion_ack = 0x19; packet.update_time.serviceType = TC_TYPE_LFR_UPDATE_TIME; packet.update_time.serviceSubType = TC_SUBTYPE_UPDATE_TIME; packet.update_time.sourceID = SID_TC_RPW_INTERNAL; packet.update_time.cp_rpw_time[0] = (unsigned char) (coarseTime >> 24); packet.update_time.cp_rpw_time[1] = (unsigned char) (coarseTime >> 16); packet.update_time.cp_rpw_time[2] = (unsigned char) (coarseTime >> 8); packet.update_time.cp_rpw_time[3] = (unsigned char) (coarseTime); packet.update_time.cp_rpw_time[4] = 0; // fine time MSB packet.update_time.cp_rpw_time[5] = 0; // fine time LSB GetCRCAsTwoBytes((unsigned char*) &packet.update_time, crcAsTwoBytes, PACKET_LENGTH_TC_LFR_UPDATE_TIME + CCSDS_TC_TM_PACKET_OFFSET - 2); packet.update_time.crc[0] = crcAsTwoBytes[0]; packet.update_time.crc[1] = crcAsTwoBytes[1]; messageSize = PACKET_LENGTH_TC_LFR_UPDATE_TIME + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES; // SEND DATA status = rtems_message_queue_send( queue_id, &packet, messageSize); if (status != RTEMS_SUCCESSFUL) { PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n") } return status; }