#!/bin/sh

# Bring up/down voice subsystem

. /etc/sysconfig/rc.conf
. /etc/sysconfig/network.conf
. /bin/network-functions

. /etc/image_features

if [ -e "/tmp/featurestatus.conf" ] ; then
	. /tmp/featurestatus.conf
fi

PIDFILE=/var/run/cm.pid
LOGGER="/bin/logger -t $0"
SETSID="/usr/bin/setsid"
KILLALL_BIN="/usr/bin/killall"
KILL_BIN="/bin/kill"

if [ "$SEC_START_ACTIVATION" != "true" ]; then
#    $LOGGER "The device is not activated. exiting ..."
    exit 0
fi

# paths
TELEPHONY_PATH=/telephony
CONFIGS_PATH=/etc/telephony
LOGS_PATH=/tmp
PIDFILES_PATH=/var/run
BIN_PATH=/bin

# the general telephony services
CALLMANAGER=cm
MGCONTROLLER=mg
SIPUSERAGENT=ua
H323TERMINAL=h323
VMSYSTEM=vms
FXOAGENT=fxoua
NATAGENT=natagent
PRESENCEUA=presenceua
CALLCTRLINTERFACE=cci
CALLDETAILRECORDER=cdr

# The DSP application for SUN4I and PC_IPPBX
if [ "$HW_TYPE" == HW_TYPE_PC ] ; then
DSPSUN4I=dsppc.out
else
DSPSUN4I=dsp.out
fi

# the T1/E1 related telephony services
CASUSERAGENT=casuser
CASNETWORKAGENT=casnet
ISDN_L2=isdnl2
CCSUSERAGENT=isdnl3user
CCSNETWORKAGENT=isdnl3net

CODEC_GAIN="/bin/codecgain"
NORMALIZER="/bin/normalizer /etc/telephony"

DSPLOGGER="dsplog"

# conference server applications
CONF_CONTROLLER=confcontroller
POLICY_SERVER=policyserver

DSP_PRESENT=true

RESTART_ONLY_WATCHER_PHONES_MARKER="/mnt/bbram/vrestart"
DONT_REBOOT_PHONES_MARKER="/tmp/dontrebootphones"

# Input parameter: PID
CheckIfServiceRunning ()
{
	local i;
	for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
		if [ "$PID" != "" ] ; then
			# Check if running
			$KILL_BIN -0 $PID > /dev/null 2>&1
			if [ $? = 0 ] ; then
				return 0
			fi
			return 1
		fi
		/bin/usleep 100
	done
	return 1
}

# Input parameter: SERVICE_NAME
PrintServiceStatus () {
	local PID;

	if [ -r "$PIDFILES_PATH/$SERVICE_NAME.pid" ] ; then
		PID=$(/bin/cat $PIDFILES_PATH/$SERVICE_NAME.pid)

		# Check if still running
		$KILL_BIN -0 $PID > /dev/null 2>&1
		if [ $? != 0 ] ; then
			echo "$SERVICE_NAME is in an undefined state. PID file exists but no corresponding process."
			return 1
		fi

		echo "$SERVICE_NAME is up and running"
	else
		echo "$SERVICE_NAME is not running (no PID file)"
		return 3
	fi

	return 0
}

do_start_conf_editor ()
{
	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		echo -n " Starting Policy Server:                     "
		$SETSID $TELEPHONY_PATH/$POLICY_SERVER > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$POLICY_SERVER.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi
}

do_start ()
{
	/etc/init.d/softdogd wait
	ACT=`pwd`
	cd /tmp
	ServiceCheckRunning1
	$LOGGER "Starting Voice system..."

	echo -n " Starting DSP logger:                        "
	$SETSID $BIN_PATH/$DSPLOGGER > /dev/null 2>&1 &
	PID=$!
	echo $PID > $PIDFILES_PATH/$DSPLOGGER.pid
	/bin/sleep 1
	CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	echo -n " Initializing DSP:                           "
 	HW_VERSION=`cat /etc/hardware_label.txt`
	if [ "$HW_TYPE" == HW_TYPE_PC ] && [ "$HW_VERSION" == 1 ] ; then
		if [ -f /mnt/bbram/dsp/dspinit ] ; then
			DSP_DIR=/mnt/bbram/dsp
		else
			DSP_DIR=/etc/default-dsp
		fi
		$DSP_DIR/dspinit --path $DSP_DIR > /tmp/dspinit.out
		echo "done"
	else
		if [ -f /mnt/bbram/dsp/$DSPSUN4I ] ; then
			DSP_DIR=/mnt/bbram/dsp
		else
			DSP_DIR=/etc/default-dsp
		fi
		NUMBER_OF_DSP_CORES=0
		if [ "$FEATURE_MULTIDSP" == "1" ] ; then
			echo ""
			if [ "$HW_TYPE" == HW_TYPE_PC ] ; then
				CPU_ID=0
				if [ "$START_DSP_CARD" = "true" ] ; then
					IS_DSP_CARD_INSTALLED=`cat /proc/dspcard | grep DC4X`
					if [ "$IS_DSP_CARD_INSTALLED" != "" ] ; then
					NUMBER_OF_DSP_CORES=4
					fi
					IS_DSP_CARD_INSTALLED=`cat /proc/dspcard | grep DC2X`
					if [ "$IS_DSP_CARD_INSTALLED" != "" ] ; then
						NUMBER_OF_DSP_CORES=2
					fi
				fi
				if [ $NUMBER_OF_DSP_CORES != 0 ] ; then
					$DSP_DIR/dspinit --path $DSP_DIR > /tmp/dspinit.out
					echo "done"
				fi
			else
				CPU_ID=$(/bin/cat /proc/fiad/hw-info | grep BOARD_CPU_ID | /bin/cut -f 2 -d '=')
			fi

			NUMBER_OF_CPU_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
			NUMBER_OF_VIRT_DSP_COUNT=$(($NUMBER_OF_CPU_CORES-1))

			for i in `seq 0 $(($NUMBER_OF_VIRT_DSP_COUNT))`; do
				j=$(($i+$NUMBER_OF_DSP_CORES))
				echo -n "     process $i:                             "
				$SETSID $DSP_DIR/$DSPSUN4I -i $(($CPU_ID*$NUMBER_OF_CPU_CORES+$j)) > /dev/null 2>&1 &
				PID=$!
				echo $PID > $PIDFILES_PATH/$DSPSUN4I$j.pid
				if [ "$HW_TYPE" == HW_TYPE_SUNXI ] ; then
					taskset -p $((2**$i)) $PID
				fi
				/bin/sleep 2
				CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
			done
		else
			$SETSID $DSP_DIR/$DSPSUN4I > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$DSPSUN4I.pid
			/bin/sleep 2
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		fi
	fi

#	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] && [ "$HW_TYPE" != HW_TYPE_SUNXI ] ; then
	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		echo -n " Checking telephony configuration:           "
		$SETSID $NORMALIZER > /dev/null 2>&1
		echo "done"
	fi

	#
	# Closed for midi and pc platforms
	#
	if [ "$HW_TYPE" != HW_TYPE_MIDI ] && [ "$HW_TYPE" != HW_TYPE_PC ] && [ "$HW_TYPE" != HW_TYPE_SUNXI ] ; then
		echo -n " Refreshing LAN-traffic regulator:           "
		/bin/ltraffreg -c -f $CONFIGS_PATH/lanunits.cfg > /dev/null 2>&1
		if [ $? = 0 ] ; then
			echo "done"
		else	
			echo "failed"
		fi
	fi

	if [ "$FEATURE_PPT" != "1" ] ; then
		echo -n " Starting NAT Agent:                         "
		$SETSID $TELEPHONY_PATH/$NATAGENT $CONFIGS_PATH > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$NATAGENT.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi

	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		echo -n " Starting Conference Controller:             "
		$SETSID $TELEPHONY_PATH/$CONF_CONTROLLER > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$CONF_CONTROLLER.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"

		echo -n " Starting Policy Server:                     "
		$SETSID $TELEPHONY_PATH/$POLICY_SERVER > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$POLICY_SERVER.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi
	
	# Don't move this after $CALLMANAGER!
	if [ "$FEATURE_IPLINES_AUTOCONFIG" = "1" ] && [ "$SUBPRODUCT_TYPE" != QUADRO_CS ]; then
		echo -n " Starting phone Rebooter:                    "
		if [ -e /var/run/system_is_ready -o "$START_PBX_ONLY_MODE" != "true" -o "$START_DHCLIENT" != "true" ]; then
			if [ ! -e $DONT_REBOOT_PHONES_MARKER ]; then
				if [ -e $RESTART_ONLY_WATCHER_PHONES_MARKER ]; then
					$SETSID /bin/phrebooter -s -r -w > /dev/null 2>&1 &
					rm -rf $RESTART_ONLY_WATCHER_PHONES_MARKER
				else
					$SETSID /bin/phrebooter -s -r > /dev/null 2>&1 &
				fi
				PID=$!
				$KILL_BIN -0 $PID > /dev/null 2>&1
				if [ $? = 0 ] ; then
					echo "done"
				else
					echo "failed"
				fi
			else
				echo "skipped"
			fi
		else
			echo "skipped"
		fi
	fi

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ]; then
		echo -n " Starting Call Controller:                   "
		$SETSID $TELEPHONY_PATH/$CALLMANAGER $CONFIGS_PATH > $LOGS_PATH/$CALLMANAGER.out 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$CALLMANAGER.pid
		/bin/sleep 4
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi

	if [ "$FEATURE_PPT" != "1" ] ; then
		echo -n " Starting SIP User Agent:                    "
		$SETSID $TELEPHONY_PATH/$SIPUSERAGENT $CONFIGS_PATH > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$SIPUSERAGENT.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi

	if [ "$FEATURE_H323" = "1" ] ; then
		echo -n " Starting H323 Terminal:                     "
		$SETSID $TELEPHONY_PATH/$H323TERMINAL $CONFIGS_PATH > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$H323TERMINAL.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi
	
	if [ "$FEATURE_PRESENCE" = "1" ] ; then
		echo -n " Starting Presence user agent:               "
		$SETSID $TELEPHONY_PATH/$PRESENCEUA $CONFIGS_PATH > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$PRESENCEUA.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi
	
	if [ "$FEATURE_3PCC" = "1" ] ; then
		echo -n " Starting Remote Call Control Interface:     "
		$SETSID $TELEPHONY_PATH/$CALLCTRLINTERFACE $CONFIGS_PATH > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$CALLCTRLINTERFACE.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi

	echo -n " Starting Media Gateway Application:         "
	DEFAULT_ULIMIT_VALUE=`ulimit -n`
	if [ "$HW_TYPE" == HW_TYPE_PC ] ; then
		EXTRA_ULIMIT_VALUE=4096
	else
		EXTRA_ULIMIT_VALUE=2048
	fi
	ulimit -n $EXTRA_ULIMIT_VALUE
	if [ "$HW_TYPE" == HW_TYPE_PC ] && [ "$HW_VERSION" = "2" ] ; then
		$SETSID taskset 1 $TELEPHONY_PATH/$MGCONTROLLER $CONFIGS_PATH > /dev/null 2>&1 &
	else
		$SETSID $TELEPHONY_PATH/$MGCONTROLLER $CONFIGS_PATH > /dev/null 2>&1 &
	fi
	
	ulimit -n $DEFAULT_ULIMIT_VALUE
	PID=$!
	echo $PID > $PIDFILES_PATH/$MGCONTROLLER.pid
	/bin/sleep 1
	CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	if [ "$HW_TYPE" == HW_TYPE_PC ] && [ "$HW_VERSION" != 1 ] ; then
		chrt -f -p 98 $PID
	fi
	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		if [ "$FEATURE_FXO" = "1" ] || [ "$FEATURE_FXS" = "1" ] || [ "$FEATURE_AUDIO_LINES" = "1" ] ; then
			echo -n " Loading initial codec gains:                "
			$SETSID $CODEC_GAIN --all > /tmp/logs/codecgain.log 2>&1
			echo "done"
		fi
	fi

	if [ -f /etc/telephony/hwinfo ] ; then
		. /etc/telephony/hwinfo
	else
		echo
		echo Error: Could not find /etc/telephony/hwinfo
		echo
	fi

	if [ "$FEATURE_FXO" = "1" ] ; then
		echo -n " Starting FXO Agent:                         "
		if [ "$fxo_installed" = "1" ] ; then
			$SETSID $TELEPHONY_PATH/$FXOAGENT $CONFIGS_PATH > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$FXOAGENT.pid
			/bin/sleep 1
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		else
			echo "skipped"
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] ; then
		echo -n " Starting CAS User Mode Agent:               "
		if [ "$e1t1_installed" = "1" ] ; then
			$SETSID $TELEPHONY_PATH/$CASUSERAGENT $CONFIGS_PATH > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$CASUSERAGENT.pid
			/bin/sleep 1
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		else
			echo "skipped"
		fi

		echo -n " Starting CAS Network Mode Agent:            "
		if [ "$e1t1_installed" = "1" ] ; then
			$SETSID $TELEPHONY_PATH/$CASNETWORKAGENT $CONFIGS_PATH > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$CASNETWORKAGENT.pid
			/bin/sleep 1
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		else
			echo "skipped"
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] || [ "$FEATURE_ISDN" = "1" ] ; then
		echo -n " Starting ISDN Level 3 User Mode Agent:      "
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			$SETSID $TELEPHONY_PATH/$CCSUSERAGENT $CONFIGS_PATH > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$CCSUSERAGENT.pid
			/bin/sleep 3
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		else
			echo "skipped"
		fi

		echo -n " Starting ISDN Level 3 Network Mode Agent:   "
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			$SETSID $TELEPHONY_PATH/$CCSNETWORKAGENT $CONFIGS_PATH > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$CCSNETWORKAGENT.pid
			/bin/sleep 3
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		else
			echo "skipped"
		fi

		echo -n " Starting ISDN Level 2 Agent:                "
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			$SETSID $TELEPHONY_PATH/$ISDN_L2 $CONFIGS_PATH > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$ISDN_L2.pid
			/bin/sleep 1
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		else
			echo "skipped"
		fi
	fi

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
	        echo -n " Starting Voicemail System:                  "
	        $SETSID $TELEPHONY_PATH/$VMSYSTEM $CONFIGS_PATH > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$VMSYSTEM.pid
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi

	echo -n " Starting Call Detail Recorder:              "
	$SETSID $TELEPHONY_PATH/$CALLDETAILRECORDER $CONFIGS_PATH > /dev/null 2>&1 &
	PID=$!
	echo $PID > $PIDFILES_PATH/$CALLDETAILRECORDER.pid
	CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"

	cd $ACT

	#
	# Closed for midi and pc platforms
	#
	if [ "$HW_TYPE" != HW_TYPE_MIDI ] && [ "$HW_TYPE" != HW_TYPE_PC ] && [ "$HW_TYPE" != HW_TYPE_SUNXI ] ; then
		#
		#	Switch off the lifeline support as far as voice is up.
		#	Watchdog (when available) should take care of the rest.
		#
		echo "OFF" > /proc/fiad/pld/LifelineSupport
	fi

	if [ "$HW_TYPE" = HW_TYPE_SUNXI ] ; then
		if [ "$FEATURE_FXS" = "1" ] ; then
# Force CM to restart codec timer
			/bin/sleep 5
			/bin/notifier -timechange 0
		fi
	fi

	return 0
}

stop_processes ()
{
	/etc/init.d/softdogd wait

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		$KILLALL $VMSYSTEM 		> /dev/null 2>&1
		rm $PIDFILES_PATH/$VMSYSTEM.pid
	fi

	$KILLALL $CALLDETAILRECORDER 	> /dev/null 2>&1
	rm $PIDFILES_PATH/$CALLDETAILRECORDER.pid
	
	$KILLALL $MGCONTROLLER 	> /dev/null 2>&1
	rm $PIDFILES_PATH/$MGCONTROLLER.pid

	$KILLALL $SIPUSERAGENT 	> /dev/null 2>&1
	rm $PIDFILES_PATH/$SIPUSERAGENT.pid

	if [ "$FEATURE_H323" = "1" ] ; then
		$KILLALL $H323TERMINAL 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$H323TERMINAL.pid
	fi
	
	if [ "$FEATURE_PRESENCE" = "1" ] ; then
		$KILLALL $PRESENCEUA 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$PRESENCEUA.pid
	fi

	if [ "$FEATURE_3PCC" = "1" ] ; then
		$KILLALL $CALLCTRLINTERFACE 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$CALLCTRLINTERFACE.pid
	fi

	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		$KILLALL $CONF_CONTROLLER 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$CONF_CONTROLLER.pid

		$KILLALL $POLICY_SERVER 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$POLICY_SERVER.pid
	fi
	
	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ]; then
		$KILLALL $CALLMANAGER 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$CALLMANAGER.pid
	fi

	if [ "$FEATURE_PPT" != "1" ] ; then
		$KILLALL $NATAGENT 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$NATAGENT.pid
	fi
	
	if [ "$DSP_PRESENT" = "true" ]; then
		$KILLALL $DSPLOGGER 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$DSPLOGGER.pid
	fi

	if [ -f /etc/telephony/hwinfo ] ; then
		. /etc/telephony/hwinfo
	else
		echo
		echo Error: Could not find /etc/telephony/hwinfo
		echo
	fi

	if [ "$FEATURE_FXO" = "1" ] ; then
		if [ "$fxo_installed" = "1" ] ; then
			$KILLALL $FXOAGENT 		> /dev/null 2>&1
			rm $PIDFILES_PATH/$FXOAGENT.pid
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] ; then
			$KILLALL $CASUSERAGENT 	> /dev/null 2>&1
			rm $PIDFILES_PATH/$CASUSERAGENT.pid

			$KILLALL $CASNETWORKAGENT 	> /dev/null 2>&1
			rm $PIDFILES_PATH/$CASNETWORKAGENT.pid
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] || [ "$FEATURE_ISDN" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			$KILLALL $ISDN_L2 		> /dev/null 2>&1
			rm $PIDFILES_PATH/$ISDN_L2.pid

			$KILLALL $CCSUSERAGENT 	> /dev/null 2>&1
			rm $PIDFILES_PATH/$CCSUSERAGENT.pid

			$KILLALL $CCSNETWORKAGENT 	> /dev/null 2>&1
			rm $PIDFILES_PATH/$CCSNETWORKAGENT.pid
		fi
	fi

	HW_VERSION=`cat /etc/hardware_label.txt`
	if [ "$HW_TYPE" == HW_TYPE_PC ] && [ "$HW_VERSION" == 1 ] ; then
		echo ""
	else
		if [ "$FEATURE_MULTIDSP" == "1" ] ; then
			NUMBER_OF_CPU_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
			$KILLALL $DSPSUN4I 	> /dev/null 2>&1
			if [ "$HW_TYPE" == HW_TYPE_PC ] ; then
				NUMBER_OF_DSP_CORES=0
				CPU_ID=0
				if [ "$START_DSP_CARD" = "true" ] ; then
					IS_DSP_CARD_INSTALLED=`cat /proc/dspcard | grep DC4X`
					if [ "$IS_DSP_CARD_INSTALLED" != "" ] ; then
						NUMBER_OF_DSP_CORES=4
					fi
					IS_DSP_CARD_INSTALLED=`cat /proc/dspcard | grep DC2X`
					if [ "$IS_DSP_CARD_INSTALLED" != "" ] ; then
						NUMBER_OF_DSP_CORES=2
					fi
				fi
				NUMBER_OF_VIRT_DSP_COUNT=$(($NUMBER_OF_CPU_CORES-1))
				for i in `seq 0 $(($NUMBER_OF_VIRT_DSP_COUNT))`; do
					j=$(($i+$NUMBER_OF_DSP_CORES))
					rm $PIDFILES_PATH/$DSPSUN4I$j.pid
				done
			else
			
				for i in `seq 0 $(($NUMBER_OF_CPU_CORES-1))`; do
					rm $PIDFILES_PATH/$DSPSUN4I$i.pid
				done
			fi
		else
			$KILLALL $DSPSUN4I 	> /dev/null 2>&1
			rm $PIDFILES_PATH/$DSPSUN4I.pid
		fi
	fi

	return 0
}

stop_processes_by_main_thread ()
{
	/etc/init.d/softdogd wait

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		PID_FILE=$PIDFILES_PATH/$VMSYSTEM.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi

	PID_FILE=$PIDFILES_PATH/$CALLDETAILRECORDER.pid
	$KILL `cat $PID_FILE`		> /dev/null 2>&1
	rm $PID_FILE

	PID_FILE=$PIDFILES_PATH/$MGCONTROLLER.pid
	$KILL `cat $PID_FILE`		> /dev/null 2>&1
	rm $PID_FILE

	PID_FILE=$PIDFILES_PATH/$SIPUSERAGENT.pid
	$KILL `cat $PID_FILE`		> /dev/null 2>&1
	rm $PID_FILE

	if [ "$FEATURE_H323" = "1" ] ; then
		PID_FILE=$PIDFILES_PATH/$H323TERMINAL.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi
	
	if [ "$FEATURE_PRESENCE" = "1" ] ; then
		PID_FILE=$PIDFILES_PATH/$PRESENCEUA.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi

	if [ "$FEATURE_3PCC" = "1" ] ; then
		PID_FILE=$PIDFILES_PATH/$CALLCTRLINTERFACE.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi

	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		PID_FILE=$PIDFILES_PATH/$CONF_CONTROLLER.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE

		PID_FILE=$PIDFILES_PATH/$POLICY_SERVER.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi
	
	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ]; then
		PID_FILE=$PIDFILES_PATH/$CALLMANAGER.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi

	if [ "$FEATURE_PPT" != "1" ] ; then
		PID_FILE=$PIDFILES_PATH/$NATAGENT.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi

	if [ "$DSP_PRESENT" = "true" ]; then
		PID_FILE=$PIDFILES_PATH/$DSPLOGGER.pid
		$KILL `cat $PID_FILE`		> /dev/null 2>&1
		rm $PID_FILE
	fi
	
	HW_VERSION=`cat /etc/hardware_label.txt`
	if [ "$HW_TYPE" == HW_TYPE_PC ] && ["$HW_VERSION" == 1 ] ; then
		echo ""
	else
		if [ "$FEATURE_MULTIDSP" == "1" ] ; then
			NUMBER_OF_CPU_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
			for i in `seq 0 $(($NUMBER_OF_CPU_CORES-1))`; do
				PID_FILE=$PIDFILES_PATH/$DSPSUN4I$i.pid
				$KILL `cat $PID_FILE`		> /dev/null 2>&1
				rm $PID_FILE
			done
		else
			PID_FILE=$PIDFILES_PATH/$DSPSUN4I.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE
		fi
	fi

	if [ -f /etc/telephony/hwinfo ] ; then
		. /etc/telephony/hwinfo
	else
		echo
		echo Error: Could not find /etc/telephony/hwinfo
		echo
	fi

	if [ "$FEATURE_FXO" = "1" ] ; then
		if [ "$fxo_installed" = "1" ] ; then
			PID_FILE=$PIDFILES_PATH/$FXOAGENT.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] ; then
			PID_FILE=$PIDFILES_PATH/$CASUSERAGENT.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE

			PID_FILE=$PIDFILES_PATH/$CASNETWORKAGENT.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] || [ "$FEATURE_ISDN" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			PID_FILE=$PIDFILES_PATH/$ISDN_L2.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE

			PID_FILE=$PIDFILES_PATH/$CCSUSERAGENT.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE

			PID_FILE=$PIDFILES_PATH/$CCSNETWORKAGENT.pid
			$KILL `cat $PID_FILE`		> /dev/null 2>&1
			rm $PID_FILE
		fi
	fi

	return 0
}

check_if_stopped ()
{
	local i;
	
	for i in 1 2 3 4 5 6 7 8 9 10; do
		# Check if stopped
		$KILLALL_BIN -0 $1 > /dev/null 2>&1
		if [ $? = 0 ] ; then
		    /bin/sleep 1
		else
			$LOGGER $1: successfully stopped
			return 0
		fi
			$LOGGER Waiting $i sec for $1 stop
	done
	if [ $1 != $NATAGENT ] ; then
  		$LOGGER Process $1 failed to stop. Rebooting the device...
		/bin/reboot
	else
		# it seems natagent is starting ok after killing. So no need to reboot the board.
  		$LOGGER Process $1 failed to stop. Killing that with SIGKILL...
		killall -9 $1
	fi
    return 1
}

check_if_everybody_stopped ()
{
	/etc/init.d/softdogd wait

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		check_if_stopped $VMSYSTEM
	fi

	check_if_stopped $CALLDETAILRECORDER
	check_if_stopped $MGCONTROLLER
	check_if_stopped $SIPUSERAGENT

	if [ "$FEATURE_H323" = "1" ] ; then
		check_if_stopped $H323TERMINAL
	fi
	
	if [ "$FEATURE_PRESENCE" = "1" ] ; then
		check_if_stopped $PRESENCEUA
	fi

	if [ "$FEATURE_3PCC" = "1" ] ; then
		check_if_stopped $CALLCTRLINTERFACE
	fi

	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		check_if_stopped $CONF_CONTROLLER
		check_if_stopped $POLICY_SERVER
	fi
	
	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ]; then
		check_if_stopped $CALLMANAGER
	fi

	if [ "$FEATURE_PPT" != "1" ] ; then
		check_if_stopped $NATAGENT
	fi

	if [ "$DSP_PRESENT" = "true" ]; then
		check_if_stopped $DSPLOGGER
	fi

	HW_VERSION=`cat /etc/hardware_label.txt`

	if [ "$HW_TYPE" == HW_TYPE_PC ] && [ "$HW_VERSION" == 1 ] ; then
		echo ""
	else
		if [ "$FEATURE_MULTIDSP" == "1" ] ; then
			NUMBER_OF_CPU_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
			for i in `seq 0 $(($NUMBER_OF_CPU_CORES-1))`; do
				check_if_stopped $DSPSUN4I
			done
		else
			check_if_stopped $DSPSUN4I
		fi
	fi

	if [ -f /etc/telephony/hwinfo ] ; then
		. /etc/telephony/hwinfo
	else
		echo
		echo Error: Could not find /etc/telephony/hwinfo
		echo
	fi

	if [ "$FEATURE_FXO" = "1" ] ; then
		if [ "$fxo_installed" = "1" ] ; then
			check_if_stopped $FXOAGENT
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] ; then
			check_if_stopped $CASUSERAGENT
			check_if_stopped $CASNETWORKAGENT
		fi
	fi

	if [ "$FEATURE_E1T1" = "1" ] || [ "$FEATURE_ISDN" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			check_if_stopped $ISDN_L2
			check_if_stopped $CCSUSERAGENT
			check_if_stopped $CCSNETWORKAGENT
		fi
	fi

	return 0
}

do_stop_conf_editor ()
{
	KILLALL=$KILLALL_BIN
	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		$KILLALL $POLICY_SERVER 	> /dev/null 2>&1
		rm $PIDFILES_PATH/$POLICY_SERVER.pid
	fi
}


do_stop ()
{
	KILLALL=$KILLALL_BIN
	stop_processes
}

do_kill ()
{
	KILLALL="$KILLALL_BIN -9"
	stop_processes
}

do_stop_by_main_thread ()
{
	KILL=$KILL_BIN
	stop_processes_by_main_thread
}

# the constants :)
VOICE_SUBSYSTEM_OK=0
APPLICATION_CRASHED=1




do_status ()
{
	VOICE_SUBSYSTEM_STATUS=$VOICE_SUBSYSTEM_OK
    if [ "$PRODUCT_SUBCLASS" == "PRODUCT_SUBCLASS_CONFIG_EMULATOR" ]; then
  		return $VOICE_SUBSYSTEM_STATUS
	fi

	if [ "$DSP_PRESENT" = "true" ]; then
		SERVICE_NAME=$DSPLOGGER
		PrintServiceStatus
		# the return value of PrintServiceStatus is not checked here, because dsplogger is not critical
		
		HW_VERSION=`cat /etc/hardware_label.txt`
		if [ "$HW_TYPE" == HW_TYPE_PC ] && [ "$HW_VERSION" == 1 ] ; then
			if /bin/dspstats -n 0 > /dev/null 2>&1; then
				echo "dsp is up and running"
			else
				echo "dsp is not running"
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
		elif [ "$HW_TYPE" == HW_TYPE_SUNXI ] || [ "$HW_TYPE" == HW_TYPE_PC ]; then
			if [ "$FEATURE_MULTIDSP" == "1" ] ; then
				NUMBER_OF_CPU_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
				if [ "$HW_TYPE" == HW_TYPE_SUNXI ]; then
					for i in `seq 0 $(($NUMBER_OF_CPU_CORES-1))`; do
						SERVICE_NAME=$DSPSUN4I$i
						PrintServiceStatus
						if [ "$?" = "1" ] ; then
							VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
						fi
					done
				else
					NUMBER_OF_DSP_CORES=0
					CPU_ID=0
					if [ "$START_DSP_CARD" = "true" ] ; then
						IS_DSP_CARD_INSTALLED=`cat /proc/dspcard | grep DC4X`
						if [ "$IS_DSP_CARD_INSTALLED" != "" ] ; then
							NUMBER_OF_DSP_CORES=4
						fi
						IS_DSP_CARD_INSTALLED=`cat /proc/dspcard | grep DC2X`
						if [ "$IS_DSP_CARD_INSTALLED" != "" ] ; then
							NUMBER_OF_DSP_CORES=2
						fi
					fi
					NUMBER_OF_VIRT_DSP_COUNT=$(($NUMBER_OF_CPU_CORES-1))
					for i in `seq 0 $(($NUMBER_OF_VIRT_DSP_COUNT))`; do
						j=$(($i+$NUMBER_OF_DSP_CORES))
						SERVICE_NAME=$DSPSUN4I$j
						PrintServiceStatus
						if [ "$?" = "1" ] ; then
							VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
						fi
					done
				fi
			else
				SERVICE_NAME=$DSPSUN4I
				PrintServiceStatus
				if [ "$?" = "1" ] ; then
					VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
				fi
			fi
		fi
	fi

	if [ "$SUBPRODUCT_TYPE" = QUADRO_CS ] || [ "$FEATURE_CONFERENCE" = "1" ] || [ "$FEATURE_CONF_SERVER" = "1" ]; then
		SERVICE_NAME=$CONF_CONTROLLER
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi

		SERVICE_NAME=$POLICY_SERVER
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi
	fi

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ]; then
		SERVICE_NAME=$CALLMANAGER
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi
	fi
	
	SERVICE_NAME=$MGCONTROLLER
	PrintServiceStatus
	if [ "$?" = "1" ] ; then
		VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
	fi
	    
	SERVICE_NAME=$SIPUSERAGENT
	PrintServiceStatus
	if [ "$?" = "1" ] ; then
		VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
	fi

	SERVICE_NAME=$NATAGENT
	PrintServiceStatus
	if [ "$?" = "1" ] ; then
		VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
	fi
	
	if [ "$FEATURE_H323" = "1" ] ; then
		SERVICE_NAME=$H323TERMINAL
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi
	fi
	
	if [ "$FEATURE_PRESENCE" = "1" ] ; then
		SERVICE_NAME=$PRESENCEUA
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi
	fi
	
	if [ "$FEATURE_3PCC" = "1" ] ; then
		SERVICE_NAME=$CALLCTRLINTERFACE
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi
	fi

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		SERVICE_NAME=$VMSYSTEM
		PrintServiceStatus
		if [ "$?" = "1" ] ; then
			VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
		fi
	fi

	SERVICE_NAME=$CALLDETAILRECORDER
	PrintServiceStatus
	if [ "$?" = "1" ] ; then
		VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
	fi

	if [ -f /etc/telephony/hwinfo ] ; then
		. /etc/telephony/hwinfo
	else
		echo
		echo Error: Could not find /etc/telephony/hwinfo
		echo
	fi
	if [ "$FEATURE_FXO" = "1" ] ; then
		if [ "$fxo_installed" = "1" ] ; then
			SERVICE_NAME=$FXOAGENT
			PrintServiceStatus
			if [ "$?" = "1" ] ; then
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
		fi
	fi
	if [ "$FEATURE_E1T1" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] ; then
			SERVICE_NAME=$CASUSERAGENT
			PrintServiceStatus
			if [ "$?" = "1" ] ; then
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
			SERVICE_NAME=$CASNETWORKAGENT
			PrintServiceStatus
			if [ "$?" = "1" ] ; then
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
		fi
	fi
	if [ "$FEATURE_E1T1" = "1" ] || [ "$FEATURE_ISDN" = "1" ] ; then
		if [ "$e1t1_installed" = "1" ] || [ "$isdn_installed" = "1" ] ; then
			SERVICE_NAME=$ISDN_L2
			PrintServiceStatus
			if [ "$?" = "1" ] ; then
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
			SERVICE_NAME=$CCSUSERAGENT
			PrintServiceStatus
			if [ "$?" = "1" ] ; then
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
			SERVICE_NAME=$CCSNETWORKAGENT
			PrintServiceStatus
			if [ "$?" = "1" ] ; then
				VOICE_SUBSYSTEM_STATUS=$APPLICATION_CRASHED
			fi
		fi
	fi

	return $VOICE_SUBSYSTEM_STATUS
}

do_start_ppt ()
{
	ACT=`pwd`
	cd /tmp
	ServiceCheckRunning1
	$LOGGER "Starting Voice system for PPT..."

	echo -n " Starting DSP logger:                        "
	$SETSID $BIN_PATH/$DSPLOGGER > /dev/null 2>&1 &
	PID=$!
	echo $PID > $PIDFILES_PATH/$DSPLOGGER.pid
	/bin/sleep 1
	CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	echo -n " Initializing DSP:                           "

	if [ -f /mnt/bbram/dsp/dsp.out ] ; then
		DSP_DIR=/mnt/bbram/dsp
	else
		DSP_DIR=/etc/default-dsp
	fi

	if [ "$FEATURE_MULTIDSP" = "1" ] ; then
		if [ "$HW_TYPE" == HW_TYPE_PC ] ; then
			CPU_ID=0
		else
			CPU_ID=$(/bin/cat /proc/fiad/hw-info | grep BOARD_CPU_ID | /bin/cut -f 2 -d '=')
		fi
		NUMBER_OF_CPU_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
		for i in `seq 0 $(($NUMBER_OF_CPU_CORES-1))`; do
			$SETSID $DSP_DIR/dsp.out -i $(($CPU_ID*$NUMBER_OF_CPU_CORES+$i)) > /dev/null 2>&1 &
			PID=$!
			echo $PID > $PIDFILES_PATH/$DSPSUN4I$i.pid
			/bin/sleep 2
			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
		done
	else
		$SETSID $DSP_DIR/dsp.out > /dev/null 2>&1 &
		PID=$!
		echo $PID > $PIDFILES_PATH/$DSPSUN4I.pid
		/bin/sleep 2
		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
	fi

#	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] && [ "$HW_TYPE" != HW_TYPE_SUNXI ] ; then
	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		echo -n " Checking telephony configuration:           "
		$SETSID $NORMALIZER > /dev/null 2>&1
		echo "done"
	fi

	#
	# Closed for midi and pc platforms
	#
	if [ "$HW_TYPE" != HW_TYPE_MIDI ] && [ "$HW_TYPE" != HW_TYPE_PC ] && [ "$HW_TYPE" != HW_TYPE_SUNXI ] ; then
		echo -n " Refreshing LAN-traffic regulator:           "
		/bin/ltraffreg -c -f $CONFIGS_PATH/lanunits.cfg > /dev/null 2>&1
		if [ $? = 0 ] ; then
			echo "done"
		else	
			echo "failed"
		fi
	fi

#	if [ "$FEATURE_PPT" != "1" ] ; then
#		echo -n " Starting NAT Agent:                         "
#		$SETSID $TELEPHONY_PATH/$NATAGENT $CONFIGS_PATH > /dev/null 2>&1 &
#		PID=$!
#		echo $PID > $PIDFILES_PATH/$NATAGENT.pid
#		/bin/sleep 2
#		CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
#	fi

#	echo -n " Starting Call Controller:                   "
#	$SETSID $TELEPHONY_PATH/$CALLMANAGER $CONFIGS_PATH > $LOGS_PATH/$CALLMANAGER.out 2>&1 &
#	PID=$!
#	echo $PID > $PIDFILES_PATH/$CALLMANAGER.pid
#	/bin/sleep 4
#	CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"

	echo -n " Starting Media Gateway Application:         "
	DEFAULT_ULIMIT_VALUE=`ulimit -n`
	EXTRA_ULIMIT_VALUE=2048
	ulimit -n $EXTRA_ULIMIT_VALUE
	$SETSID $TELEPHONY_PATH/$MGCONTROLLER $CONFIGS_PATH > /dev/null 2>&1 &
	ulimit -n $DEFAULT_ULIMIT_VALUE
	PID=$!
	echo $PID > $PIDFILES_PATH/$MGCONTROLLER.pid
	/bin/sleep 1
	CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"

	if [ "$SUBPRODUCT_TYPE" != QUADRO_CS ] ; then
		if [ "$FEATURE_FXO" = "1" ] || [ "$FEATURE_FXS" = "1" ] || [ "$FEATURE_AUDIO_LINES" = "1" ] ; then
			echo -n " Loading initial codec gains:                "
			$SETSID $CODEC_GAIN --all > /tmp/logs/codecgain.log 2>&1
			echo "done"
		fi
	fi

	if [ -f /etc/telephony/hwinfo ] ; then
		. /etc/telephony/hwinfo
	else
		echo
		echo Error: Could not find /etc/telephony/hwinfo
		echo
	fi

#	if [ "$FEATURE_FXO" = "1" ] ; then
#		echo -n " Starting FXO Agent:                         "
#		if [ "$fxo_installed" = "1" ] ; then
#			$SETSID $TELEPHONY_PATH/$FXOAGENT $CONFIGS_PATH > /dev/null 2>&1 &
#			PID=$!
#			echo $PID > $PIDFILES_PATH/$FXOAGENT.pid
#			/bin/sleep 1
#			CheckIfServiceRunning > /dev/null  && echo "done" || echo "failed"
#		else
#			echo "skipped"
#		fi
#	fi

	return 0
}

case "$1" in
	start)
		if [ "$PRODUCT_SUBCLASS" == "PRODUCT_SUBCLASS_CONFIG_EMULATOR" ]; then
			do_start_conf_editor
		else
			do_start
		fi
		;;
	stop)
		if [ "$PRODUCT_SUBCLASS" == "PRODUCT_SUBCLASS_CONFIG_EMULATOR" ]; then
			do_stop_conf_editor
		else
			do_stop
		fi
		;;
	kill)
		do_kill
		;;
	stopshtrix)
		do_stop_by_main_thread
		;;
	status)
		do_status
		;;
	oldrestart)
		do_stop
		/bin/sleep 1
		do_start
		;;
	restart)
		if [ "$PRODUCT_SUBCLASS" == "PRODUCT_SUBCLASS_CONFIG_EMULATOR" ]; then
			do_stop_conf_editor
			do_start_conf_editor
		else
			do_stop
			touch $RESTART_ONLY_WATCHER_PHONES_MARKER
			check_if_everybody_stopped
			if [ "$FEATURE_E1T1" = "1" ] ; then
				echo 1 >/proc/fiad/reset-cpu1
			fi
			do_start
		fi

		;;
	start_ppt)
		do_start_ppt
		;;

	*)
		echo "Usage: $0 {start|stop|kill|stopshtrix|oldrestart|restart|status}"
		exit 1
esac

exit $?
