#===============================================================================
# SSS Firmware
#===============================================================================
# File 			:	lib_io.sh
# Who			:	JWB
# Descripttion	:	iomicom ,global definition, message, buzzer
#
# Copyright		:	LG ELECTRONICS INC.
# history 		:	2008.11.21 separated from lib_sss
#===============================================================================
IO_ID_GET_IP_ADDR=0x03
IO_ID_GET_NET_MASK=0x04
IO_ID_GET_GATE_WAY=0x05
IO_ID_GET_FILE_NAME=0x06
IO_ID_GET_SER_NUM0=0x07
IO_ID_GET_SER_NUM1=0x08
IO_ID_GET_BOOT_TYPE=0x09
IO_ID_GET_AGING_TYPE=0x0a
IO_ID_GET_FAN_RPM=0x0b

IO_ID_SET_RD_DATA=0x80
IO_ID_SET_SV_NAME_0=0x81
IO_ID_SET_SV_NAME_1=0x82
IO_ID_SET_IP_ADDR=0x83
IO_ID_SET_TIME=0x84
IO_ID_SET_ST_CAPA=0x85
IO_ID_SET_SYS_STATE=0x86
STATE_TYPE_SYS=0x00
#SYS_STATE_BOOTED=0x01
#SYS_STATE_HALT_START=0x02
#SYS_STATE_HALTED=0x03
#SYS_STATE_USBBACKUP=0x07
#SYS_STATE_ENCTONORAM=0x08
STATE_TYPE_MNT=0x01
#MNT_STATE_UNLOAD=0x00
#MNT_STATE_OPEN=0x01
#MNT_STATE_LOAD=0x02
#MNT_STATE_LOADING=0x03
STATE_TYPE_BCK=0x02
#BCK_STATE_NONE=0x00
#BCK_STATE_STARTED=0x01
#BCK_STATE_ENDED=0x02
STATE_TYPE_BURN=0x03
#BURN_STATE_NONE=0x00
#BURN_STATE_STARTED=0x01
#BURN_STATE_ENDED=0x02
STATE_TYPE_INITPASSWD_COMP=0x04
IO_ID_SET_SVC_CODE=0x87
IO_ID_SET_RAID_SYNC=0x88
IO_ID_USB_INFO=0x89
IO_ID_UPS_INFO=0x8A
IO_ID_HDD_FAIL=0x8B
IO_ID_ODD_EJECT=0x8C
IO_ID_MN_VER=0x8D
IO_ID_LED_STATE=0x8E
IO_ID_FAN_RPM=0x8F

IO_ID_SET_VOL_NAME_0=0x90
IO_ID_SET_VOL_NAME_1=0x91
IO_ID_SET_NET_MASK=0x92
IO_ID_SET_GATE_WAY=0x93
IO_ID_BUZ=0xA0
IO_ID_FILE_NAME=0xD0
IO_ID_ERR_MSG=0xD1
IO_ID_MSG_KEEP=0xD2
IO_ID_MC_UPDATE=0xF0
#===============================================================================
# SSS global Variable
#===============================================================================
SSS_SOC=`cat /proc/soc_type |awk '{print $1}'`
SSS_SATA_CONTROLLER=`cat /proc/scsi/mvSata/0 |grep DeviceID |awk -F' |,' '{print $2}'`
SSS_TWSI="/dev/sss_twsi"
SSS_NOTICE="/dev/sss_notice"
SSS_DISK_DIR="/etc/sss_script/disk"
SSS_DISK_LED_STS=${SSS_DISK_DIR}"/disk_led_status"
SSS_USB_LIST_NEW=${SSS_DISK_DIR}"/usb_list_new"
SSS_USB_LIST=${SSS_DISK_DIR}"/usb_list"
DIF_SCSI_LIST=${SSS_DISK_DIR}"/scsi_list"
VOLCONF=${SSS_DISK_DIR}"/vol.conf"
SIF_VER_LIST="/etc/sss_script/system/ver_list"
SSS_LAST_USB="/etc/sss_script/disk/last_usb"
SSS_EMAIL_SHELL="/etc/sss_script/email/email-notification.sh"
SSS_EVENT_DIR="/etc/sss_script/event"
SSS_LOG_SYS_NOTICE="/var/log/messages"
SSS_SYS_FW_LOG=${SSS_EVENT_DIR}"/sss_fw_version"
SSS_ODD_FW_LOG=${SSS_EVENT_DIR}"/sss_odd_fw_version"
SSS_FW_LOG=${SSS_EVENT_DIR}"/sss_fw_log"
SSS_CONF_SYS=${SSS_EVENT_DIR}"/sss_fw_config"
SSS_CONF_USER_DIR="/boot/config"
SSS_CONF_USER_LIST="/boot/config/user_conf.list"
SSS_CONF_SYS_FW="/boot/n4b1_conf.tar.bz2"
SSS_INITIAL_FW="/boot/n4b1_init.tar.bz2"

SSS_VOL1="/mnt/fs/Vol1"
SSS_VOL2="/mnt/fs/Vol2"
SSS_VOL3="/mnt/fs/Vol3"
SSS_VOL4="/mnt/fs/Vol4"

SSS_VOL1_SYSTEM_DIR=${SSS_VOL1}"/system"
SSS_VOL1_SHARE_DIR=${SSS_VOL1_SYSTEM_DIR}"/Share"
SSS_BACKUP_DIR=${SSS_VOL1_SYSTEM_DIR}"/Backup"
SSS_DISCBACKUP_DIR=${SSS_BACKUP_DIR}"/IMG"

MSG_JOB_LIST="/etc/sss_script/event/msg_job_list"
MSG_JOB_SHELL="/usr/local/bin/msg_job.sh"
MSG_JOB_DAEMON="/usr/local/bin/msgjobd"
MSG_JOB_INTERVAL=10
AUTOSCRIPT="lge_script"
BAY_NAME_CONVERT="on"
#===============================================================================
# FAN RPM and Temperature
# table_fan_t lgdiag_fan_mode[] = {
# 	    {	0,		0,		100,	"LGDIAG_FAN_STOP",	},
# 		{  17,    700,     1100,	"LGDIAG_FAN_SILENT",},//900,
# 	    {  27,   1000,     1400,	"LGDIAG_FAN_NORMAL",},//1200,
# 	    { 255,   1300,	   2000,	"LGDIAG_FAN_COOL",	},//1560, 12V
# };
#===============================================================================
TEMP_SHUTDOWN=75
TEMP_COOL=56
TEMP_NORMAL=49

#RPM_COOL=255
#RPM_NORMAL=27
#RPM_SILENT=17
# New Fan Rpm Profile
RPM_COOL=29
RPM_NORMAL=20
RPM_SILENT=11
#===============================================================================
# EVENT MSG
#===============================================================================
#0        1         2         3         4         5
#12345678901234567890123456789012345678901234567890
MSG=(
'Link down. Please check LAN cable connection'  #0
'LAN is Link up'                                #1
'has no partition'                              #2
'Unknown format'                                #3
'formatting...'                                 #4
'formatted'                                     #5
'mounted'                                       #6
'unmounted'                                     #7
'USB backup start'                              #8
'USB backup complete'                           #9
'Reserved'                                      #10
'No volume!!! Please create user volume'		#11
'Adding disk...'                                #12
'creating...'                                   #13
'removed'                                       #14
'resyncing...'                                 #15
'resync done'                                  #16
'expanding...'                                  #17
'Raid fault occurred!!! Replace the faulty bay' #18
'expanded'                                      #19
'Initializing Admin Password...'                #20
'Admin Password Initialized'                    #21
'Reserved'                                      #22
'Disk removed'                                  #23
'Disk added'                                    #24
'Disk formatting...'                            #25
'Reserved'                                      #26
'Reserved'                                      #27
'Check UPS connection'                          #28
'UPS unsynchronized'                            #29
'UPS synchronized'                              #30
'UPS unconnected'                               #31
'UPS battery Low'                               #32
'UPS power fail. Please shut down this system'   #33
'Shut down from UPS power fail...'              #34
'Reserved'                                      #35
'Reserved'                                      #36
'Reserved'                                      #37
'Reserved'                                      #38
'Temperature Exceeding'                         #39
'Fan Error Occured'                             #40
'setting...'                                    #41
'set complete'                                  #42
'Reserved'                                      #43
'ODD is busy'                                   #44
'Extracting Audio CD...'                        #45
'Audio CD extracted'                            #46
'Reserved'                                      #47
'Reserved'                                      #48
'Reserved'                                      #49
'Reserved'                                      #50
'CDROM mounted'                                 #51
'CDROM unmounted'                               #52
'Reserved'                                      #53
'Reserved'                                      #54
'Reserved'                                      #55
'Reserved'                                      #56
'Extracting DVD title...'                       #57
'DVD title extracted'                           #58
'Reserved'                                      #59
'Reserved'                                      #60
'Reserved'                                      #61
'Reserved'                                      #62
'Backup Disc image...'                          #63
'Disc image backup complete'                    #64
'Disc burnnig...'                               #65
'Disc burn complete'                            #66
'Tray Open'                                     #67
'Tray Close'                                    #68
'Tray Load'                                     #69
'Reserved'                                      #70
'Initializing System factory...'                #71
'System factory initialized'                    #72
'Shutting down System...'                       #73
'Restarting System...'                          #74
'Updating System...'                  		#75
'System update complete'                        #76
'Updating U-Boot...'                            #77
'U-Boot update complete'                        #78
'Updating Kernel...__deleted'                   #79
'Kernel update complete__deleted'               #80
'Updating Micom...'                  		#81
'Micom update complete'                         #82
'Updating Blu-ray...'                           #83
'Blu-ray update complete'                       #84
'Update failed'                 		#85
'Initialize failed'                             #86
'Reserved'                                      #87
'Starting auto run script...'                   #88
'Auto run script complete'                      #89
'Updating DVD...'                               #90
'DVD update complete'                           #91
'Fan Communication Error!!!'                    #92
'Shut down from high temperature...'            #93
'Reserved'                                      #94
)
#
MSGTABLE=(
'BAY1'                                          #0
'BAY2'                                          #1
'BAY3'                                          #2
'BAY4'                                          #3
'Vol1'                                          #4
'Vol2'                                          #5
'Vol3'                                          #6
'Vol4'                                          #7
'of Vol1'                                       #8
'of Vol2'                                       #9
'of Vol3'                                       #10
'of Vol4'                                       #11
'Blu-ray Driver'                                #12
'BD'                                            #13
'USB'                                           #14
'USB1'                                          #15
'USB2'                                          #16
'USB3'                                          #17
'Memory Slot'                                   #18
'UPS'                                           #19
'Printer'                                       #20
'Blu-ray Disc'                                  #21
'BD'                                            #22
'DVD'                                           #23
'DVD-Title'                                     #24
'CD'                                            #25
'Audio'                                         #26
'System'                          				#27
'Micom'                                         #28
'Fan'                                           #29
'Lan'                                           #30
'Image'                                         #31
'Tray'                                          #32
'Check'                                         #33
'Connection'                                    #34
'Migration'                                     #35
'High Temperature'                              #36
'Rsv'                                           #37
'Rsv'                                           #38
'Rsv'                                           #39
'Rsv'                                           #40
'Rsv'                                           #41
'Rsv'                                           #42
'Rsv'                                           #43
'Rsv'                                           #44
'Power Fail'                                    #45
'Disc'                                          #46
'No Disc'                                       #47
'Not Formattable Disc'                          #48
'Rsv'                                           #49
'formatting...'                                 #50
'formatted.'                                    #51
'adding...'                                     #52
'added.'                                        #53
'resynching...'                                 #54
'resynched.'                                    #55
'expanding...'                                  #56
'expanded.'                                     #57
'deleting...'                                   #58
'deleted.'                                      #59
'firmware updating...'                			#60
'firmware updated.'                         	#61
'updating...'                                   #62
'updated.'                                      #63
'hot removed.'                                  #64
'hot added.'                                    #65
'burnning...'                                   #66
'burn complete.'                                #67
'Rsv'                                           #68
'Rsv'                                           #69
'Rsv'                                           #70
'Rsv'                                           #71
'syncing...'                                   #72
'sync complete.'                               #73
'backup...'                                     #74
'backup complete.'                              #75
'extracting...'                                 #76
'extracted.'                                    #77
'restoring...'                                  #78
'restored.'                                     #79
'initializing...'                               #80
'initialized.'                                  #81
'factory initializing...'                       #82
'factory initialized.'                          #83
'connecting...'                                 #84
'connected'                                     #85
'closed'                                        #86
'opened'                                        #87
'loading...'                                    #88
'Rsv'                                           #89
'Rsv'                                           #90
'restarting...'                                 #91
'shutting down...'                              #92
'abnormal endded!!!'                            #93
'canceled!!!'                                   #94
'updating failed!!!'                            #95
'detected.'                                     #96
'complete.'                                     #97
'denied!!!'                                     #98
'Unknown format!!!'                             #99
'LAN is link up.'                              	#100
'Link down!!! please check Lan connection.'  	#101
'Rsv'                                           #102
'Rsv'                                           #103
'Rsv'                                           #104
'Rsv'                                           #105
'Rsv'                                           #106
'Rsv'                                           #107
'Rsv'                                           #108
'Rsv'                                           #109
)
#===============================================================================
# functions
#===============================================================================
#===============================================================================
# Description	:	Decimal to hexadecimal
# input 		:	1~8( decimal or hex )
# output 		:   hex(0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX)
#===============================================================================
DecToHex()
{
	#echo "DecToHex($*)"
	#printf "0x%x\n" $1
	nice --10 printf "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x" $1 $2 $3 $4 $5 $6 $7 $8
}
#===============================================================================
# Description	:	Write Data to Micom with TWSI
# input 		:	1( decimal or hex )
# output 		:   hex(0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX)
#===============================================================================
IoWrite()
{
	#echo "IoWrite($*)"
	nice --5 flock $SSS_TWSI echo	`DecToHex $1 $2 $3 $4 $5 $6 $7 $8` > $SSS_TWSI
}
#===============================================================================
# Description	:
# input 		:	micom id
# output 		:   dword1 , dword0
#===============================================================================
SSS_IoReadPre()
{
    #echo "SSS_IoRead($*)"
    bIoRetry=0
    while [ "$bIoRetry" -le 5 ] ; do
    	bIoRetry=$(($bIoRetry + 1))
	    temp=`IoWrite $IO_ID_SET_RD_DATA $1`
	    aIoR=(`cat /dev/sss_twsi`)
	
	    D0=$(( ${aIoR[2]} & 0xff))
	    D1=$(((${aIoR[2]} & 0xff00)    >> 8))
	    D2=$(((${aIoR[2]} & 0xff0000)  >> 16))
	    D3=$(((${aIoR[2]} & 0xff000000)>> 24))
	    
	    D4=$(( ${aIoR[1]} & 0xff))
	    D5=$(((${aIoR[1]} & 0xff00)    >> 8))
	    D6=$(((${aIoR[1]} & 0xff0000)  >> 16))
	    D7=$(((${aIoR[1]} & 0xff000000)>> 24))
	    
	    bCS=$(($D0^$D1^$D2^$D3^$D4^$D5^$D6))
	    if [ "$bCS" != "$D7" ]; then
	    	continue
	    else
	    	echo $D0 $D1 $D2 $D3 $D4 $D5 $D6 $D7
	    	return 0
	    fi
	done
	return 1
}
SSS_IoRead()
{
	#echo "SSS_IoRead1($*)"
    IoReadRetry=0
    while [ "$IoReadRetry" -le 5 ] ; do
    	IoReadRetry=$(($IoReadRetry + 1))
		SSS_IoReadPre $1
		if [ $? = 0 ]; then
			return 0
		else
			continue
		fi
	done
	return 1
}
#===============================================================================
# Description	:	String To Hexadecimal
# input 		:	1(offset of string)
#				:	2(length of string to convert)
#				:	3(string)
# output 		:   hex(0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX)
#===============================================================================
StringToHex()
{
	#echo "StringToHex($*)"
	StringToHexSub $3 |awk -v ofs=$1 -v len=$2 -F' ' '
	{
		for(i=1; i<=len; i++){
			if($(i+ofs) == "")
				print 0x20" ";
			else
				print $(i+ofs)" ";
		}
	}'
}

#===============================================================================
# Description	:
# input 		:	1(string)
# output 		:   1(number of field)
#				:	2(StringToHex( 0x01 0x0c ...))
#===============================================================================
StringToHexSub()
{
	#echo "StringToHexSub($*)"
	nice --10 ascii -st $* |awk -F' ' '
	BEGIN{
		line = 0;
	}
	{
		S[line] = $3;
		line++;
	}
	END{
		for(i=0; i<line; i++){
			printf S[i]" ";
		}
	}'
}

#===============================================================================
# Description	:
# input 		:	#1. ps name
# output 		:   0:Yes It is 1: No
#===============================================================================
Check_GrepPs()
{
	sCheckPs=`ps -w`
	echo $sCheckPs | grep -i $1  > /dev/null 2>&1
}
#===============================================================================
# Description	:
# input 		:	1(string)
# output 		:   1(length of String)
#===============================================================================
StringLength()
{
	#echo "StringLength($*)"
	StringToHexSub $* |awk -F' ' '{print NF}'
}
#===============================================================================
# Description   :
# input         :   1(fan, shutdown, hdd, bay [remov]add [1/2/3/4])
# output        :   1()
#===============================================================================
SSS_SetEmailNotice()
{
    #echo "SSS_SetEmailNotice($*)"
    $SSS_EMAIL_SHELL $* > /dev/null 2>&1
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetServerVersion()
{
	#echo "SSS_SetServerName($*)"
	temp=`cat ${SSS_SYS_FW_LOG}|grep Version|awk -F'-' '{print $NF}'`
	temp="[${temp}]"
	IoWrite $IO_ID_MN_VER `StringToHex 0 6 $temp`
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetServerName()
{
	#echo "SSS_SetServerName($*)"
	temp=`hostname`
	StrLen=`StringLength $temp`
	IoWrite $IO_ID_SET_SV_NAME_0 `StringToHex 0 6 $temp`
	IoWrite $IO_ID_SET_SV_NAME_1 `StringToHex 6 6 $temp`

}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetIpAddr()
{
	#echo "SSS_IpAddr($*)"
	. /etc/sss_script/network/ifcfg-egiga0
	sTemp=`nice --10 ifconfig egiga0 |grep 'inet addr'`
	sAddr=${sTemp##*addr:}
	sAddr=${sAddr%% Bcast*}
	sMask=${sTemp##*Mask:}
	sGate=`route -n |tail -1` | awk '{print $2}'
	
	
	if [ "$BOOTPROTO" = "dhcp" ] ; then
		IoWrite $IO_ID_SET_IP_ADDR ${sAddr//./" "} 1
	else
		IoWrite $IO_ID_SET_IP_ADDR ${sAddr//./" "} 0
	fi
	
	IoWrite $IO_ID_SET_NET_MASK ${sMask//./" "}
	IoWrite $IO_ID_SET_GATE_WAY ${sGate//./" "}
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetIpAddrFromMcu()
{
	#echo "SSS_SetIpAddrFromMcu($*)"
	#killall sss_main
	tIP=(`SSS_IoRead $IO_ID_GET_IP_ADDR`)
	sIP=${tIP[1]}.${tIP[2]}.${tIP[3]}.${tIP[4]}
	#echo Main read from MCU IP : $sIP  > /dev/console
	sDHCP=${tIP[5]}
	#echo Main read from MCU DHCP : $sDHCP  > /dev/console
	if [ $sDHCP = 0 ] ; then
		tMK=(`SSS_IoRead $IO_ID_GET_NET_MASK`)
		sMASK=${tMK[1]}.${tMK[2]}.${tMK[3]}.${tMK[4]}
		#echo Main read from MCU MASK : $sMASK  > /dev/console
		tGW=(`SSS_IoRead $IO_ID_GET_GATE_WAY`)
		sGW=${tGW[1]}.${tGW[2]}.${tGW[3]}.${tGW[4]}
		#echo Main read from MCU GATE : $sGW  > /dev/console
		
		if 	[ $((${tIP[1]} & ${tMK[1]})) !=  $((${tGW[1]} & ${tMK[1]})) ] || \
			[ $((${tIP[2]} & ${tMK[2]})) !=  $((${tGW[2]} & ${tMK[2]})) ] || \
			[ $((${tIP[3]} & ${tMK[3]})) !=  $((${tGW[3]} & ${tMK[3]})) ] || \
			[ $((${tIP[4]} & ${tMK[4]})) !=  $((${tGW[4]} & ${tMK[4]})) ]; then
			SSS_SetIpAddr
			MSG_Once 'IP Address Not match with Gateway and Net Mask!!!'
			return 1
		fi
	fi

	MSG_Once IP Address ${MSG[42]}
	# ipup send ip to micom
	if [ $sDHCP = 0 ] ; then
		nice --10 /etc/sss_script/network/IFcfg key none $sIP $sMASK $sGW
	else
		nice --10 /etc/sss_script/network/IFcfg key dhcp 0 0 0
	fi
	MSG_Once IP Address ${MSG[42]}
	#ADDED BY TJP 05232009
	/usr/local/bin/upnp-portmap.sh

}
#===============================================================================
# Description	:
# input 		:	1(1:filenum)
# output 		:   1()
#===============================================================================
SSS_SetFileName()
{
	#echo "SSS_SetFileName($*)"

	cd ${SSS_DISCBACKUP_DIR}
	filetotal=`find *.iso *.cue *.ISO *.CUE 2>/dev/null |awk 'END{print NR}'`

	if [ "${filetotal}" = 0  ] ; then
		filename="none"
	else
		filename=`find *.iso *.cue *.ISO *.CUE 2>/dev/null |awk -v filenum=$1 '{if(NR == filenum ) print}'`
	fi
	filenumhex=`printf "0x%x" $1`
	filetotalhex=`printf "0x%x" $filetotal`

	nice --5 flock $SSS_TWSI echo $IO_ID_FILE_NAME 0x0 $filenumhex $filetotalhex $filename > $SSS_TWSI
}
SSS_SetFileNameFromMcu()
{
	#echo "SSS_SetFileNameFromMcu($*)"
	sFILENUM=`SSS_IoRead $IO_ID_GET_FILE_NAME | awk -F' ' '{print $2}'`
	#echo $sFILENUM
	SSS_SetFileName $sFILENUM
}

SSS_GetBurnFileName()
{
    #echo "SSS_GetBurnFileName($*)"
    BurnFileNum=`SSS_IoRead $IO_ID_GET_FILE_NAME |awk '{print $2}'`
    cd ${SSS_DISCBACKUP_DIR}
    BurnFileName=`find *.iso *.cue *.ISO *.CUE 2>/dev/null |awk -v filenum=$BurnFileNum '{if(NR == filenum ) print}'`
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetNetMask()
{
	echo "SSS_SetNetMask($*)"
	echo "Do Not use this function"
	
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetGateWay()
{
	echo "SSS_SetGateWay($*)"
	echo "Do Not use this function"
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetTime()
{
	#echo "SSS_SetTime($*)"
	#temp=`date +%-C" "%-y" "%-m" "%-d" "%-H" "%-M`
	IoWrite $IO_ID_SET_TIME `date +%-C" "%-y" "%-m" "%-d" "%-H" "%-M`
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetStorageCapa()
{
	#echo "SSS_SetStorageCapa($*)"

	#temp=`df |grep '/mnt/fs/Vol1'| awk '{sub("%","",$5); print $5}'`

	IoWrite $IO_ID_SET_ST_CAPA `df |grep '/mnt/fs/Vol1'| awk '{sub("%","",$5); print $5}'`
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetRaidState()
{
	grep "]  resync =" /proc/mdstat > /dev/null 2>&1
	sRet1=$?
	grep "]  recovery =" /proc/mdstat > /dev/null 2>&1
	sRet2=$?
	grep "]  reshape =" /proc/mdstat > /dev/null 2>&1
	sRet3=$?

	if [ "$sRet1" = 0 ] || [ "$sRet2" = 0 ] || [ "$sRet3" = 0 ]; then
		#echo raid resynching
		SSS_SetRaidSync 1
	else
		#echo raid resynch done
		SSS_SetRaidSync 0
	fi
}
SSS_SetBootEnd()
{
	SSS_SetSysState 0x01
	SSS_SetBuzzerBootEnd
}
#===============================================================================
# Description	:	
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetSvcCode()
{
	#echo "SSS_SetSvcCode($*)"
	IoWrite $IO_ID_SET_SVC_CODE $1 $2
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetSysState()
{
	IoWrite $IO_ID_SET_SYS_STATE $STATE_TYPE_SYS $1
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetMountState()
{
	IoWrite $IO_ID_SET_SYS_STATE $STATE_TYPE_MNT $1
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetBackupState()
{
	IoWrite $IO_ID_SET_SYS_STATE $STATE_TYPE_BCK $1
}

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetBurnState()
{
	IoWrite $IO_ID_SET_SYS_STATE $STATE_TYPE_BURN $1
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetInitPasswdComplete()
{
	IoWrite $IO_ID_SET_SYS_STATE $STATE_TYPE_INITPASSWD_COMP
}

#===============================================================================
# Description	:
# input 		:	1(1:now 0:down)
# output 		:   1()
#===============================================================================
SSS_SetRaidSync()
{
	IoWrite $IO_ID_SET_RAID_SYNC $1
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1(Hdd 4[sdd],3[sdc],2[sdb],1[sda] : bit 3,2,1,0)
#===============================================================================
SSS_GetDiskFailLed()
{
	bLed=0
	aLedT=(`cat $SSS_DISK_LED_STS`)
	
	[ "${aLedT[1]}" != 0 ] && bLed=$(($bLed | 0x01));
	[ "${aLedT[3]}" != 0 ] && bLed=$(($bLed | 0x02));
	[ "${aLedT[5]}" != 0 ] && bLed=$(($bLed | 0x04));
	[ "${aLedT[7]}" != 0 ] && bLed=$(($bLed | 0x08));
	
	echo $bLed
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1(Hdd 4[sdd],3[sdc],2[sdb],1[sda] : bit 3,2,1,0)
#===============================================================================
SSS_SetDiskFailStatus()
{
	let "ret=$1 & 1"
	if [ "$ret" != 0 ]; then
		flock $SSS_DISK_LED_STS echo "host0	1"	> $SSS_DISK_LED_STS
	else
		flock $SSS_DISK_LED_STS echo "host0	0"	> $SSS_DISK_LED_STS
	fi
	let "ret=$1 & 2"
	if [ "$ret" != 0 ]; then
		flock $SSS_DISK_LED_STS echo "host1	1"	>> $SSS_DISK_LED_STS
	else
		flock $SSS_DISK_LED_STS echo "host1	0"	>> $SSS_DISK_LED_STS
	fi
	let "ret=$1 & 4"
	if [ "$ret" != 0 ]; then
		flock $SSS_DISK_LED_STS echo "host2	1"	>> $SSS_DISK_LED_STS
	else
		flock $SSS_DISK_LED_STS echo "host2	0"	>> $SSS_DISK_LED_STS
	fi
	let "ret=$1 & 8"
	if [ "$ret" != 0 ]; then
		flock $SSS_DISK_LED_STS echo "host3	1"	>> $SSS_DISK_LED_STS
	else
		flock $SSS_DISK_LED_STS echo "host3	0"	>> $SSS_DISK_LED_STS
	fi
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1(Hdd 4[sdd],3[sdc],2[sdb],1[sda] : bit 3,2,1,0)
#===============================================================================
SSS_SetDiskFailLed()
{
	return
	
	LEDDATA_OLD=`SSS_GetDiskFailLed`

	case "$1" in
		host0)	LEDDATA=1	;;
		host1)	LEDDATA=2	;;
		host2)	LEDDATA=4	;;
		host3)	LEDDATA=8	;;
		all)	LEDDATA=15	;;
		"")		IoWrite $IO_ID_LED_STATE $LEDDATA_OLD
				return		;;
		*)		return		;;
	esac


	case "$2" in
	on) 	FAIL_HDD_LED=$(( $LEDDATA_OLD |  $LEDDATA ))	;;
	off)	FAIL_HDD_LED=$(( $LEDDATA_OLD & ~$LEDDATA ))	;;
	esac

	#if [ $FAIL_HDD_LED != "" ]; then
		SSS_SetDiskFailStatus $FAIL_HDD_LED
		IoWrite $IO_ID_LED_STATE $FAIL_HDD_LED
	#fi
}

#===============================================================================
# Description	:
# input 		:	1(fan level) 		0: (fan off)
#										1: (fan rpm 255 : 12V)
#										2: (fan rpm 200 : 10V)
#										3: (fan rpm 150 : 8V)
# input(new FAN):	1(fan level) 		0: (fan off)
#										1: (fan rpm 80~255(0x50~0xff) : 12V)
#										2: (fan rpm 32(0x20) : 10V)
#										3: (fan rpm 22(0x16) : 8V)
# output 		:   1(rpm duty : 0 ~ 255)
#===============================================================================
SSS_GetFanRpm()
{
	wRPM=`SSS_IoRead $IO_ID_GET_FAN_RPM | awk '{print $2 * 256 + $3}'`
}
SSS_SetFanRpm()
{
	FrCnt=0
	while [ "$FrCnt" -le 5 ]; do
		FrCnt=$(( $FrCnt + 1))
		IoWrite $IO_ID_FAN_RPM $1
		
		SSS_GetFanRpm
		if [ "$1" != 0 ] && [ "$wRPM" -lt 400 ]; then
			sleep 2
			continue;
		elif [ "$1" = 0 ] && [ "$wRPM" -gt 100 ]; then
			sleep 2
			continue;
		else
			break;
		fi
	done
	if [ "$FrCnt" -ge 5 ] ; then
		echo [`date`]"Error : Fan Communition"  >> ${SSS_LOG_SYS_NOTICE}
		MSG_Once ${MSG[92]}
		SSS_SetBuzzerAlarmFanError
	fi
}
#===============================================================================
# Description	:
# input 		:			0		: (fan off)					 0V
#							150		: silent( temp <= 49 degree) 8V
#							200		: normal( temp > 49 degree) 10V
#							255		: cool  ( temp > 56 degree) 12V
#									: shutdown( temp > 62 degree)
# PWM Duty and Voltage table
# 255 		: 	12.0V	cool  ( temp > 56 degree)
# 200 		: 	10.0V	normal( temp > 49 degree)
# 150 		: 	8.0 V	silent( temp <= 49 degree)
# 102 		: 	6.0 V	silent( temp <= 49 degree)
#===============================================================================
FAN_ReadTemp()
{
	#AllDisks="sda sdb sdc sdd"
	#allbays=(`cat /etc/sss_script/disk/scsi_list |grep host[0-3] ' |awk '{print $1}'`)
	allbays=(`find /sys/block/ -name device |xargs ls -al |grep host[0-3]/ |awk -F'/' '{print $4}' | sort -r`)
	temp=0
	tempmax=0
	tempmaxdisk="none"
	#for Disk in $AllDisks
	for Disk in ${allbays[*]}
	do
		SSS_GetDiskTemperature ${Disk}
		temp=$?
		if [ $temp -le 85 ]; then
			tempmax=$temp
			tempmaxdisk=${Disk}
			break
		fi
	done
	echo "tempmax    :"$tempmax > /etc/sss_script/event/fan_info
	echo "tempmaxdisk:"$tempmaxdisk >> /etc/sss_script/event/fan_info
	#echo [`date`]"tempmax    :${tempmax}" >> ${SSS_LOG_SYS_NOTICE}
	#echo [`date`]"tempmaxdisk:${tempmaxdisk}" >> ${SSS_LOG_SYS_NOTICE}
}
FAN_Control()
{
	#echo "FAN_Control($*)"
	
	FcCnt=0
	while [ "$FcCnt" -le 5 ]; do
		FcCnt=$(expr $FcCnt + 1)
		FAN_ReadTemp

		if [ $tempmax -gt $TEMP_SHUTDOWN ]; then
			if [ "$FcCnt" -ge 5 ]; then
				echo "rpmmode:TEMP_SHUTDOWN" >> /etc/sss_script/event/fan_info
				echo [`date`]"TEMP_SHUTDOWN tempmax :" $tempmax  >> ${SSS_LOG_SYS_NOTICE}
				MSG_Add ${MSG[93]}
				SSS_SetBuzzerAlarmTempShutdown
				shutdown
				break;
			else
				echo [`date`]"TEMP_SHUTDOWN tempmax : $tempmax($FcCnt)" >> ${SSS_LOG_SYS_NOTICE}
				sleep 60
				continue;
			fi
		elif [ $tempmax -gt $TEMP_COOL ]; then
			SSS_SetFanRpm $RPM_COOL
			echo "rpmmode:RPM_COOL" >> /etc/sss_script/event/fan_info
			break;
		elif [ $tempmax -gt $TEMP_NORMAL ]; then
			SSS_SetFanRpm $RPM_NORMAL
			echo "rpmmode:RPM_NORMAL" >> /etc/sss_script/event/fan_info
			break;
		else
			SSS_SetFanRpm $RPM_SILENT
			echo "rpmmode:RPM_SILENT" >> /etc/sss_script/event/fan_info
			break;
		fi
	done
	SSS_GetFanRpm
	echo "current_rpm:"$wRPM >> /etc/sss_script/event/fan_info
}
#===============================================================================
# Description   :	SSC Control for Hitach HDD, referenced by /sbin/shutdown
# input         :   1()
# output        :   1(on:1 off:0)
##===============================================================================
SSS_SSCcontrol()
{
	allbays=(`find /sys/block/ -name device |xargs ls -al |grep host[0-3]/ |awk -F'/' '{print $4}' | sort -r`)
	for Disk in ${allbays[*]}
	do
		sss_main hdd sscon /dev/${Disk}
    done
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1(on:1 off:0)
#===============================================================================
SSS_SetBuzzer()
{
	#echo "SSS_SetBuzzer($*)"
	IoWrite $IO_ID_BUZ $1
}
#===============================================================================
# Description	:
# input 		:	1(duty_on: msec) 2(duty_off: msec) 3(count)
# output 		:   1(on:1 off:0)
#===============================================================================
SSS_SetBuzzerCount()
{
	#echo "SSS_SetBuzzerCount($*)"
	duty_on=$(($1 * 1000))
	duty_off=$(($2 * 1000))
	count=$3

	num=1
	while [ "$num" -le "$count" ]; do
		SSS_SetBuzzer 1
		usleep $duty_on
		SSS_SetBuzzer 0
		usleep 1
		SSS_SetBuzzer 0
		usleep $duty_off

		num=$(($num + 1))
	done
}
SSS_SetBuzzerBtn()
{
	#echo "SSS_SetBuzzerBtn($*)"
	SSS_SetBuzzer 1
	usleep $((10*1000))
	SSS_SetBuzzer 0
	usleep 1
	SSS_SetBuzzer 0
}
# 1(S1 : Octab1(0x01 - 0x07) Octab2(0x11 - 0x17) Octab3(0x21 - 0x27))
# 2(S2)
# 3(S3)
# 4(S4)
# 5(Sound Delay:10ms)
# 6(Interval Delay:10ms)
SSS_SetBuzzerNew()
{
	#echo "SSS_SetBuzzerNew($*)"
	nice -5 flock $SSS_TWSI echo 0xa1 $* > $SSS_TWSI
	usleep 100000
}
SSS_SetBuzzerErr1()
{
	SSS_SetBuzzerNew 0x15 0x11 0x15 0x11 0x8 0x5
}
SSS_SetBuzzerOk1()
{
	SSS_SetBuzzerNew 0x11 0x13 0x15 0x0 0x8 0x5
}
# SSS_SetFindMe
SSS_SetBuzzerAlarm1()
{
	SSS_SetBuzzerNew 0x11 0x12 0x13 0x14 0x5 0x3
}
# SSS_SetBuzzerAlarmTempShutdown
SSS_SetBuzzerAlarm2()
{
	SSS_SetBuzzerNew 0x14 0x13 0x12 0x11 0x5 0x3
}
# SSS_SetBuzzerBootEnd
SSS_SetBuzzerAlarm0()
{
	SSS_SetBuzzerNew 0x11 0x13 0x15 0x21 0x14 0x1
}
# SSS_SetBuzzerShutdown
SSS_SetBuzzerAlarm3()
{
	SSS_SetBuzzerNew 0x21 0x15 0x13 0x11 0x14 0x1
}
# SSS_SetBuzzerRmvMount
SSS_SetBuzzerAlarm4()
{
	SSS_SetBuzzerNew 0x11 0x13 0x15 0x0 0x8 0x5
}
# SSS_SetBuzzerRmvUnmount
SSS_SetBuzzerAlarm5()
{
	SSS_SetBuzzerNew 0x15 0x13 0x11 0x0 0x8 0x5
}
# LGE Script Start / 
SSS_SetBuzzerAlarm6()
{
	SSS_SetBuzzerNew 0x21 0x23 0x25 0x0 0x8 0x5
}
# LGE Script End
SSS_SetBuzzerAlarm7()
{
	SSS_SetBuzzerNew 0x25 0x23 0x21 0x0 0x8 0x5
}
# Bay Hot Added
SSS_SetBuzzerAlarm8()
{
	SSS_SetBuzzerNew 0x23 0x25 0x0 0x0 0x8 0x5
}
#  Bay Hot Removed
SSS_SetBuzzerAlarm9()
{
	SSS_SetBuzzerNew 0x25 0x23 0x25 0x23 0x8 0x5
}
SSS_SetFindMe()
{
	BuzCnt=3
	while [ "$BuzCnt" -gt 0 ]; do
		BuzCnt=$(expr $BuzCnt - 1)
		SSS_SetBuzzerAlarm1
	done
}
SSS_SetBuzzerAlarmTempShutdown()
{
	SSS_SetEmailNotice shutdown
	BuzCnt=10
	while [ "$BuzCnt" -gt 0 ]; do
		BuzCnt=$(expr $BuzCnt - 1)
		SSS_SetBuzzerAlarm2
		sleep 1
	done
}
SSS_SetBuzzerAlarmFanError()
{
	SSS_SetEmailNotice fan
	BuzCnt=5
	while [ "$BuzCnt" -gt 0 ]; do
		BuzCnt=$(expr $BuzCnt - 1)
		SSS_SetBuzzerAlarm1
		SSS_SetBuzzerAlarm2
		sleep 1
	done
}
SSS_SetBuzzerBootEnd()
{
	SSS_SetBuzzerAlarm0
}
SSS_SetBuzzerShutdown()
{
	SSS_SetBuzzerAlarm3
}
SSS_SetBuzzerRmvMount()
{
	SSS_SetBuzzerAlarm4
}
SSS_SetBuzzerRmvUnmount()
{
	SSS_SetBuzzerAlarm5
}
SSS_SetBuzzerLgeScriptStart()
{
	SSS_SetBuzzerAlarm6
}
SSS_SetBuzzerLgeScriptEnd()
{
	SSS_SetBuzzerAlarm7
}
SSS_SetBuzzerBayHotRemoved()
{
	
	BuzCnt=3
	while [ "$BuzCnt" -gt 0 ]; do
		BuzCnt=$(expr $BuzCnt - 1)
		SSS_SetBuzzerAlarm9
	done
}
SSS_SetBuzzerBayHotAdded()
{
	SSS_SetBuzzerAlarm8
}
#===============================================================================
# Description	:
# input 		:	message
# output 		:   1
#===============================================================================
SSS_SetEventMsg()
{
	#echo "SSS_SetEventMsg($*)"

	StrLen=`StringLength $*`
	StrLenHex=`printf "0x%x" $(($StrLen + 2))`
	nice -5 flock $SSS_TWSI echo $IO_ID_ERR_MSG $StrLenHex 0x00 0x00 $* > $SSS_TWSI

	if [ $? != 0 ] ; then
		echo [`date`]"SSS_SetEventMsg($*)" Error  >> ${SSS_LOG_SYS_NOTICE}
	fi
	
}
SSS_SetEventMsgKeep()
{
	#echo "SSS_SetEventMsgKeep($*)"

	StrLen=`StringLength $*`
	StrLenHex=`printf "0x%x" $(($StrLen + 2))`
	nice -5 flock $SSS_TWSI echo $IO_ID_MSG_KEEP $StrLenHex 0x00 0x00 $* > $SSS_TWSI

	if [ $? != 0 ] ; then
		echo [`date`]"SSS_SetEventMsgKeep($*)" Error  >> ${SSS_LOG_SYS_NOTICE}
	fi
}
#===============================================================================
# Description	:	MSG_IdsToString
# input 		:	message
# output 		:   1
#===============================================================================
#1.Message Id1  "null"/id
#2.Message Id2  "null"/id
#3.Message Id3  "null"/id
MSG_IdsToString()
{
	sTemp=""
	[ "$1" != "null" ] && sTemp="${sTemp}${MSGTABLE[$1]} ";
	[ "$2" != "null" ] && sTemp="${sTemp}${MSGTABLE[$2]} ";
	[ "$3" != "null" ] && sTemp="${sTemp}${MSGTABLE[$3]} ";
	echo $sTemp
}
#===============================================================================
# Description	:
# input 		:	message
# output 		:   1
#===============================================================================
SSS_SetVolume()
{
	mpRet=`mopilt -i`
    Disc=`echo ${mpRet}| grep 'No Disc'`
    if [ "$Disc" != "" ]; then
        MSG_Once No Disc
        return 0;
    fi
	echo $mpRet |grep -q 'Disc Type'   && Disc=`echo ${mpRet##*Disc Type }     |awk '{ print $2}'` || Disc=""
	echo $mpRet |grep -q 'Disc Status' && Status=`echo ${mpRet##*Disc Status } |awk '{ print $2}'` || Status=""
	echo $mpRet |grep -q 'Volume name' && Vol=`echo ${mpRet##*Volume name }    |awk '{ print $2}'` || Vol=""
	echo $mpRet |grep -q 'Media Type'  && Media=`echo ${mpRet##*Media Type }   |awk '{ print $2}'` || Media=""

	if [ "$Media" = "cda" ]; then
	        Status="Audio"
	fi

	if [ "$Status" = "Blank" -o "$Status" = "Audio" ]; then
	        LCD="${Disc%%[*}[$Status]"
	else
	        if [ "$Vol" = "__NA__" -o "$Vol" = "" ]; then
	            Vol="Untitle"
	        fi
	        LCD="${Disc%%[*}[$Vol]"
	fi

	MSG_Once $LCD
	if [ "$Status" != "Blank" -a "$Status" != "Audio" ]; then
		mount /dev/sr0
	fi
}
#===============================================================================
# Description	:
# input 		:	1(Disk name : sd[abcd])
# output 		:   1(temperature : *C)
#===============================================================================
SSS_GetDiskTemperature()
{
	#echo "SSS_GetDiskTemperature($*)"
	temp=`smartctl -d marvell -s on -A /dev/$1 | grep Temperature |awk -F' ' '{print $10}'`
	return $temp;
}
#===============================================================================
# Description	:
# input 		:
# output 		:   1(Serial Number : 8byte 0000000000000000
#===============================================================================
SSS_GetSerialNumber()
{
	#echo "SSS_GetSerialNumber($*)"
	temp0=`SSS_IoRead $IO_ID_GET_SER_NUM0`
	temp1=`SSS_IoRead $IO_ID_GET_SER_NUM1`
	serialnumber=`echo $temp0 $temp1 |awk '{print $3$4$5$6$11$12$13$14}'`
}
#===============================================================================
# Description	:	WAIT_Function
# input 		:
# output 		:   
#===============================================================================
WAIT_Function()
{
	while :
	do
		echo "Waiting ${1}..." > /dev/console
		sleep 5
		Check_GrepPs "$1" && continue;
		echo 'Complete ${1}!!!' > /dev/console
		return 0	
	done
}

#1. function name 2~. message
MSG_UntilFuncEnd()
{
	if [ ! -z "$2" ]; then
		sTempMsg=$*
		sTempMsg=${sTempMsg//"$1 "/}
		#message job add
		$MSG_JOB_SHELL add $sTempMsg
	fi
	WAIT_Function $1
	if [ ! -z "$2" ]; then
		#message job remove
		$MSG_JOB_SHELL remove $sTempMsg
	fi
}
MSG_FuncProc()
{
	MSG_UntilFuncEnd $* &
}
MSG_Once()
{
	$MSG_JOB_SHELL once $*
}
MSG_Add()
{
	$MSG_JOB_SHELL add $*
}
MSG_Remove()
{
	$MSG_JOB_SHELL remove $*
}
MSG_JobClear()
{
	cat /dev/null > $MSG_JOB_LIST
}
