int main(int argc,char **argv){
    
    byte com=0;                             	// シリアルCOMポート番号
    byte dev_bell[8];                       	// XBee子機(ベル)デバイスのアドレス
    byte dev_sw[8];                         	// XBee子機(スイッチ)デバイスのアドレス
    byte trig=0;                                // 子機へデータ要求するタイミング調整用
    XBEE_RESULT xbee_result;                	// 受信データ(詳細)

    if(argc==2) com=(byte)atoi(argv[1]);    	// 引数があれば変数comに代入する
    xbee_init( com );                       	// XBee用COMポートの初期化
    printf("Waiting for XBee Bell\n");
    xbee_atnj(60);                          	// デバイスの参加受け入れ
    xbee_from( dev_bell );                  	// 見つけた子機のアドレスを変数devへ
    bell(dev_bell,3);							// ベルを3回鳴らす
    xbee_end_device(dev_bell, 1, 0, 0);      	// 起動間隔1秒,自動測定OFF,SLEEP端子無効
    printf("Waiting for XBee Switch\n");
    xbee_atnj(60);                          	// デバイスの参加受け入れ
    xbee_from( dev_sw );                    	// 見つけた子機のアドレスを変数devへ
    bell(dev_bell,3);							// ベルを3回鳴らす
    xbee_gpio_init( dev_sw );               	// 子機のDIOにIO設定を行う
    xbee_end_device(dev_sw, 3, 0, 1);     		// 起動間隔3秒,自動送信OFF,SLEEP端子有効
    printf("done\n");

    while(1){
        if( trig == 0){
            xbee_force( dev_sw );                  		// 子機へデータ要求を送信
            trig = FORCE_INTERVAL;
        }
        trig--;
        xbee_rx_call( &xbee_result );                   // データを受信
        switch( xbee_result.MODE ){                     // 受信したデータの内容に応じて
            case MODE_RESP:
            case MODE_GPIN:                             // 子機XBeeの自動送信の受信
                if(xbee_result.GPI.PORT.D1 == 0){
	                printf("D1=0 Ring\n");
	                bell(dev_bell,3);					// ベルを3回鳴らす
	            }else printf("D1=1\n");
                bell(dev_bell,0);						// ベル音を消す
                break;
        }
    }
}
int main(void){
    byte value;                                     // 受信値
    XBEE_RESULT xbee_result;                        // 受信データ(詳細)

    xbee_init( 0 );                                 // XBeeの初期化
    printf("Example 68 SW_R (Any key to Exit)\n");
    if( xbee_ping(dev_gpio)==00 ){
        xbee_myaddress(dev_my);                     // 自分のアドレスを設定する
        xbee_gpio_init(dev_gpio);                   // デバイスdev_gpioにIO設定を行う
        while(1){
            xbee_rx_call( &xbee_result );           // データを受信
            if( xbee_result.MODE == MODE_GPIN){     // 子機XBeeのDIO入力
                value = xbee_result.GPI.PORT.D1;    // D1ポートの値を変数valueに代入
                printf("Value =%d\n",value);        // 変数valueの値を表示
                xbee_gpo(dev_gpio,4,value);         // 子機XBeeのDIOポート4へ出力
            }
            if( kbhit() ) break;                    // PCのキー押下時にwhileを抜ける
        }
    }
    printf("\ndone\n");
    return(0);
}
int main(int argc,char **argv){
	byte i;
	byte trig=0;
	byte trig_min_s=0;
	byte trig_min_e=0;
	byte prev=0;
//	byte dev_en = 0;	// センサー発見の有無(0:未発見)
	XBEE_RESULT xbee_result;

	time_t timer;
	struct tm *time_st;

	byte port=0;		// ↓お手持ちのXBeeモジュールのIEEEアドレスに変更する
	byte dev_sens[]   = {0x00,0x13,0xA2,0x00,0x00,0x00,0x00,0x00};	// PocketGeiger
	
	int signCount=0;	//信号のカウント回数
	int noiseCount=0;	//ノイズのカウント回数
	byte signValue=0;	//前回のsign値 0 or 1

	float cpm = 0; //現在のカウント数
	float cpmHistory[DATA_NUM]; //カウント回数の履歴
	byte cpmIndex=0;//カウント回数の現在配列の格納位置

	//cpm計算用の時間
	int cpmTimeSec=0;

	//出力演算用
	float cpmBuff=0.;
	float uSvBuff=0.;
//	float uSvdBuff=0.;

	float min;

	// 初期化処理
	#ifndef H3694
		if( argc==2 ) port = (byte)(argv[1][0]-'0');
	#endif
	xbee_init( port );					// COMポート初期化(引数はポート番号)
	xbee_at( "ATSP07D0");				// End Device用データ保持期間を20秒に設定
	
	// デバイス探索
	lcd_disp("Searching:PocketGeiger");
	if( xbee_atnj(30) ){				// 30秒間の参加受け入れ
		lcd_disp("Found device");
		xbee_from( dev_sens );			// 受信したアドレスをdev_sensへ格納
	//	dev_en = 1;						// sensor発見済
		xbee_gpio_init(dev_sens);		// デバイスdev_sensにIO設定を行うための送信(End Deviceは設定できるとは限らない)
		xbee_rat( dev_sens , "ATD405");	// ポケットガイガをOFFにする
		xbee_rat( dev_sens , "ATSM05");	// Cyclic Sleep wakes on timer expirationに設定
		xbee_rat( dev_sens , "ATSP07D0");	// 送信間隔を20秒に設定
	}else{
		lcd_disp("Failed:no dev.");
		exit(-1);
	}
	
	for(i=0; i<DATA_NUM;i++ ) cpmHistory[i]=0;

	lcd_disp("Started...");
	time(&timer);
	time_st = localtime(&timer);
	printf("%02d:%02d:%02d \n",time_st->tm_hour,time_st->tm_min,time_st->tm_sec);
	do{
		time(&timer);
		time_st = localtime(&timer);
	}while( (time_st->tm_sec) != 0 );
	
	lcd_disp("Measuring...");
	trig = 1 ;						// 測定中
	prev = 0 ;						// 前回の測定時刻の秒
	trig_min_s = time_st->tm_min ;	// 開始の分を記録
	trig_min_e = time_st->tm_min + TIME_MEAS;	// 終了の分を記録
	if( trig_min_e >= 60 ) trig_min_e -= 60;
	xbee_rat( dev_sens , "ATD404");	// ポケットガイガをONにする
	printf("%02d:%02d:%02d ---- uSv/h (--- cpm)\n",time_st->tm_hour,time_st->tm_min,time_st->tm_sec);
	
	// メイン処理
	while(1){							// 永久に受信する
	
		time(&timer);
		time_st = localtime(&timer);
	
		/* データ受信(待ち受けて受信する) */
		xbee_result.MODE = MODE_AUTO;	// 自動受信モードに設定
		xbee_rx_call( &xbee_result );	// データを受信します。(処理に50msかかります)
										// data:受信結果の代表値
										// xbee_result:詳細な受信結果
										// xbee_result.MODE:受信モード
		switch( xbee_result.MODE ){		// 受信したデータの内容(MODE値)に応じて
			case MODE_RESP:				// sensorからの応答の場合に照度と温度を表示
			case MODE_GPIN:				// 周期方式でデータ受信した場合も想定
				if( bytecmp( dev_sens , xbee_result.FROM ,8 ) == 0 ){
				//	printf("gpin\n");	// テスト用
					#ifdef XBEE_END_DEVICE
						signCount++;		//放射線パルス(Low)をカウント
						if( xbee_result.GPI.PORT.D1 == signValue ){
							signCount++;	//パケットロス対策
							printf("detected packet loss\n");
						}
						signValue = xbee_result.GPI.PORT.D1;					// 現在の値を保存
					#else
						if( xbee_result.GPI.PORT.D1 == 0 ) signCount++;			//放射線パルス(Low)をカウント
					#endif
					if( xbee_result.GPI.PORT.D2 == 1 ) {
						noiseCount++;		//ノイズ(High)をカウント
						printf("detected noise\n");
					}
				}else{
					printf("gpin from=");
					for( i=0 ; i<8 ; i++ ) printf("%02X ",xbee_result.FROM[i]);
					printf("\nstatus=[%x]\n",xbee_result.STATUS);
				}
				break;
			case MODE_IDNT:				// 新しいデバイスを発見
				lcd_disp("found a new device");
				xbee_from( dev_sens );	// 受信したアドレスをdev_sensへ格納
			//	dev_en = 1;				// sensor発見済
				xbee_gpio_init(dev_sens);	// デバイスdev_sensにIO設定を行うための送信
				xbee_rat( dev_sens , "ATD405");	// ポケットガイガをOFFにする
				xbee_rat( dev_sens , "ATSM05");	// Cyclic Sleep wakes on timer expirationに設定
				xbee_rat( dev_sens , "ATSP07D0");	// 送信間隔を20秒に設定
				break;
			default:
				break;
		}
		
		if( trig == 1 ){					// 測定中
			if(time_st->tm_min == trig_min_e ){
				trig = 2;					// 20秒後に停止する
				xbee_rat( dev_sens , "ATD405");	// ポケットガイガをOFFにする
			}
		}else if( trig == 0 ){				// 測定していない
			if(time_st->tm_min == trig_min_s ){
				trig = 1;
				xbee_rat( dev_sens , "ATD404");	// ポケットガイガをONにする
				for(i=0; i<DATA_NUM;i++ ) cpmHistory[i]=0;
				cpmIndex = 0;
				cpm = 0;
				cpmTimeSec = 0;
			}
		}else{ // trig == 2					// 20秒後に停止する
			if(time_st->tm_sec == 20 ){
				trig = 0;
			}
		}
		
		if( ((time_st->tm_sec)%6 == 0 ) && (prev != (time_st->tm_sec)) ){
			prev = time_st->tm_sec;
			if( trig != 0){
				if(noiseCount == 0){				//ノイズが検出されないとき(ノイズが検出されたときは、処理をしない)
					cpmIndex++;
					if(cpmIndex >= DATA_NUM){        //最後(TIME_MEAS分後)まできたら元に戻す
						cpmIndex = 0;
					}
					//一周してきたときに次に格納する配列に値が詰まっていれば、
					//現在の合計しているカウント(変数cpm)から引いて、無かったことにする
					if(cpmHistory[cpmIndex] > 0){
						cpm -= cpmHistory[cpmIndex];
					}

					cpmHistory[cpmIndex] = signCount;
					cpm += signCount;				//カウント回数の蓄積
					
					if( cpmTimeSec >= TIME_MEAS * 60 ){		//cpmを求めるときに使用する計測時間(最大TIME_MEAS分)を加算
						cpmTimeSec = TIME_MEAS * 60;
					}else{
						cpmTimeSec += 6 ;
					}
				}
				min = cpmTimeSec / 60.0;      //現在の計測時間(最大TIME_MEAS分)
				if(min!=0){        //cpm、uSv/h、uSv/hの誤差をそれぞれ計算する
					cpmBuff = cpm / min;
					uSvBuff = cpm / min / alpha;
				//	uSvdBuff = sqrt(cpm) / min / alpha;
				}else{        //0割り算のときは、0にする
					cpmBuff = 0;
					uSvBuff = 0;
				//	uSvdBuff = 0;
				}
			}
			//液晶への表示
			printf("%02d:%02d:%02d ",time_st->tm_hour,time_st->tm_min,time_st->tm_sec);
			if( trig == 0 ) printf("off "); else printf("ON  ");
			printf("%.2f uSv/h ", uSvBuff );
			printf("(%.1f cpm) ", cpmBuff );
			if( trig == 0 ) printf("\n"); else printf("s=%d n=%d\n", signCount, noiseCount );
			
			//次のループのための変数の初期化
			signCount=0;
			noiseCount=0;
		}
	}
}
Beispiel #4
0
void xbee_routine_thread(void)
{
	int ret=0;
    pthread_t id;
	uint8 _i,_adr[8];
	uint8 *HeadMidAdr=NULL;

	time_t timetTime;
    struct tm *pTmTime;

	timetTime = time(NULL);		//获取当前系统时间
	//printf("timetTime=%d\n", (uint32)timetTime);
	strncpy(CoorInfo.logname,"xbee_dev_log_",13);
    pTmTime = localtime(&timetTime);	//time_t 结构转换成tm结构
    snprintf(CoorInfo.logname+13 , 24 , "%04d_%02d_%02d_%02d_%02d_%02d.txt", pTmTime->tm_year+1900, pTmTime->tm_mon+1, pTmTime->tm_mday, pTmTime->tm_hour, pTmTime->tm_min, pTmTime->tm_sec);
	printf("CoorInfo.logname=%s\n", CoorInfo.logname);
	err_log(CoorInfo.logname , strlen(CoorInfo.logname));

	xbee_gpio_init();
	xbee_serial_port_init(115200);

	for(_i=0;_i<8;_i++)
		_adr[_i] = 0;

		MUTEX_LOCK(&mutex13_pSourcePathList);
			pSourcePathList = CreatRouterLink(_adr,0,HeadMidAdr,0);
		MUTEX_UNLOCK(&mutex13_pSourcePathList);

		MUTEX_LOCK(&mutex01_serial_rbuf);
			creat_circular_queue( &serial_rbuf );
		MUTEX_UNLOCK(&mutex01_serial_rbuf);

		MUTEX_LOCK(&mutex08_trans_status_buf);
			creat_circular_queue( &trans_status_buf );
		MUTEX_UNLOCK(&mutex08_trans_status_buf);

		MUTEX_LOCK(&mutex09_xbee_other_api_buf);
			creat_circular_queue( &xbee_other_api_buf );
		MUTEX_UNLOCK(&mutex09_xbee_other_api_buf);

		MUTEX_LOCK(&mutex10_serial_wbuf);
			creat_circular_queue( &serial_wbuf );
		MUTEX_UNLOCK(&mutex10_serial_wbuf);

		MUTEX_LOCK(&mutex12_trans_req_buf);
			creat_circular_queue( &trans_req_buf );
		MUTEX_UNLOCK(&mutex12_trans_req_buf);

		MUTEX_LOCK(&mutex11_route_record_buf);
			creat_circular_queue( &route_record_buf );
		MUTEX_UNLOCK(&mutex11_route_record_buf);

	//printf("\033[33mstart xbee_routine_thread_write_serial...\033[0m\r\n");
	do{
	    if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_write_serial,NULL)) != 0)
		{
	        printf ("Create xbee_routine_thread_write_serial error!\n");
			err_log("Create xbee_routine_thread_write_serial error!" , strlen("Create xbee_routine_thread_write_serial error!"));
	    }
	}while(ret != 0);

	//printf("\033[33mstart xbee_routine_thread_read_serial...\033[0m\r\n");
	do{
	    if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_read_serial,NULL)) != 0)
		{
	        printf ("Create xbee_routine_thread_read_serial error!\n");
			err_log("Create xbee_routine_thread_read_serial error!" , strlen("Create xbee_routine_thread_read_serial error!"));
	    }
	}while(ret != 0);

	//printf("\033[33mstart xbee_routine_thread_process_serial_rbuf...\033[0m\r\n");
	do{
    	if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_process_serial_rbuf,NULL)) != 0)
		{
       		printf ("Create xbee_routine_thread_process_serial_rbuf error!\n");
			err_log("Create xbee_routine_thread_process_serial_rbuf error!" , strlen("Create xbee_routine_thread_process_serial_rbuf error!"));
    	}
	}while(ret != 0);

	xbee_reset();
	sleep(1);
	XBeeNetInit();
	get_mac();

	//printf("\033[33mstart xbee_routine_thread_process_trans_status_buf...\033[0m\r\n");
	do{
    	if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_process_trans_status_buf,NULL)) != 0)
		{
        	printf ("Create xbee_routine_thread_process_trans_status_buf error!\n");
			err_log("Create xbee_routine_thread_process_trans_status_buf error!" , strlen("Create xbee_routine_thread_process_trans_status_buf error!"));
    	}
	}
	while(ret != 0);

	//printf("\033[33mstart xbee_routine_thread_process_trans_req_buf...\033[0m\r\n");
	do{
    	if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_process_trans_req_buf,NULL)) != 0)
		{
    	    printf ("Create xbee_routine_thread_process_trans_req_buf error!\n");
			err_log("Create xbee_routine_thread_process_trans_req_buf error!" , strlen("Create xbee_routine_thread_process_trans_req_buf error!"));
    	}
	}
	while(ret != 0);

	//printf("\033[33mstart xbee_routine_thread_process_route_record_buf...\033[0m\r\n");
	do{
    	if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_process_route_record_buf,NULL)) != 0)
		{
			printf ("Create xbee_routine_thread_process_route_record_buf error!\n");
			err_log("Create xbee_routine_thread_process_route_record_buf error!" , strlen("Create xbee_routine_thread_process_route_record_buf error!"));
		}
	}
	while(ret != 0);

	//printf("\033[33mstart xbee_routine_thread_process_other_api_buf...\033[0m\r\n");
	do{
    	if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_process_other_api_buf,NULL)) != 0)
		{
			printf ("Create xbee_routine_thread_process_other_api_buf error!\n");
			err_log("Create xbee_routine_thread_process_other_api_buf error!" , strlen("Create xbee_routine_thread_process_other_api_buf error!"));
    	}
	}while(ret != 0);

#if __XBEE_TEST__
	//printf("\033[33mstart xbee_routine_thread_test...\033[0m\r\n");
	do{
		if((ret=pthread_create(&id,NULL,(void *) xbee_routine_thread_test,NULL)) != 0)
		{
	        printf ("Create xbee_routine_thread_test error!n");
	    }
	}while(ret != 0);
#endif
	while(1)
	{
		uint16 i=0,n=0;
		SourceRouterLinkType *p=NULL;
		MUTEX_LOCK(&mutex13_pSourcePathList);
		n = LinkLenth(pSourcePathList);
		for(i=1;i<=n;i++)
		{
			p = FindnNode(pSourcePathList,i);
			if(p->cnt-- < 1)
				DeleteNode(pSourcePathList,p);
			p = NULL;
		}
		MUTEX_UNLOCK(&mutex13_pSourcePathList);
		usleep(5000000);
		//usleep(2000000);
	}
}