Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot handle binary("raw") data in QiValue #1

Closed
malaybaku opened this issue Feb 11, 2016 · 1 comment
Closed

Cannot handle binary("raw") data in QiValue #1

malaybaku opened this issue Feb 11, 2016 · 1 comment

Comments

@malaybaku
Copy link
Owner

QiValueの実体がバイナリデータの場合にデータIOが出来ない問題

概要

QiValueの型の中でもバイナリ型("Raw")に関して

  • QiValue.SetValue(byte[] data)
  • `QiValue.GetRaw()``

等を使ってもSetValueの反応が特に無かったりGetRawで意味のある結果が得られなかったりする。バイナリデータが扱えないとALVideoDeviceでのカメラ画像取得などに支障が出るのを確認済み。

原因

C言語API側の実装が未対応らしく、実装部分を見てもreturn 0;しか無いのが現状。

対策指針

下記のいずれかを検討中

  • libqi-capiの追記してPR飛ばす
  • C言語APIのさらに元であるqi.dllをロードして対応する
@malaybaku
Copy link
Owner Author

対応結果

下記のようにしてC言語APIであるqic.dllを修正することでバイナリデータの入出力に対応した。

環境整備

VS 2013 Community上でlibqi-capiのビルドが通るようにする

#Python 2.7系がインストール済みという前提
pip install qibuild
qisrc init http://github.com/aldebaran/manifest.git
qitoolchain create --feed-name win32-vs2013 --branch master altoolchain git://github.com/aldebaran/toolchains.git
qibuild config --wizard
#ウィザードでは下記の操作を行う
# - Generator/IDEをVS2013 Communityに変更
# - デフォルトツールチェインを上で作ったaltoolchainに変更

#コード変更1
qibuild configure --release libqi-capi
#コード2
qibuild make libqi-capi

コード変更1

configuremakeの時点でエラーで通らない段階があるハズなので、その場合は(不健全だが)libqiに関するエラーをよく読み、通ってない単体テストをコメントアウトとかで潰す

コード変更2

ここが変更の主体。libqi-capiの未実装関数を次のように実装する。

//# RAW
int qi_value_raw_set(qi_value_t* value, const char* data, int size){
  qi::AnyValue &gv = qi_value_cpp(value);
  if (gv.kind() != qi::TypeKind_Raw) {
    return 0;
  }
  try {
    gv.setRaw(data, size);
    return 1;
  } catch (std::runtime_error &) {}
  return 0;
}

int qi_value_raw_get(qi_value_t* value, const char**data, int *size) {
  qi::AnyValue &gv = qi_value_cpp(value);
  if (gv.kind() != qi::TypeKind_Raw) {
    return 0;
  }
  try {
    std::pair<char*, size_t> res = gv.asRaw();
    *data = res.first;
    *size = res.second;
    return 1;
  } catch (std::runtime_error &) {}

  *data = 0;
  *size = -1;
  return 0;
}

これでビルドするとバイナリデータの入出力がC言語APIからも拾えるようになった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant