WebCFace 2.9.0
Web-based Communication Framework & Dashboard-like UI
|
webcface/field.h
)WebCFaceで送受信されるそれぞれのデータを Field と呼びます。 データ型としては Value, Text, Func, View, Log, Canvas2D, Image, Canvas3D, RobotModel が用意されており、詳細はそれぞれのページで説明しています。
このページには各データ型に共通の情報を載せています。
C++ Client::child() または Member::child() に名前を指定することで Field オブジェクトを取得できます。
または ["名前"]
でも同様に取得できます。
JavaScript Client.child() または Member.child() に名前を指定することで Field オブジェクトを取得できます。
Python Client.child() または Member.child() に名前を指定することで Field オブジェクトを取得できます。
Field型のままではデータの送信や受信はできません。 各種データ型のメソッドを使う必要があります。
C++ 例えば child() の代わりに value() でアクセスすると Value 型が返ります。 他の型についても同様です。
または、Fieldに対して .value()
でもValue型に変換できます。
JavaScript 例えば child() の代わりに value() でアクセスすると Value 型が返ります。 他の型についても同様です。
または、Fieldに対して .value()
でもValue型に変換できます。
Python 例えば child() の代わりに value() でアクセスすると Value 型が返ります。 他の型についても同様です。
または、Fieldに対して .value()
でもValue型に変換できます。
Fieldの名前を半角ピリオドで区切ると、WebUI上ではフォルダアイコンで表示されグループ化されて表示されます。
C++
のように名前を指定する代わりに、 Field::child() または 各種データ型::child() でもグループ内のデータを指定できます。
または ["名前"]
でも同様です。
[]
)の引数が数値(または"1"
のような文字列でも同じ)の場合、 2.8 child() や []
内に数値を入れられる仕様はdeprecatedです。 (Value型の配列アクセスを除く)
C++ Field::member() でそのFieldが所属するMemberを取得できます。
Field::name(), (2.0 nameW()) で名前を取得できます。
child() とは逆に、Field::parent() でグループのField (nameの最後のピリオドの前までのField) を取得できます。 cpp assert(wcli.child("pos.x").parent().name() == "pos");
Field::lastName() (2.0 lastNameW()) でピリオドで区切られた最後の部分を取り出すことができます。 cpp assert(wcli.child("pos.x").lastName() == "x");
JavaScript Field.member でそのFieldが所属するMemberを取得できます。
Field.name で名前を取得できます。
Python Field.member でそのFieldが所属するMemberを取得できます。
Field.name で名前を取得できます。
クライアントが送信したデータは、サーバーを経由して別のクライアントに送られます。 (Valueに限らず、これ以降説明する他のデータ型のfieldについても同様です。)
サーバー→クライアント間では、初期状態ではデータは送信されず、 クライアントがリクエストを送って初めてサーバーからデータが順次送られてくるようになります。
基本的にクライアント→サーバーの方向にはすべてのデータが送信されるのに対し、サーバー→クライアントの方向には必要なデータのみを送信する設計になっていますが、これは前者はlocalhost(サーバーとクライアントが同じPC)のみで、後者はWi-FiやLANでも通信することを想定したものです。 (通信量は増えますがクライアント→サーバーのデータ送信をWi-FiやLAN経由で行うことも可能です)
各種データ型のメソッド (Value.set() や View.sync() など) を使って送信するデータをセットし、 その後 Client::sync() をすることで実際にデータが送信されます。
Client::sync() については 4-1. Client の送受信の章を参照してください。
1.8 1.4.1 1.1.2 クライアント→サーバー間では、同じデータを繰り返し送信した場合は2回目以降はデータを送信しないことで通信量を削減しています。
各種データ型のrequestメソッド (Value.request() や View.request() など) を使ってデータをリクエストできます。 (リクエストの送信は Client::sync() とは非同期に行われます。)
データが一度リクエストされた状態であればそれ以降 Client::sync() 時にデータが受信され、 各種データ型のメソッド (Value.tryGet(), get() など) でデータを取得できます。
また、データを一度もリクエストしていない状態で teyGet(), get() などの関数を呼んでデータを取得しようとした際にも自動的にリクエストが送られます。
データが送信された際、 Entry としてそのデータの存在が全クライアントに通知されます。 受信したEntryはリクエスト状態とは関係なく取得可能です。
C++ 例えば Member::values() で 1.6 Member::valueEntries() でそのMemberが送信しているvalueのリストが得られます。
Text, Func, View など他のデータ型に関しても同様に textEntries()
, funcEntries()
, viewEntries()
などで取得できます。
2.1 Value::exists() でそのデータが送信されているかどうかを確認できます。 tryGet() と違い、データそのものを受信するリクエストは送られません。 他のデータ型に関しても同様に Text::exists()
, Func::exists()
, View::exists()
などが使えます。
1.11 Field::valueEntries() でそのfield以下のvalueのみが得られます (Textなど他の型についても同様)
2.6 Field::childrenRecurse() ですべてのデータ型についてそのfield以下に存在するentryを確認できます。 cpp std::vector<webcface::Field> values = wcli.member("foo").field("pos").childrenRecurse(); // pos.x, pos.y などのデータ(型に関係なく)のリストが得られる
また、Field::children() では次のピリオドで区切られているグループを取得できます。 cpp std::vector<webcface::Field> values = wcli.member("foo").field("pos").children(); // 例えば、 pos.x, pos.y, pos.vel.x, pos.vel.y が存在した場合、 // pos.x, pos.y, pos.vel が得られる
Field::hasChildren() でそのfield以下にデータが存在するかを確認できます。
C
wcfValueEntryList
, wcfValueEntryListW
にchar*の配列とサイズを渡すと、valueの一覧を取得できます。
それぞれのvalue名の文字列は、 wcfClose() するまではfreeされません。
Text, Func, View など他のデータ型に関しても同様に wcfTextEntryList()
, wcfFuncEntryList()
, wcfViewEntryList()
などで取得できます。
JavaScript Member.values() 1.10 Member.valueEntries() でそのMemberが送信しているvalueのリストが得られます
Text, Func, View など他のデータ型に関しても同様に textEntries()
, funcEntries()
, viewEntries()
などで取得できます。
1.8 Value.exists() でそのデータが送信されているかどうかを確認できます。 tryGet() と違い、データそのものを受信するリクエストは送られません。 他のデータ型に関しても同様に Text.exists()
, Func.exists()
, View.exists()
などが使えます。
1.10 Field.valueEntries() でそのfield以下のvalueのみが得られます (Textなど他の型についても同様)
1.10 Field.childrenRecurse() ですべてのデータ型についてそのfield以下に存在するentryを確認できます。 ts const values = wcli.member("foo").field("pos").childrenRecurse(); // pos.x, pos.y などのデータ(型に関係なく)のリストが得られる
また、Field.children() では次のピリオドで区切られているグループを取得できます。 ts const values = wcli.member("foo").field("pos").children(); // 例えば、 pos.x, pos.y, pos.vel.x, pos.vel.y が存在した場合、 // pos.x, pos.y, pos.vel が得られる
Field.hasChildren() でそのfield以下にデータが存在するかを確認できます。
Python Member.values() 1.1 Member.value_entries() でそのMemberが送信しているvalueのリストが得られます
Text, Func, View など他のデータ型に関しても同様に text_entries()
, func_entries()
, view_entries()
などで取得できます。
2.0 Value.exists() でそのデータが送信されているかどうかを確認できます。 try_get() と違い、データそのものを受信するリクエストは送られません。 他のデータ型に関しても同様に Text.exists()
, Func.exists()
, View.exists()
などが使えます。
3.1 Field.value_entries() でそのfield以下のvalueのみが得られます (Textなど他の型についても同様)
3.1 Field.children(recurse=True) ですべてのデータ型についてそのfield以下に存在するentryを確認できます。 python values = wcli.member("foo").field("pos").children(recurse=True) @section autotoc_md78 pos.x, pos.y などのデータ(型に関係なく)のリストが得られる
また、Field.children(recurse=False) では次のピリオドで区切られているグループを取得できます。 python values = wcli.member("foo").field("pos").children(recurse=False); @section autotoc_md79 例えば、 pos.x, pos.y, pos.vel.x, pos.vel.y が存在した場合、 @section autotoc_md80 pos.x, pos.y, pos.vel が得られる
Field.has_children() でそのfield以下にデータが存在するかを確認できます。
他のメンバーが新しくデータを追加したときに呼び出されるコールバックを設定できます。 ValueEntry, TextEntry など各データ型にそれぞれあります。
イベントの詳細な使い方はMemberEntryと同様です(Member のページを参照してください)。 このクライアントが接続する前から存在したデータについては start(), waitConnection() 時に一度に送られるので、 コールバックの設定はstart()より前に行うと良いです。
ValueEntryではデータの存在を知ることしかできません。 データの内容を取得するにはコールバックの中で改めてget()やrequest()を呼ぶか、 後述のValueChangeイベントを使ってください。
C++ 2.0 Member::onValueEntry() でコールバックを設定できます。 新しく追加されたValueの情報が引数に渡されます。
ver1.11以前では .onValueEntry().appendListener(...)
他のデータ型に関しても同様に onTextEntry()
, onFuncEntry()
, onViewEntry()
などが使えます。
C
wcfValueEntryEvent
, wcfValueEntryEventW
で引数に const char * 2つと void * をとる関数ポインタをコールバックとして設定できます。
新しく追加されたValueの名前が引数に渡されます。 void*引数には登録時に任意のデータのポインタを渡すことができます。(使用しない場合はNULLでよいです。)
他のデータ型に関しても同様に wcfTextEntryEvent()
, wcfFuncEntryEvent()
, wcfViewEntryEvent()
などが使えます。
JavaScript Member.onValueEntry でコールバックを設定できます。 新しく追加されたValueの情報が引数に渡されます。
他のデータ型に関しても同様に onTextEntry
, onFuncEntry
, onViewEntry
などが使えます。
Python Member.on_value_entry() でコールバックを設定できます。 新しく追加されたValueの情報が引数に渡されます。
on_value_entry.connect(...)
on_text_entry()
, on_func_entry()
, on_view_entry()
などが使えます。
受信したデータが変化したときにコールバックを呼び出すことができます。 Change イベントにコールバックを設定するとget()やrequest()を呼ばなくても自動的にその値がリクエストされます。
また、データが変化したどうかに関わらずそのMemberがsync()したときにコールバックを呼び出したい場合は Sync イベントが使えます。
イベントの詳細な使い方はonMemberEntryと同様です(Member のページを参照してください)。
C++ 2.0 Value::onChange(), Member::onSync() でコールバックを設定できます。 他のデータ型についても同様です。
引数にはそれぞれそのValue自身,Member自身が渡されます。 (キャプチャでも同じことができるのでなくてもよい)
value("hoge").appendListener(...)
, member("foo").onSync().appendListener(...)
ですすべてのデータを受信したい場合は ValueEntry イベントの中でonChangeを設定すると可能です。
C
wcfValueChangeEvent
, wcfValueChangeEventW
で引数に const char * 2つと void * をとる関数ポインタをコールバックとして設定できます。 void*引数には登録時に任意のデータのポインタを渡すことができます。(使用しない場合はNULLでよいです。)
他のデータ型についても同様です。
JavaScript Value.on(), Member.onSync.on() などでコールバックを設定できます。 他のデータ型についても同様です。
引数にはそれぞれそのValue自身,Member自身が渡されます。 (なくてもよい)
例えば全Memberの全Valueデータを受信するには
のようにすると可能です。
Python 2.0 Value.on_change(), Member.on_sync() でコールバックを設定できます。 他のデータ型についても同様です。
引数にはそれぞれそのValue自身,Member自身が渡されます。
すべてのデータを受信したい場合は ValueEntry イベントの中でonChangeを設定すると可能です。
pythonでは Value.signal プロパティがこのイベントのsignalを返します。