現: 2012-12-24 (月) 12:12:36 takaboo ソース
Line 1: Line 1:
 +TITLE:FREEDOM III library
 +#norelated
 +#nocontents
 +*概要 [#t909366f]
 +FREEDOM IIIライブラリVer.4.5は、[[FDIII-HC>BTE083]]とDynamixelシリーズで構成されたアプリケーションを効率的に運用するためのライブラリです。~
 +アクチュエータのIDやアクチュエータの位置を角度に変換するパラメータを元に、各アクチュエータを連動して動かしたり、アクチュエータの持つ情報を取得するといったアプリケーションレベルにおいて最低限必要な機能を本ライブラリでカバーします。~
 +なお、本ライブラリはその外のライブラリ(SAM7S, SAM7S_TOPPERS等)を静的に使用していますので、ベンダーから提供されるGCC Developer Liteをインストールする際は、各コンポーネントを手動で選択することなくフルインストールした環境で使用して下さい。また、全てのソースもインストールと同時に展開されますので、必要に応じて参照できます。~
 +本ライブラリで提供されるAPIのプロトタイプ宣言や特殊な構造体はfd.hに集約されています。このヘッダファイルに宣言が無いAPIは使用しないで下さい。
 +*API [#a19dba7f]
 +機能別にAPIの詳細を解説します。主なコンテンツを以下に紹介します。
 +-[[OS関連>#m50e2f43]]~
 +Toppersに関連する機能やFREEDOM III libraryのエンジン部分を担うAPI。
 +-[[サウンド>#nf714783]]~
 +FDIII-HCに搭載されたブザーによる音楽の演奏API。
 +-[[コンソール>#m9abd54e]]~
 +USBやBluetoothを介したコンソールAPI。
 +-[[LCD描画>#h931c7fe]]~
 +FDIII-HCに接続して使用するLCDの描画API。
 +-[[RC-100B>#g8a60aa2]]~
 +BluetoothによるリモートコントローラRC-100Bとの通信API。
 +-[[SIXAXIS>#e4fbf192]]~
 +BluetoothによるリモートコントローラSIXAXISないしDUALSHOCK3との通信API。
 +-[[ホームポジション・モーションファイル管理>#e1b0cdb0]]~
 +FREEDOM III libraryで扱う主要なデータをSDカードで扱うAPI。
 +-[[Dynamixelプロトコル>#eec291b3]]~
 +Dynamixelプロトコルをサポートするデバイスとコミュニケーションを行うAPI。
 +-[[Dynamixelアクチュエータシリーズ専用>#abd6a7f5]]~
 +Dynamixelプロトコルをサポートするアクチュエータ専用のコミュニケーションAPI。
 +-[[FUTABA RSアクチュエータシリーズプロトコル及び各アイテム専用>#j1dc9dbe]]~
 +FUTABAコマンド方式サーボのプロトコルをサポートするアクチュエータ専用のコミュニケーションAPI。
 +-[[KONDO KRSアクチュエータシリーズプロトコル及び各アイテム専用>#xa12f7bb]]~
 +KONDO ICS3.0/ICS3.5をサポートするアクチュエータ専用のコミュニケーションAPI。
 +-[[SDファイルアクセス>#i87518a6]]~
 +任意のデータをSDカードを介して扱うAPI。
 +-[[FREEDOM IIIライブラリ専用型定義>#l89858c4]]~
 +FREEDOM III library全般で使用されるオリジナルな変数宣言。
 +
 +旧来に比べかなりのボリュームになっていますが、実際には全てを使うわけではありません。必要に応じてAPIを使用してユーザアプリケーションを構成します。まずは[[FDIII-HCのサンプルプログラム>BTE083 FDIII-HC#m24a02e6]]を一通り実行して、動作を確認する事を推奨します。
 +
 +**OS関連 [#m50e2f43]
 +FREEDOM IIIライブラリはToppersに依存しており、予め予約されたリソースのうちユーザに解放しているものであれば自由に使用できます。主な恩恵は複数のタスクが使用できることにあります。~
 +各タスクで利用できるスタックはカーネルのコンフィギュレーションで2kバイトに固定されています。大きなメモリを必要とする処理(変数の宣言やネストが深い関数の呼び出し)を行うと容易にスタックがフローします。~
 +TASK5はライブラリ内で使用済みとなりますので、ユーザプログラムから制御してはなりません。その他のリソースについてもライブラリ内で使用済みなものがいつくか存在しますので、詳細はライブラリのソースにて確認してください。~
 +なお、ToppersのAPIに関してはここでは触れませんので、具体的な使い方等についてはサンプルプログラムで確認してください。
 +
 +***fd_ElapsedTime [#uc34bc90]
 +起動からの経過時間を1ms単位で取得する。
 + uint32_t fd_ElapsedTime (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~0~: 経過時間[ms]
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +int main (void) {
 +  while (!fd_rx_buff ()) {
 +   int ms = fd_ElapsedTime ();
 +   int s = (ms / 1000) % 60;
 +   int m = (ms / 60000) % 60;
 +   int h = (ms / 360000) % 24;
 +   fd_printf ("\r %02d:%02d:%02d.%02d", h, m, s, (ms % 1000) / 10);
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_Wait [#o4813042]
 +タスク起床待ち状態に移行させる。内部ではtslp_tskに置き換えられるため、tslp_tskをそのまま使っても同等の処理となる。~
 +なお、プリエンプティブ・マルチタスクを活性化する機能([[fd_EnableAutoRotateReadyQueue>#b0347a​33]])はデフォルトでONとなっているため、本APIを時間がかかる処理やループ内に適宜挿入して意図的にディスパッチを促す必要はないが、OFFの場合は他のタスク(ライブラリで使用しているTASK5も含む)の期待する動作が阻害される場合がある。
 + ER fd_Wait (TMO tmout);
 +-パラメータ
 +--TMO '''tmout'''
 +~タイムアウト[ms]指定なら正の値~
 +他、TMO_POL TMO_FEVR
 +-戻り値
 +~E_OK: 正常終了~
 +E_PAR: パラメータエラー~
 +E_RLWAI: 待ち状態の強制解除~
 +E_TMOUT: ポーリング失敗もしくはタイムアウト
 +
 +***fd_SoftReset [#b820b7d5]
 +実行中のアプリケーションプログラムを強制終了し、ブートローダへ移行する。なお、mainから抜けると同様の処理が行われる。
 + void fd_SoftReset (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_GetShutdownState [#ef291638]
 +fd_SoftResetないしmainからリターンした事による終了を検出する。
 + bool fd_GetShutdownState (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 終了処理中
 +
 +***fd_EnableAutoRotateReadyQueue [#b0347a33]
 +1ms単位で励起されるレディーキューの強制自動回転を許可する。許可されるとプリエンプティブ・マルチタスクなOSとして利用できる。
 + void fd_EnableAutoRotateReadyQueue (bool en);
 +-パラメータ
 +--bool '''en'''
 +~true: 許可~
 +false: 禁止 (デフォルト)
 +-戻り値
 +~なし
 +
 +***main [#lf37455f]
 +mainタスクから呼ばれるユーザ用に解放されたコールバック関数。mainタスクでライブラリ内で必要となる最低限の初期化処理が行われた後、本main関数が呼ばれる。main関数の宣言が無いと即時終了するプログラムとなる。~
 + int main (void);
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  while (!fd_GetPB ()) {
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***USER_TASK1 [#g1455d0a]
 +TASK1から呼ばれるユーザ用関数。実質TASK1として扱って構わない。
 + void USER_TASK1 (void);
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void USER_TASK1 (void) {
 +  static bool led = false;
 +  while (!fd_GetShutdownState ()) {
 +   fd_SetLed ((led = !led));
 +   fd_Wait (300);
 +  }
 +}
 +
 +void main (void) {
 +  act_tsk (TASK1);
 +  while (!fd_GetPB ()) {
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***USER_TASK2 [#gdad4d27]
 +TASK2から呼ばれるユーザ用関数。実質TASK2として扱って構わない。
 + void USER_TASK2 (void);
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void USER_TASK2 (void) {
 +  static bool led = false;
 +  while (!fd_GetShutdownState ()) {
 +   fd_PlayMusic (false, "L9o4c9");
 +   fd_Wait (1000);
 +  }
 +}
 +
 +void main (void) {
 +  act_tsk (TASK2);
 +  while (!fd_GetPB ()) {
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***USER_TASK3 [#v96465a8]
 +TASK3から呼ばれるユーザ用関数。実質TASK3として扱って構わない。
 + void USER_TASK3 (void);
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void USER_TASK3 (void) {
 +  while (!fd_GetShutdownState ()) {
 +   fd_putc ('.');
 +   fd_Wait (200);
 +  }
 +}
 +
 +void main (void) {
 +  act_tsk (TASK3);
 +  while (!fd_GetPB ()) {
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***USER_TASK4 [#wc1d92a1]
 +TASK4から呼ばれるユーザ用関数。実質TASK4として扱って構わない。
 + void USER_TASK4 (void);
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void USER_TASK4 (void) {
 +  int c;
 +  while (!fd_GetShutdownState ()) {
 +   rcv_dtq (DTQ1, (VP_INT*)&c);
 +   fd_putc (c);
 +   if (c == '\33') break;
 +  }
 +  fd_SoftReset ();
 +}
 +
 +void main (void) {
 +  char c;
 +  act_tsk (TASK4);
 +  fd_puts ("\nSMPL3 START\n");
 +  while (!fd_GetShutdownState ()) {
 +   if (fd_rx_buff ()) {
 +     while (fd_rx_buff ()) {
 +       c = fd_getc ();
 +       snd_dtq (DTQ1, c);
 +     }
 +   }
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +**システム共通 [#v0636858]
 +本ライブラリを使用するにあって必須の初期化処理、各種パラメータの設定、モーションの実行等を行うAPIです。
 +
 +***fd_SetSpec [#r0f0534c]
 +モーションの再生等に使用されるホームポジション値及びネットワークに接続されるデバイスの諸元(ID・動作範囲・各種リミッタ等)の設定を行う。本API を実行しなければモーション等は再生できない。
 +[[fd_GetInitalizedSpec>#abd52cf3]]にてパラメータの初期化が既に行われているかの判断ができる。~
 +なお、諸元データ内にアクチュエータのパラメータが記述されており[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を超えていれば、本APIにて各アクチュエータと通信を行い、それらパラメータの設定が行われる。また、それに伴いアクチュエータの出力軸が現在の位置にロックされる。また、モーションが停止するまで待つため、[[fd_StopMotion>#b6767958]]で該当モーションを停止させてから呼び出すことを推奨する。
 + void fd_SetSpec (const PHomePosition hp, const TSpec *svp, int size);
 +-パラメータ
 +--const [[PHomePosition>#ef1eb5c1]] '''hp'''
 +~ホームポジションを保持した[[THomePosition>#fa1e627a]]構造体の変数のアドレス~
 +ホームポジションは全ての動作の基準となるアクチュエータの初期位置(0~1023 の値)であり角度ではない
 +--const [[TSpec>#w18bc93a]] *'''svp'''
 +~使用する全アクチュエータに関する情報を保持した[[TSpec>#w18bc93a]]構造体の変数のアドレス
 +--int '''size'''
 +~psvで指定した[[TSpec>#w18bc93a]]の配列の個数~
 +fd_SpecSizeマクロを使用すると簡便に算出できる
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +// 諸元
 +const TSpec Spec[] = {
 +  // id  device    offset        gain  min  max    speed trq.  comp.
 +  {  1, DEV_RX28, fd_AxisOfs(0), +341, {    0, 1023},  0, 1023, { 1, 1,  32,  32} },
 +  {  2, DEV_RX28, fd_AxisOfs(1), +341, {    0, 1023},  0, 1023, { 1, 1,  32,  32} },
 +  {  3, DEV_RX28, fd_AxisOfs(2), +331, {    0, 1023},  0, 1023, { 1, 1,  32,  32} },
 +};
 +
 +// ホームポジションデータ
 +THomePosition HomePosition = { 512, 512, 512};
 +
 +void main (void) {
 +  fd_SetSpec (&HomePosition, Spec, fd_SpecSize (Spec));
 +}
 +</pre>
 +}}
 +
 +***fd_GetInitalizedSpec [#abd52cf3]
 +[[fd_SetSpec>#r0f0534c]]によって必要な初期化がなされているかの状態を取得する。
 + bool fd_GetInitalizedSpec (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: [[fd_SetSpec>#r0f0534c]]によって初期化済み~
 +false: 未初期化
 +
 +***fd_SetHomePosition [#qb02a390]
 +ホームポジションを再設定する。
 + void fd_SetHomePosition (const PHomePosition hp);
 +-パラメータ
 +--const [[PHomePosition>#ef1eb5c1]] '''hp'''
 +~ホームポジションを保持した[[THomePosition>#fa1e627a]]構造体の変数のアドレス~
 +ホームポジションは全ての動作の基準となるアクチュエータの初期位置(0~1023ないし0~4095の値)を定義したものであり角度ではない
 +-戻り値
 +~なし
 +
 +***fd_SetBeepCondition [#ke8d1df6]
 +ビープを発音する条件をORで設定する。0の指定ないしデフォルトでは各条件が発生しても無音となる。
 + void fd_SetBeepCondition (uint8_t beep);
 +-パラメータ
 +--uint8_t '''beep'''
 +~ビープ発音条件~
 +各ビットの割り当ては以下の通り
 + #define FD_BEEP_BOOTUP    (1 << 0)  // 起動直後
 + #define FD_BEEP_LOWVOLTAGE (1 << 1)  // 低電圧検出
 + #define FD_BEEP_PACKETERR  (1 << 2)  // パケットエラーないしアラーム
 + #define FD_BEEP_MMI        (1 << 3)  // DIP/PB操作時
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  // 全部入り
 +  fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP);
 +  fd_SetUVThreshold (7.4);
 +}
 +</pre>
 +}}
 +
 +***fd_SetUVThreshold [#ce52eef3]
 +FDIII-HCに印加される電源の電圧低下を検出する際の閾値を設定する。電圧低下を検出すると[[fd_SetBeepCondition>#ke8d1df6]]にてFD_BEEP_LOWVOLTAGEが指定されている際にアラーム音が発生する他、デバイスとの通信を伴う一部のAPIが実際の処理を行わずに呼び出し元に戻る。
 + void fd_SetUVThreshold (float PilotVoltage);
 +-パラメータ
 +--float '''PilotVoltage'''
 +~電圧[V]を実数で指定~
 +デフォルトは0
 +-戻り値
 +~なし
 +
 +***fd_GetPresentVoltage [#t634d666]
 +FDIII-HCに供給されている電源の電圧を取得する。
 + uint32_t fd_GetPresentVoltage (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~電圧[V]の10倍値
 +
 +***fd_SetLed [#y75cf4a6]
 +FDIII-HCに搭載されたLED2(橙色)を点灯・消灯する。
 + void fd_SetLed (bool On);
 +-パラメータ
 +--bool '''On'''
 +~true: LED点灯~
 +false: LED消灯
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  bool led = false;
 +  while (!fd_rx_buff ()) {
 +   // LED点滅
 +   fd_SetLed (led = !led);
 +   // PB1の押下で'.'を送信
 +   if (fd_GetPB ()) fd_putc ('.');
 +   // DIPスイッチの値でウェイトを変更
 +   fd_Wait ((fd_GetDIP () + 1) * 50);
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_GetPB [#pfa91195]
 +FDIII-HCに搭載されたプッシュボタン(PB1)の状態を取得する。
 + bool fd_GetPB (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: DOWN~
 +false: UP
 +
 +***fd_GetDIP [#g2ff485a]
 +FDIII-HCに搭載されたディップスイッチ(DIP1)の状態を取得する。
 + uint8_t fd_GetDIP (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~0~15
 +
 +***fd_GetAcceleration [#k05e5891]
 +FDIII-HCに搭載された3軸加速度センサの値を取得する。~
 +なお、取得する値には個体差が含まれるため、使用状況に応じて適宜補正する事を推奨する。
 + void fd_GetAcceleration (uint16_t *v);
 +-パラメータ
 +--uint16_t *'''v'''
 +~取得した値を保存する3要素の配列のアドレスを指定し、[0]にx軸、[1]にy 軸、[2]にz軸の値が保存される~
 +各軸とも図の矢印方向を重力方向と平行に位置した場合約511、重力方向と一致させた場合約613(1g≒102)の値が得られる~
 +最大3g程度まで計測可能
 +#ref(fdiii-hc_acceldir.png)
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  uint16_t acc[3];
 +  while (!fd_rx_buff ()) {
 +   fd_GetAcceleration (acc);
 +   fd_printf ("\r %3d %3d %3d\33[K", acc[0], acc[1], acc[2]);
 +   fd_Wait (100);
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_ExtractMaxAngleDiffByDeg [#h72fe16b]
 +現在の相対角度と指定ポーズの最大角度差を抽出する。
 + int fd_ExtractMaxAngleDiffByDeg (const PPose Pose, PApplyPart pap);
 +-パラメータ
 +--const [[PPose>#nc6be2ce]] '''Pose'''
 +~1つのポーズを保持した[[TPose>#y2b4d82e]]構造体の変数のアドレス
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~角度(deg)の10倍値
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +// 諸元
 +TSpec Spec[] = {{  1, DEV_RX28, fd_AxisOfs(0), +341, {    0, 1023},  0, 1023, { 1, 1,  32,  32} },};
 +// 適用部位
 +TApplyPart mypart = { Priority: 1, PartNum:  1, Part:{ fd_AxisOfs(0), }};
 +// ホームポジション
 +THomePosition HomePosition = { 512 };
 +// ホームポジションへ移行するモーション
 +TPose GoHome[] = { { Structure: { 0}, ADJ_SACC_SDECEL, Div:1000 }};
 +
 +void main (void) {
 +  int Maxdiff;
 +  DX_ChangeBaudrate (1000000);
 +  // 諸元設定
 +  fd_SetSpec (&HomePosition, Spec, fd_SpecSize (Spec));
 +  // 目標角度との差を抽出
 +  Maxdiff = fd_ExtractMaxAngleDiffByDeg (GoHome, &mypart);
 +  // 差を適当に時間換算
 +  GoHome[0].Div = Maxdiff * 2;
 +  // モーションの再生
 +  if (fd_PlayMotion (GoHome, 1, fd_MSize (GoHome), 100, &mypart)) {
 +   // 再生中なら待つ
 +   while (fd_GetMotionStat (&mypart) && !fd_rx_buff ()) fd_Wait (10);
 +  }
 +  // モーション再生を停止
 +  fd_StopMotion (&mypart);
 +}
 +</pre>
 +}}
 +
 +***fd_PlayMotion [#xc988ccc]
 +複数のポーズで構成されたモーションを指定された部位で再生し、即時復帰する。モーションは紙芝居を動きのあるアニメーション化するのと似ており、ポーズ間をスムーズにつなぐ処理を自動的に行う。また最初のポーズへ移行する際は現在の姿勢が基準となる。~
 +#ref(fdiii-hc_motion.png)
 +実際のポーズ間の補間は指定される遷移時間内に数ms程度の間隔で位置の指令を小刻みに行う事で実現しているため、その周期で若干のトルクリプルが生じる場合がある。また、指令にはSYNCインストラクションを使用しており、アクチュエータへ指令が確実に伝わったかどうかの判定は行っていない。~
 +なお、予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、その間の補間データの送信は行われない。
 + bool fd_PlayMotion (PPose Motion, short StartPoint, short EndPoint, uint16_t Speed, PApplyPart ApplyPart);
 +-パラメータ
 +--[[PPose>#nc6be2ce]] '''Motion'''
 +~再生するモーションデータが保存された[[TPose>#y2b4d82e]]構造体の変数のアドレス~
 +サポートするポーズ数は最大20
 +--short '''StartPoint'''
 +~1~n: モーションデータの再生開始ポーズ位置
 +--short '''EndPoint'''
 +~1~n: モーションデータの再生終了ポーズ位置
 +--uint16_t '''Speed'''
 +~モーションの再生スピードを%で指定~
 +100で[[TPose>#y2b4d82e]]のDivに設定された時間、50でDivに設定された半分の時間(Div = 1000なら0.5秒)で再生~
 +200でDivに設定された2倍の時間(Div = 1000なら2秒)で再生
 +--[[PApplyPart>#c439574f]] '''ApplyPart'''
 +~モーションを適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス~
 +モーションの動作中はApplyPartが全ての情報を持つ
 +-戻り値
 +~true: モーションの設定及び再生の開始に成功~
 +false: 失敗
 +-使用例
 +
 +***fd_StopMotion [#b6767958]
 +指定部位でモーションが再生中であれば、現在位置で中断させる。何らかの要因で停止が検出できない場合でも、最低1秒間は停止処理を行う。
 + bool fd_StopMotion (const PApplyPart pap);
 +-パラメータ
 +--const [[PApplyPart>#c439574f]] '''pap'''
 +~モーションを適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 停止成功~
 +false: 停止失敗(タイムアウト)
 +
 +***fd_GetMotionStat [#wdd6dd5e]
 +指定部位でモーションが再生中かを取得する。
 + bool fd_GetMotionStat (const PApplyPart pap);
 +-パラメータ
 +--const [[PApplyPart>#c439574f]] '''pap'''
 +~モーションを適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 再生中~
 +false: 停止中
 +
 +***fd_SendMomentMotion [#p9f3bc13]
 +1つのポーズを指定された部位で再生し、即時復帰する。[[fd_PlayMotion>#xc988ccc]]との違いは補間制御を全く行わない事にあり、設定された角度を直接指令する。また、補間方式や遷移時間が必要ないため、[[TPose>#y2b4d82e]]ではなく[[TStructure>#c60c95a5]]で指定する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、その間のデータ送信は行われない。~
 +また、一度呼び出すとそれ以後は適用した部位にモーション実行中のフラグが立つため、使用後は[[fd_StopMotion>#b6767958]]でフラグを落とす事を推奨する。
 + bool fd_SendMomentMotion (const PStructure sv, PApplyPart pap);
 +-パラメータ
 +--const [[PStructure>#gbd350af]] '''sv'''
 +~送信する角度データを保存した[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~モーションを適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_AssistMotionEdit [#x052dc88]
 +軸の角度を都度取得して一連のモーションを作成手法(ティーチング)が採られるケースがある。本APIではモーションデータを動的に作成する場合に、それらの一部の機能を補助する。~
 +実際には他のAPIを併用した上で、モーションエディタとしてプログラムを構成する必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、通信にかかる一部機能が正常に完了しない。
 + bool fd_AssistMotionEdit (TEdCmd cmd, int *pos, int *page, PPose Pose, PApplyPart pap);
 +-パラメータ
 +--[[TEdCmd>#l6e0e486]] '''cmd'''
 +~実行する処理
 +--int *'''pos'''
 +~0: 空~
 +1~20: 現在対象としているポーズ位置
 +--int *'''page'''
 +~0: 空~
 +1~20: キャプチャないし指定されたポーズ数(配列要素数)
 +--[[PPose>#nc6be2ce]] '''Pose'''
 +~作成するモーションデータが保存された[[TPose>#y2b4d82e]]構造体の変数のアドレス~
 +サポートするポーズ数は最大20
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~対象の部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_ConvDeg2Pos [#n48c7ad9]
 +[[TStructure>#c60c95a5]]に設定されたホームポジションからの相対角度を絶対位置に変換する。[[fd_ConvPos2Deg>#x71ae1c2]]の逆。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
 + bool fd_ConvDeg2Pos (PStructure deg, PStructure pos, PApplyPart pap, bool limit);
 +-パラメータ
 +--[[PStructure>#gbd350af]] '''deg'''
 +~変換元の角度を保存した[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PStructure>#gbd350af]] '''pos'''
 +~変換先の[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~変換対象の部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +--bool '''limit'''
 +~true: 変換後の位置情報を[[TSpec>#w18bc93a]]内の[[TOpRange>#ta0ab767]]で指定された動作範囲内に収める~
 +false: 変換後の位置情報をそのまま適用する
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_ConvPos2Deg [#x71ae1c2]
 +[[TStructure>#c60c95a5]]に設定された絶対位置をホームポジションからの相対角度に変換する。[[fd_ConvDeg2Pos>#n48c7ad9]]の逆。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
 + bool fd_ConvPos2Deg (PStructure pos, PStructure deg, PApplyPart pap);
 +-パラメータ
 +--[[PStructure>#gbd350af]] '''pos'''
 +~変換元の位置を保存した[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PStructure>#gbd350af]] '''deg'''
 +~変換先の[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~変換対象の部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_GetIDbyOffset [#f272a54c]
 +オフセットアドレスから[[TSpec>#w18bc93a]]に記述されたIDを抽出する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
 + int fd_GetIDbyOffset (short *ofs);
 +-パラメータ
 +--short *'''ofs'''
 +~オフセットアドレス
 +-戻り値
 +~-1: 取得失敗~
 +0~: [[TSpec>#w18bc93a]]で指定されたID
 +
 +***fd_GetSpecIndexbyOffset [#n6912311]
 +オフセットアドレスから[[TSpec>#w18bc93a]]の配列要素のインデックスを抽出する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
 + int fd_GetSpecIndexbyOffset (short *ofs);
 +-パラメータ
 +--short *'''ofs'''
 +~オフセットアドレス
 +-戻り値
 +~-1: 取得失敗~
 +0~: オフセットが該当する[[TSpec>#w18bc93a]]の配列のインデックス
 +
 +***fd_CheckDXAlarmState [#s3316109]
 +[[TSpec>#w18bc93a]]で定義されたネットワークに接続される全デバイスのステータスをチェックする。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
 + bool fd_CheckDXAlarmState (PAlarmStatus stat, int *num);
 +-パラメータ
 +--[[PAlarmStatus>#vfd08c35]] '''stat'''
 +~[[TAlarmStatus>#v3e0186a]]の配列のアドレス
 +--int *'''num'''
 +~statの配列数
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_LockDXParam [#oca51c3c]
 +指定された部位のアクチュエータのみに対して、EEPROMエリアの書き換え禁止を指令する。一度書き換え禁止を行うと、アクチュエータを再起動しない限りEEPROMエリアの書き換えは行えない。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_LockDXParam (PApplyPart pap);
 +-パラメータ
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_SetDXEnableControl [#j7c6565a]
 +指定された部位のアクチュエータのみに対して、位置決め制御の開始・停止を指令する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_SetDXEnableControl (bool en, PApplyPart pap);
 +-パラメータ
 +--bool '''en'''
 +~true: 位置決め制御開始 (出力軸が現在位置でロック)~
 +false: 位置決め制御停止 (出力軸がフリー)
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_SetDXTorqueLimit [#w1160d28]
 +指定された部位のアクチュエータのみに対して、トルクリミッタの制限値を設定する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_SetDXTorqueLimit (uint16_t t, PApplyPart pap);
 +-パラメータ
 +--uint16_t '''t'''
 +~0~1023: トルクリミッタの制限値
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_GetDXCurrentAngleByPos [#l179804e]
 +指定された部位の現在の絶対位置を取得する。ホームポジションからの相対角度で取得する場合は[[fd_GetDXCurrentAngleByDeg>#uc36a807]]を使用する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_GetDXCurrentAngleByPos (PStructure angle, PApplyPart pap);
 +-パラメータ
 +--[[PStructure>#gbd350af]] '''angle'''
 +~絶対位置を取得する[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~絶対位置を取得する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +// 諸元
 +const TSpec Spec[] = {
 +  // id  device    offset                      gain  min  max
 +  {  1, DEV_RX28, fd_AxisOfs(0), +341, {    0, 1023}},
 +  {  2, DEV_RX28, fd_AxisOfs(1), +341, {    0, 1023}},
 +};
 +// 適用部位
 +TApplyPart mypart = {
 +  Priority: 1,
 +  PartNum:  2,
 +  Part:{
 +     fd_AxisOfs(0),
 +     fd_AxisOfs(1),
 +  }
 +};
 +// ホームポジション
 +THomePosition hp = { 512, 512};
 +
 +void main (void) {
 +  DX_ChangeBaudrate (1000000);
 +  fd_SetSpec (&hp, Spec, fd_SpecSize (Spec));
 +
 +  // 現在位置を取得しその値でホームポジションを更新
 +  if (fd_GetDXCurrentAngleByPos (&hp, &mypart)) fd_SetHomePosition (&hp);
 +}
 +</pre>
 +}}
 +
 +***fd_GetDXCurrentAngleByDeg [#uc36a807]
 +指定された部位のホームポジションからの相対角度を取得する。絶対位置で取得する場合は[[fd_GetDXCurrentAngleByPos>#l179804e]]を使用する。~
 +予め[[fd_SetSpec>#r0f0534c]]でホームポジションと使用するアクチュエータの情報を設定しておく必要がある。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_GetDXCurrentAngleByDeg (PStructure angle, PApplyPart pap);
 +-パラメータ
 +--[[PStructure>#gbd350af]] '''angle'''
 +~相対角度を取得する[[TStructure>#c60c95a5]]構造体の変数のアドレス
 +--[[PApplyPart>#c439574f]] '''pap'''
 +~相対角度を取得する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +**サウンド [#nf714783]
 +FDIII-HCのブザーを使用して任意の音階の発音やメロディーを奏でることが出来ます。~
 +なお、再生中であっても[[fd_SetBeepCondition>#ke8d1df6]]で設定された条件が優先されて、再生が中断する場合があります。
 +
 +***fd_PlayMusic [#sf1c5c40]
 +独自のMML(Music Macro Language)もどきで譜面ライクに音楽を記述し、再生させ即時復帰する。再生がMMLの最終命令を経過すると再生終了となる。~
 + void fd_PlayMusic (bool force, const char *MML);
 +-パラメータ
 +--bool '''force'''
 +~true: 既に再生中であれば停止した後に再生~
 +false: 既に再生中であれば再生しない
 +--const char *'''MML'''
 +~音階: Cx,Dx,Ex,Fx,Gx,Ax,Bx (xは0-9の音長指定もしくは+,-,#)~
 +休符: Rx (xは音長)~
 +音長指定: Lx (xは音長)~
 +シャープ: #,+~
 +フラット: -~
 +テンポ: Tx (x:0-9)~
 +オクターブ: Ox (x:0-5)~
 +1オクターブUP: <~
 +1オクターブDOWN: >
 +~[音長]~
 +0: 1(全音符)~
 +1: 2分音符~
 +2: 3分音符~
 +3: 4分音符~
 +4: 6分音符~
 +5: 8分音符~
 +6: 12分音符~
 +7: 16分音符~
 +8: 24分音符~
 +9: 32分音符
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  fd_PlayMusic (
 +   false,
 +   "o1t3 c7<c7>>a7<a7>b-7<b-7r5r3 c7<c7>>a7<a7>b-7<b-7r5r3"
 +   ">f7<f7>d7<d7>e-7<e-7r5r3 >f7<f7>d7<d7>e-7<e-7r5r5 e-8d8d-8"
 +   "c7r7e-7r7d7r7>a-7r7g7r7<d-7r7 c8g-8f8e8b-8a8a-8r8e-8r8>b8"
 +   "r8b-8r8a8r8a-8r8"
 +  );
 +  while (fd_GetMusicStat ()) fd_Wait (10);
 +}
 +</pre>
 +}}
 +
 +***fd_GetMusicStat [#x885d696]
 +MMLが再生されているかを取得する。
 + bool fd_GetMusicStat (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~ture: 再生中~
 +false: 停止中
 +
 +***fd_ToneOn [#pd72ed74]
 +指定の音階を連続的に発音する。MMLが再生中の場合は無視される。
 + void fd_ToneOn (int Oct, int Tone);
 +-パラメータ
 +--int '''Oct'''
 +~0~5: オクターブ
 +--int '''Tone'''
 +~0~11: C,C#,D,D#,E,F,F#,G,G#,A,A#,Bの音階に相当
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  int i;
 +  for (i = 0; i < 72; i++) {
 +   fd_ToneOn (i / 12, i % 12);
 +   fd_Wait (50);
 +  }
 +  fd_ToneOff ();
 +}
 +</pre>
 +}}
 +
 +***fd_ToneOff [#k80e42c6]
 +[[fd_ToneOn>#pd72ed74]]により発音中であれば停止する。
 + void fd_ToneOff (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +**コンソール [#m9abd54e]
 +FDIII-HCでは主にUSBを介したシリアル通信を使用してプログラムの転送や実行中のプログラムのモニタ等を行うため、簡便に文字や文字列の送受信を行うためのAPIを用意しています。USBの他にBluetoothのSPP及びDBGU(TTLレベル)によるシリアル通信も使用できます。~
 +なお、コンソールAPIでは各コンソール系I/Fを個別に取り扱う事ができません。
 +
 +***fd_AssignUARTToConsole [#tedb73fb]
 +FDIII-HCのCN14をコンソールとして初期化する。FDIII-DISPLAYを接続した際は、115200bpsを指定して初期化する。~
 +なお、指定されたボーレートと実際にライブラリ内で適用されるボーレートは誤差が生じるので、戻り値を確認して使用可能なボーレートであるかを判断する必要がある。~
 +また、内部の送受信バッファは各々100バイトである。
 + uint32_t fd_AssignUARTToConsole (uint32_t dbgu_baud);
 +-パラメータ
 +--uint32_t '''dbgu_baud'''
 +~ボーレート[bps]
 +-戻り値
 +~0: 失敗~
 +1~: 近似された実ボーレート
 +
 +***fd_DeassignUART [#i39957c0]
 +UARTに割り当てた機能を無効化する。
 + void fd_DeassignUART (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_AssignBTToConsole [#s0929f11]
 +FDIII-HCのBluetoothをコンソールとして初期化する。~
 +なお、Bluetoothの動作自体はFDIII-HCのブートローダで設定されたBluetoothの接続モードに依存する。~
 +また、内部の送受信バッファは各々200バイトである。
 + void fd_AssignBTToConsole (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_DeassignBT [#c3b2e108]
 +Bluetoothに割り当てた機能(コンソール・SIXAXIS・RC-100B)を無効化する。~
 + void fd_DeassignBT (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_rx_buff [#c1552bcf]
 +受信バッファにあるデータ数を取得する。受信バッファからデータを取り出すには[[fd_getc>#i991caed]]を使用する。~
 +なお、複数のI/Fをコンソールとしてアサインしている場合は、最後に入力があったI/Fの受信バッファに保存されているデータ数となる。
 + int fd_rx_buff (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~バッファに保存された受信データのバイト数
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 + 
 +void main (void) {
 +  int i, n = 0;
 +  char c, s[20];
 +  // DBGUをコンソールに
 +  fd_AssignUARTToConsole (115200);
 +  // Bluetoothをコンソールに
 +  fd_AssignBTToConsole ();
 +  // PB1が押されるまでループ
 +  while (!fd_GetPB ()) {
 +   // 受信バッファにデータがあるまでループ
 +   while (fd_rx_buff ()) {
 +     // 1バイト取り出して送信
 +     fd_putc (c = fd_getc ());
 +     switch (c) {
 +       // 文字列送信
 +       case '0': fd_puts ("\nHELLO!\n"); break;
 +       // 書式付文字列送信
 +       case '1': fd_printf ("\nn++=%d\n", n++); break;
 +       // 文字列受信
 +       case '2': fd_puts ("\ns<-"); fd_gets (s, 19); fd_puts ("\n"); fd_puts (s); break;
 +       // 書式付文字列入力
 +       case '3': fd_puts ("\ni<-"); fd_scanf ("%d", &i); fd_printf ("\nd=%d\n", i); break;
 +     }
 +   }
 +   fd_Wait (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_rx_purge [#y0e593ea]
 +受信バッファにあるデータを消去する。
 + void fd_rx_purge (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_putc [#t7580c31]
 +指定された1バイトのデータを送信する。
 + void fd_putc (const char c);
 +-パラメータ
 +--const char '''c'''
 +~1バイトの送信する文字
 +-戻り値
 +~なし
 +
 +***fd_getc [#i991caed]
 +受信バッファから1バイト取得する。受信バッファが空の場合は1バイト受信するまで返らない。
 + char fd_getc (void);
 +-パラメータ
 +~なし
 +-戻り値
 +受信バッファに保存された一番古い1バイトのデータ
 +
 +***fd_puts [#g73fcca2]
 +指定された文字列を送信する。
 + void fd_puts (const char *s);
 +-パラメータ
 +--const char *'''s'''
 +~送信文する字列のアドレス
 +-戻り値
 +~なし
 +
 +***fd_gets [#ofacd6f0]
 +指定された文字数以下の文字列を指定バッファに受信する。改行でそれ以前に入力された文字列を指定バッファにコピーし入力文字数を返す。エスケープで処理をキャンセルし0を返す。~
 +バイナリデータの受信には使用できない。
 + int fd_gets (char *s, int len);
 +-パラメータ
 +--char *'''s'''
 +~受信した文字列を保存するバッファのアドレス
 +--int '''len'''
 +~最大受信文字数
 +-戻り値
 +~受信した文字のバイト数
 +
 +***fd_printf [#p02de6dd]
 +指定された書式付きの文字列を送信する。
 + int fd_printf (const char *, ...);
 +-パラメータ
 +-戻り値
 +
 +***fd_scanf [#y72ef9cf]
 +書式付入力を行う。コンソールからの入力を、指定された書式に従って変数へ読み込む。
 + int fd_scanf (const char * fmt, ...);
 +-パラメータ
 +-戻り値
 +
 +***fd_cls [#m7e87b05]
 +コンソールとして使用しているターミナル上のテキストを全消去する。
 + void fd_cls (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_locate [#hf2d34d2]
 +コンソールとして使用しているターミナル上のカーソル座標を指定する。~
 +SIMPLE TERMと[[LCD>BTH058]]の座標系が異なるため、直接エスケープシーケンスで座標を指定せずに本APIで代用する事を推奨する。
 + void fd_locate (int x, int y);
 +-パラメータ
 +--int '''x'''
 +~1~80: 画面左上を1としたX座標
 +--int '''y'''
 +~1~24: 画面左上を1としたY座標
 +-戻り値
 +~なし
 +
 +**LCD描画 [#h931c7fe]
 +オプションの[[LCD>BTH058]]を対象としたAPIで、主にグラフィックの描画を行います。~
 +解像度は内部固定で、左上が(0,0)、右下が(319,239)の座標を持ちます。基本的にこの座標の範囲外の値を指定した場合は描画処理を行いません。
 +
 +***fd_LCDExists [#dbd37794]
 +LCDが接続されているかを検出する。検出に成功した場合でも、処理に少なくとも数十msかかる。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + bool fd_LCDExists (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 検出成功~
 +false: 検出失敗
 +
 +***fd_LCDSetFontSize [#d7651000]
 +LCDのテキストプレーンの解像度を変更する。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDSetFontSize (uint8_t sz);
 +-パラメータ
 +--uint8_t sz
 +~0: 文字サイズ小 (最大80x30文字)~
 +1: 文字サイズ中 (最大64x20文字) デフォルト~
 +2: 文字サイズ大 (最大40x15文字)
 +-戻り値
 +~なし
 +
 +***fd_LCDSelectPictureBuff [#p9e86a3b]
 +LCDに備わった4枚のグラフィックバッファのうち、指定されたバッファを表示する。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDSelectPictureBuff (uint8_t plane);
 +-パラメータ
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~なし
 +
 +***fd_LCDSetBGColor [#n6f13cc7]
 +LCDの指定されたグラフィックバッファを表示対象とし、背景色を設定する。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDSetBGColor (TColor color, uint8_t plane);
 +-パラメータ
 +--[[TColor>#sb197154]] '''color'''
 +~背景色
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~なし
 +
 +***fd_LCDDrawPixel [#ff8bba53]
 +指定された座標のドットをLCDに描画する。~
 +LCDモジュールのファームウェアに依存し、初期バージョンのファームウェアでは描画されない。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDDrawPixel (uint16_t X, uint16_t Y, TColor color, uint8_t plane);
 +-パラメータ
 +--uint16_t '''X'''
 +~0~319: X座標
 +--uint16_t '''Y'''
 +~0~239: Y座標
 +--[[TColor>#u45f0df8]] '''(*func)(int x, int y)'''
 +~指定座標の色を返すコールバック関数のアドレス
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~なし
 +
 +***fd_LCDDrawLine [#y64579a4]
 +指定された(X0,Y0)と(X1,Y1)の座標を結ぶ直線をLCDに描画する。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDDrawLine (uint16_t X0, uint16_t Y0, uint16_t X1, uint16_t Y1, TColor color, uint8_t plane);
 +-パラメータ
 +--uint16_t '''X0'''
 +~0~319: 始点のX座標
 +--uint16_t '''Y0'''
 +~0~239: 始点のY座標
 +--uint16_t '''X1'''
 +~0~319: 終点のX座標
 +--uint16_t '''Y1'''
 +~0~239: 終点のY座標
 +--[[TColor>#u45f0df8]] '''color'''
 +~色
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~なし
 +
 +***fd_LCDDrawSquare [#g33a1e25]
 +指定された(X0,Y0)と(X1,Y1)の座標を対角に持つ矩形をLCDに描画する。~
 +LCDモジュールのファームウェアに依存し、初期バージョンのファームウェアでは「塗りつぶしなし」が描画されない。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDDrawSquare (uint16_t X0, uint16_t Y0, uint16_t X1, uint16_t Y1, bool fill, TColor color, uint8_t plane);
 +-パラメータ
 +--uint16_t '''X0'''
 +~0~319: 始点のX座標
 +--uint16_t '''Y0'''
 +~0~239: 始点のY座標
 +--uint16_t '''X1'''
 +~0~319: 終点のX座標
 +--uint16_t '''Y1'''
 +~0~239: 終点のY座標
 +--bool '''fill'''
 +~true: 塗りつぶしあり~
 +false: 塗りつぶしなし
 +--[[TColor>#u45f0df8]] '''color'''
 +~色
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~なし
 +
 +***fd_LCDDrawElipse [#xb0531a7]
 +指定された(X,Y)を中心とした楕円をLCDに描画する。~
 +LCDモジュールのファームウェアに依存し、初期バージョンのファームウェアでは描画されない。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + void fd_LCDDrawElipse (uint16_t X, uint16_t Y, uint16_t hRadius, uint16_t vRadiuse, bool fill, TColor color, uint8_t plane);
 +-パラメータ
 +--uint16_t '''X'''
 +~0~319: 中心のX座標
 +--uint16_t '''Y'''
 +~0~239: 中心のY座標
 +--uint16_t '''hRadius'''
 +~1~319: 水平方向の半径
 +--uint16_t '''vRadiuse'''
 +~1~239: 垂直方向の半径
 +--bool '''fill'''
 +~true: 塗りつぶしあり~
 +false: 塗りつぶしなし
 +--[[TColor>#u45f0df8]] '''color'''
 +~色
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~なし
 +
 +***fd_LCDDrawPicture [#k8c7c99c]
 +指定された矩形領域に任意の画像をLCDに描画する。ピクセル単位で描画を行うため、処理に時間を要する。~
 +予め[[fd_AssignUARTToConsole>#s0929f11]]を使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
 + bool fd_LCDDrawPicture (uint16_t X, uint16_t Y, uint16_t width, uint16_t height, TColor (*func)(int x, int y), uint8_t plane);
 +-パラメータ
 +--uint16_t '''X'''
 +~0~319: 描画領域左上のX座標
 +--uint16_t '''Y'''
 +~0~239: 描画領域左上のY座標
 +--uint16_t '''width'''
 +~0~319: 描画領域の幅 X+widthが319以下になるよう指定する
 +--uint16_t '''height'''
 +~0~239: 描画領域の高さ Y+heightが239以下になるよう指定する
 +--[[TColor>#u45f0df8]] '''(*func)(int x, int y)'''
 +~指定座標の色を返すコールバック関数のアドレス
 +--uint8_t '''plane'''
 +~0~3: バッファ番号
 +-戻り値
 +~true: 描画処理対象~
 +false: 描画処理対象外
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +#include <math.h>
 +
 +const TColor
 +  black  = {R: 0, G: 0, B: 0},
 +  yellow  = {R:31, G:31, B: 0};
 +
 +void elipse (uint16_t X, uint16_t Y, uint16_t hRadius, uint16_t vRadius, TColor color, uint8_t plane) {
 +  int hDia = hRadius << 1, vDia = vRadius << 1;
 +
 +  TColor mydraw (int x, int y) {
 +   if (fd_GetShutdownState ()) return (TColor)(uint16_t)0xffff;
 +   if (x < hRadius && y < vRadius) {
 +     if (y < vRadius + sqrt (pow (vRadius, 2.0) - pow ((x - hRadius), 2.0) * pow (vRadius, 2.0) / pow (hRadius, 2.0)) && x < hRadius - sqrt (pow (hRadius, 2.0) - pow ((y - vRadius), 2.0) * pow (hRadius, 2.0) / pow (vRadius, 2.0))) return (TColor){t:1};
 +     else return color;
 +   } else {
 +     if (y < vRadius + sqrt (pow (vRadius, 2.0) - pow ((x - hRadius), 2.0) * pow (vRadius, 2.0) / pow (hRadius, 2.0)) && x < hRadius + sqrt (pow (hRadius, 2.0) - pow ((y - vRadius), 2.0) * pow (hRadius, 2.0) / pow (vRadius, 2.0))) return color;
 +     else return (TColor){t:1};
 +   }
 +  }
 +  if ((plane > 3) || (hDia <= 0) || (vDia <= 0)) return;
 +  fd_LCDDrawPicture (X - hRadius, Y - vRadius, hDia, vDia, &mydraw, plane);
 +}
 +
 +void main (void) {
 +  fd_AssignUARTToConsole (115200);
 +  fd_LCDSelectPictureBuff (0);
 +  fd_LCDSetBGColor (black, 0);
 +  elipse (160, 120, 100, 100, yellow, 0);
 +}
 +</pre>
 +}}
 +
 +**RC-100B [#g8a60aa2]
 +FDIII-HCとRC-100B(FREEDOM Jr.III Wireless Controller)をBluetoothで接続し、使い慣れたゲーム用ジョイスティックライクなコントローラを利用した簡易的な操縦系や、FDIII-HCでは不足している外部からの入力系の補助としてとして使用できます。~
 +なお、予めFDIII-HCのブートローダでBluetoothをSLAVEモードにし、RC-100Bとペアリングしておく必要があります。
 +
 +***fd_AssignBTToRC100 [#z5b9199b]
 +BluetoothをRC-100Bとの接続専用に初期化する。以下に示すRC-100B用APIを使用する前に1度だけ実行する必要がある。~
 +以後RC-100B用API以外の使用目的(コンソールやSIXAXIS)でBluetoothを利用する事はできない。
 + uint32_t fd_AssignBTToRC100 (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~ボーレート[bps]
 +
 +***fd_ClearRC100Buff [#l84f8809]
 +受信バッファをクリアする。
 + void fd_ClearRC100Buff (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_GetRC100Buff [#s7c03e09]
 +受信バッファにあるデータ数を取得する。RC-100Bに備わったボタンの状態が変化すると、その都度バッファにその状態が蓄えられる。
 + uint16_t fd_GetRC100Buff (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~データ数
 +
 +***fd_GetRC100Data [#e341850b]
 +受信バッファから最も古い1データを取得する。受信バッファが空の場合はボタンの変化があるまで返らない。
 + void fd_GetRC100Data (Prc100Stat c);
 +-パラメータ
 +--[[Prc100Stat>#l040c154]] '''c'''
 +~データを取得する[[Trc100Stat>#s12fe324]]構造体の変数のアドレス
 +-戻り値
 +~なし
 +
 +***fd_GetRC100Current [#o4d57523]
 +受信バッファから最新の1データを取得する。受信待ちは行わない。
 + void fd_GetRC100Current (Prc100Stat c);
 +-パラメータ
 +--[[Prc100Stat>#l040c154]] '''c'''
 +~データを取得する[[Trc100Stat>#s12fe324]]構造体の変数のアドレス
 +-戻り値
 +~なし
 +
 +**SIXAXIS [#e4fbf192]
 +FDIII-HCのBluetoothにはPlayStation®3用のワイヤレスコントローラであるSIXAXISないしDUALSHOCK®3との接続機能が備わっています。RC-100Bにはないアナログスティックや加速度センサが内蔵されており、それらの信号も取り込むことが可能です。~
 +使い慣れたゲーム用コントローラを利用した簡易的な操縦系や、FDIII-HCでは不足している外部からの入力系の補助としてとして使用してください。~
 +なお、予めFDIII-HCのブートローダでBluetoothをSIXAXISモードにし、更にSIXAXIS自体にFDIII-HCのMACアドレスを登録しておく必要があります。
 +
 +***fd_AssignBTToSIXAXIS [#nc74804f]
 +BluetoothをSIXAXISないしDUALSHOCK3との接続専用に初期化する。以下に示すSIXAXIS用APIを使用する前に1度だけ実行する必要がある。~
 +以後SIXAXIS用API以外の使用目的(コンソールやRC-100B)でBluetoothを利用する事はできない。
 + uint32_t fd_AssignBTToSIXAXIS (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~端末速度[bps]
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 + 
 +void main (void) {
 +  // ボタンデータの取得用変数の定義
 +  static TsixaxisStat rc;
 +  // BluetoothをSIXAXISの受信に使用
 +  fd_AssignBTToSIXAXIS ();
 +  // コンソールの入力がない間ループ
 +  while (!fd_rx_buff ()) {
 +   // SIXAXISの受信バッファがある間ループ
 +   while (fd_GetSIXAXISBuff ()) {
 +     fd_GetSIXAXISData (&rc);
 +     fd_printf (
 +       "\x1b[1;1%d %d %d %d\33[K\n",
 +       rc[_SIXAXIS_BTN_U].down,
 +       rc[_SIXAXIS_BTN_D].down,
 +       rc[_SIXAXIS_BTN_L].down,
 +       rc[_SIXAXIS_BTN_R].down
 +     );
 +   }
 +   // アナログ値の取得
 +   fd_printf (
 +     "\x1b[2;1H %4d %4d %4d %4d\33[K",
 +     fd_GetSIXAXISAnalog (_SIXAXIS_ANA_LANAH),
 +     fd_GetSIXAXISAnalog (_SIXAXIS_ANA_LANAV),
 +     fd_GetSIXAXISAnalog (_SIXAXIS_ANA_RANAH),
 +     fd_GetSIXAXISAnalog (_SIXAXIS_ANA_RANAV)
 +   );
 +   fd_Wait(50);
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_ClearSIXAXISBuff [#tb95ad7c]
 +受信バッファをクリアする。
 + void fd_ClearSIXAXISBuff (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +
 +***fd_GetSIXAXISBuff [#ld2d0a85]
 +受信バッファにあるデータ数を取得する。SIXAXISに備わったボタンの状態が変化すると、その都度バッファにその状態が蓄えられる。
 + uint16_t fd_GetSIXAXISBuff (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~データ数
 +
 +***fd_GetSIXAXISData [#t846479b]
 +受信バッファから最も古い1データを取得する。受信バッファが空の場合はボタンの変化があるまで返らない。
 + void fd_GetSIXAXISData (PsixaxisStat c);
 +-パラメータ
 +--[[PsixaxisStat>#x801c580]] '''c'''
 +~データを取得する[[TsixaxisStat>#o18f9eab]]構造体の変数のアドレス
 +-戻り値
 +~なし
 +
 +***fd_GetSIXAXISCurrent [#a1dbb2bc]
 +受信バッファから最新の1データを取得する。受信待ちは行わない。
 + void fd_GetSIXAXISCurrent (PsixaxisStat c);
 +-パラメータ
 +--[[PsixaxisStat>#x801c580]] c
 +~データを取得する[[TsixaxisStat>#o18f9eab]]構造体の変数のアドレス
 +-戻り値
 +~なし
 +
 +***fd_GetSIXAXISAnalog [#xf245f9e]
 +ボタンの押し圧やアナログスティック、加速度センサ等の最新アナログ値を取得する。取得に当たり受信バッファを監視する必要はない。
 + short fd_GetSIXAXISAnalog (int ch);
 +-パラメータ
 +--int '''ch'''
 +~_SIXAXIS_ANA_LANAH: 右アナログスティック横~
 +_SIXAXIS_ANA_LANAV: 右アナログスティック縦~
 +_SIXAXIS_ANA_RANAH: 左アナログスティック横~
 +_SIXAXIS_ANA_RANAV: 左アナログスティック縦~
 +_SIXAXIS_ANA_U: 上ボタン~
 +_SIXAXIS_ANA_R: 右ボタン~
 +_SIXAXIS_ANA_D: 下ボタン~
 +_SIXAXIS_ANA_L: 左ボタン~
 +_SIXAXIS_ANA_L2: L2ボタン~
 +_SIXAXIS_ANA_R2: R2ボタン~
 +_SIXAXIS_ANA_L1: L1ボタン~
 +_SIXAXIS_ANA_R1: R1ボタン~
 +_SIXAXIS_ANA_TRIANGLE: △ボタン~
 +_SIXAXIS_ANA_CIRCLE: ○ボタン~
 +_SIXAXIS_ANA_CROSS: ×ボタン~
 +_SIXAXIS_ANA_SQUARE: □ボタン~
 +_SIXAXIS_ANA_ACCX: x軸加速度~
 +_SIXAXIS_ANA_ACCY: y軸加速度~
 +_SIXAXIS_ANA_ACCZ: z軸加速度~
 +_SIXAXIS_ANA_GYROZ: z軸ジャイロ
 +-戻り値
 +~指定チャネルに応じた値
 +
 +**ホームポジション・モーションファイル管理 [#e1b0cdb0]
 +ソースコード中にホームポジションやモーションを固定データとして記述してしまうと、それらを調整や編集してもソースプログラムに反映させるのは手動操作となり、反映させるには再度コンパイルしてプログラムをダウンロードし直さなくてはなりません。~
 +本ライブラリではそれらのデータをFDIII-HCに装備したSDカード上のファイルとして扱う事ができるため、データのコピーやバックアップ等がPC等でも行えます。
 +
 +***fd_MMSD_Search [#x9ab42ce]
 +指定された名前でSDカードに保存されたモーションファイルを検索し、必要に応じてそのデータを取得する。
 + bool fd_MMSD_Search (const char *Name, PPose Motion, int *page);
 +-パラメータ
 +--const char *Name
 +~モーション名 (最大8文字)
 +--[[PPose>#nc6be2ce]] Motion
 +~読み出されたモーションデータを保存する[[TPose>#y2b4d82e]]構造体の変数のアドレスもしくはNULL~
 +--int *page
 +~読み出されたモーションデータのポーズ数を取得するint型の変数のアドレスもしくはNULL
 +-戻り値
 +~true: 指定モーションファイルが見つかった~
 +false: 指定モーションファイルが見つからない
 +
 +***fd_MMSD_SearchAndPlayMotion [#ue2e9e06]
 +指定された名前でSDカードに保存されたモーションファイルを検索し、見つかったら再生する。再生スピードや始点・終点の指示はできない。
 + bool fd_MMSD_SearchAndPlayMotion (const char *Name, PPose Motion, int *page, const PApplyPart pap);
 +-パラメータ
 +--const char *Name
 +~モーション名 (最大8文字)
 +--[[PPose>#nc6be2ce]] Motion
 +~読み出されたモーションデータを保存する[[TPose>#y2b4d82e]]構造体の変数のアドレス
 +--int *page
 +~読み出されたモーションデータのポーズ数を取得するint型の変数のアドレス
 +--const [[PApplyPart>#c439574f]] pap
 +~モーションを適用する部位を指定した[[TApplyPart>#q3b8aabf]]構造体の変数のアドレス~
 +モーションの動作中はApplyPartが全ての情報を持つ
 +-戻り値
 +~true: 指定モーションファイルが見つかり、再生に成功~
 +false: 指定モーションファイルが見つからない、もしくは再生に失敗
 +
 +***fd_MMSD_Add [#if19aa80]
 +モーションデータに名前を付けてSDカードに保存する。同名のモーションファイルでの上書き保存はできない。
 + bool fd_MMSD_Add (const char *Name, PPose Motion, int page);
 +-パラメータ
 +--const char *Name
 +~モーション名 (最大8文字)
 +--[[PPose>#nc6be2ce]] Motion
 +~書き込むモーションデータが保存された[[TPose>#y2b4d82e]]構造体の変数のアドレス
 +--int page
 +~書き込むモーションデータのポーズ数
 +-戻り値
 +~ture: 成功~
 +false: 失敗 (既存モーションファイルとの競合も含む)
 +
 +***fd_MMSD_Del [#m07878ac]
 +指定された名前でSDカードに保存されたモーションファイルを検索し、存在すれば削除する。
 + bool fd_MMSD_Del (const char *Name);
 +-パラメータ
 +~削除するモーション名 (最大8文字)
 +-戻り値
 +~ture: 成功~
 +false: 失敗
 +
 +***fd_MMSD_FindFirst[#wc16cb38]
 +SDカード内のモーションファイルの一覧を取得する際の、初期処理及びルートディレクトリへの移動を行う。実際のファイルの一覧取得は[[fd_MMSD_FindNext>#t63a43d9]]が担う。
 + bool fd_MMSD_FindFirst(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 検索成功~
 +false: 検索失敗
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  char name[10];
 +  fd_Wait (2000);
 +  if (fd_MMSD_FindFirst ()) {
 +   int page;
 +   while (fd_MMSD_FindNext (name, NULL, &page)) {
 +     fd_printf ("[%s,%2d]", name, page);
 +   }
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_MMSD_FindNext [#t63a43d9]
 +モーションファイルの一覧を取得する際の、次のファイルを見つける。モーションファイル名の取得と合わせて、モーションデータの読み込みも同時に行える。~
 +先に[[fd_MMSD_FindFirst>#wc16cb38]]を実行しておく必要がある。
 + bool fd_MMSD_FindNext (char *Name, PPose Motion, int *page);
 +-パラメータ
 +--char *Name
 +~見つかったモーション名を保存するchar *型の変数のアドレス
 +--[[PPose>#nc6be2ce]] Motion
 +~見つかったモーションデータを読み込む[[TPose>#y2b4d82e]]構造体の変数のアドレス~
 +もしくはNULL
 +--int *page
 +~見つかったモーションデータのポーズ数を取得するint型の変数のアドレス~
 +もしくはNULL
 +-戻り値
 +~true: 取得成功~
 +false: 取得失敗
 +
 +***fd_MMSD_ChangeMotionName [#meb380a2]
 +指定された名前でSDカードに保存されたモーションファイルを検索し、存在すればモーション名を変更する。
 + bool fd_MMSD_ChangeMotionName (const char *OldName, const char *NewName);
 +-パラメータ
 +--const char *'''OldName'''
 +--const char *'''NewName'''
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_MMSD_ReadHomePosition [#g40c7bf5]
 +SDカードに保存されたホームポジションファイルを検索し、存在すればデータを取得する。
 + bool fd_MMSD_ReadHomePosition (PHomePosition hp);
 +-パラメータ
 +--[[PHomePosition>#ef1eb5c1]] '''hp'''
 +~ホームポジションを保持したTHomePosition構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_MMSD_WriteHomePosition [#ib547d2a]
 +SDカードにホームポジションデータを保存(上書きも含む)する。
 + bool fd_MMSD_WriteHomePosition (const PHomePosition hp);
 +-パラメータ
 +--const [[PHomePosition>#ef1eb5c1]] '''hp'''
 +~ホームポジションを保持したTHomePosition構造体の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +**Dynamixelプロトコル [#eec291b3]
 +SpecやApplyPartによるモーションの管理APIでは用意されていないネットワーク上のデバイスの機能を、Dynamixelプロトコルを使用して直接扱うAPIです。~
 +モーションの再生中であっても、センサからのフィードバックを検出したり、特殊なアイテムのデータを読み書きするといった事が可能です。
 +
 +***DX_ChangeBaudrate [#n66c725c]
 +ボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、全てのAPIはこのボーレートを基準にして動作する。~
 +なお、ライブラリ内では静的に1M[bps]で初期化されているため、そのままで支障がなければ特に変更の必要はないが、異なるボーレートのデバイスを使用する場合は[[fd_SetSpec>#r0f0534c]]で諸元を設定するよりも前にボーレートを変更しておく事。
 + bool DX_ChangeBaudrate (uint32_t baud);
 +-パラメータ
 +--uint32_t '''baud'''
 +~ネットワークの装置とFDIII-HC間の通信速度[bps]
 +-戻り値
 +~true: 成功~
 +false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
 +
 +***DX_CalcTimeout [#scc623a0]
 +ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
 + uint32_t DX_CalcTimeout (int num);
 +-パラメータ
 +--int '''num'''
 +~バイト数
 +-戻り値
 +~タイムアウト時間[ms]
 +
 +***DX_WriteByteData [#pb95f8ec]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
 + bool DX_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~254: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint8_t '''dat'''
 +~0~255: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteWordData [#y4ee49bd]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
 + bool DX_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~254: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint16_t '''dat'''
 +~0~65535: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteBlockData [#u49395b2]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
 + bool DX_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~254: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--const uint8_t *'''dat'''
 +~書き込むデータを保存したuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~'''dat'''のバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_ReadByteData [#t86b5caf]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
 + bool DX_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_ReadWordData [#g1cb002c]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
 + bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint16_t *'''result'''
 +~読み出したデータを保存するuint16_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_ReadBlockData [#s13929a7]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
 + bool DX_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~読み出すバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteSyncData [#m9e1dbb8]
 +SYNCインストラクションを使用して複数のデバイスの同一アイテムに対して各々異なる値を一括送信する。
 + bool DX_WriteSyncData (const uint8_t *dat, uint8_t size, PDXAlarm errcode);
 +-パラメータ
 +--const uint8_t *'''dat'''
 +~SYNCインストラクションのパラメータ部分を記述したuint8_t型の配列のアドレス
 +--uint8_t '''size'''
 +~'''dat'''のバイト数
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~ライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_Ping [#md35ab79]
 +指定されたIDを持つデバイスを対象に、PINGを発行する。IDがわかっている場合に使用する。
 + bool DX_Ping (uint8_t id, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint32_t '''timeout'''
 +~検出タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 指定IDのデバイスが見つかった~
 +false: 指定IDのデバイスがタイムアウト時間を超過しても見つからない
 +
 +***DX_Ping2 [#ld30ed86]
 +不特定のIDを持つデバイスを対象に、PINGを発行する(ブロードキャストIDを使用してPING)。IDがわからないデバイスに対して使用するため、ネットワーク上に接続されるデバイスは1台のみとする事。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool DX_Ping2 (uint8_t *id, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t *'''id'''
 +~検出されたデバイスのIDを保存するuint8_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~検出タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 何らかのデバイスが応答しIDを取得できた~
 +false: デバイスがタイムアウト時間を超過しても見つからない
 +
 +**Dynamixelアクチュエータシリーズ専用 [#abd6a7f5]
 +アクチュエータに共通のコントロールテーブルを扱うケースが多いため、Dynamixelプロトコルを直接扱わずに簡便にアクセスするためのAPIが用意されています。~
 +なお、必ず各APIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できません。また、若干オーバヘッドが生じます。また、応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出されます。
 +
 +***fd_DXGetModelNumber [#rabc62b7]
 +本APIのみデバイスの種別を問わずモデルナンバー取得する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + uint16_t fd_DXGetModelNumber (uint8_t id, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~正常に取得されると0以外のデバイスのモデルナンバー
 +
 +***fd_DXLockParam [#hfbabc76]
 +指定IDのアクチュエータに対して、EEPROMエリアの書き換え禁止を指令する。一度書き換え禁止を行うと、アクチュエータを再起動しない限りEEPROMエリアの書き換えは行えない。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXLockParam (uint8_t id);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXEnableControl [#jf067157]
 +指定IDのアクチュエータに対して、位置決め制御の開始・停止を指令する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXEnableControl (uint8_t id, bool On);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--bool '''On'''
 +~true: 位置決め制御開始 (出力軸が現在位置でロック)~
 +false: 位置決め制御停止 (出力軸がフリー)
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXSetPosition [#nbe84864]
 +指定IDのアクチュエータに対して、指定された位置を指令(アイテムのGOAL POSITIONへの書き込み)する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXSetPosition (uint8_t id, uint16_t Position);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint16_t '''Position'''
 +~0~1023: 10bit分解能版~
 +0~4095: 12bit分解能版
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXGetPosition [#b02dbecb]
 +指定IDのアクチュエータから、現在の位置を取得(アイテムのPRESENT POSITIONの読み出し)する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXGetPosition (uint8_t id, uint16_t *Position);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint16_t *'''Position'''
 +~取得した値を保存するuint16_t型の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXSetSpeed [#b509ce72]
 +指定IDのアクチュエータに対して、指定された速度を指令(アイテムのMOVING SPEEDへの書き込み)する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 +// Dynamixelへ速度指令
 + bool fd_DXSetSpeed (uint8_t id, short Speed);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--short '''Speed'''
 +~-1023~0~1023: 回転方向指示(符号)を含む速度
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXSetTorqueLimit [#u4255df3]
 +指定IDのアクチュエータに対して、トルクリミッタの制限値を設定(アイテムのTORQUE LIMITへの書き込み)する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXSetTorqueLimit (uint8_t id, uint16_t Torque);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint16_t '''Torque'''
 +~0~1023: トルクリミッタの制限値
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXGetLoad [#e1ca8211]
 +指定IDのアクチュエータから、現在の負荷を取得(アイテムのPRESENT LOADの読み出し)する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXGetLoad (uint8_t id, int16_t *Load);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--int16_t *'''Load'''
 +~取得した値を保存するint16_t型の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXSetCompliance [#oa8c8a48]
 +指定IDのアクチュエータに対して、コンプライアンスを設定(アイテムのCW COMPLIANCE MARGINから4バイトへの書き込み)する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXSetCompliance (uint8_t id, uint8_t CWM, uint8_t CCWM, uint8_t CWS, uint8_t CCWS);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''CWM'''
 +~0~254: CWマージン
 +--uint8_t '''CCWM'''
 +~0~254: CCWマージン
 +--uint8_t '''CWS'''
 +~1~254: CWスロープ
 +--uint8_t '''CCWS'''
 +~1~254: CCWスロープ
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXSetPIDGain [#tf2e8047]
 +指定IDのアクチュエータに対して、位置決め制御時のゲインを設定する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXSetPIDGain (uint8_t id, uint8_t PGain, uint8_t IGain, uint8_t DGain);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''PGain'''
 +~0~254: Pゲイン
 +--uint8_t '''IGain'''
 +~0~254: Iゲイン
 +--uint8_t '''DGain'''
 +~0~254: Dゲイン
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_DXSetEndlessTurn [#b3ee5cbf]
 +指定IDのアクチュエータに対して、無限回転・位置決めモードを切り替える。コントロールテーブルのEEPROMエリアの書き換えを伴うため、頻度が高い使用は禁物である。また、EEPROMエリアの書き換え禁止措置が講じられている場合は、モードの切り替えに失敗する。~
 +[[fd_SetUVThreshold>#ce52eef3]]で指定された電圧を下回ると、実際の処理を行わない。
 + bool fd_DXSetEndlessTurn (uint8_t id, bool f);
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--bool '''f'''
 +~true: 無限回転モードへ切り替え~
 +false: 位置決めモードへ切り替え
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +**FUTABA RSアクチュエータシリーズプロトコル及び各アイテム専用 [#j1dc9dbe]
 +コマンド方式サーボのプロトコルを使用して内蔵メモリマップへのアクセスと、それらを使用せず簡便に各アイテムへアクセスするためのAPIです。~
 +
 +なお、各アイテムへのアクセス専用APIは、各APIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できないのと、若干オーバヘッドが生じます。また、応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出されます。
 +
 +FDIII-HCとサーボモータのケーブルは以下のピンアサインとします。
 +#ref(RSCABLE.png)
 +
 +***RS_ChangeBaudrate [#j2bd988e]
 +RSシリーズ向けにボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、全てのAPIはこのボーレートを基準にして動作する。~
 +このAPIを使用すると、RSシリーズ以外のアクチュエータとの通信は行う事ができない。また、Dynamixelを前提とした諸元やモーション等を使用するAPIは使用してはならない。
 + bool RS_ChangeBaudrate (uint32_t baud);
 +-パラメータ
 +--uint32_t '''baud'''
 +~ネットワークの装置とFDIII-HC間の通信速度[bps]~
 +誤差率の関係上460800bps以下を推奨
 +-戻り値
 +~true: 成功~
 +false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  int16_t now = -1500, p;
 +  // ボーレート変更
 +  RS_ChangeBaudrate (230400);
 +  // トルクON
 +  fd_RSEnableControl (1, true);
 +  while (!fd_GetPB ()) {
 +   // 位置指令
 +   RS_WriteWordData (1, RS_ADDRESS_GOAL_POSITION, now, 10, NULL);
 +   // 位置取得
 +   RS_ReadWordData (1, RS_ADDRESS_PRESENT_POSITION, (void *)&p, 10, NULL);
 +   fd_printf("goal pos=%5d, present pos=%5d\r",now, p);
 +   if (++now > 1500) now = -1500;
 +   fd_Wait (1);
 +  }
 +  // トルクOFF
 +  fd_RSEnableControl (1, false);
 +}
 +</pre>
 +}}
 +
 +***RS_CalcTimeout [#h9907c27]
 +ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
 + uint32_t RS_CalcTimeout (int num);
 +-パラメータ
 +--int '''num'''
 +~バイト数
 +-戻り値
 +~タイムアウト時間[ms]
 +
 +***RS_WriteByteData [#z83fb6d1]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
 + bool RS_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127, 255: 対象デバイスのIDもしくはブロードキャストID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--uint8_t '''dat'''
 +~0~255: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_WriteWordData [#t8c562c3]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
 + bool RS_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127, 255: 対象デバイスのIDもしくはブロードキャストID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--uint16_t '''dat'''
 +~0~65535: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_WriteBlockData [#f722e71c]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
 + bool RS_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127, 255: 対象デバイスのIDもしくはブロードキャストID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--const uint8_t *'''dat'''
 +~書き込むデータを保存したuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~'''dat'''のバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_ReadByteData [#v40cd6c6]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
 + bool RS_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_ReadWordData [#cf0ea1a8]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
 + bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--uint16_t *'''result'''
 +~読み出したデータを保存するuint16_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_ReadBlockData [#z255db04]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
 + bool RS_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~読み出すバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_WriteSyncData [#i4b1c774]
 +ロングパケットを使用して複数のデバイスの同一アイテムに対して各々異なる値を一括送信する。
 + bool RS_WriteSyncData (const uint8_t *dat, uint8_t size, PDXAlarm errcode);
 +-パラメータ
 +--const uint8_t *'''dat'''
 +~ロングパケットの「Address, Length, Count, VID, DATA, .... , VID, DATA」部分を記述したuint8_t型の配列のアドレス
 +--uint8_t '''size'''
 +~'''dat'''のバイト数
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~ライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***RS_Ping [#ged0b2c0]
 +指定されたIDを持つデバイスを対象に存在確認をする。
 + bool RS_Ping (uint8_t id, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint32_t '''timeout'''
 +~検出タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 指定IDのデバイスが見つかった~
 +false: 指定IDのデバイスがタイムアウト時間を超過しても見つからない
 +
 +***fd_RSGetModelNumber [#v10dec8c]
 +指定IDのデバイスに対して、モデルナンバーを取得する。~
 + uint16_t fd_RSGetModelNumber (uint8_t id, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~正常に取得されると0以外のデバイスのモデルナンバー
 +
 +***fd_RSEnableControl [#ya80ba8f]
 +指定IDのアクチュエータに対して、位置決め制御の開始・停止(アイテムのTORQUE ENABLE)を指令する。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_RSEnableControl (uint8_t id, bool On);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--bool '''On'''
 +~true: 位置決め制御開始 (出力軸が現在位置でロック)~
 +false: 位置決め制御停止 (出力軸がフリー)
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_RSSetPosition [#wcdc8881]
 +指定IDのアクチュエータに対して、指定された位置を指令(アイテムのGLOBAL POSITIONへの書き込み)する。なお、RSシリーズは予め[[トルクON>#ya80ba8f]]を指示しておかないと動作しない。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_RSSetPosition (uint8_t id, int16_t Position);
 +-パラメータ
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--int16_t '''Position'''
 +~-1500~+1500: -150.0~+150.0度
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_RSGetPosition [#r360ebdd]
 +指定IDのアクチュエータから、現在の位置を取得(アイテムのPRESENT POSITIONの読み出し)する。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_RSGetPosition (uint8_t id, int16_t *Position);
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--int16_t *'''Position'''
 +~取得した値を保存するint16_t型の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_RSSetTime [#t77a3778]
 +指定IDのアクチュエータに対して、指定された移動時間(10ms単位)を指令する。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 +// Dynamixelへ速度指令
 + bool fd_RSSetTime (uint8_t id, int16_t Times);
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--int16_t '''Times'''
 +~0~65535: 移動時間を10ms単位で指定
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_RSSetTorqueLimit [#dcd9bca3]
 +指定IDのアクチュエータに対して、トルクリミッタの制限値を設定する。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_RSSetTorqueLimit (uint8_t id, uint16_t Torque);
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint16_t '''Torque'''
 +~0~100: トルクリミッタの制限値[%]
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_RSSetCompliance [#o6b85bb5]
 +指定IDのアクチュエータに対して、コンプライアンスを設定する。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。~
 + bool fd_RSSetCompliance (uint8_t id, uint8_t CWM, uint8_t CCWM, uint8_t CWS, uint8_t CCWS);
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint8_t '''CWM'''
 +~0~255: CWマージン
 +--uint8_t '''CCWM'''
 +~0~255: CCWマージン
 +--uint8_t '''CWS'''
 +~0~255: CWスロープ
 +--uint8_t '''CCWS'''
 +~0~255: CCWスロープ
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_RSSetPIDGain [#s8100de3]
 +指定IDのアクチュエータに対して、位置決め制御時のPIDゲインを設定する。~
 +なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 +
 + bool fd_RSSetPIDGain (uint8_t id, uint8_t Gain, uint8_t dummy1, uint8_t dummy2);
 +--uint8_t '''id'''
 +~1~127: 対象デバイスのID
 +--uint8_t '''Gain'''
 +~0~255: ゲイン
 +--uint8_t '''dummy1'''
 +~0: 未使用
 +--uint8_t '''dummy2'''
 +~0: 未使用
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +**KONDO KRSアクチュエータシリーズプロトコル及び各アイテム専用 [#xa12f7bb]
 +ICS3.0/ICS3.5のプロトコルを使用した各アイテムへのアクセスと、それらを使用せず簡便に各アイテムへアクセスするためのAPIです。~
 +なお、KRSシリーズのアクチュエータにおいて指令位置や位置フィードバックといったデータがメモリマップ上に存在しないため、本ライブラリ内にてこれらのデータを仮想メモリマップ上に配置しています。それにより他のアクチュエータ同様のIDとアドレスによるアクセス方法を疑似的に提供します。
 +
 +仮想メモリマップ構成
 +| Address | Data Type | Name | Range | I/O |
 +| 0 | uint8_t |Torque Enable| 0..1[Off/On] | R/W |
 +| 1 | uint16_t |Goal Position| 0..16383 | R/W |
 +| 3 | uint16_t |Present Position| ? | R |
 +| 5 | int8_t |Present Current| ? | R |
 +| 6 | int8_t |Present Temperature| ?[degC] | R |
 +
 +各アイテムは以下のルールを元に変換されます。~
 +-Torque Enable:
 +~0:ICSにて舵角を0として送信~
 +1:ICSにて指定済みのGoal Positionを舵角として送信
 +-Goal Position:
 +~ICSにて舵角として送信する値。サーボモータに設定されたパルスリミットを超えた値が指定された場合の挙動は保証されない。~
 +-Present Position:
 +~ICSにて現在の舵角として受信された値。~
 +-Present Current:
 +~ICSにて電流値として受信された値を正規化。単位は不明。~
 +-Present Temperature:
 +~ICSにて温度値として受信された値を摂氏に正規化。
 +
 +また、APIにてIDに255を指定した場合、存在の有無に関わらず0~31の全てのIDに対して処理を順次行います。そのため、必要以上の処理時間を要する場合があります。
 +
 +FDIII-HCとサーボモータのケーブルは以下のピンアサインとします。
 +#ref(KRSCABLE.png)
 +
 +***KRS_ChangeBaudrate [#wd7e5012]
 +KRSシリーズ向けにボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、全てのAPIはこのボーレートを基準にして動作する。~
 +このAPIを使用すると、KRSシリーズ以外のアクチュエータとの通信は行う事ができない。また、Dynamixelを前提とした諸元やモーション等を使用するAPIは使用してはならない。
 + bool KRS_ChangeBaudrate (uint32_t baud);
 +-パラメータ
 +--uint32_t '''baud'''
 +~ネットワークの装置とFDIII-HC間の通信速度[bps]~
 +誤差率の関係上115200bpsのみを推奨
 +-戻り値
 +~true: 成功~
 +false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <fd.h>
 +
 +void main (void) {
 +  uint16_t now = 0, p;
 +  // ボーレート変更
 +  KRS_ChangeBaudrate (115200);
 +  while (!fd_GetPB ()) {
 +   // 舵角指令
 +   KRS_WriteWordData (0, KRS_ADDRESS_GOAL_POSITION, now, 5, NULL);
 +   // 舵角取得
 +   KRS_ReadWordData (0, KRS_ADDRESS_PRESENT_POSITION, &p, 5, NULL);
 +   fd_printf("goal pos=%5d, present pos=%5d\r", now, p);
 +   if (++now > 16383) now = 0;
 +   fd_Wait (1);
 +  }
 +  // トルクOFF
 +  fd_KRSEnableControl (0, false);
 +}
 +</pre>
 +}}
 +
 +***KRS_CalcTimeout [#m09add00]
 +ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
 + uint32_t KRS_CalcTimeout (int num);
 +-パラメータ
 +--int '''num'''
 +~バイト数
 +-戻り値
 +~タイムアウト時間[ms]
 +
 +***KRS_WriteByteData [#dbdc8154]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
 + bool KRS_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31, 255: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~6: 対象アドレス
 +--uint8_t '''dat'''
 +~0~255: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_WriteWordData [#m013796f]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
 + bool KRS_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31, 255: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~5: 対象アドレス
 +--uint16_t '''dat'''
 +~0~65535: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_WriteBlockData [#t41426cb]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
 + bool KRS_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31, 255: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--const uint8_t *'''dat'''
 +~書き込むデータを保存したuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~'''dat'''のバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_ReadByteData [#l0c2760f]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
 + bool KRS_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~6: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_ReadWordData [#he41c52c]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
 + bool KDX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~5: 対象アドレス
 +--uint16_t *'''result'''
 +~読み出したデータを保存するuint16_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_ReadBlockData [#t28174bc]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
 + bool KRS_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~読み出すバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_WriteSyncData [#ua3a37fc]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。~
 +なお、ICSでは同期系のパケットを持たないため、実際には個々のIDに順次BlockWriteで処理を行う。
 + bool KRS_WriteSyncData (const uint8_t *dat, uint8_t size, PDXAlarm errcode);
 +-パラメータ
 +--const uint8_t *'''dat'''
 +~「Address, Length, ID, DATA, .... , ID, DATA」といったDynamixelのSYNCインストラクションのパラメータと同じ記述をしたuint8_t型の配列のアドレス
 +--uint8_t '''size'''
 +~'''dat'''のバイト数
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~ライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***KRS_Ping [#pfa4af7a]
 +指定されたIDを持つデバイスを対象に存在確認をする。
 + bool KRS_Ping (uint8_t id, uint32_t timeout, PDXAlarm errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--uint32_t '''timeout'''
 +~検出タイムアウト時間[ms]
 +--[[PDXAlarm>#e9eaf5e2]] '''errcode'''
 +~デバイスおよびライブラリのエラーコードを取得する[[TDXAlarm>#pec1d2f6]]型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 指定IDのデバイスが見つかった~
 +false: 指定IDのデバイスがタイムアウト時間を超過しても見つからない
 +
 +***fd_KRSEnableControl [#z122c930]
 +指定IDのアクチュエータに対して、位置決め制御の開始・停止を指令する。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_KRSEnableControl (uint8_t id, bool On);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--bool '''On'''
 +~true: 位置決め制御開始 (出力軸が現在位置でロック)~
 +false: 位置決め制御停止 (出力軸がフリー)
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_KRSSetPosition [#jd9b52c0]
 +指定IDのアクチュエータに対して、指定された位置を指令(アイテムのGOAL POSITIONへの書き込み)する。なお、KRSシリーズは本指により自動的にトルクイネーブルがONになる。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_KRSSetPosition (uint8_t id, uint16_t Position);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--uint16_t '''Position'''
 +~0~16383
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_KRSGetPosition [#l4082ff3]
 +指定IDのアクチュエータから、現在の位置を取得(アイテムのPRESENT POSITIONの読み出し)する。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_KRSGetPosition (uint8_t id, uint16_t *Position);
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--uint16_t *'''Position'''
 +~取得した値を保存するuint16_t型の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_KRSGetCurrent [#t2b90caf]
 +指定IDのアクチュエータから、現在の電流値を取得(アイテムのPRESENT CURRENTの読み出し)する。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_KRSGetCurrent (uint8_t id, int16_t *Current);
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--int16_t *'''Current'''
 +~取得した値を保存するint16_t型の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***fd_KRSGetTemperature [#kb5ec354]
 +指定IDのアクチュエータから、現在の温度[degC]を取得(アイテムのPRESENT TEMPERATUREの読み出し)する。~
 +応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
 + bool fd_KRSGetTemperature (uint8_t id, int8_t *Temp);
 +--uint8_t '''id'''
 +~0~31: 対象デバイスのID
 +--int8_t *'''Temp'''
 +~取得した値を保存するint8_t型の変数のアドレス
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +**SDファイルアクセス [#i87518a6]
 +SDカードのファイルへアクセスするためのAPIです。アプリケーションで独自のデータを保存したり読み出すといった事が可能です。~
 +なお、対応するファイルシステムはFAT16のみとなり、FDIII-HCには時計機能が装備されない都合から日付・時刻を保存する機能はありません。
 +
 +***fd_WriteFile [#wc9c0974]
 +SDカードにファイルを書き込む。既存ファイルの場合は上書きされる。
 + bool fd_FileWrite (const char *fname, const void *wdata, uint32_t wrsz, uint32_t *sfsz);
 +-パラメータ
 +--const char *'''fname'''
 +~書込むファイル名
 +--const void *'''wdata'''
 +~書込みバッファのアドレス
 +--uint32_t '''wrsz'''
 +~書き込むバッファ内のデータサイズ
 +--uint32_t *'''sfsz'''
 +~実際に書き込んだサイズを保存するuint32_t型のアドレス
 +-戻り値
 +~true: ファイルの書込み成功~
 +false: ファイルの書込み失敗
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include "fd.h"
 +
 +void main (void) {
 +  uint32_t sz, rsz;
 +  // 書込みバッファ
 +  char buff[10] = "1234567890";
 +  // 読込み内容の保存バッファ
 +  char rbuff[21];
 +  fd_Wait (2000);
 +  // SDカードへTEST.DATを作成
 +  if (fd_WriteFile ("TEST.DAT", buff, sizeof (buff), &sz)) {
 +   rsz = sz;
 +   // TEST.DATへデータを追加
 +   if (fd_AppendFile ("TEST.DAT", buff, sizeof (buff), &sz)) {
 +     rsz += sz;
 +     // TEST.DATの内容を読み込む
 +     if (fd_ReadFile ("TEST.DAT", rbuff, rsz, &sz)) {
 +       // 末尾に0を追加することで文字列化
 +       rbuff[sz] = 0x0;
 +       fd_printf ("read buff = %s read size=%d\n", rbuff, sz);
 +       // TEST.DATを削除
 +       fd_DeleteFile ("TEST.DAT");
 +     }
 +   }
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_AppendFile [#a6c3a153]
 +指定されたファイルの最後に追加で書込みを行う。
 + bool fd_AppendFile (const char *fname, const void *wdata, uint32_t wrsz, uint32_t *sfsz);
 +-パラメータ
 +--const char *'''fname'''
 +~追加書込みを行うファイル名
 +--const void *'''wdata'''
 +~書込みバッファのアドレス
 +--uint32_t '''wrsz'''
 +~書き込むバッファ内のデータサイズ
 +--uint32_t *'''sfsz'''
 +~実際に書き込んだサイズを保存するuint32_t型のアドレス
 +-戻り値
 +~true: 追加書込み成功~
 +false: 追加書込み失敗
 +
 +***fd_ReadFile [#de5650e0]
 +指定されたファイルの内容をバッファへ読み込む。
 + bool fd_ReadFile (const char *fname, void *rdata, uint32_t rdsz, uint32_t *sfsz);
 +-パラメータ
 +--const char *'''fname'''
 +~読み込むファイル名
 +--void *'''rdata'''
 +~読み込んだ内容を保存するバッファのアドレス
 +--uint32_t '''rdsz'''
 +~読み込んだ内容を保存するバッファのサイズ
 +--uint32_t *'''sfsz'''
 +~実際に読み込んだサイズを保存するuint32_t型のアドレス
 +-戻り値
 +~true: ファイルの読込み成功~
 +false: ファイルの読込み失敗
 +
 +***fd_DeleteFile [#n80a989c]
 +指定されたファイル・フォルダをSDカードより削除する。
 + bool fd_DeleteFile (const char *fname);
 +-パラメータ
 +--const char *'''fname'''
 +~削除するファイル、又はフォルダ名
 +-戻り値
 +~true: 削除成功~
 +false: 削除失敗
 +
 +***fd_FindFirst[#aefc72f3]
 +フォルダ内の一覧を取得する際の、最初のファイル、又はフォルダを見つける。
 + bool fd_FindFirst(const char *foldername);
 +-パラメータ
 +--const char *'''foldername'''
 +~一覧を取得したいフォルダ名
 +-戻り値
 +~true: オープン成功~
 +false: オープン失敗
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include "fd.h"
 +
 +void main (void) {
 +  char fname[13];
 +  TFileInfo fi;
 +  fd_Wait (2000);
 +  if (fd_SDIsAlive ()) {
 +   // ルートフォルダを指定
 +   if (fd_FindFirst("/")) {
 +     // フォルダ内のファイル全てを検索
 +     while (fd_FindNext (fname, &fi)) {
 +       // フォルダを除いたファイルのみ表示
 +       if (!(fi.fattr & AM_DIR)) fd_printf ("file:%s size=%d\n", fname, fi.fsize);
 +     }
 +   }
 +  }
 +}
 +</pre>
 +}}
 +
 +***fd_FindNext [#naf4c900]
 +フォルダ内の一覧を取得する際の、次のファイル、又はフォルダを見つける。名称と合わせて情報も取得する。
 + bool fd_SD_FindNext (char *fname, TFileInfo *types);
 +-パラメータ
 +--char *'''fname'''
 +~見つかったファイル、又はフォルダ名を保存するchar型の配列変数のアドレス
 +--[[TFileInfo>#j83471bf]] *'''types'''
 +~見つかったファイル、又はフォルダのファイル情報を保存する[[TFileInfo>#j83471bf]]型の構造体の変数のアドレス
 +-戻り値
 +~true: 取得成功~
 +false: 取得失敗、又はフォルダ内検索終了
 +
 +***fd_MakeFolder [#pc0284d7]
 +フォルダを作成する。
 + bool fd_MakeFolder (const char *foldername);
 +-パラメータ
 +--const char *'''foldername'''
 +~作成するフルパスのフォルダ名
 +-戻り値
 +~true: 作成成功~
 +false: 作成失敗
 +
 +***fd_FileExists [#k2a246a4]
 +ファイル、又はフォルダの存在を確認をする。
 + bool fd_FileExists (const char *fname, TFileInfo *finfo);
 +-パラメータ
 +--const char *'''fname'''
 +~存在確認するファイル、又はフォルダ名
 +--TFileInfo *'''finfo'''
 +~見つかったファイル、又はフォルダのFATFSファイル情報構造体を保存する[[TFileInfo>#j83471bf]]型の変数のアドレス
 +-戻り値
 +~true: 確認成功~
 +false: 確認失敗
 +
 +***fd_SDIsAlive [#k052b419]
 +SDカードの存在を確認する。
 + bool fd_SDIsAlive (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: SDカードが存在する~
 +false: SDカードが存在しない
 +
 +**FREEDOM IIIライブラリ専用型定義 [#l89858c4]
 +本ライブラリでは複数の情報を一括で扱うAPIが多いため、引数としてそれらの情報を取りまとめた構造体のポインタを渡すケースがあります。全てfd.h内で定義されていますので、詳細はソースを参照してください。
 +
 +***TModelNo [#wd5f19ef]
 +FREEDOM IIIライブラリで想定しているネットワークデバイスのModel No.の一覧が記述された列挙型変数。~
 +主に[[TSpec>#w18bc93a]]構造体内の定義で使用される。
 + typedef enum {
 +   DEV_AX12  =    12,
 +   DEV_AX12W  =  0x12c,
 +   DEV_AXS1  =    13,
 +   DEV_AX18  =    18,
 +   DEV_DX113  =    113,
 +   DEV_DX116  =    116,
 +   DEV_DX117  =    117,
 +   DEV_RX10  =    10,
 +   DEV_RX24  =    24,
 +   DEV_RX28  =    28,
 +   DEV_RX64  =    64,
 +   DEV_EX106  =    107,
 +   DEV_MX28  =    29,
 +   DEV_MX64  = 0x0136,
 +   DEV_MX106  = 0x0140,
 +   DEV_M168IO = 0x4001,
 +   DEV_9DOF  = 0x4002,
 +   DEV_USS3  = 0x4004,
 +   DEV_UDIII  = 0x4010,
 +   DEV_MIO2  = 0x4020
 + } TModelNo;
 +-DEV_AX12
 +~AX-12, AX-12+, AX-12A
 +-DEV_AX12W
 +~AX-12W
 +-DEV_AXS1
 +~AX-S1
 +-DEV_AX18
 +~AX-18F, AX-18A
 +-DEV_DX113
 +~DX-113
 +-DEV_DX116
 +~DX-116
 +-DEV_DX117
 +~DX-117
 +-DEV_RX10
 +~RX-10
 +-DEV_RX24
 +~RX-24F
 +-DEV_RX28
 +~RX-28
 +-DEV_RX64
 +~RX-64
 +-DEV_EX106
 +~EX-106+
 +-DEV_MX28
 +~MX-28R, MX-28T
 +-DEV_MX64
 +~MX-64R, MX-64T
 +-DEV_MX106
 +~MX-106R, MX-106T
 +-DEV_M168IO
 +~Multifunction I/Oモジュール
 +-DEV_9DOF
 +~9DOFセンサモジュール
 +-DEV_USS3
 +~USS3
 +-DEV_UDIII
 +~ユニバーサルドライバ3
 +-DEV_MIO2
 +~MIO2
 +
 +***TOpRange [#ta0ab767]
 +アクチュエータの動作可能範囲をソフトウェア的に決めるための構造体。~
 +主に[[TSpec>#w18bc93a]]構造体内の定義で使用される。
 + typedef struct {
 +   short        lowerlimit;
 +   short        upperlimit;
 + } TOpRange;
 +-short '''lowerlimit'''
 +~アクチュエータの動作下限位置
 +-short '''lowerlimit'''
 +~アクチュエータの動作上限位置
 +
 +***TCompliance [#j7f153d3]
 +アクチュエータのコンプライアンスをまとめた構造体。~
 +主に[[TSpec>#w18bc93a]]構造体内の定義で使用される。
 + typedef struct {
 +   uint8_t CWMargin;
 +   uint8_t CCWMargin;
 +   uint8_t CWSlope;
 +   uint8_t CCWSlope;
 + } TCompliance;
 +-uint8_t '''CWMargin'''
 +~CWマージン~
 +MXシリーズにおいてはD Gain
 +-uint8_t '''CCWMargin'''
 +~CCWマージン~
 +MXシリーズにおいてはI Gain
 +-uint8_t '''CWSlope'''
 +~CWスロープ~
 +MXシリーズにおいてはP Gain
 +-uint8_t '''CCWSlope'''
 +~CCWスロープ~
 +MXシリーズにおいては未使用
 +
 +***TSpec [#w18bc93a]
 +デバイスの固有情報と[[TStructure>#c60c95a5]]のどの位置に適用するかを記述した構造体。[[fd_SetSpec>#r0f0534c]]にて使用する場合は、使用するデバイス数分の配列を定義した上で渡す。
 + typedef struct {
 +   short      id;
 +   TModelNo    ModelNo;
 +   short      *offset;
 +   short      Deg2Pos;
 +   TOpRange    OpRange;
 +   uint16_t    MaxSpeed;
 +   uint16_t    MaxTorque;
 +   TCompliance Compliance;
 +   uint16_t    BluntGain;
 + } TSpec;
 +-short '''id'''
 +~対象デバイスのID~
 +[[fd_SetSpec>#r0f0534c]]にて検出されないアラームとなる
 +-[[TModelNo>#wd5f19ef]] '''ModelNo'''
 +~対象デバイスのモデルNo.~
 +[[fd_SetSpec>#r0f0534c]]にて不一致が検出されるとアラームとなる
 +-short *'''offse'''t
 +~対象デバイス(アクチュエータに限る)を適用する先の[[TStructure>#c60c95a5]]内のオフセット位置~
 +例えばTStructureで定義された配列の10番目([9])の要素をオフセットとする場合は、fd_AxisOfsマクロを使用して以下の様に記述する
 + fd_AxisOfs(9)
 +~この設定により、各アクチュエータのIDとアプリケーション上で想定している構造が結び付けられる
 +#ref(tspec.png)
 +-short '''Deg2Pos'''
 +~対象デバイス(アクチュエータに限る)の位置と角度を変換する係数~
 +計算式は以下の通り (POS:位置, DEG:角度x10, HP:ホーム位置)~
 + POS = DEG * Deg2Pos / 1000 + HP
 +-[[TOpRange>#ta0ab767]] '''OpRange'''
 +~対象デバイス(アクチュエータに限る)の動作可能範囲~
 +ライブラリ内のソフト的なリミッタとして機能
 +-uint16_t '''MaxSpeed'''
 +~対象デバイス(アクチュエータに限る)の初期の速度~
 +[[fd_SetSpec>#r0f0534c]]により指定された値が対象デバイスに書き込まれる
 +-uint16_t '''MaxTorque'''
 +~対象デバイス(アクチュエータに限る)の初期のトルクリミット~
 +[[fd_SetSpec>#r0f0534c]]により指定された値が対象デバイスに書き込まれる~
 +0の場合は書き込みを行わない
 +-[[TCompliance>#j7f153d3]] '''Compliance'''
 +~対象デバイス(アクチュエータに限る)の初期のコンプライアンスもしくは制御ゲイン~
 +[[fd_SetSpec>#r0f0534c]]により指定された値が対象デバイスに書き込まれる~
 +全て0の場合は書き込みを行わない
 +-uint16_t '''BluntGain'''
 +~最終的な位置指令の際に本ゲインを元にスイープさせながら処理する~
 +小さい値で指令に追従しなくなるため、離散的な角度指令を行う際に使用すると、結果なめらかな挙動を得られる~
 +0ないし1000以上で遅延なくモータの最大能力で位置指令を行う
 +
 +***PSpec [#e936e373]
 +[[TSpec>#w18bc93a]]のポインタ型。
 +
 +***TStructure [#c60c95a5]
 +アプリケーションにおける軸の配置(構造)を決定づける配列で、その軸のアクチュエータの角度や位置を保持するのに用いる。~
 +ホームポジションやモーションはデバイスのIDで管理されるものではなく、この配列のどの位置に構造物のどの部位を割り当てるかで決定される。IDやアクチュエータの割り当ては[[TSpec>#w18bc93a]]内で定義される本配列に対するoffsetで二次的に決定される。~
 +ライブラリとして管理できる最大軸数は60(=FD_MAX_AXIS_NUM)軸である。
 + typedef short TStructure[FD_MAX_AXIS_NUM];
 +
 +***PStructure [#gbd350af]
 +[[TStructure>#c60c95a5]]のポインタ型
 +
 +***THomePosition [#fa1e627a]
 +各軸のホームポジションの位置を保持する配列。基本的にTStructureと全く同じで、アプリケーションにおける軸の配置(構造)を決定づける配列と同じ割り当てとする。
 + typedef TStructure THomePosition;
 +
 +***PHomePosition [#ef1eb5c1]
 +[[THomePosition>#fa1e627a]]のポインタ型
 +
 +***TMotionAdj [#ib9fef69]
 +複数の[[TPose>#y2b4d82e]]にて構成されるモーションにおいて、各々のポーズ間をつなぐ方法。
 + typedef enum {
 +   ADJ_SACC_SDECEL,
 +   ADJ_SACC,
 +   ADJ_SDECEL,
 +   ADJ_CONST
 + } TMotionAdj;
 +-ADJ_SACC_SDECEL
 +~S字(sin波)による加減速で2点間を補間~
 +始点及び終点近傍の速度が遅くなるため、機械的な負荷が軽減される
 +-ADJ_SACC
 +~S字(sin波)による加速で2点間を補間~
 +始点のみ近傍の速度が遅くなる
 +-ADJ_SDECEL
 +~S字(sin波)による減速で2点間を補間~
 +終点のみ近傍の速度が遅くなる
 +-ADJ_CONST
 +~定速度で2点間を補間
 +
 +***TPose [#y2b4d82e]
 + typedef struct {
 +   TStructure  Structure;
 +   TMotionAdj  Adj;
 +   int        Div;
 + } TPose;
 +-[[TStructure>#c60c95a5]] '''Structure'''
 +~アプリケーションの構造に合わせた角度情報
 +-[[TMotionAdj>#ib9fef69]] '''Adj'''
 +~補間方式
 +-int '''Div'''
 +~補間時間[ms]~
 +モーションにおいてはこの時間を経てStructureで設定された各軸の角度へ遷移させる
 +
 +***PPose [#nc6be2ce]
 +[[TPose>#y2b4d82e]]のポインタ型。
 +
 +***TApplyPart [#q3b8aabf]
 +モーションの再生やアクチュエータへの設定を行う際に、それらを適用する[[TStructure>#c60c95a5]]内のどの部位(軸)に適用するかを定義する。さらに、モーションの再生中は、本構造体がバッファを含めたデータの実態を担う。そのため、内部的な値の保持やバッファの定義が多く、定義の際に使用するメンバーは限られる。~
 +なお、宣言する際に少々トリッキーな手法を用いるため、使用する際はサンプルプログラム等で確認の事。
 + typedef struct {
 +   int        CurrentPose,
 +               PoseNum,
 +               MotionIntDiv,
 +               MotionDiv;
 +   TPose      Motion[FD_MAX_POSE_NUM+1];
 +   const bool  Registed;
 +   const bool  Stop;
 +   const bool  Playing;
 +   uint8_t    Priority;
 +   uint8_t    PartNum;
 +   short      *Part[];
 + } TApplyPart;
 +-int '''CurrentPose'''
 +~定義及び引用不可 (現在のポーズ位置を保持)
 +-int '''PoseNum'''
 +~定義及び引用不可 (現在のポーズ数を保持)
 +-int '''MotionIntDiv'''
 +~定義及び引用不可 (モーション分割初期値を保持)
 +-int '''MotionDiv'''
 +~定義及び引用不可 (モーション分割現在値を保持)
 +-[[TPose>#y2b4d82e]] '''Motion[FD_MAX_POSE_NUM+1]'''
 +~定義及び引用不可 (モーション再生用バッファ)
 +-const bool '''Registed'''
 +~定義及び引用不可 (内部テーブルへの追加フラグ)
 +-const bool '''Stop'''
 +~定義及び引用不可 (モーション停止指令)
 +-const bool '''Playing'''
 +~定義及び引用不可 (モーションの再生中フラグ)~
 +true: 再生中~
 +false: 再生終了
 +-uint8_t '''Priority'''
 +~優先度~
 +値が小さいほど優先度が高く、複数のモーションを同時に再生する等で部位が干渉する場合は、本優先度が最も高いものが適用される
 +-uint8_t '''PartNum'''
 +~Partで定義されるオフセットアドレスの要素数
 +-short *'''Part[]'''
 +~[[TStructure>#c60c95a5]]内の配列のオフセットアドレス~
 +ここで列挙される軸が適用対象となるが、例えばTStructureで定義された配列の1,2,4,5番目([0],[1],[3],[4])の4つの要素をオフセットとする場合は、fd_AxisOfsマクロを使用して以下の様に記述する。
 + fd_AxisOfs(0), fd_AxisOfs(1), fd_AxisOfs(3), fd_AxisOfs(4)
 +
 +***PApplyPart [#c439574f]
 +[[TApplyPart>#q3b8aabf]]のポインタ型。
 +***TTrc100Stat [#y369f1e7]
 +RC-100Bの1つのボタンの状態を示す。
 + typedef struct {
 +   bool        change;
 +   bool        down;
 + } TTrc100Stat;
 +-bool '''change'''
 +~ボタンの状態変化(UP->DOWNないしDOWN->UP)の有無~
 +true: あり~
 +false: なし
 +-bool '''down'''
 +~ボタンの押下状態~
 +~true: DOWN
 +false: UP
 +
 +***Trc100Stat [#s12fe324]
 +RC-100Bの10個のボタンの状態を示す配列。それぞれの要素は[[TTrc100Stat>#y369f1e7]]である。
 + typedef TTrc100Stat Trc100Stat[10];
 +配列の要素を抽出する際は、以下のマクロが使用できる。
 + #define _RC100_U 0  // 上方向キー
 + #define _RC100_D 1  // 下方向キー
 + #define _RC100_L 2  // 左方向キー
 + #define _RC100_R 3  // 右方向キー
 + #define _RC100_1 4  // 1ボタン
 + #define _RC100_2 5  // 2ボタン
 + #define _RC100_3 6  // 3ボタン
 + #define _RC100_4 7  // 4ボタン
 + #define _RC100_5 8  // 5ボタン
 + #define _RC100_6 9  // 6ボタン
 +
 +***Prc100Stat [#l040c154]
 +[[Trc100Stat>#s12fe324]]のポインタ型。
 +
 +***TTsixaxisStat [#q59f04b9]
 +SIXAXISないしDUALSHOCK3の1つのボタンの状態を示す。
 + typedef struct {
 +   bool        change;
 +   bool        down;
 + } TTsixaxisStat;
 +-bool '''change'''
 +~ボタンの状態変化(UP->DOWNないしDOWN->UP)の有無~
 +true: あり~
 +false: なし
 +-bool '''down'''
 +~ボタンの押下状態~
 +~true: DOWN
 +false: UP
 +
 +***TsixaxisStat [#o18f9eab]
 +SIXAXISないしDUALSHOCK3の17個のボタンの状態を示す配列。それぞれの要素は[[TTsixaxisStat>#q59f04b9]]である。
 + typedef TTsixaxisStat TsixaxisStat[17];
 +配列の要素を抽出する際は、以下のマクロが使用できる。
 + #define _SIXAXIS_BTN_U        0  // 上方向キー
 + #define _SIXAXIS_BTN_D        1  // 下方向キー
 + #define _SIXAXIS_BTN_L        2  // 左方向キー
 + #define _SIXAXIS_BTN_R        3  // 右方向キー
 + #define _SIXAXIS_BTN_TRIANGLE 4  // △ボタン
 + #define _SIXAXIS_BTN_SQUARE  5  // □ボタン
 + #define _SIXAXIS_BTN_CROSS    6  // ×ボタン
 + #define _SIXAXIS_BTN_CIRCLE  7  // ○ボタン
 + #define _SIXAXIS_BTN_R1      8  // R1ボタン
 + #define _SIXAXIS_BTN_L1      9  // L1ボタン
 + #define _SIXAXIS_BTN_L2      10  // L2ボタン
 + #define _SIXAXIS_BTN_R2      11  // R2ボタン
 + #define _SIXAXIS_BTN_SELECT  12  // SELECTボタン
 + #define _SIXAXIS_BTN_START    13  // STARTボタン
 + #define _SIXAXIS_BTN_PS      14  // PSボタン
 + #define _SIXAXIS_BTN_RANA    15  // 右アナログスティック
 + #define _SIXAXIS_BTN_LANA    16  // 左アナログスティック
 +
 +***PsixaxisStat [#x801c580]
 +[[TsixaxisStat>#o18f9eab]]のポインタ型。
 +
 +***TDXAlarm [#pec1d2f6]
 +ライブラリ内及びネットワークデバイスで検出されたエラーないしアラームの情報。
 + typedef uint16_t TDXAlarm;
 +各ビットの割り当ては以下の通り。~
 +ライブラリ内で定義されるアラーム。
 + #define ALARM_INVALID_DEVICE (1 << 15) // 諸元と異なるデバイス
 + #define ALARM_INVALID_ID    (1 << 14) // 指定できないID
 + #define ALARM_DIFF_ID        (1 << 13) // 想定されないID
 + #define ALARM_ILLEGAL_SIZE  (1 << 12) // 想定されないデータサイズ
 + #define ALARM_INVALID_PARAM  (1 << 11) // 想定されないパラメータサイズ
 + #define ALARM_COMM          (1 << 10) // 通信ポートの不良
 + #define ALARM_CHECKSUM      (1 << 9)  // チェックサムの不一致
 + #define ALARM_TIMEOUT        (1 << 8)  // 通信タイムアウト
 +デバイスで定義されるアラーム。
 + #define ALARM_DX_INST        (1 << 6)  // 未定義のインストラクション
 + #define ALARM_DX_OVERLOAD    (1 << 5)  // 過負荷
 + #define ALARM_DX_CHECKSUM    (1 << 4)  // チェックサムの不一致
 + #define ALARM_DX_RANGE      (1 << 3)  // 設定範囲外
 + #define ALARM_DX_OVERHEAT    (1 << 2)  // 過加熱
 + #define ALARM_DX_ANGLE      (1 << 1)  // 位置指令の範囲外
 + #define ALARM_DX_OVERVOLTAGE (1 << 0)  // 過電圧
 +
 +***PDXAlarm [#e9eaf5e2]
 +[[TDXAlarm>#pec1d2f6]]のポインタ型。
 +
 +***TAlarmStatus [#v3e0186a]
 +ネットワークデバイスの持つIDとアラームを紐付けた構造体。
 + typedef struct {
 +   uint8_t    id;
 +   TDXAlarm    Status;
 + } TAlarmStatus;
 +-uint8_t '''id'''
 +~デバイスのID
 +-[[TDXAlarm>#pec1d2f6]] '''Status'''
 +~デバイスのアラーム
 +
 +***PAlarmStatus [#vfd08c35]
 +[[TAlarmStatus>#v3e0186a]]のポインタ型。
 +
 +***TEdCmd [#l6e0e486]
 +[[fd_AssistMotionEdit>#x052dc88]]で指定するコマンド。
 + typedef enum {
 +   TED_PLAY,
 +   TED_REVERSE,
 +   TED_FOWARD,
 +   TED_CAPTURE,
 +   TED_DELETE,
 +   TED_INSERT,
 +   TED_REPLACE
 + } TEdCmd;
 +
 +-TED_PLAY
 +~モーションデータを頭からフル再生
 +-TED_REVERSE
 +~1つ前のポーズに軸を移行
 +-TED_FOWARD
 +~1つ後のポーズに軸を移行
 +-TED_CAPTURE
 +~現在の角度を取り込み、最後のポーズの後に追加
 +-TED_DELETE
 +~現在の1ポーズを削除
 +-TED_INSERT
 +~現在の角度を取り込み、現在のポーズの前に挿入
 +-TED_REPLACE
 +~現在の角度を取り込み、現在のポーズを置換
 +
 +***TFileInfo [#j83471bf]
 +FATFSにおけるファイル情報構造体。
 + typedef struct {
 +   uint32_t fsize;      // File size
 +   uint16_t fdate;      // Last modified date
 +   uint16_t ftime;      // Last modified time
 +   uint8_t  fattr;      // Attribute
 +   char    fname[13];  // Short file name (8.3 format)
 + } TFileInfo;
 +-uint32_t '''fsize'''
 +~ファイルのバイトサイズ
 +-uint16_t '''fdate'''
 +~変更された最後の日付
 +-uint16_t '''ftime'''
 +~変更された最後の時間
 +-uint8_t  '''fattr'''
 +~ファイルの属性~
 +fatfsに準じる以下のビットがアサインされる
 + #define AM_RDO  0x01 // Read only
 + #define AM_HID  0x02 // Hidden
 + #define AM_SYS  0x04 // System
 + #define AM_VOL  0x08 // Volume label
 + #define AM_LFN  0x0F // LFN entry
 + #define AM_DIR  0x10 // Directory
 + #define AM_ARC  0x20 // Archive
 + #define AM_MASK 0x3F // Mask of defined bits
 +-char '''fname[13]'''
 +~ショートファイル名(8.3フォーマット)
 +
 +***TColor [#u45f0df8]
 +RGB555のカラーフォーマットと透過ビットを合わせた構造体。16bitでの指定も可能。
 + typedef union {
 +   struct {
 +     uint16_t B:5;
 +     uint16_t G:5;
 +     uint16_t R:5;
 +     uint16_t t:1;
 +   };
 +   uint16_t WORD;
 + } TColor;
 +*注意事項 [#tee7f5e6]
 +**スタックサイズ [#ve08f74b]
 +関数内で動的に確保できるメモリのサイズはToppersのライブラリ(aspcore.h内に宣言がある)によって2kバイトに制限されています。これは変数の宣言も含まれ、本ライブラリで定義される型等はサイズが大きいため、不用意に宣言(記憶域をautoで指定)してしまうと気づかないうちにスタックフローが生じ、プログラムの動作に支障をきたします。~
 +関数内でサイズの大きい変数を確保する場合はstatic指定子を付与し、静的にメモリを確保させる事でこの制限を回避する事ができます。
  

  • FREEDOM III library のバックアップ差分(No. All)
    • 現: 2012-12-24 (月) 12:12:36 takaboo

トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom