Skip to content

Commit

Permalink
support linux
Browse files Browse the repository at this point in the history
  • Loading branch information
flap1 committed Jun 8, 2022
1 parent 6d2e320 commit 81fe7a7
Show file tree
Hide file tree
Showing 7 changed files with 241 additions and 197 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ 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/sils_sci_if.cpp
Sils/ccsds_sils_sci_if.cpp
)
message("USE SCI_COM_WINGS")
Expand All @@ -38,6 +39,7 @@ 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/sils_sci_if.cpp
Sils/uart_sils_sci_if.cpp
)
message("USE SCI_COM_UART")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@


// 最初だけ初期化して、プログラム終了時にポートを閉じるようにしたい
static SCIComPort sci_com_;
#ifdef WIN32
static SCIComPortCcsds sci_com_(11);
#else
static SCIComPortCcsds sci_com_(1); // wings_tmtc_if でも設定が必要
#endif

int SILS_SIC_IF_init(void)
{
Expand All @@ -29,90 +33,4 @@ 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
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,15 @@
#ifndef CCSDS_SILS_SCI_IF_HPP_
#define CCSDS_SILS_SCI_IF_HPP_

#include <Windows.h>
#include <stddef.h>
#include "sils_sci_if.hpp"

// ZEUS SILSからのコピー
class SCIComPort
class SCIComPortCcsds : public 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;
SCIComPortCcsds(int port) : SCIComPort(port){};
~SCIComPortCcsds(void){};
};

int SILS_SIC_IF_init();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
#pragma section REPRO
/**
* @file
* @brief sils_sci_if
* @details SCI COMでやりとりするIF
SCIComPort classは基本的にEQU ZEUSのコードを流用
*/

#include "sils_sci_if.hpp"

#ifdef WIN32
SCIComPort::SCIComPort(int port)
{
char port_settings[15];
snprintf(port_settings, 15, "%s%d", "\\\\.\\COM", port);
// ビルド通らなかったので,ZEUSからちょっと変えた
myHComPort_ = CreateFile(port_id, 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_settings[13];
snprintf(port_settings, 13, "%s%d", "/dev/tnt", port);
if((myHComPort_ = open(port_settings, 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

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* @file
* @brief sils_sci_if
* @details SCI COMでやりとりするIF
SCIComPort classは基本的にEQU ZEUSのコードを流用
*/
#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>

// ZEUS SILSからのコピー
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

Loading

0 comments on commit 81fe7a7

Please sign in to comment.