<?php

	class MiMic_LPC1769_Ni
	{
		private $_mcu;
		public function __construct($i_mcu)
		{
			$this->_mcu=$i_mcu;
		}



		
		private function BCF_call($i_id,$i_in,$o_out,&$i_db)
		{
			
			$bc="";
			//WM初期化命令
			if(isset($i_in))
			{
				//wmがあれば、初期化命令を追加。
				//LD命令を直書き
				for($i=0;$i<8;$i++){
					if(isset($i_in['wm'.$i])){
						$bc.="FB".MiMicLib::hexout($i,2).MiMicLib::hexout($i_in['wm'.$i],8);
					}
				}
				if(isset($i_in['stream']))
				{
					$in_stream=$i_in['stream'];
					//streamをセット
					for($i=0;$i<count($in_stream);$i++){
						array_push($i_db,$in_stream[$i]);
					}
				}
			}
			//CALL命令を直書き
			$bc.="ZF".MiMicLib::hexout($i_id,8);
			//
			if(isset($o_out))
			{
				//o_out.wmxがあれば、回収用命令を追記
				//SGET命令を直書き
				for($i=0;$i<8;$i++){
					if(array_key_exists('wm'.$i,$o_out)){
						$bc.="EE".MiMicLib::hexout($i,2);
					}
				}
			}
			return $bc;
		}
		private function PARSE_call($i_result,&$o_out)
		{
			
			if($i_result->result!=0x00){
				//失敗.理由はresultの内容。
				return false;
			}
			$num_of_wm=0;
			if(isset($o_out))
			{
				for($i=0;$i<8;$i++){
					if(array_key_exists('wm'.$i,$o_out)){
						$num_of_wm++;
					}
				}
			}
			//streamから値を回収
			//streamは、関数の返したストリーム+WMの返却値
			if(isset($o_out))
			{
				
				//WM回収のためにSGET命令を直書き
				$offset=count($i_result->stream)-$num_of_wm;
				for($i=0;$i<8;$i++){
					if(array_key_exists('wm'.$i,$o_out)){
						$o_out['wm'.$i]=$i_result->stream[$offset];
						$offset++;
					}
				}
				//o_out.streamがあれば、値を回収。
				if(array_key_exists('stream',$o_out)){
					$o_out['stream']=array();
					for($i=0;$i<count($i_result->stream)-$num_of_wm;$i++){
						array_push($o_out['stream'],$i_result->stream[$i]);
					}
				}
			}
			return true;
		}
		public function call($i_id,$i_in,&$o_out)
		{
			$db=array();
			$bc=$this->BCF_call($i_id,$i_in,$o_out,$db);
			//実行
			return $this->PARSE_call(
				$this->_mcu->callMiMic($bc.MiMic_LPC1769::_BCF_END,$db),$o_out);
		}
	}
