/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void TO_AddPkt( TO_ADD_PKT_t * pCmd) { int32 status; status = CFE_SB_SubscribeEx(pCmd->Stream, TO_Tlm_pipe, pCmd->Flags, pCmd->BufLimit); if(status != CFE_SUCCESS) CFE_EVS_SendEvent(TO_ADDPKT_ERR_EID,CFE_EVS_ERROR, "L%d TO Can't subscribe 0x%x status %i",__LINE__, pCmd->Stream, status); else CFE_EVS_SendEvent(TO_ADDPKT_INF_EID,CFE_EVS_INFORMATION, "L%d TO AddPkt 0x%x, QoS %d.%d, limit %d",__LINE__, pCmd->Stream, pCmd->Flags.Priority, pCmd->Flags.Reliability, pCmd->BufLimit); } /* End of TO_AddPkt() */
int32 TO_AppInit(void) { int32 iStatus; uint16 i; TO_AppData.RunStatus = CFE_ES_APP_RUN; /* Register the TO app */ CFE_ES_RegisterApp(); /* Setup CMD Pipes */ TO_AppData.CmdPipeDepth = TO_CMD_PIPE_DEPTH ; strcpy(TO_AppData.CmdPipeName, "TO_CMD_PIPE"); TO_AppData.SchPipeDepth = TO_SCH_PIPE_DEPTH; strcpy(TO_AppData.SchPipeName, "TO_SCH_PIPE"); /* Initialize event filter table */ TO_AppData.EventFilters[0].EventID = TO_INIT_INF_EID; TO_AppData.EventFilters[0].Mask = CFE_EVS_NO_FILTER; TO_AppData.EventFilters[1].EventID = TO_CTODPIPE_ERR_EID; TO_AppData.EventFilters[1].Mask = CFE_EVS_NO_FILTER; TO_AppData.EventFilters[2].EventID = TO_SUBSCRIBE_ERR_EID; TO_AppData.EventFilters[2].Mask = CFE_EVS_NO_FILTER; TO_AppData.EventFilters[3].EventID = TO_TLMOUTSOCKET_ERR_EID; TO_AppData.EventFilters[3].Mask = CFE_EVS_NO_FILTER; TO_AppData.EventFilters[4].EventID = TO_TLMOUTSTOP_ERR_EID; TO_AppData.EventFilters[4].Mask = CFE_EVS_NO_FILTER; TO_AppData.EventFilters[5].EventID = TO_MSGID_ERR_EID; TO_AppData.EventFilters[5].Mask = CFE_EVS_NO_FILTER; TO_AppData.EventFilters[6].EventID = TO_FNCODE_ERR_EID; TO_AppData.EventFilters[6].Mask = CFE_EVS_EVERY_OTHER_TWO; TO_AppData.EventFilters[7].EventID = TO_NOOP_INF_EID; TO_AppData.EventFilters[7].Mask = CFE_EVS_NO_FILTER; /* Register event filter table */ iStatus = CFE_EVS_Register(TO_AppData.EventFilters, TO_EVT_COUNT, CFE_EVS_BINARY_FILTER); if ( iStatus != CFE_SUCCESS ) { CFE_ES_WriteToSysLog("TO App: Error Registering Events"); } /* Initialize housekeeping packet (clear user data area) */ CFE_SB_InitMsg(&TO_AppData.HkPacket, TO_HK_TLM_MID, sizeof(TO_AppData.HkPacket), TRUE); /* Subscribe for Commands on the Command Pipe */ iStatus = CFE_SB_CreatePipe(&TO_AppData.CmdPipe, TO_AppData.CmdPipeDepth, TO_AppData.CmdPipeName); if (iStatus == CFE_SUCCESS) { CFE_SB_Subscribe(TO_CMD_MID, TO_AppData.CmdPipe); } else { CFE_EVS_SendEvent(TO_CTODPIPE_ERR_EID,CFE_EVS_ERROR, "TO: Can't create cmd pipe status %i",iStatus); } /* Subscribe for the Wakeup and Send_HK messages on the SCH Pipe*/ iStatus = CFE_SB_CreatePipe(&TO_AppData.SchPipe, TO_AppData.SchPipeDepth, TO_AppData.SchPipeName); if (iStatus == CFE_SUCCESS) { CFE_SB_Subscribe(TO_SEND_HK_MID, TO_AppData.SchPipe); CFE_SB_Subscribe(TO_SEND_TLM_MID, TO_AppData.SchPipe); } else { CFE_EVS_SendEvent(TO_CTODPIPE_ERR_EID,CFE_EVS_ERROR, "TO: Can't create cmd pipe status %i",iStatus); } /* Install the delete handler */ OS_TaskInstallDeleteHandler((void *)(&TO_Cleanup)); /* Register and Load iLoad Table */ iStatus = TO_TableInit(); if(iStatus != CFE_SUCCESS) { goto end_of_function; } /* Setup TLM Pipes */ for (i=0; i < TO_MAX_TLM_CLASS_QUEUES; i++) { if(TO_AppData.Config->ClassQueue[i].Mode == TO_QUEUE_ENABLED) { char pipeName[OS_MAX_API_NAME]; sprintf(pipeName, "TO_CLSQUEUE_%u", i); iStatus = CFE_SB_CreatePipe(&TO_AppData.Config->ClassQueue[i].PipeId, TO_AppData.Config->ClassQueue[i].Size, pipeName); if (iStatus != CFE_SUCCESS) { CFE_EVS_SendEvent(TO_TLMPIPE_ERR_EID,CFE_EVS_ERROR, "TO: Can't create Tlm pipe status %i",iStatus); } } } /* Subscriptions for TLM pipe*/ for (i=0; i < TO_AppData.Config->MaxSubscriptions; i++) { if(TO_AppData.Config->Subscription[i].MsgId != TO_UNUSED ) { CFE_SB_Qos_t qos = {0,0}; uint32 clsQueueIdx = TO_AppData.Config->Subscription[i].ClassQueueIdx; iStatus = CFE_SB_SubscribeEx(TO_AppData.Config->Subscription[i].MsgId, TO_AppData.Config->ClassQueue[clsQueueIdx].PipeId, qos, TO_AppData.Config->Subscription[i].MsgLimit); if (iStatus != CFE_SUCCESS) { CFE_EVS_SendEvent(TO_SUBSCRIBE_ERR_EID,CFE_EVS_ERROR, "TO: Can't subscribe to MID 0x%x status 0x%08X index %u", TO_AppData.Config->Subscription[i].MsgId, iStatus, i); } else { TO_AppData.HkPacket.PktSubCount++; } } } for (i=0; i < TO_MAX_TLM_CHANNELS; i++) { if(TO_AppData.Config->Channel[i].Mode == TO_CHANNEL_ENABLED) { struct sockaddr_in servaddr; int status; int reuseaddr=1; if((TO_AppData.Config->Channel[i].Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { TO_AppData.Config->Channel[i].Mode = TO_CHANNEL_DISABLED; CFE_EVS_SendEvent(TO_TLMOUTSOCKET_ERR_EID,CFE_EVS_ERROR, "TO: TLM socket errno: %i on channel %u", errno, i); continue; } setsockopt(TO_AppData.Config->Channel[i].Socket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,sizeof(reuseaddr)); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port=0; status = bind(TO_AppData.Config->Channel[i].Socket, (struct sockaddr *)&servaddr,sizeof(servaddr)); if(status < 0) { CFE_EVS_SendEvent(TO_TLMOUTSOCKET_ERR_EID, CFE_EVS_ERROR, "TO: TLM bind errno: %i on channel %u", errno, i); TO_AppData.Config->Channel[i].Mode = TO_CHANNEL_DISABLED; continue; } CFE_EVS_SendEvent(TO_TLMOUTENA_INF_EID, CFE_EVS_INFORMATION, "TO UDP telemetry output enabled channel %u to %s:%u", i, TO_AppData.Config->Channel[i].IP, TO_AppData.Config->Channel[i].DstPort); } } TO_AppData.DropFileData = FALSE; TO_AppData.DropEOF = FALSE; TO_AppData.DropFIN = FALSE; TO_AppData.DropACK = FALSE; TO_AppData.DropMetaData = FALSE; TO_AppData.DropNAK = FALSE; TO_AppData.CorruptChecksum = FALSE; TO_AppData.AdjustFileSize = FALSE; CFE_EVS_SendEvent (TO_INIT_INF_EID, CFE_EVS_INFORMATION, "TO Initialized. Version %d.%d.%d.%d Awaiting enable command.", TO_MAJOR_VERSION, TO_MINOR_VERSION, TO_REVISION, TO_MISSION_REV); end_of_function: return iStatus; }
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void HS_AppMain(void) { int32 Status = CFE_SUCCESS; uint32 RunStatus = CFE_ES_APP_RUN; /* ** Performance Log, Start */ CFE_ES_PerfLogEntry(HS_APPMAIN_PERF_ID); /* ** Register this application with Executive Services */ Status = CFE_ES_RegisterApp(); /* ** Perform application specific initialization */ if (Status == CFE_SUCCESS) { Status = HS_AppInit(); } /* ** If no errors were detected during initialization, then wait for everyone to start */ if (Status == CFE_SUCCESS) { CFE_ES_WaitForStartupSync(HS_STARTUP_SYNC_TIMEOUT); /* ** Enable and set the watchdog timer */ CFE_PSP_WatchdogSet(HS_WATCHDOG_TIMEOUT_VALUE); CFE_PSP_WatchdogService(); CFE_PSP_WatchdogEnable(); CFE_PSP_WatchdogService(); /* ** Subscribe to Event Messages */ if (HS_AppData.CurrentEventMonState == HS_STATE_ENABLED) { Status = CFE_SB_SubscribeEx(CFE_EVS_EVENT_MSG_MID, HS_AppData.EventPipe, CFE_SB_Default_Qos, HS_EVENT_PIPE_DEPTH); if (Status != CFE_SUCCESS) { CFE_EVS_SendEvent(HS_SUB_EVS_ERR_EID, CFE_EVS_ERROR, "Error Subscribing to Events,RC=0x%08X",Status); } } } if (Status != CFE_SUCCESS) { /* ** Set run status to terminate main loop */ RunStatus = CFE_ES_APP_ERROR; } /* ** Application main loop */ while(CFE_ES_RunLoop(&RunStatus) == TRUE) { /* ** Performance Log, Stop */ CFE_ES_PerfLogExit(HS_APPMAIN_PERF_ID); /* ** Task Delay for a configured timeout */ #if HS_POST_PROCESSING_DELAY != 0 OS_TaskDelay(HS_POST_PROCESSING_DELAY); #endif /* ** Task Delay for a configured timeout */ Status = CFE_SB_RcvMsg(&HS_AppData.MsgPtr, HS_AppData.WakeupPipe, HS_WAKEUP_TIMEOUT); /* ** Performance Log, Start */ CFE_ES_PerfLogEntry(HS_APPMAIN_PERF_ID); /* ** Process the software bus message */ if ((Status == CFE_SUCCESS) || (Status == CFE_SB_NO_MESSAGE) || (Status == CFE_SB_TIME_OUT)) { Status = HS_ProcessMain(); } /* ** Note: If there were some reason to exit the task ** normally (without error) then we would set ** RunStatus = CFE_ES_APP_EXIT */ if (Status != CFE_SUCCESS) { /* ** Set request to terminate main loop */ RunStatus = CFE_ES_APP_ERROR; } } /* end CFS_ES_RunLoop while */ /* ** Check for "fatal" process error... */ if (Status != CFE_SUCCESS) { /* ** Send an event describing the reason for the termination */ CFE_EVS_SendEvent(HS_APP_EXIT_EID, CFE_EVS_CRITICAL, "Application Terminating, err = 0x%08X", Status); /* ** In case cFE Event Services is not working */ CFE_ES_WriteToSysLog("HS App: Application Terminating, ERR = 0x%08X\n", Status); } HS_CustomCleanup(); /* ** Performance Log, Stop */ CFE_ES_PerfLogExit(HS_APPMAIN_PERF_ID); /* ** Exit the application */ CFE_ES_ExitApp(RunStatus); } /* end HS_AppMain */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void TO_init(void) { int32 status; char PipeName[16]; uint16 PipeDepth; uint16 i; char ToTlmPipeName[16]; uint16 ToTlmPipeDepth; CFE_ES_RegisterApp(); downlink_on = FALSE; PipeDepth = 8; strcpy(PipeName, "TO_LAB_CMD_PIPE"); ToTlmPipeDepth = 64; strcpy(ToTlmPipeName, "TO_LAB_TLM_PIPE"); /* ** Register event filter table... */ CFE_EVS_Register(CFE_TO_EVS_Filters, sizeof(CFE_TO_EVS_Filters)/sizeof(CFE_EVS_BinFilter_t), CFE_EVS_BINARY_FILTER); /* ** Initialize housekeeping packet (clear user data area)... */ CFE_SB_InitMsg(&to_hk_status, TO_LAB_HK_TLM_MID, sizeof(to_hk_status), TRUE); /* Subscribe to my commands */ status = CFE_SB_CreatePipe(&TO_Cmd_pipe, PipeDepth, PipeName); if (status == CFE_SUCCESS) { CFE_SB_Subscribe(TO_LAB_CMD_MID, TO_Cmd_pipe); CFE_SB_Subscribe(TO_LAB_SEND_HK_MID, TO_Cmd_pipe); } else CFE_EVS_SendEvent(TO_CRCMDPIPE_ERR_EID,CFE_EVS_ERROR, "L%d TO Can't create cmd pipe status %i",__LINE__,status); /* Create TO TLM pipe */ status = CFE_SB_CreatePipe(&TO_Tlm_pipe, ToTlmPipeDepth, ToTlmPipeName); if (status != CFE_SUCCESS) { CFE_EVS_SendEvent(TO_TLMPIPE_ERR_EID,CFE_EVS_ERROR, "L%d TO Can't create Tlm pipe status %i",__LINE__,status); } /* Subscriptions for TLM pipe*/ for (i=0; (i < (sizeof(TO_SubTable)/sizeof(TO_subsciption_t))); i++) { if(TO_SubTable[i].Stream != TO_UNUSED ) status = CFE_SB_SubscribeEx(TO_SubTable[i].Stream, TO_Tlm_pipe, TO_SubTable[i].Flags, TO_SubTable[i].BufLimit); if (status != CFE_SUCCESS) CFE_EVS_SendEvent(TO_SUBSCRIBE_ERR_EID,CFE_EVS_ERROR,"L%d TO Can't subscribe to stream 0x%x status %i", __LINE__, TO_SubTable[i].Stream,status); } /* ** Install the delete handler */ OS_TaskInstallDeleteHandler((void *)(&TO_delete_callback)); CFE_EVS_SendEvent (TO_INIT_INF_EID, CFE_EVS_INFORMATION, "TO Lab Initialized. Version %d.%d.%d.%d Awaiting enable command.", TO_LAB_MAJOR_VERSION, TO_LAB_MINOR_VERSION, TO_LAB_REVISION, TO_LAB_MISSION_REV); } /* End of TO_Init() */