int sema_lock_timeout (sema_handle handle, long ms) { sema_t *s = (sema_t *) handle; int ret; if (ms == 0) { ret = sema_lock (handle, NOWAIT_OPT); return ret != R_ERR_WOULD_BLOCK ? ret : R_ERR_TIMEOUT; } if (s->type == MUTEX_TYPE) { if (s->owner != current_thread_info ()) { ret = down_timeout (&s->sem, ms * HZ / 1000); if (ret != 0) { goto err; } s->owner = current_thread_info (); } s->ref_count++; return R_OK; } else { ret = down_timeout (&s->sem, ms * HZ / 1000); if (ret != 0) { goto err; } return R_OK; } err: switch (ret) { case -ETIME: return R_ERR_TIMEOUT; default: return R_ERR_FAILED; } }
/****************************************************** interpreter関数 ソケット通信でclientからコマンドがきたら、コマンドに応じて返信する *****************************************************/ int interpreter(char *line){ char com[128]; char *ptr; int command_flag=FALSE; int fd = get_socket_fd(); char result[8024]; //結果の文字列領域 int size; int i; //コマンドを切り出す while (*line && whitespace (*line)) line++; ptr = read_token(line, "%s", com); //fprintf(stderr, "recv command: %s\n", com); /******** コマンドに応じて返すデータを変更(ここから) *********/ //生画像データが欲しい if(strcmp(com, "write-rawdata") == 0){ //rawdataを送っている間に画像データが書き変わらないようにロックをかける sema_lock(raw_semaphore); write(fd, rawdata, (process_width*process_height*3)); sema_unlock(raw_semaphore); command_flag = TRUE; } //処理語画像データが欲しい else if(strcmp(com, "write-processdata") == 0){ sema_lock(process_semaphore); write(fd, processdata, (process_width*process_height*3)); sema_unlock(process_semaphore); command_flag = TRUE; } //処理結果(座標等)が欲しい // euslispで解釈しやすいように、()のリスト情報で情報付しておいてやるのがよい // 仕様は自分で決めて、後でclientのeuslisp側のソフトが動くものを作ればいい // ここでは重心位置を返すようにしている else if(strcmp(com, "result") == 0){ size = sprintf(result, "((:centroid"); for(i=0; i<label_num; i++){ size += sprintf(result+size, " #f(%d %d)", (int)linfo[i].xpos,(int)linfo[i].ypos); } size += sprintf(result+size, ")"); size += sprintf(result+size, " (:area"); for(i=0; i<label_num; i++){ size += sprintf(result+size, " %d", linfo[i].area); } size += sprintf(result+size, "))\n"); write(fd, result, size); command_flag = TRUE; } //縦横を返す for vision-viewer else if(strcmp(com, "vision-size")==0){ size = sprintf(result, "(%d %d)\n", process_height, process_width); write(fd, result, size); command_flag = TRUE; } //閾値を変更したい else if(strcmp(com, "color-threshold") == 0){ for(i=0; i<6; i++){ ptr = read_token(ptr, "%d", &rgb_thre[i]); } fprintf(stderr, "change rgb_threshold "); for(i=0; i<6; i++){ fprintf(stderr, "%d ", rgb_thre[i]); } fprintf(stderr, "\n"); command_flag = TRUE; } //閾値を取得したい else if(strcmp(com, "get-color-threshold") == 0){ size = sprintf(result, "#f("); for(i=0; i<6; i++){ size += sprintf(result+size, "%d ", rgb_thre[i]); } size += sprintf(result+size, ")\n"); write(fd, result, size); command_flag = TRUE; } //Labeling個数をセット 引数一つ else if(strcmp(com, "set-displaylabel-num") == 0){ ptr = read_token(ptr, "%d", &display_label_num); fprintf(stderr, "change displaylabelnum %d\n", display_label_num); command_flag = TRUE; } //Labeling個数を取得 else if(strcmp(com, "get-displaylabel-num") == 0){ size = sprintf(result, "%d\n", display_label_num); write(fd, result, size); command_flag = TRUE; } //表示最小面積をセット 引数ひとつ else if(strcmp(com, "set-minarea") == 0){ ptr = read_token(ptr, "%d", &minimum_area); fprintf(stderr, "change minimu area size %d\n", minimum_area); command_flag = TRUE; } //表示最小面積を取得 else if(strcmp(com, "get-minarea") == 0){ size = sprintf(result, "%d\n", minimum_area); write(fd, result, size); command_flag = TRUE; } /******** コマンドに応じて返すデータを変更(ここまで) *********/ //該当しないコマンドがきた場合はその旨を表示 if(command_flag == FALSE){ fprintf(stderr, "No such command %s\n", com); } return 0; }