/* =====================================================================
* Copyright 2018 Oki Data Corporation. All rights reserved.
* Copyright 1999-2017 Oki Data Corporation. All rights reserved.
* ===================================================================== */
/****************************************************************************
* @FileName leisusIF.c
* @Version 00.40 2016.08.31
* @auther ttakagi@oki.com
****************************************************************************/
/*
Modification History
------------------------------------------------------------------------
[00.01] 1999/06/02
first edition
[00.02] 1999/06/22
add extend functions
[00.03] 1999/07/07
change kanji-format(*sjis*dos -> *euc-japan*unix)]
[00.10] 1999/09/03
second edition (include task comtrol)
[00.11] 1999/11/11 yyama@okidata.co.jp
void leisusIF_ReadStsHandler 1個所修正
[00.12] 1999/12/06 yyama@okidata.co.jp
leisusIF_GetFixedMemory() Fixed Memory取得関数作成
initApi()からコールする。
[00.13] 1999/12/07 yyama@okidata.co.jp
alloc_tbl, alloc_max, ex_alloc_tbl, ex_alloc_max をコメントアウト
(warningを避けるため)
[00.14] 1999/12/22 yyama@okidata.co.jp
initApi(),initExApi()変更.
leisusIF_GetFixedMemory()は削除、malloc()をmallocWM()に変更。
[00.15] 2000/01/12 ttakagi@okidata.co.jp
sendFuncWithCRDYTime関数作成。
[00.15] 2000/01/12 ttakagi@okidata.co.jp
puif_logがバッファをオーバする不具合を改修した
[00.16] 2000/05/15
leisusIF.cで-1でセマフォ解放待ちをするため
Leisus_Command(size, buf, leisusIF_SendAckHandler, NULL);がリターンして
来ない場合にダンマリになってしまう対策。
[00.17] 2000/06/10
ステータス読みだしコマンドがIGNOREDされる場合に、SC002になる不具合への対応。
[00.18] 2000/06/23 matsuda550@okisoft.co.jp
changeCRDYTime関数作成。
[00.19] 2002/04/16 T.Takagi
デバッグログ機能を拡張.
[00.20] 2002/12/26 T.Takagi
leisusIF_ReadStsHandlerのデバッグログ書式を変更
[00.21] 2003/10/08 J.Sato
デバッグログ取得有無の #if 条件を変更.
[00.22] 2004/04/22 J.Sato
S/C072 発生時は新たな通信を抑止するように変更.
[00.23] 2004/05/25 J.Sato
00.22 で使ったワークエリアが用途外なので新規追加.
[00.24] 2005/06/30 J.Sato
CU:PX734/5+PU:PX714/5 で立ち上がらない問題の対策.
[00.25] 2005/07/07 J.Sato
S/C072 の表示が出なくなるので 00.22 の変更を削除.
[00.26] 2007/06/29 J.Sato
デバッグログにタイムスタンプを追加、メモリ保存を高速化、割り込み中でなけれ
ばintLockする、他の改善.
[00.27] 2007/09/18 J.Sato
沖コマンドをIGNOREDされた時にSHUTDOWNルートに移行してしまう不具合の改修.
デバッグログ出力を単体でサポートするよう変更.
[00.28] 2008/05/10 J.Sato
デバッグログ用のコマンド文字列を追加.
[00.29] 2008/06/07 J.Sato
PX736MFP FourS 環境で PEM_DEBUG 付きだとコンパイルエラーが起きる問題の対応.
[00.30] 2008/10/28 J.Sato
デバッグログ用のコマンド文字列を追加 (PAGECANCEL).
[00.31] 2009/04/16 J.Sato
デバッグログ用のコマンド文字列を追加 (LKOUT、DPSAVE、SLPTIME).
[00.32] 2009/08/24 J.Sato
デバッグログ用のコマンド文字列を修正 (SSLFWRN、他).
[00.33] 2009/10/12 CTC M.Matsui
PX736MFP FatalError発生後、強制再起動するための対応.
[00.34] 2009/10/20 J.Sato
PX736MFP FatalError発生後、強制再起動した時、Null Pointer Accessする可能性
への対処 (PU通信エラーの通知ハンドラをNULLチェックしていなかったため).
[00.35] 2011/06/24 J.Sato
VIDEO関連のデバッグログ用のコマンド文字列を修正.
タイムスタンプを20msベースタイマから64bitタイマに変更.
[00.36] 2013/05/17 J.Sato
VIDEO関連のデバッグログ用のコマンド文字列を修正.
[00.37] 2013/07/16 J.Sato
デバッグ用メソッドの一部コメントアウトの書式が間違っていたので修正.
[00.38] 2014/02/28 J.Sato
デバッグログ用のコマンド文字列を追加.
[00.39] 2015/07/14 J.Sato
FourS でログが保存・参照できない問題への対策.
FLSHDATA で通信エラーになった時の詳細コード不正対策、他.
[00.40] 2016/08/31 J.Sato
ExCommand/Ack ログを有効にした時の問題点修正.
------------------------------------------------------------------------
*/
#include "leisusIF.h"
#include "leisusM.h"
#include "leisusPUC.h"
#include "smaps_types.h"
#include "foundation_class/Semaphore.h"
#include "foundation_class/MutexLock.h"
#include <stdio.h>
#include <string.h>
#include "okiTimestamp.h"
#include "memory_manager/WorkMemoryAllocator.h"
#ifndef TRUE
typedef int BOOL;
#define TRUE 1
#define FALSE 0
#endif
#define GET_LEISUSIF_LOG 1 /* Only for Debugging Purpose */
#define GET_LEISUSIF_EX_LOG 0
/* kind of functions */
#define LEISUS_IF_SENDFUNC 0x00 /* sendFunc */
#define LEISUS_IF_SENDEXFUNC 0x01 /* sendExFunc */
#define LEISUS_IF_READFUNC 0x02 /* readFunc */
#define LEISUS_IF_READEXFUNC 0x03 /* readExFunc */
#define LEISUS_IF_ACKFORSEND 0x04 /* send(Ex)Func-ACK */
/* 0x05 *//* (reserved) */
#define LEISUS_IF_ACKFORREAD 0x06 /* read(Ex)Func-ACK */
#define LEISUS_IF_READSTATUS 0x07 /* read(Ex)Func-STS */
#define LEISUS_IF_CALLEVENT 0x08 /* callEvent */
#define LEISUS_IF_CALLEXEVENT 0x09 /* callExEvent */
#define LEISUS_IF_SETCRDYTIME 0x0a /* sendExFunc-setCRDYTime */
/* 0x0b *//* (reserved) */
#define LEISUS_IF_INTERRUPT 0x0f /* video interrupt (reserved) */
#define LEISUS_IF_INFORMATION 0x10
#define LEISUS_IF_COMERROR 99 /* communication error */
#define LEISUS_IF_TIMEOUT 100
#define LEISUS_IF_ENDMARKER 0xff /* terminator */
#if (defined(PEM_DEBUG) && (GET_LEISUSIF_LOG || GET_LEISUSIF_EX_LOG))
#define PUIFLOGMAX 1024
extern void puifprint(void);
extern void PuIfLogFunc(unsigned char kind, int size, unsigned char *buf);
extern void PuIfLogClear(void);
#define INIT_PUIF_LOG() PuIfLogClear()
#else
#define INIT_PUIF_LOG()
#endif /* (GET_LEISUSIF_LOG) */
#if (defined(PEM_DEBUG) && GET_LEISUSIF_LOG)
#define GET_PUIF_LOG(kind, size, data) PuIfLogFunc(kind, size, data)
#define GET_PUIF_LOG1(kind, data0) \
{ \
unsigned char buf[1]; \
buf[0] = data0; \
GET_PUIF_LOG(kind, 1, buf); \
}
#else
#define GET_PUIF_LOG(kind, size, data)
#define GET_PUIF_LOG1(kind, data0)
#endif /* (GET_LEISUSIF_LOG) */
#if (defined(PEM_DEBUG) && GET_LEISUSIF_EX_LOG)
#define GET_PUIF_EX_LOG(kind, size, data) PuIfLogFunc(kind, size, data)
#define GET_PUIF_EX_LOG2(kind, data0, data1) \
{ \
T_CMD buf[2]; \
buf[0] = data0; \
buf[1] = data1; \
GET_PUIF_EX_LOG(kind, 2, buf); \
}
#else
#define GET_PUIF_EX_LOG(kind, size, data)
#define GET_PUIF_EX_LOG2(kind, data0, data1)
#endif /* (GET_LEISUSIF_LOG) */
/****************************************************/
/*** func型 : ハンドラ情報 ***/
/****************************************************/
typedef struct {
T_CMD cmd; /* leisusu-Mコマンド識別子 */
unsigned int type; /* コマンドタイプ(未使用) */
void (*funcPtr)(); /* ハンドラ */
} T_FUNC;
/****************************************************/
/*** 静的変数 ***/
/****************************************************/
static int exIsInitSem = 0; /* セマフォ初期化状態(1:済) */
static Semaphore* exSyncSem; /* タスク同期セマフォ */
static MutexLo