Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support linux for uart and ccsds on SILS #341

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Examples/2nd_obc_user/src/src_user/IfWrapper/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
180 changes: 180 additions & 0 deletions Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.cpp
Original file line number Diff line number Diff line change
@@ -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
41 changes: 41 additions & 0 deletions Examples/2nd_obc_user/src/src_user/IfWrapper/Sils/sils_sci_if.hpp
Original file line number Diff line number Diff line change
@@ -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 <Windows.h>
#else
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#endif

#include <stddef.h>
#include <stdio.h>

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

Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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)
{
Expand Down
Loading