diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/CMakeLists.txt b/Examples/2nd_obc_user/src/src_user/IfWrapper/CMakeLists.txt index ae8bb4c18..7377a963f 100644 --- a/Examples/2nd_obc_user/src/src_user/IfWrapper/CMakeLists.txt +++ b/Examples/2nd_obc_user/src/src_user/IfWrapper/CMakeLists.txt @@ -29,7 +29,8 @@ if(USE_SCI_COM_WINGS AND NOT USE_SILS_MOCKUP) add_definitions(-DUSE_SCI_COM_WINGS) #target_sources(${PROJECT_NAME} PUBLIC list(APPEND C2A_SRCS - Sils/uart_sils_sci_if.cpp + Sils/sils_sci_if.cpp + Sils/sils_sci_uart_if.cpp ) message("USE SCI_COM_UART") endif() diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp new file mode 100644 index 000000000..37b218820 --- /dev/null +++ b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp @@ -0,0 +1,180 @@ +#pragma section REPRO +/** + * @file + * @brief sils_sci_if + * @details SCI COMでやりとりするIF + */ + +#include "sils_sci_if.hpp" + +#ifdef _WIN32 +SCIComPort::SCIComPort(int port) +{ + char port_name[15]; + snprintf(port_name, 15, "%s%d", "\\\\.\\COM", port); + myHComPort_ = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if ((int)myHComPort_ == -1) + { + // 正常にポートオープンできていない場合は終了 + CloseHandle(myHComPort_); + init_success = false; + return; + } + + // どうやら正常ポートopenにならないっぽく,これが必要 + init_success = true; + + // ポートのボーレート、パリティ等を設定 + config_.BaudRate = 115200; + config_.Parity = PARITY_NONE; + config_.ByteSize = 8; + config_.StopBits = STOPBITS_10; + + // Parity、StopBits、DataBitsも同様に設定 + SetCommState(myHComPort_, &config_); +} + +SCIComPort::~SCIComPort(void) +{ + if (init_success == true) + { + CloseHandle(myHComPort_); + } +} + +int SCIComPort::Send(unsigned char* buffer, size_t offset, size_t count) +{ + DWORD toWriteBytes = count; // 送信したいバイト数 + DWORD writeBytes; // 実際に送信されたバイト数 + + if (init_success == true) + { + WriteFile(myHComPort_, buffer + offset, toWriteBytes, &writeBytes, NULL); + return writeBytes; + } + else + { + return 0; + } +} + +int SCIComPort::Receive(unsigned char* buffer, size_t offset, size_t count) +{ + DWORD fromReadBytes = count; // 受信したいバイト数 + DWORD dwErrors; + COMSTAT ComStat; + DWORD dwCount; // 受信したバイト数 + + if (init_success == true) + { + ClearCommError(myHComPort_, &dwErrors, &ComStat); + dwCount = ComStat.cbInQue; + + if (dwCount > 0) + { + if (dwCount < count) + { + fromReadBytes = dwCount; + ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); + } + else + { + fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 + ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); + } + } + + return dwCount; + } + else + { + return 0; + } +} + +#else + +SCIComPort::SCIComPort(int port) +{ + char port_name[13]; + snprintf(port_name, 13, "%s%d", "/dev/tnt", port); + if ((myHComPort_ = open(port_name, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) + { + close(myHComPort_); + init_success = false; + return; + } + + // どうやら正常ポートopenにならないっぽく,これが必要 + init_success = true; + + cfsetispeed(&config_, 115200); + cfsetospeed(&config_, 115200); + config_.c_cflag &= ~PARENB; // No Parity + config_.c_cflag &= ~CSTOPB; // 1 Stop Bit + config_.c_cflag &= ~CSIZE; + config_.c_cflag |= CS8; // 8 Bits + tcsetattr(myHComPort_, TCSANOW, &config_); +} + +SCIComPort::~SCIComPort(void) +{ + if (init_success == true) + { + close(myHComPort_); + } +} + +int SCIComPort::Send(unsigned char* buffer, size_t offset, size_t count) +{ + unsigned long toWriteBytes = count; // 送信したいバイト数 + unsigned long writeBytes; // 実際に送信されたバイト数 + + if (init_success == true) + { + writeBytes = write(myHComPort_, buffer + offset, toWriteBytes); + return writeBytes; + } + else + { + return 0; + } +} + +int SCIComPort::Receive(unsigned char* buffer, size_t offset, size_t count) +{ + unsigned long fromReadBytes = count; // 受信したいバイト数 + unsigned long dwErrors; + unsigned long ComStat_cbInQue; + unsigned long dwCount; // 受信したバイト数 + + if (init_success == true) + { + dwCount = ComStat_cbInQue; + + if (dwCount > 0) + { + if (dwCount < count) + { + fromReadBytes = dwCount; + dwCount = read(myHComPort_, buffer + offset, fromReadBytes); + } + else + { + fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 + dwCount = read(myHComPort_, buffer + offset, fromReadBytes); + } + } + + return dwCount; + } + else + { + return 0; + } +} + +#endif + +#pragma section diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp new file mode 100644 index 000000000..568bf6099 --- /dev/null +++ b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp @@ -0,0 +1,41 @@ +/** + * @file + * @brief sils_sci_if + * @details SCI COMでやりとりするIF + */ +#ifndef SILS_SCI_IF_HPP_ +#define SILS_SCI_IF_HPP_ + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif + +#include +#include + +class SCIComPort +{ +public: + SCIComPort(int port); + virtual ~SCIComPort(void); + + int Send(unsigned char* buffer, size_t length, size_t offset); + int Receive(unsigned char* buffer, size_t length, size_t offset); + +private: +#ifdef _WIN32 + HANDLE myHComPort_; + DCB config_; +#else + int myHComPort_; + struct termios config_; +#endif + bool init_success; +}; + +#endif + diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.cpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.cpp new file mode 100644 index 000000000..1dd3c65ac --- /dev/null +++ b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.cpp @@ -0,0 +1,35 @@ +#pragma section REPRO +/** + * @file + * @brief sils_sci_uart_if + * @details SILSでDriverのテストをするように作った + */ + +#include "sils_sci_uart_if.hpp" + + +// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい +#ifdef _WIN32 +static SCIComPortUart SILS_SCI_UART_IF_sci_com_(14); +#else +static SCIComPortUart SILS_SCI_UART_IF_sci_com_(4); +#endif + + +int SILS_SCI_UART_IF_init(void) +{ + return 0; +} + +int SILS_SCI_UART_IF_tx(unsigned char* data_v, int count) +{ + SILS_SCI_UART_IF_sci_com_.Send(data_v, 0, count); + return 0; +} + +int SILS_SCI_UART_IF_rx(unsigned char* data_v, int count) +{ + return SILS_SCI_UART_IF_sci_com_.Receive(data_v, 0, count); +} + +#pragma section diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.hpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.hpp new file mode 100644 index 000000000..f2c32132a --- /dev/null +++ b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.hpp @@ -0,0 +1,23 @@ +/** + * @file + * @brief sils_sci_uart_if + * @details SILSでDriverのテストをするように作った + sils_sci_ccsds_if.c/hのほぼコピー + */ +#ifndef SILS_SCI_UART_IF_HPP_ +#define SILS_SCI_UART_IF_HPP_ + +#include "sils_sci_if.hpp" + +class SCIComPortUart : public SCIComPort +{ +public: + SCIComPortUart(int port) : SCIComPort(port) {}; + ~SCIComPortUart(void) {}; +}; + +int SILS_SCI_UART_IF_init(); +int SILS_SCI_UART_IF_tx(unsigned char* data_v, int count); +int SILS_SCI_UART_IF_rx(unsigned char* data_v, int count); + +#endif diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils.cpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils.cpp index a8e7e0635..5a5d103ce 100644 --- a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils.cpp +++ b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils.cpp @@ -3,7 +3,7 @@ #include "../../Settings/port_config.h" #ifdef USE_SCI_COM_WINGS -#include "uart_sils_sci_if.hpp" +#include "sils_sci_uart_if.hpp" #endif int OBC_C2A_SendFromObc(int port_id, unsigned char* buffer, int offset, int count); @@ -24,7 +24,7 @@ int UART_rx(void* my_uart_v, void* data_v, int buffer_size) } #ifdef USE_SCI_COM_WINGS - return SILS_SCI_UART_IF_RX((unsigned char*)data_v, buffer_size); + return SILS_SCI_UART_IF_rx((unsigned char*)data_v, buffer_size); #else return OBC_C2A_ReceivedByObc(my_uart->ch, (unsigned char*)data_v, 0, buffer_size); #endif @@ -46,7 +46,7 @@ int UART_tx(void* my_uart_v, void* data_v, int data_size) } } #ifdef USE_SCI_COM_WINGS - SILS_SCI_UART_IF_TX((unsigned char*)data_v, data_size); + SILS_SCI_UART_IF_tx((unsigned char*)data_v, data_size); #else if (OBC_C2A_SendFromObc(my_uart->ch, (unsigned char*)data_v, 0, data_size) < 0) { diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.cpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.cpp deleted file mode 100644 index 6fb389fe6..000000000 --- a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#pragma section REPRO -/** - * @file - * @brief uart_sils_sci_if - * @details SILSでDriverのテストをするように作った - ccsds_sils_sci_if.c/hのほぼコピー - */ - -#include "uart_sils_sci_if.hpp" - - -// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい -static SCIComPortUart sci_com_uart_; - -int SILS_SCI_UART_IF_init(void) -{ - return 0; -} - -int SILS_SCI_UART_IF_TX(unsigned char* data_v, int count) -{ - sci_com_uart_.Send(data_v, 0, count); - return 0; -} - -int SILS_SCI_UART_IF_RX(unsigned char* data_v, int count) -{ - return sci_com_uart_.Receive(data_v, 0, count); -} - - -SCIComPortUart::SCIComPortUart(void) -{ - // ビルド通らなかったので,ZEUSからちょっと変えた - myHComPort_ = CreateFile("\\\\.\\COM14", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if ((int)myHComPort_ == -1) - { - // 正常にポートオープンできていない場合は終了 - CloseHandle(myHComPort_); - init_success = false; - return; - } - - // どうやら正常ポートopenにならないっぽく,これが必要 - init_success = true; - - // ポートのボーレート、パリティ等を設定 - config_.BaudRate = 115200; - config_.Parity = PARITY_NONE; - config_.ByteSize = 8; - config_.StopBits = STOPBITS_10; - - // Parity、StopBits、DataBitsも同様に設定 - SetCommState(myHComPort_, &config_); -} - -SCIComPortUart::~SCIComPortUart(void) -{ - if (init_success == true) - { - CloseHandle(myHComPort_); - } -} - -int SCIComPortUart::Send(unsigned char* buffer, size_t offset, size_t count) -{ - DWORD toWriteBytes = count; // 送信したいバイト数 - DWORD writeBytes; // 実際に送信されたバイト数 - - if (init_success == true) - { - WriteFile(myHComPort_, buffer + offset, toWriteBytes, &writeBytes, NULL); - - return writeBytes; - } - else - { - return 0; - } -} - -int SCIComPortUart::Receive(unsigned char* buffer, size_t offset, size_t count) -{ - DWORD fromReadBytes = count; // 受信したいバイト数 - DWORD dwErrors; - COMSTAT ComStat; - DWORD dwCount; // 受信したバイト数 - - if (init_success == true) - { - ClearCommError(myHComPort_, &dwErrors, &ComStat); - dwCount = ComStat.cbInQue; - - if (dwCount > 0) - { - if (dwCount < count) - { - fromReadBytes = dwCount; - ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); - } - else - { - fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 - ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); - } - } - - return dwCount; - } - else - { - return 0; - } -} - -#pragma section diff --git a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.hpp b/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.hpp deleted file mode 100644 index e6ff4550c..000000000 --- a/Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.hpp +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file - * @brief uart_sils_sci_if - * @details SILSでDriverのテストをするように作った - ccsds_sils_sci_if.c/hのほぼコピー - */ -#ifndef UART_SILS_SCI_IF_HPP_ -#define UART_SILS_SCI_IF_HPP_ - -#include - -class SCIComPortUart -{ -public: - SCIComPortUart(void); - ~SCIComPortUart(void); - - int Send(unsigned char* buffer, size_t length, size_t offset); - int Receive(unsigned char* buffer, size_t length, size_t offset); - -private: - HANDLE myHComPort_; - DCB config_; - bool init_success; -}; - -int SILS_SCI_UART_IF_init(); -int SILS_SCI_UART_IF_TX(unsigned char* data_v, int count); -int SILS_SCI_UART_IF_RX(unsigned char* data_v, int count); - -#endif diff --git a/Examples/2nd_obc_user/sync_with_minimum_user.bat b/Examples/2nd_obc_user/sync_with_minimum_user.bat index 5d125aa8a..579334215 100644 --- a/Examples/2nd_obc_user/sync_with_minimum_user.bat +++ b/Examples/2nd_obc_user/sync_with_minimum_user.bat @@ -14,7 +14,9 @@ call :sync_dir ".\src\src_user\Script\" "..\minimum_user\src\src_user\Script\" call :sync_dir ".\src\src_user\Settings\TlmCmd\Ccsds\" "..\minimum_user\src\src_user\Settings\TlmCmd\Ccsds\" call :sync_file ".\src\src_user\Applications\UserDefined\debug_apps.h" "..\minimum_user\src\src_user\Applications\UserDefined\debug_apps.h" -call :sync_file ".\src\src_user\IfWrapper\Sils\uart_sils_sci_if.hpp" "..\minimum_user\src\src_user\IfWrapper\Sils\uart_sils_sci_if.hpp" +call :sync_file ".\src\src_user\IfWrapper\Sils\sils_sci_uart_if.hpp" "..\minimum_user\src\src_user\IfWrapper\Sils\sils_sci_uart_if.hpp" +call :sync_file ".\src\src_user\IfWrapper\Sils\sils_sci_if.cpp" "..\minimum_user\src\src_user\IfWrapper\Sils\sils_sci_if.cpp" +call :sync_file ".\src\src_user\IfWrapper\Sils\sils_sci_if.hpp" "..\minimum_user\src\src_user\IfWrapper\Sils\sils_sci_if.hpp" call :sync_file ".\src\src_user\IfWrapper\Sils\wdt_sils.cpp" "..\minimum_user\src\src_user\IfWrapper\Sils\wdt_sils.cpp" call :sync_file ".\src\src_user\IfWrapper\SilsMockup\README.md" "..\minimum_user\src\src_user\IfWrapper\SilsMockup\README.md" call :sync_file ".\src\src_user\IfWrapper\SilsMockup\uart_sils.c" "..\minimum_user\src\src_user\IfWrapper\SilsMockup\uart_sils.c" diff --git a/Examples/minimum_user/src/src_user/IfWrapper/CMakeLists.txt b/Examples/minimum_user/src/src_user/IfWrapper/CMakeLists.txt index bd5328f01..e8f38e502 100644 --- a/Examples/minimum_user/src/src_user/IfWrapper/CMakeLists.txt +++ b/Examples/minimum_user/src/src_user/IfWrapper/CMakeLists.txt @@ -31,7 +31,8 @@ if(USE_SCI_COM_WINGS AND NOT USE_SILS_MOCKUP) add_definitions(-DUSE_SCI_COM_WINGS) #target_sources(${PROJECT_NAME} PUBLIC list(APPEND C2A_SRCS - Sils/ccsds_sils_sci_if.cpp + Sils/sils_sci_if.cpp + Sils/sils_sci_ccsds_if.cpp ) message("USE SCI_COM_WINGS") endif() @@ -40,7 +41,8 @@ if(USE_SCI_COM_UART AND NOT USE_SILS_MOCKUP) add_definitions(-DUSE_SCI_COM_UART) #target_sources(${PROJECT_NAME} PUBLIC list(APPEND C2A_SRCS - Sils/uart_sils_sci_if.cpp + Sils/sils_sci_if.cpp + Sils/sils_sci_uart_if.cpp ) message("USE SCI_COM_UART") endif() diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils.cpp index c4412d369..051b58101 100644 --- a/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils.cpp +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils.cpp @@ -14,7 +14,7 @@ #include "../ccsds_user.h" #ifdef USE_SCI_COM_WINGS -#include "ccsds_sils_sci_if.hpp" +#include "sils_sci_ccsds_if.hpp" #endif #define CCSDS_TX_VALID_SIZE (444) @@ -26,7 +26,7 @@ int CCSDS_init(void* my_ccsds_v) CCSDS_set_rate(0xAD, my_ccsds); // 初期値 230.4 [kbps] #ifdef USE_SCI_COM_WINGS - SILS_SIC_IF_init(); + SILS_SCI_CCSDS_IF_init(); #endif return CCSDS_ERR_OK; } @@ -37,7 +37,7 @@ int CCSDS_rx(void* my_ccsds_v, void* data_v, int buffer_size) (CCSDS_Config*)my_ccsds_v; #ifdef USE_SCI_COM_WINGS - return SILS_SIC_IF_RX(data, buffer_size); + return SILS_SCI_CCSDS_IF_rx(data, buffer_size); #endif return 0; @@ -53,7 +53,7 @@ int CCSDS_tx(void* my_ccsds_v, void* data_v, int data_size) if (!CCSDS_get_buffer_num()) return CCSDS_ERR_TX_NO_BUFFER; #ifdef USE_SCI_COM_WINGS - ret = SILS_SIC_IF_TX(data, data_size); + ret = SILS_SCI_CCSDS_IF_tx(data, data_size); #endif if (ret == 0) return CCSDS_ERR_TX_INVALID; diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils_sci_if.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils_sci_if.cpp deleted file mode 100644 index 6a40e5e53..000000000 --- a/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils_sci_if.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#pragma section REPRO -/** - * @file - * @brief ccsds_sils_sci_if - * @details WINGS TMTC IFとCCSDSのTransfer FrameをSCI COMでやりとりするIF - Windows上でcom0comを使うことを想定 - SCIComPort classは基本的にEQU ZEUSのコードを流用 - */ - -#include "ccsds_sils_sci_if.hpp" - - -// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい -static SCIComPort sci_com_; - -int SILS_SIC_IF_init(void) -{ - return 0; -} - -int SILS_SIC_IF_TX(unsigned char* data_v, int count) -{ - sci_com_.Send(data_v, 0, count); - return 0; -} - -int SILS_SIC_IF_RX(unsigned char* data_v, int count) -{ - return sci_com_.Receive(data_v, 0, count); -} - - -SCIComPort::SCIComPort(void) -{ - // ビルド通らなかったので,ZEUSからちょっと変えた - myHComPort_ = CreateFile("\\\\.\\COM11", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if ((int)myHComPort_ == -1) - { - // 正常にポートオープンできていない場合は終了 - CloseHandle(myHComPort_); - init_success = false; - return; - } - - // どうやら正常ポートopenにならないっぽく,これが必要 - init_success = true; - - // ポートのボーレート、パリティ等を設定 - config_.BaudRate = 115200; - config_.Parity = PARITY_NONE; - config_.ByteSize = 8; - config_.StopBits = STOPBITS_10; - - // Parity、StopBits、DataBitsも同様に設定 - SetCommState(myHComPort_, &config_); -} - -SCIComPort::~SCIComPort(void) -{ - if (init_success == true) - { - CloseHandle(myHComPort_); - } -} - -int SCIComPort::Send(unsigned char* buffer, size_t offset, size_t count) -{ - DWORD toWriteBytes = count; // 送信したいバイト数 - DWORD writeBytes; // 実際に送信されたバイト数 - - if (init_success == true) - { - WriteFile(myHComPort_, buffer + offset, toWriteBytes, &writeBytes, NULL); - - return writeBytes; - } - else - { - return 0; - } -} - -int SCIComPort::Receive(unsigned char* buffer, size_t offset, size_t count) -{ - DWORD fromReadBytes = count; // 受信したいバイト数 - DWORD dwErrors; - COMSTAT ComStat; - DWORD dwCount; // 受信したバイト数 - - if (init_success == true) - { - ClearCommError(myHComPort_, &dwErrors, &ComStat); - dwCount = ComStat.cbInQue; - - if (dwCount > 0) - { - if (dwCount < count) - { - fromReadBytes = dwCount; - ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); - } - else - { - fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 - ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); - } - } - - return dwCount; - } - else - { - return 0; - } -} - -#pragma section diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils_sci_if.hpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils_sci_if.hpp deleted file mode 100644 index 5119340a0..000000000 --- a/Examples/minimum_user/src/src_user/IfWrapper/Sils/ccsds_sils_sci_if.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @file - * @brief ccsds_sils_sci_if - * @details WINGS TMTC IFとCCSDSのTransfer FrameをSCI COMでやりとりするIF - Windows上でcom0comを使うことを想定 - SCIComPort classは基本的にEQU ZEUSのコードを流用 - */ -#ifndef CCSDS_SILS_SCI_IF_HPP_ -#define CCSDS_SILS_SCI_IF_HPP_ - -#include - -// ZEUS SILSからのコピー -class SCIComPort -{ -public: - SCIComPort(void); - ~SCIComPort(void); - - int Send(unsigned char* buffer, size_t length, size_t offset); - int Receive(unsigned char* buffer, size_t length, size_t offset); - -private: - HANDLE myHComPort_; - DCB config_; - bool init_success; -}; - -int SILS_SIC_IF_init(); -int SILS_SIC_IF_TX(unsigned char* data_v, int count); -int SILS_SIC_IF_RX(unsigned char* data_v, int count); - -#endif diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_ccsds_if.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_ccsds_if.cpp new file mode 100644 index 000000000..7f183ebce --- /dev/null +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_ccsds_if.cpp @@ -0,0 +1,36 @@ +#pragma section REPRO +/** + * @file + * @brief sils_sci_ccsds_if + * @details WINGS TMTC IFとCCSDSのTransfer FrameをSCI COMでやりとりするIF + * Windows上でcom0comを使うことを想定 + * SCIComPort classは基本的にEQU ZEUSのコードを流用 + */ + +#include "sils_sci_ccsds_if.hpp" + + +// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい +#ifdef _WIN32 +static SCIComPortCcsds SILS_SCI_CCSDS_IF_sci_com_(11); +#else +static SCIComPortCcsds SILS_SCI_CCSDS_IF_sci_com_(1); +#endif + +int SILS_SCI_CCSDS_IF_init(void) +{ + return 0; +} + +int SILS_SCI_CCSDS_IF_tx(unsigned char* data_v, int count) +{ + SILS_SCI_CCSDS_IF_sci_com_.Send(data_v, 0, count); + return 0; +} + +int SILS_SCI_CCSDS_IF_rx(unsigned char* data_v, int count) +{ + return SILS_SCI_CCSDS_IF_sci_com_.Receive(data_v, 0, count); +} + +#pragma section diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_ccsds_if.hpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_ccsds_if.hpp new file mode 100644 index 000000000..d9f808634 --- /dev/null +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_ccsds_if.hpp @@ -0,0 +1,25 @@ +/** + * @file + * @brief sils_sci_ccsds_if + * @details WINGS TMTC IFとCCSDSのTransfer FrameをSCI COMでやりとりするIF + * Windows上でcom0comを使うことを想定 + * SCIComPort classは基本的にEQU ZEUSのコードを流用 + */ +#ifndef SILS_SCI_CCSDS_IF_HPP_ +#define SILS_SCI_CCSDS_IF_HPP_ + +#include +#include "sils_sci_if.hpp" + +class SCIComPortCcsds : public SCIComPort +{ +public: + SCIComPortCcsds(int port) : SCIComPort(port) {}; + ~SCIComPortCcsds(void) {}; +}; + +int SILS_SCI_CCSDS_IF_init(); +int SILS_SCI_CCSDS_IF_tx(unsigned char* data_v, int count); +int SILS_SCI_CCSDS_IF_rx(unsigned char* data_v, int count); + +#endif diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp new file mode 100644 index 000000000..37b218820 --- /dev/null +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp @@ -0,0 +1,180 @@ +#pragma section REPRO +/** + * @file + * @brief sils_sci_if + * @details SCI COMでやりとりするIF + */ + +#include "sils_sci_if.hpp" + +#ifdef _WIN32 +SCIComPort::SCIComPort(int port) +{ + char port_name[15]; + snprintf(port_name, 15, "%s%d", "\\\\.\\COM", port); + myHComPort_ = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if ((int)myHComPort_ == -1) + { + // 正常にポートオープンできていない場合は終了 + CloseHandle(myHComPort_); + init_success = false; + return; + } + + // どうやら正常ポートopenにならないっぽく,これが必要 + init_success = true; + + // ポートのボーレート、パリティ等を設定 + config_.BaudRate = 115200; + config_.Parity = PARITY_NONE; + config_.ByteSize = 8; + config_.StopBits = STOPBITS_10; + + // Parity、StopBits、DataBitsも同様に設定 + SetCommState(myHComPort_, &config_); +} + +SCIComPort::~SCIComPort(void) +{ + if (init_success == true) + { + CloseHandle(myHComPort_); + } +} + +int SCIComPort::Send(unsigned char* buffer, size_t offset, size_t count) +{ + DWORD toWriteBytes = count; // 送信したいバイト数 + DWORD writeBytes; // 実際に送信されたバイト数 + + if (init_success == true) + { + WriteFile(myHComPort_, buffer + offset, toWriteBytes, &writeBytes, NULL); + return writeBytes; + } + else + { + return 0; + } +} + +int SCIComPort::Receive(unsigned char* buffer, size_t offset, size_t count) +{ + DWORD fromReadBytes = count; // 受信したいバイト数 + DWORD dwErrors; + COMSTAT ComStat; + DWORD dwCount; // 受信したバイト数 + + if (init_success == true) + { + ClearCommError(myHComPort_, &dwErrors, &ComStat); + dwCount = ComStat.cbInQue; + + if (dwCount > 0) + { + if (dwCount < count) + { + fromReadBytes = dwCount; + ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); + } + else + { + fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 + ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); + } + } + + return dwCount; + } + else + { + return 0; + } +} + +#else + +SCIComPort::SCIComPort(int port) +{ + char port_name[13]; + snprintf(port_name, 13, "%s%d", "/dev/tnt", port); + if ((myHComPort_ = open(port_name, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) + { + close(myHComPort_); + init_success = false; + return; + } + + // どうやら正常ポートopenにならないっぽく,これが必要 + init_success = true; + + cfsetispeed(&config_, 115200); + cfsetospeed(&config_, 115200); + config_.c_cflag &= ~PARENB; // No Parity + config_.c_cflag &= ~CSTOPB; // 1 Stop Bit + config_.c_cflag &= ~CSIZE; + config_.c_cflag |= CS8; // 8 Bits + tcsetattr(myHComPort_, TCSANOW, &config_); +} + +SCIComPort::~SCIComPort(void) +{ + if (init_success == true) + { + close(myHComPort_); + } +} + +int SCIComPort::Send(unsigned char* buffer, size_t offset, size_t count) +{ + unsigned long toWriteBytes = count; // 送信したいバイト数 + unsigned long writeBytes; // 実際に送信されたバイト数 + + if (init_success == true) + { + writeBytes = write(myHComPort_, buffer + offset, toWriteBytes); + return writeBytes; + } + else + { + return 0; + } +} + +int SCIComPort::Receive(unsigned char* buffer, size_t offset, size_t count) +{ + unsigned long fromReadBytes = count; // 受信したいバイト数 + unsigned long dwErrors; + unsigned long ComStat_cbInQue; + unsigned long dwCount; // 受信したバイト数 + + if (init_success == true) + { + dwCount = ComStat_cbInQue; + + if (dwCount > 0) + { + if (dwCount < count) + { + fromReadBytes = dwCount; + dwCount = read(myHComPort_, buffer + offset, fromReadBytes); + } + else + { + fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 + dwCount = read(myHComPort_, buffer + offset, fromReadBytes); + } + } + + return dwCount; + } + else + { + return 0; + } +} + +#endif + +#pragma section diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp new file mode 100644 index 000000000..568bf6099 --- /dev/null +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp @@ -0,0 +1,41 @@ +/** + * @file + * @brief sils_sci_if + * @details SCI COMでやりとりするIF + */ +#ifndef SILS_SCI_IF_HPP_ +#define SILS_SCI_IF_HPP_ + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif + +#include +#include + +class SCIComPort +{ +public: + SCIComPort(int port); + virtual ~SCIComPort(void); + + int Send(unsigned char* buffer, size_t length, size_t offset); + int Receive(unsigned char* buffer, size_t length, size_t offset); + +private: +#ifdef _WIN32 + HANDLE myHComPort_; + DCB config_; +#else + int myHComPort_; + struct termios config_; +#endif + bool init_success; +}; + +#endif + diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.cpp new file mode 100644 index 000000000..69e9b241e --- /dev/null +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.cpp @@ -0,0 +1,35 @@ +#pragma section REPRO +/** + * @file + * @brief sils_sci_uart_if + * @details SILSでDriverのテストをするように作った + */ + +#include "sils_sci_uart_if.hpp" + + +// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい +#ifdef _WIN32 +static SCIComPortUart SILS_SCI_UART_IF_sci_com_(13); +#else +static SCIComPortUart SILS_SCI_UART_IF_sci_com_(3); +#endif + + +int SILS_SCI_UART_IF_init(void) +{ + return 0; +} + +int SILS_SCI_UART_IF_tx(unsigned char* data_v, int count) +{ + SILS_SCI_UART_IF_sci_com_.Send(data_v, 0, count); + return 0; +} + +int SILS_SCI_UART_IF_rx(unsigned char* data_v, int count) +{ + return SILS_SCI_UART_IF_sci_com_.Receive(data_v, 0, count); +} + +#pragma section diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.hpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.hpp new file mode 100644 index 000000000..f2c32132a --- /dev/null +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/sils_sci_uart_if.hpp @@ -0,0 +1,23 @@ +/** + * @file + * @brief sils_sci_uart_if + * @details SILSでDriverのテストをするように作った + sils_sci_ccsds_if.c/hのほぼコピー + */ +#ifndef SILS_SCI_UART_IF_HPP_ +#define SILS_SCI_UART_IF_HPP_ + +#include "sils_sci_if.hpp" + +class SCIComPortUart : public SCIComPort +{ +public: + SCIComPortUart(int port) : SCIComPort(port) {}; + ~SCIComPortUart(void) {}; +}; + +int SILS_SCI_UART_IF_init(); +int SILS_SCI_UART_IF_tx(unsigned char* data_v, int count); +int SILS_SCI_UART_IF_rx(unsigned char* data_v, int count); + +#endif diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils.cpp index 2209d1b39..bb7512d6a 100644 --- a/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils.cpp +++ b/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils.cpp @@ -3,7 +3,7 @@ #include "../../Settings/port_config.h" #ifdef USE_SCI_COM_UART -#include "uart_sils_sci_if.hpp" +#include "sils_sci_uart_if.hpp" #endif int OBC_C2A_SendFromObc(int port_id, unsigned char* buffer, int offset, int count); @@ -24,7 +24,7 @@ int UART_rx(void* my_uart_v, void* data_v, int buffer_size) } #ifdef USE_SCI_COM_UART - return SILS_SCI_UART_IF_RX((unsigned char*)data_v, buffer_size); + return SILS_SCI_UART_IF_rx((unsigned char*)data_v, buffer_size); #else return OBC_C2A_ReceivedByObc(my_uart->ch, (unsigned char*)data_v, 0, buffer_size); #endif @@ -46,7 +46,7 @@ int UART_tx(void* my_uart_v, void* data_v, int data_size) } } #ifdef USE_SCI_COM_UART - SILS_SCI_UART_IF_TX((unsigned char*)data_v, data_size); + SILS_SCI_UART_IF_tx((unsigned char*)data_v, data_size); #else if (OBC_C2A_SendFromObc(my_uart->ch, (unsigned char*)data_v, 0, data_size) < 0) { diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.cpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.cpp deleted file mode 100644 index 9bcb379d6..000000000 --- a/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#pragma section REPRO -/** - * @file - * @brief uart_sils_sci_if - * @details SILSでDriverのテストをするように作った - ccsds_sils_sci_if.c/hのほぼコピー - */ - -#include "uart_sils_sci_if.hpp" - - -// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい -static SCIComPortUart sci_com_uart_; - -int SILS_SCI_UART_IF_init(void) -{ - return 0; -} - -int SILS_SCI_UART_IF_TX(unsigned char* data_v, int count) -{ - sci_com_uart_.Send(data_v, 0, count); - return 0; -} - -int SILS_SCI_UART_IF_RX(unsigned char* data_v, int count) -{ - return sci_com_uart_.Receive(data_v, 0, count); -} - - -SCIComPortUart::SCIComPortUart(void) -{ - // ビルド通らなかったので,ZEUSからちょっと変えた - myHComPort_ = CreateFile("\\\\.\\COM13", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if ((int)myHComPort_ == -1) - { - // 正常にポートオープンできていない場合は終了 - CloseHandle(myHComPort_); - init_success = false; - return; - } - - // どうやら正常ポートopenにならないっぽく,これが必要 - init_success = true; - - // ポートのボーレート、パリティ等を設定 - config_.BaudRate = 115200; - config_.Parity = PARITY_NONE; - config_.ByteSize = 8; - config_.StopBits = STOPBITS_10; - - // Parity、StopBits、DataBitsも同様に設定 - SetCommState(myHComPort_, &config_); -} - -SCIComPortUart::~SCIComPortUart(void) -{ - if (init_success == true) - { - CloseHandle(myHComPort_); - } -} - -int SCIComPortUart::Send(unsigned char* buffer, size_t offset, size_t count) -{ - DWORD toWriteBytes = count; // 送信したいバイト数 - DWORD writeBytes; // 実際に送信されたバイト数 - - if (init_success == true) - { - WriteFile(myHComPort_, buffer + offset, toWriteBytes, &writeBytes, NULL); - - return writeBytes; - } - else - { - return 0; - } -} - -int SCIComPortUart::Receive(unsigned char* buffer, size_t offset, size_t count) -{ - DWORD fromReadBytes = count; // 受信したいバイト数 - DWORD dwErrors; - COMSTAT ComStat; - DWORD dwCount; // 受信したバイト数 - - if (init_success == true) - { - ClearCommError(myHComPort_, &dwErrors, &ComStat); - dwCount = ComStat.cbInQue; - - if (dwCount > 0) - { - if (dwCount < count) - { - fromReadBytes = dwCount; - ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); - } - else - { - fromReadBytes = count; // 読み込みすぎるとデータが失われるので読み込む量を制御 - ReadFile(myHComPort_, buffer + offset, fromReadBytes, &dwCount, NULL); - } - } - - return dwCount; - } - else - { - return 0; - } -} - -#pragma section diff --git a/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.hpp b/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.hpp deleted file mode 100644 index e6ff4550c..000000000 --- a/Examples/minimum_user/src/src_user/IfWrapper/Sils/uart_sils_sci_if.hpp +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file - * @brief uart_sils_sci_if - * @details SILSでDriverのテストをするように作った - ccsds_sils_sci_if.c/hのほぼコピー - */ -#ifndef UART_SILS_SCI_IF_HPP_ -#define UART_SILS_SCI_IF_HPP_ - -#include - -class SCIComPortUart -{ -public: - SCIComPortUart(void); - ~SCIComPortUart(void); - - int Send(unsigned char* buffer, size_t length, size_t offset); - int Receive(unsigned char* buffer, size_t length, size_t offset); - -private: - HANDLE myHComPort_; - DCB config_; - bool init_success; -}; - -int SILS_SCI_UART_IF_init(); -int SILS_SCI_UART_IF_TX(unsigned char* data_v, int count); -int SILS_SCI_UART_IF_RX(unsigned char* data_v, int count); - -#endif diff --git a/Script/CI/check_coding_rule.json b/Script/CI/check_coding_rule.json index d5cda639f..767f80560 100644 --- a/Script/CI/check_coding_rule.json +++ b/Script/CI/check_coding_rule.json @@ -11,7 +11,8 @@ "src_core/Script" ], "ignore_files" : [ - "src_user/TlmCmd/telemetry_definitions.c" + "src_user/TlmCmd/telemetry_definitions.c", + "src_user/IfWrapper/Sils/sils_sci_if.hpp" ], "ignore_rules" : [ ],