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; } } }
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); } }