Skip to content

Commit

Permalink
fix for 2nd obc
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed Oct 30, 2022
1 parent 71c74dc commit d8778b9
Show file tree
Hide file tree
Showing 9 changed files with 287 additions and 153 deletions.
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 @@ -27,7 +27,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_urat_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

0 comments on commit d8778b9

Please sign in to comment.