/*
UDP シリアル相互変換プログラム
mes2用

処理手順
UDP受信待ち
受信したら、内容確認し、h83664へシリアルDATAを送る
シリアルDATAを1秒間の間待つ。返事が来なかったら、udpへTIMEUPを送信
シリアルより返答を受け取ったら、内容をUDPで送信する
*/

#include <mes2.h>
#include <h8/reg3067.h>
//#include "./itu.h"
#include "./y_sci1.h"

//ソケット
int sk;
//UPD受信設定
struct sockaddr addr, recv;
//LANから受け取るdataの入れ物
unsigned char urdata[20];
//SCIからのdataの入れ物
unsigned char sdata[20];
//dataのシリアル番号の入れ物
unsigned char snum,snum2 ;
//flug=1のとき、UDP受信あり 2:前回と同じDATA受信
int flug ;
//flug2=1のとき、sci待ち受け解除
int flug2 ;
//itu割込み用カウンタ
 unsigned int count;


/*
//itu1割り込み処理
#pragma interrupt
void warikomi(void)
{
 int i;
 unsigned char c;
 c = TISRA;  c = c & (~2);  TISRA = c; //割り込みフラグをクリア*必ず必要
 count++;
if( count > 2000)
{
count = 0;
flug2 = 1;
}
//   y_outch1( 'L' ) ;
return;
}
*/


/*主処理__*/
int main(void) 
{
int i;
char tmpc;
char tmpc2;
//変数の初期化
snum=' ';snum2=' ';
flug = 0 ; flug2 = 0;
for(i=0;i<20;i++){  urdata[i] = ' ' ; sdata[i] = ' ' ;}
count=0;

//UDP受信DATAの大きさを入れる
int size = 0;

//sci設定
y_inisci12((unsigned char) 2 , (unsigned char) 129 );

/*LAN設定__*/
ifconfig("ne0",IPADDR(192,168,11,7),IPADDR(255,255,255,0));
sk = udp_socket();
if(sk == -1) {return 0;}
//ポート設定
addr.sin_port = 124;
//相手のアドレス
addr.sin_addr = IPADDR( 192,168,11,4 );
//ソケットにアドレスを割り当てる
udp_bind(sk, &addr);
/*__LAN設定*/

//割り込みベクタアドレスの指定 *必ず必要
//set_handler(28,warikomi); 
// int_enable();

//                       printf("start");
//                       y_outch1( 'S' ) ;
/*無限ループ__*/
while (1)
{
//                      printf("_");
//                      y_outch1( '_' ) ;
//udp受信
udp_timeout(sk,100);
size = recvfrom(sk, urdata, 20, &recv);
//受信DATAがある場合
if(size > 0) {
//受け取ったDATAが前回受け取ったDATAと同一か否かの検査
snum2 = snum ; snum = urdata[19] ;
flug = 1;
if( snum == snum2 ){ flug = 2; }
//                      y_outch1( 'j' ) ;
}

//同じ命令をもう一度受け取った場合の処理
 if( flug == 2)
 {
   flug = 3;
   sendto(sk, urdata, 20, &recv);
//                          printf("same");
//                       y_outch1( 'O' ) ;
 }

//命令を受け取った場合の処理
 if( flug == 1)
 {
  flug = 3;
  //シリアルに発送する。
  for(i=0;i<20;i++){
//                tmpc2 = urdata[i];
//                printf( &tmpc2,1 ) ;
              y_outch1( urdata[i] ) ;
   if(urdata[i]=='!'){break;}
  }
  //規定時間待つタイマーをスタート
  //タイマー割り込みで規定時間後にSCI受信待ちを解除(flug2を1にSET)
 
//  itu1( 1250 , 3 ); // 1/20000000 * 1250 * 2^3 = 1/2000秒
  //SCI受信。!を受けるまでSCI受信を続ける
  for(i=0;i<20;i++){ sdata[i] = ' ' ; }
  i = 0;
  count=0;
  while (1){
   tmpc = y_inchn() ;
   if(tmpc != '_'){ if(tmpc != -1){ sdata[i] = tmpc ; i++ ; } }
   if(tmpc == '!' ){ break ; }
   if(flug2 >0 ){ break ; }
   if(i == 18 ){ sdata[18]='!' ; break ; }
  count ++;
  if(count>30000){ flug2 = 1;}
  }
  //SCI待ちtimeOver以外なら、LANよりシリアル受信DATAを発送する
//  itu1end();count = 0;      //タイマー終了
  count = 0;
  if(flug2 >0 )
  {
   flug2 = 0 ;
   sdata[0] = 'A'; sdata[1] = 'A';
   sdata[2] = 'T'; sdata[3] = 'I';sdata[4] = 'M'; sdata[5] = 'E';sdata[6] = 'U'; sdata[7] = 'P';
   sdata[8] = '!';
  }//TimeOver(1sec)
 sdata[19] = snum;
 sendto( sk, sdata, 20, &recv );
 }

if( flug == 3){  flug = 0;}

}/*__無限ループ*/



}
/*__主処理*/



