/**
 * @brief SCIドライバ readme.txt
 *
 * @version: 1.9 2024/10/17, $Id $
 *
 * 本ソフトウェアの著作権は作成元である(株)北斗電子が所有するものとし、
 * (株)北斗電子は、以下の (1)-(3) の条件を満たす場合に限り、
 * 本ソフトウェア（本ソフトウェアを改変したものを含む。以下同じ）を
 * 使用・複製・改変・再配布（以下、利用と呼ぶ）することを無償で許諾する。
 *
 * (1) 本ソフトウェアをソースコードの形で利用する場合には、下記の著作
 *	   権表示、この利用条件が、そのままの形でソースコード中に含まれて
 *	   いること。
 * (2) 本ソフトウェアの一部または全てを無断で転載することを禁止するもの
 *	   とする。雑誌などへ紹介・収録の場合は(株)北斗電子に連絡願います。
 * (3) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
 *	   からも、(株)北斗電子は一切の責任を負わないものとする。
 *
 * Copyright (C) Hokuto denshi Co,Ltd. 2022-2024
 */

/*

　本ソースコードは、スマートコンフィグレータ（RX, RL78, RH850, RISC-V）、
コード生成(RL78), FSP(RA)で自動生成した、SCI(UART)のコード
と共に使用するソフトウェアです。


CS+の環境では、sjis/sci.c, sjis/sci.h を使用してください
（ファイル内のコメントはShift-JISです）

e2studioの環境では、utf8/sci.c, utf8/sci.hを使用してください
（ファイル内のコメントはUTF8です）

（コメントの文字コードの相違だけですので、文字化けを気にしなければどちらを使用しても問題ありません。）

※サンプルプログラムに組み込まれている場合は、CS+の場合はsjis、e2studio向けの場合はutf8の文字コードのファイルを適用しています
（sjis/utf8のフォルダ区分を気にする必要はありません）

○ユーザ側で選択する項目(sci.h)

(*1)マイコン種別

//#include "../mcu_type/mcu_type.h"

　複数のソースで一括でマイコン種別を設定する際などは、この部分で定義ファイルをインクルードしてください。

mcu_type.h内では

#define MCU_TYPE_RX
#define MCU_TYPE_DEFINED

　の様な定義がなされている事を期待しています。

(*1')

　別ファイルでマイコン種別を定義しない（sci.c, sci.hを単独で使用する）場合

#define MCU_TYPE_RX
//#define MCU_TYPE_RL78
//#define MCU_TYPE_RA
//#define MCU_TYPE_RH850
//#define MCU_TYPE_RISC_V

　使用するマイコン種別に応じて。いずれか1つを有効にしてください。


(*2)スマートコンフィグレータ／コード生成種別（RL78のみ）

#define RL78_SMART_CONFIGURATOR			//スマートコンフィグレータ（RL78/G23以降）
//#define RL78_CODE_GENERATION			//コード生成

　RL78の場合、どちらか一方を有効にしてください

(*2')RAでSCIが、SCI, SCI_Bのどちらであるか選択してください（RAのみ）

#define RA_SCI                          //通常のSCI
//#define RA_SCI_B                      //SCI_B

(*3)インクルード

・RL78（コード生成使用の場合）

#include	"r_cg_serial.h
//#include	"r_cg_sau.h"

　コード生成が出力した、ファイル名に応じて記載してください。

・RH850

#include	"Config_UART1.h"

　使用するSCI-chに合わせて、上記ヘッダファイルの"UART1"の部分を書き換えてください。

(*4)SCIチャネル定義

・RX

(void)R_Config_SCI1_?????

　使用するSCI-chに合わせて、上記記述の"SCI1"の部分を書き換えてください。

・RL78

(void)R_Config_UART0_?????

　使用するUART-chに合わせて、上記記述の"UART0"の部分を書き換えてください。

・RA

(void)R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg)
(void)R_SCI_UART_????(&g_uart9_ctrl...

　"g_uart9_ctrl", "g_uart9_cfg"の"g_uart9"の部分をFSPで定義したNameに合わせて書き換えてください。

・RH850

R_Config_UART1_?????

　使用するSCI-chに合わせて、上記記述の"UART1"の部分を書き換えてください。

・RISC_V

#define INTERRUPT_DISABLE	R_CLIC->clicintie27_b.IE=0
#define INTERRUPT_ENABLE	R_CLIC->clicintie27_b.IE=1

　使用する送信完了割り込みの IESLRn のnに応じて、上記"27"の部分をn+19の値に書き換えてください。
　（送信完了割り込み SAU0_ENDI0 が使用するのが IESLR8 の場合は、27となります）

(void)R_Config_UART0_????()

　使用するUART-chに合わせて、上記記述の"UART0"の部分を書き換えてください。

(*5)定数定義

#define SCI_SEND_BUF_SIZE		1024

　送信バッファの1ページあたりのバイト数です。送信バッファは2ページ確保していますので、この数値の倍のメモリを消費します。(最大は65536）

#define SCI_RECV_BUF_SIZE 		16

　受信バッファのバイト数です。受信バッファはリングバッファ構成で、ここで定義した値のメモリを消費します。
　受信バッファは、キーボードからのコマンド入力を想定しており、デフォルト値は16バイトとしています。(最大は65536）
　送信側がマイコン等で連続してデータを送信してくる場合は、バッファ容量を増やしてください。

※RL78/G10等のマイコンでは、デフォルト値ではRAM容量を超過しますので、数値を減らしてください

#define SCI_USE_FLOAT						//浮動小数点の関数を使用する

　浮動小数点関連の関数を使用しない場合はコメントアウトしてください。
　（RL78/G10等のROM容量が少ないマイコンでは、コメントアウトしてください。コメントアウトする事で、4kB程度ROM使用量が減ります）

#define SCI_USE_TX							//送信機能を使用する
#define SCI_USE_RX							//受信機能を使用する

　送信機能か受信機能のどちらかしか使用しない場合は、使用しない側をコメントアウトしてください。


○ユーザ側でスマートコンフィグレータ生成コード内に追加する記載

・RX

Config_SCI1_user.c 内（SCI-chに応じてファイル名は変わります）

/* Start user code for include. Do not edit comment generated here */
#include "sci.h" //Includes内 ★追加
/* End user code. Do not edit comment generated here */

static void r_Config_SCI1_callback_transmitend(void)
{
    /* Start user code for r_Config_SCI1_callback_transmitend. Do not edit comment generated here */
    intr_sci_send_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_SCI1_callback_receiveend(void)
{
    /* Start user code for r_Config_SCI1_callback_receiveend. Do not edit comment generated here */
    intr_sci_receive_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_SCI1_callback_receiveerror(void)
{
    /* Start user code for r_Config_SCI1_callback_receiveerror. Do not edit comment generated here */
    intr_sci_receive_error(); //★追加
    /* End user code. Do not edit comment generated here */
}

・RL78（スマートコンフィグレータ環境）

Config_UART0_user.c（UART-chに応じてファイル名は変わります）

/* Start user code for include. Do not edit comment generated here */
#include "sci.h" //Includes内 ★追加
/* End user code. Do not edit comment generated here */

static void r_Config_UART0_callback_sendend(void)
{
    /* Start user code for r_Config_UART0_callback_sendend. Do not edit comment generated here */
    intr_sci_send_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_UART0_callback_receiveend(void)
{
    /* Start user code for r_Config_UART0_callback_receiveend. Do not edit comment generated here */
    intr_sci_receive_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_UART0_callback_error(uint8_t err_type)
{
    /* Start user code for r_Config_UART0_callback_error. Do not edit comment generated here */
    intr_sci_receive_error(); //★追加
    /* End user code. Do not edit comment generated here */
}

・RL78（コード生成環境）

r_cg_serial_user.c
(r_cg_sau_user.c) または、左記ファイル。（使用マイコンに応じてファイル名が変わります）

/* Start user code for include. Do not edit comment generated here */
#include "sci.h" //Includes内 ★追加
/* End user code. Do not edit comment generated here */

static void r_uart0_callback_receiveend(void)
{
    /* Start user code. Do not edit comment generated here */
    intr_sci_receive_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_uart0_callback_sendend(void)
{
    /* Start user code. Do not edit comment generated here */
    intr_sci_send_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_uart0_callback_error(uint8_t err_type)
{
    /* Start user code. Do not edit comment generated here */
    intr_sci_receive_error(); //★追加
    /* End user code. Do not edit comment generated here */
}

・RH850

Config_UART1_user.c 内（SCI-chに応じてファイル名は変わります）

/* Start user code for include. Do not edit comment generated here */
#include "sci.h" //Includes内 ★追加
/* End user code. Do not edit comment generated here */

void r_Config_UART1_callback_sendend(void)
{
    /* Start user code for r_Config_UART1_callback_sendend. Do not edit comment generated here */
    intr_sci_send_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

void r_Config_UART1_callback_receiveend(void)
{
    /* Start user code for r_Config_UART1_callback_receiveend. Do not edit comment generated here */
    intr_sci_receive_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_SCI1_callback_receiveerror(void)
{
    /* Start user code for r_Config_UART1_callback_error. Do not edit comment generated here */
    intr_sci_receive_error(); //★追加
    /* End user code. Do not edit comment generated here */
}

・RISC_V

Config_UART0_user.c 内（UART-chに応じてファイル名は変わります）

/* Start user code for include. Do not edit comment generated here */
#include "../../sci/sci.h" //★追加
/* End user code. Do not edit comment generated here */

static void r_Config_UART0_callback_sendend(void)
{
    /* Start user code for r_Config_UART0_callback_sendend. Do not edit comment generated here */
	intr_sci_send_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_UART0_callback_receiveend(void)
{
    /* Start user code for r_Config_UART0_callback_receiveend. Do not edit comment generated here */
	intr_sci_receive_end(); //★追加
    /* End user code. Do not edit comment generated here */
}

static void r_Config_UART0_callback_error(uint8_t err_type)
{
    /* Start user code for r_Config_UART0_callback_error. Do not edit comment generated here */
	intr_sci_receive_error(); //★追加
    /* End user code. Do not edit comment generated here */
}

○FSPで設定する必要がある項目(RA)

 General - Name
 
 を、SCI9を使用する場合で、sci.hのデフォルトに合わせる場合、"g_uart9"に変更してください
 （上記Nameとsci.h内のR_SCI_UART_????()関数の引数を合わせてください）

 Interrupts - Callback

 に"user_uart_callback"を記載


○場合によってはユーザ側で変更する必要のある記載項目(sci.c)

#if defined(MCU_TYPE_RA)
//FSPで設定した割り込みコールバック関数
void user_uart_callback (uart_callback_args_t * p_args); //★
#endif

//RAのUART割り込み処理

void user_uart_callback (uart_callback_args_t * p_args) //★

　FSPのUARTのコールバック関数名を(user_uart_callback)以外に設定した場合は、
関数名を変更した記載に合わせて変更してください。


○基本的な使い方

・SCI(UART)への文字出力

sci_start(); //最初に1回実行
sci_write_str("\nSCI print.\n");

・hexダンプ

sci_write_uint8_hex(u8); //u8のデータを、16進数で表示（u8=0x12のとき、12を表示）
sci_write_uint16_hex(u16); //u16のデータを、16進数で表示（u16=0x1234のとき、1234を表示）
sci_write_uint32_hex(u32); //u32のデータを、16進数で表示（u32=0x12345678のとき、12345678を表示）
※8bit, 16bit, 32bit変数向けに分かれています
※先頭に0xは付与しません
※A-Fは大文字です（小文字に変更する場合は、sci.c内の hex_table_char[] を変更してください）

・数値表示

sci_write_uint8(u8); //u8のデータを、符号なし10進数で表示（u8=0x12のとき、18を表示）
（16bit, 32bit版もあり）

sci_write_int16(i16); //i16のデータを、符号つき10進数で表示（i16=0x8123のとき、-32477を表示）
（8bit, 32bit版もあり）

・浮動小数点数表示

unsigned char buf[80];
float f = 1.234f;

float2str(f, 2, buf);
sci_write_str(buf); //fのデータを小数点以下2桁まで表示（1.23を表示）

float2str_eformat(f, 2, buf);
sci_write_str(buf); //fのデータをe形式で小数点以下2桁まで表示（1.23e0を表示）

・キーボードからの文字の読み取り

unsigned short ret;
unsigned char c;

ret = sci_read_char(&c);

if(ret != SCI_RECEIVE_DATA_EMPTY)
{
  switch(c)
  {
    case 'A':
      sci_write_str("input is A\n");
      break;
  }
}
