2021-06-30 15:18:41 +02:00
|
|
|
#include "obsw.h"
|
2021-07-24 13:47:09 +02:00
|
|
|
|
2023-01-18 13:43:28 +01:00
|
|
|
#include <pwd.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
2021-07-29 16:31:04 +02:00
|
|
|
#include <filesystem>
|
2023-01-13 11:44:16 +01:00
|
|
|
#include <fstream>
|
2023-01-13 11:59:11 +01:00
|
|
|
#include <iostream>
|
2022-01-17 15:58:27 +01:00
|
|
|
|
|
|
|
#include "OBSWConfig.h"
|
2022-04-22 14:09:08 +02:00
|
|
|
#include "commonConfig.h"
|
2022-11-25 11:04:33 +01:00
|
|
|
#include "core/scheduling.h"
|
2022-01-17 15:58:27 +01:00
|
|
|
#include "fsfw/tasks/TaskFactory.h"
|
2022-03-14 17:53:48 +01:00
|
|
|
#include "fsfw/version.h"
|
2023-02-12 20:41:20 +01:00
|
|
|
#include "mission/acsDefs.h"
|
|
|
|
#include "mission/system/tree/system.h"
|
2022-05-23 18:37:04 +02:00
|
|
|
#include "q7sConfig.h"
|
2022-04-19 17:24:04 +02:00
|
|
|
#include "watchdog/definitions.h"
|
2021-07-29 16:31:04 +02:00
|
|
|
|
|
|
|
static int OBSW_ALREADY_RUNNING = -2;
|
2022-05-19 16:00:26 +02:00
|
|
|
#if OBSW_Q7S_EM == 0
|
|
|
|
static const char* DEV_STRING = "Xiphos Q7S FM";
|
|
|
|
#else
|
|
|
|
static const char* DEV_STRING = "Xiphos Q7S EM";
|
|
|
|
#endif
|
2021-06-30 15:18:41 +02:00
|
|
|
int obsw::obsw() {
|
2022-03-14 17:53:48 +01:00
|
|
|
using namespace fsfw;
|
2022-01-17 15:58:27 +01:00
|
|
|
std::cout << "-- EIVE OBSW --" << std::endl;
|
2022-05-19 16:00:26 +02:00
|
|
|
std::cout << "-- Compiled for Linux (" << DEV_STRING << ") --" << std::endl;
|
2022-04-22 15:58:15 +02:00
|
|
|
std::cout << "-- OBSW v" << common::OBSW_VERSION << " | FSFW v" << fsfw::FSFW_VERSION << " --"
|
2022-04-22 14:09:08 +02:00
|
|
|
<< std::endl;
|
2022-01-17 15:58:27 +01:00
|
|
|
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
2021-06-30 15:18:41 +02:00
|
|
|
|
2021-07-29 13:07:07 +02:00
|
|
|
#if Q7S_CHECK_FOR_ALREADY_RUNNING_IMG == 1
|
2022-01-17 15:58:27 +01:00
|
|
|
// Check special file here. This file is created or deleted by the eive-watchdog application
|
|
|
|
// or systemd service!
|
|
|
|
if (std::filesystem::exists(watchdog::RUNNING_FILE_NAME)) {
|
|
|
|
sif::warning << "File " << watchdog::RUNNING_FILE_NAME
|
|
|
|
<< " exists so the software might "
|
2022-01-19 11:52:06 +01:00
|
|
|
"already be running. Check if obsw systemd service has been stopped."
|
2022-01-17 15:58:27 +01:00
|
|
|
<< std::endl;
|
|
|
|
return OBSW_ALREADY_RUNNING;
|
|
|
|
}
|
2021-07-29 13:07:07 +02:00
|
|
|
#endif
|
2023-01-13 11:43:44 +01:00
|
|
|
|
2023-01-13 13:14:11 +01:00
|
|
|
const char* homedir = nullptr;
|
|
|
|
homedir = getenv("HOME");
|
2023-01-18 13:43:28 +01:00
|
|
|
if (homedir == nullptr) {
|
|
|
|
homedir = getpwuid(getuid())->pw_dir;
|
2023-01-13 13:14:11 +01:00
|
|
|
}
|
|
|
|
std::filesystem::path bootDelayFile = std::filesystem::path(homedir) / "boot_delay_secs.txt";
|
2023-01-13 11:43:44 +01:00
|
|
|
// Init delay handling.
|
2023-01-13 13:14:11 +01:00
|
|
|
if (std::filesystem::exists(bootDelayFile)) {
|
|
|
|
std::ifstream ifile(bootDelayFile);
|
2023-01-13 11:59:11 +01:00
|
|
|
std::string lineStr;
|
|
|
|
unsigned int bootDelaySecs = 0;
|
|
|
|
unsigned int line = 0;
|
|
|
|
// Try to reas delay seconds from file.
|
|
|
|
while (std::getline(ifile, lineStr)) {
|
|
|
|
std::istringstream iss(lineStr);
|
|
|
|
if (!(iss >> bootDelaySecs)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
line++;
|
|
|
|
}
|
|
|
|
if (line == 0) {
|
|
|
|
// If the file is empty, assume default of 6 seconds
|
|
|
|
bootDelaySecs = 6;
|
|
|
|
}
|
|
|
|
std::cout << "Delaying OBSW start for " << bootDelaySecs << " seconds" << std::endl;
|
2023-01-13 13:14:11 +01:00
|
|
|
TaskFactory::delayTask(bootDelaySecs * 1000);
|
2023-01-13 11:43:44 +01:00
|
|
|
}
|
|
|
|
|
2022-11-25 11:04:33 +01:00
|
|
|
scheduling::initMission();
|
2021-06-30 15:18:41 +02:00
|
|
|
|
2023-02-12 21:34:55 +01:00
|
|
|
#if OBSW_COMMAND_SAFE_MODE_AT_STARTUP == 1
|
2023-02-12 20:41:20 +01:00
|
|
|
// Command the EIVE system to safe mode
|
|
|
|
auto sysQueueId = satsystem::EIVE_SYSTEM.getCommandQueue();
|
|
|
|
CommandMessage msg;
|
|
|
|
ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, 0);
|
|
|
|
ReturnValue_t result =
|
|
|
|
MessageQueueSenderIF::sendMessage(sysQueueId, &msg, MessageQueueIF::NO_QUEUE, false);
|
|
|
|
if (result != returnvalue::OK) {
|
|
|
|
sif::error << "Sending safe mode command to EIVE system failed" << std::endl;
|
|
|
|
}
|
2023-02-12 21:34:55 +01:00
|
|
|
#endif
|
2023-02-12 20:41:20 +01:00
|
|
|
|
2022-01-17 15:58:27 +01:00
|
|
|
for (;;) {
|
|
|
|
/* Suspend main thread by sleeping it. */
|
|
|
|
TaskFactory::delayTask(5000);
|
|
|
|
}
|
|
|
|
return 0;
|
2021-06-30 15:18:41 +02:00
|
|
|
}
|