/** 
 * @file sample2.c
 * 
 * @brief コーディングルールのサンプルコード（補足分）
 *
 * 信頼性や保守性のために守るべき幾つかのコーディングルールと見本。
 * 上級者の多くが守っていると思われる項目。
 * その他のルールについてはsample.cを参照。
 *
 * @author Lily <bt@k5-n.com>
 *
 * @date $Id$
 *
 * <!-- Copyright(C) 2006 Lily -->
 */

/*
 * ### 守るべきルール（上級者の多くが守っていると思われる項目） ###
 *
 * ■ 信頼性のためのルール
 * 引数のない関数は引数をvoidにする
 * ローカル関数には必ずstaticをつける
 * 除算や剰余算の右辺式は，0でないことを確認してから演算を行う
 * 関数呼び出しと関数定義の前でプロトタイプ宣言をする
 * 関数がエラー情報を返す場合，戻り値を確認して異常時の処理を行う
 * 他の実行単位により更新される可能性のある変数にはvolatileを付ける
 *
 * ■ コードの保守性（見やすさ）のためのルール
 * 意図的に何もしない文を記述する場合はコメントで目立たせる
 * 参照しかしない領域はconstであることを示す宣言を行う
 * 配列や構造体の初期化は，構造に従ってブロック化し，データを漏れなく記述する
 * （但し，全て0に初期化する場合は，{ 0 } による初期化を行ってもよい）
 * ヘッダファイルには，外部変数定義や関数定義を記述しない
 *
 * ■ 移植性のためのルール
 * 文字 '，\，"，/*，： は #include 指令のヘッダファイル指定に使用しない
 */

/* この先、ルール説明のコメントには###を先頭につけてある */

/* ###関数呼び出しと関数定義の前でプロトタイプ宣言をする */
#include "hardware.h"	/* ここにinit_deviceの宣言があるものとする */
#include "sample2.h"	/* ここにsample2_executeの宣言があるものとする */

#define NO_ERROR	(0)

/* ### 他の実行単位により更新される可能性のある変数にはvolatileを付ける */
/* 他の実行単位とは、割込み処理や他スレッドなどのこと */
volatile unsigned char g_sample2_interrupt_flag;

/* ###参照しかしない領域はconstであることを示す宣言を行う */
/* ###配列や構造体の初期化は構造に従ってブロック化し，データを漏れなく記述する */
static const unsigned char calc_table[2][8] = {
	{ 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 },
	{ 0x89, 0x9A, 0xAB, 0xBC, 0xCD, 0xDE, 0xEF, 0xF0 }
};
/*
 * 関数引数でも同様に、変更しない場合はconstを付ける
 * （例） void hoge(const char* str, int len);
 */

/* ###引数のない関数は引数をvoidにする */
/* ###ローカル関数には必ずstaticをつける */
static int sample2_init(void);

/** 
 * @brief システムを初期化し、もしarg1が０でなければarg2をarg1で割った値を出力する
 * 
 * @param arg1 割る数
 * @param arg2 割られる数
 * 
 * @return arg2をarg1で割った商（ただしarg1が０のときは０を返す）
 */
int sample2_execute(int arg1, int arg2)
{
	int val = 0;

	sample2_init();

	/* ###除算や剰余算の右辺式は，0でないことを確認してから演算を行う */
	if (arg1 != 0) {
		val = arg2 / arg1;
	}

	hardware_output(val);

	return val;
}

/** 
 * @brief システムを初期化
 * 
 * @return 結果（0なら成功、それ以外は失敗）
 */
int sample2_init(void)
{
	int rslt;

	/* ###関数がエラー情報を返す場合，戻り値を確認して異常時の処理を行う */
	rslt = init_device();
	if (rslt != NO_ERROR) { return -1; }

	/* ### 意図的に何もしない文を記述する場合はコメントで目立たせる */
	while (hardware_get_initialized_flag() != TRUE) {
		/* Deviceが初期化されるまで待機 */
	}
}

