Mbed OS version of IoT.js implementation running on GR-PEACH

ビルド方法

ビルド環境セットアップ

Host PC要件 : Ubuntu 16.04 (64-bit)



1. 以下のコマンドを実行し、下表に示すツールをインストールします。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install [Package]
PackageVersion
build-essential12.1ubuntu2
gyp0.1+20150913git1f374df9-1ubuntu1
mercurial3.7.3-1ubuntu1
cmake3.5.1-1ubuntu3
git1:2.7.4-0ubuntu1.4
python2.72.7.12-1ubuntu016.04.3
valgrind1:3.11.0-1ubuntu4.2
python-pip8.1.1-2ubuntu0.4

2. 以下のコマンドを実行してMbed OS用ビルドツール mbed CLIをインストールします。

$ sudo -H pip install mbed-cli

3. GNU Arm Embedded Toolchainをインストールします。

  • ダウンロードしたファイルを任意のディレクトリに展開します。
    (以下、展開先を${TOOLCHAIN}と記載します)

tar xjf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2
  • ツールチェインのパスを設定します。

環境変数を使用する場合

$ export GCC_ARM_ROOT=${TOOLCHAIN}/gcc-arm-none-eabi-6-2017-q2-update/bin
$ export PATH=$GCC_ARM_ROOT:$PATH

mbed CLIで指定する場合

$ mbed config -G GCC_ARM_PATH $GCC_ARM_ROOT

iotjs環境のビルド

1. 本プログラムのクローン

下記コマンドを実行し、本プログラムをクローンしてください。

$ hg clone https://HinoNaka@os.mbed.com/users/HinoNaka/code/GR-PEACH_mbed-os-iotjs/

クローンが正常に終了すると、GR-PEACH_mbed-os-iotjs という名称のディレクトリが生成されますので、下記コマンドで当該ディレクトリへ移動してください。

$ cd GR-PEACH_mbed-os-iotjs

(Optional)
GR-PEACH-mbed-os-iotjsディレクトリを指す環境変数 ROOTを設定してください。以降の記載は本環境変数が設定されているものとします。

$ export ROOT=$(PWD)

2. 作業用ディレクトリ(e.g. work)を作成し、当該ディレクトリに移動してください。

$ mkdir -p work
$ cd work

(Optional)
作業用ディレクトリを指す環境変数 WORK を設定してください。以降の記載は本環境変数 が設定されているものとします。

$ export WORK=$(PWD)

3. iotjsのソースツリーを取得します。

$ git clone https://github.com/pando-project/iotjs

クローンが正常に終了するとiotjsというディレクトリが生成されますので、当該ディレクトリに移動してください。

$cd iotjs

コミットID: acae9c8b2d40e7598b8d39b630b79113ce880a7e を取得します。
(下記例では、あわせてposixというブランチを作成し、当該ブランチへ切り替えています)

$ git checkout -b posix acae9c8b2d40e7598b8d39b630b79113ce880a7e

4. mbed-osセットアップ
Mbed OSソースツリーを格納するフォルダを生成し、当該フォルダへ移動します。

$ mkdir -p $(WORK)/iotjs/src/platform/mbedos5
$ cd $(WORK)/iotjs/src/platform/mbedos5

Mbed OSのソースツリーをクローンします。

$ git clone -b mbed-os-5.9 https://github.com/ARMmbed/mbed-os.git

クローンが正常に終了するとmbed-osというディレクトリが生成されますので、当該ディレクトリに移動してください。

$ cd mbed-os

コミットID: 50bd61a4a72332baa6b1bac6caccb44dc5423309 を取得します。
(下記例では、あわせてposixというブランチを作成し、当該ブランチへ切り替えています)

$ git checkout -b posix 50bd61a4a72332baa6b1bac6caccb44dc5423309

5. sd-driverの取得
下記コマンドでmbedos5ディレクトリへ移動します。

$ cd $(WORK)/iotjs/src/platform/mbedos5

sd-driverをクローンします。

$ git clone https://github.com/ARMmbed/sd-driver.git

クローンが正常終了するとsd-driverディレクトリが生成されますので、当該ディレクトリへ移動します。

$ cd sd-driver

コミットID: c8ae38fb291e086232566b0f1372cfb69c277e84 を取得します。
(下記例では、あわせてposixというブランチを作成し、当該ブランチへ切り替えています)

$ git checkout -b posix c8ae38fb291e086232566b0f1372cfb69c277e84

6. mbed-gr-libsの取得
下記コマンドでmbedos5ディレクトリへ移動します。

$ cd $(WORK)/iotjs/src/platform/mbedos5

mbed-gr-libsをクローンします。

$ git clone https://github.com/d-kato/mbed-gr-libs

クローンが正常終了するとmbed-gr-libsディレクトリが生成されますので、当該ディレクトリへ移動します。

$ cd mbed-gr-libs

コミットID: d921d611d596ecaebaab49070ef82450c583309c を取得します。
(下記例では、あわせてposixというブランチを作成し、当該ブランチへ切り替えています)

$ git checkout -b posix d921d611d596ecaebaab49070ef82450c583309c

7. AsciiFONTの取得
下記コマンドでmbedos5ディレクトリへ移動します。

$ cd $(WORK)/iotjs/src/platform/mbedos5

AsciiFONTライブラリを追加します。

$ mbed add https://os.mbed.com/teams/Renesas/code/AsciiFont/

8. iotjs環境のビルド
下記コマンドでiotjs環境のビルドディレクトリに移動し、ビルドを実行します。

$ cd $(WORK)/iotjs
$ ./tools/build.py --no-snapshot

9. GR-PEACH用コードのコピー
(Optional) 既存のiotjs環境に上書きする場合、下記コマンドを実行してください。

$ rm -rf $(WORK)/iotjs/deps/posix
$ rm -rf $(WORK)/iotjs/src/ext-modules
$ rm -rf $(WORK)/iotjs/src/platform/mbedos5/iotjs_def.h

下記コマンドでGR-PEACH用コードをコピーします。

$ cp -pr $(ROOT)/src/iotjs/* $(WORK)/iotjs/

10. lwipパッチ適用
以下コマンドでlwipパッチを適用します。

$ cd $(WORK)/iotjs/src/platform/mbedos5/mbed-os
$ git apply lwip_improve.patch

11. ESP32 TRNG対応パッチ適用
以下コマンドでESP32のTRNGを活用するためのパッチを適用します。

$ cd $(WORK)/iotjs/src/platform/mbedos5/mbed-os
$ git apply trng_support.patch

12. Mbed OS版iotjs環境のビルド
下記コマンドを実行してMbed OS版iotjs環境をビルドします。
(リリースビルドの場合)

$ cd $(WORK)/iotjs/src/platform/mbedos5
$ make clean; make DEBUG=0

(デバッグビルドの場合)

$ cd $(WORK)/iotjs/src/platform/mbedos5
$ make clean; make DEBUG=1

13. ビルドが正常に終了すると、以下の通りバイナリが生成されます。
(リリースビルドの場合)

$ ls -l ${WORK}/iotjs/src/platform/mbedos5/BUILD/RZ_A1H/GCC_ARM-RELEASE/iotjs.bin

(デバッグビルドの場合)

$ ls -l ${WORK}/iotjs/src/platform/mbedos5/BUILD/RZ_A1H/GCC_ARM-DEBUG/iotjs.bin

実行方法

1. GR-PEACHにmicro SDカードを挿入します。

2. GR-PEACHのEthernetポートから遠い側のUSBポートとHost PCをマイクロUSBケーブルで接続します。

3. Host PCでGR-PEACHが『mbed:』ドライブとして認識されたら、iotjs.binをmbedドライブにコピーします。

4. ターミナルS/Wを立上げ、『mbed Serial Port』と接続します。
/media/uploads/HinoNaka/img1.jpg
シリアルポートは下記設定としてください。

Baud rate115200
Data8 bit
Paritynone
Stop1 bit
Flow controlnone

5. 正常に書込みが終了したらGR-PEACHのRESETボタンを押下します。

6. ターミナルS/W上に下記メッセージが表示されます。
/media/uploads/HinoNaka/img2.jpg

7. Enterキーを押下してコード入力モードに移行します。
/media/uploads/HinoNaka/img3.jpg

8. 実行するJavascriptコードをターミナルソフトウェアに貼り付けてEnterキーを押下すると、実行開始します。Javascriptコード例については、test/case.txtを参照ください。

Files at this revision

API Documentation at this revision

Comitter:
Osamu Nakamura
Date:
Thu Jul 11 18:49:37 2019 +0900
Parent:
0:7cc000799c93
Child:
2:5b56214ef977
Commit message:
Initial commit of sample app and document

Changed in this revision

doc/api/aligned_buffer.html Show annotated file Show diff for this revision Revisions of this file
doc/api/display.html Show annotated file Show diff for this revision Revisions of this file
doc/api/fixup.html Show annotated file Show diff for this revision Revisions of this file
doc/api/graphics.html Show annotated file Show diff for this revision Revisions of this file
doc/api/index.html Show annotated file Show diff for this revision Revisions of this file
doc/api/jpeg.html Show annotated file Show diff for this revision Revisions of this file
doc/api/nic.html Show annotated file Show diff for this revision Revisions of this file
doc/api/video.html Show annotated file Show diff for this revision Revisions of this file
doc/ƒlƒbƒgƒ[ƒNŠÂ‹«‚̐§Œä‚ɂ‚¢‚Ä.txt Show annotated file Show diff for this revision Revisions of this file
doc/ƒrƒ‹ƒh•û–@.txt Show annotated file Show diff for this revision Revisions of this file
doc/ƒ‚ƒWƒ…[ƒ‹‘Ήžó‹µ.txt Show annotated file Show diff for this revision Revisions of this file
doc/ˆÚAŠÖ”ˆê——.xlsx Show annotated file Show diff for this revision Revisions of this file
doc/Žg—p•û–@.txt Show annotated file Show diff for this revision Revisions of this file
doc/§ŒÀŽ–€.txt Show annotated file Show diff for this revision Revisions of this file
sample/client.js Show annotated file Show diff for this revision Revisions of this file
sample/readme.txt Show annotated file Show diff for this revision Revisions of this file
sample/server.js Show annotated file Show diff for this revision Revisions of this file
test/.mbedignore Show annotated file Show diff for this revision Revisions of this file
test/case.txt Show annotated file Show diff for this revision Revisions of this file
test/contents_microSD.zip Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/aligned_buffer.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,853 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH aligned_bufferモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-aligned_buffer-aligned_buffer-">GR-PEACH aligned_bufferモジュール (aligned_buffer)</h1>
+<p><code>aligned_buffer</code> モジュールは、アライメントを指定したバッファを生成します。</p>
+<p>IoT.js のBuffer型との互換性はないため、Buffer型として使用する場合は<code>buf.toBuffer()</code>にて、変換する必要があります。
+<a href="https://github.com/pando-project/iotjs/blob/acae9c8b2d40e7598b8d39b630b79113ce880a7e/docs/api/IoT.js-API-Buffer.md">https://github.com/pando-project/iotjs/blob/acae9c8b2d40e7598b8d39b630b79113ce880a7e/docs/api/IoT.js-API-Buffer.md</a></p>
+<!--
+htmlファイルへ変換するときに、リンク先が .md から .html へ変換されてしまうので注意
+-->
+<h2 id="new-alignedbuffer-length-alignment-">new AlignedBuffer(length, alignment)</h2>
+<ul>
+<li><code>length</code> {number} バッファの長さ</li>
+<li><code>alignment</code> {number} バッファのアライメント。<code>2の累乗</code>の値を指定してください。</li>
+<li>戻り値: {AlignedBuffer} 生成したバッファ</li>
+</ul>
+<p><code>length</code>の長さのバッファを新しく生成します。バッファの内容は<code>0</code>で初期化されます。
+バッファは<code>alignment</code>バイト境界のメモリアドレスに配置されます。</p>
+<h2 id="new-alignedbuffer-buffer-alignment-">new AlignedBuffer(buffer, alignment)</h2>
+<ul>
+<li><code>buffer</code> {Buffer|AlignedBuffer} コピー元のバッファ</li>
+<li><code>alignment</code> {number} バッファのアライメント。<code>2の累乗</code>の値を指定してください。</li>
+<li>戻り値: {AlignedBuffer} 生成したバッファ</li>
+</ul>
+<p>既存のバッファのコピーを生成します。2つのバッファ間でデータは共有されません。
+バッファは<code>alignment</code>バイト境界のメモリアドレスに配置されます。
+アライメント境界が異なる<code>buffer</code>のコピーにも使用できます。</p>
+<h2 id="buf-tobuffer-start-end-">buf.toBuffer([start[, end]])</h2>
+<ul>
+<li><code>start</code> {number} 先頭インデックス。(省略時: <code>0</code>)</li>
+<li><code>end</code> {number} 終端インデックス。(省略時: <code>buf.length</code>)</li>
+<li>戻り値: {Buffer} 生成したバッファ</li>
+</ul>
+<p>既存のバッファからBuffer型のオブジェクトを生成します。
+生成されるバッファは<code>end - start</code>の長さを持ち、<code>start ~ (end-1)</code>の範囲のデータがコピーされます。
+2つのバッファ間でデータは共有されません。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> buf1 = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">128</span>, <span class="hljs-number">32</span>);
+<span class="hljs-keyword">var</span> buf2 = buf1.toBuffer();
+<span class="hljs-built_in">console</span>.log(buf2 <span class="hljs-keyword">instanceof</span> Buffer); <span class="hljs-comment">// true</span>
+</code></pre>
+<h2 id="buf-alignment">buf.alignment</h2>
+<ul>
+<li>{number}</li>
+<li>バッファのアライメントを示す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="buf-length">buf.length</h2>
+<ul>
+<li>{number}</li>
+<li>バッファの長さを示す、読み取り専用プロパティです。</li>
+</ul>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">128</span>, <span class="hljs-number">32</span>);
+<span class="hljs-built_in">console</span>.log(buf.alignment); <span class="hljs-comment">// 32</span>
+<span class="hljs-built_in">console</span>.log(buf.length); <span class="hljs-comment">// 128</span>
+</code></pre>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/display.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,1026 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH ディスプレイモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-display-">GR-PEACH ディスプレイモジュール (display)</h1>
+<p><code>display</code> モジュールは、<a href="http://www.core.co.jp/product/m2m/gr-peach/gr-lcd.html">GR-PEACH 4.3inch LCD Shield</a>
+に搭載された液晶の制御を行います。</p>
+<ul>
+<li>対応するLCDは以下の通りです。<ul>
+<li><code>&quot;4.3inch&quot;</code> - <a href="https://www.core.co.jp/product/m2m/gr-peach/gr-lcd.html">GR-PEACH 4.3inch LCD Shield</a></li>
+</ul>
+</li>
+</ul>
+<p>画像の出力は、マイコンに搭載されたハードウェアリソース(VDC5)を用いてプログラムとは非同期に実行されます。</p>
+<h2 id="display-openlcd-config-callback-">display.openLCD(config, callback)</h2>
+<ul>
+<li><code>config</code> {Object} LCDの設定<ul>
+<li><code>type</code> {string} 接続するLCDの種類。<code>&quot;4.3inch&quot;</code>のみ指定可能。必須項目です。</li>
+</ul>
+</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+<li><code>lcd</code> {Object} <code>Lcd</code>クラスのインスタンス (成功のとき)</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>LCDディスプレイに接続します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Graphics_Lvds_Port_Init
+  * Display.Graphics_init
+  * Display.Graphics_Irq_Handler_Set (★videoとハンドラを共用する)
+  * Display.Graphics_Read_Setting
+-->
+<blockquote>
+<p><strong>注意</strong>: ハードウェアリソースを排他で使用するため、複数の<code>Lcd</code>インスタンスを同時に使用することはできません。別のLCDに接続する場合は、先に生成されたインスタンスに対して<code>close()</code>を実行してください。</p>
+</blockquote>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> display = <span class="hljs-built_in">require</span>(<span class="hljs-string">'display'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">var</span> buf1 = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+<span class="hljs-keyword">var</span> buf2 = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+
+display.openLCD({
+  <span class="hljs-attr">type</span>: <span class="hljs-string">'4.3inch'</span>
+}, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, lcd</span>) </span>{
+  <span class="hljs-keyword">if</span> (err) {
+    <span class="hljs-comment">/* display.openLCD 失敗... */</span>
+    <span class="hljs-built_in">console</span>.log(err);
+    <span class="hljs-keyword">return</span>;
+  }
+  <span class="hljs-comment">/* display.openLCD 成功... */</span>
+
+  lcd.start(<span class="hljs-number">0</span>, buf1, <span class="hljs-string">'rgb565'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) </span>{
+    <span class="hljs-keyword">if</span> (err) {
+      <span class="hljs-comment">/* lcd.start 失敗... */</span>
+      <span class="hljs-built_in">console</span>.log(err);
+      <span class="hljs-keyword">return</span>;
+    }
+    <span class="hljs-comment">/* lcd.start 成功... */</span>
+
+    lcd.update(<span class="hljs-number">0</span>, buf2, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) </span>{
+      <span class="hljs-keyword">if</span> (err) {
+        <span class="hljs-comment">/* lcd.update 失敗... */</span>
+        <span class="hljs-built_in">console</span>.log(err);
+        <span class="hljs-keyword">return</span>;
+      }
+      <span class="hljs-comment">/* lcd.update 成功... */</span>
+
+      lcd.stop(<span class="hljs-number">0</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) </span>{
+        <span class="hljs-keyword">if</span> (err) {
+          <span class="hljs-comment">/* lcd.stop 失敗... */</span>
+          <span class="hljs-built_in">console</span>.log(err);
+          <span class="hljs-keyword">return</span>;
+        }
+        <span class="hljs-comment">/* lcd.stop 成功... */</span>
+
+        lcd.close(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">err</span>) </span>{
+          <span class="hljs-keyword">if</span> (err) {
+            <span class="hljs-comment">/* lcd.close 失敗... */</span>
+            <span class="hljs-built_in">console</span>.log(err);
+          }
+          <span class="hljs-comment">/* lcd.close 成功... */</span>
+        });
+      });
+    });
+  });
+});
+</code></pre>
+<h2 id="display-openlcdsync-config-">display.openLCDSync(config)</h2>
+<ul>
+<li><code>config</code> {Object} LCDの設定<ul>
+<li><code>display.openLCD()</code>の説明を参照。</li>
+</ul>
+</li>
+<li>戻り値: {Object} <code>Lcd</code>クラスのインスタンス</li>
+</ul>
+<p><code>display.openLCD()</code>の同期版です。処理は同期で行われ、処理が完了すると<code>Lcd</code>クラスのインスタンスを返却します。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> display = <span class="hljs-built_in">require</span>(<span class="hljs-string">'display'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">var</span> buf1 = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+<span class="hljs-keyword">var</span> buf2 = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> lcd = display.openLCDSync({ <span class="hljs-attr">type</span>: <span class="hljs-string">'4.3inch'</span> });
+  <span class="hljs-comment">/* display.openLCDSync 成功... */</span>
+
+  lcd.startSync(<span class="hljs-number">0</span>, buf1, <span class="hljs-string">'rgb565'</span>);
+  <span class="hljs-comment">/* lcd.startSync 成功... */</span>
+
+  lcd.updateSync(<span class="hljs-number">0</span>, buf2);
+  <span class="hljs-comment">/* lcd.updateSync 成功... */</span>
+
+  lcd.stopSync(<span class="hljs-number">0</span>);
+  <span class="hljs-comment">/* lcd.stopSync 成功... */</span>
+
+  lcd.closeSync();
+  <span class="hljs-comment">/* lcd.closeSync 成功... */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h1 id="lcd-">Lcdクラス</h1>
+<p>LCDの制御、画像データの出力を行うクラスです。</p>
+<h2 id="lcd-type">lcd.type</h2>
+<ul>
+<li>{string}</li>
+<li>接続されているLCDの種類を示す、読み取り専用プロパティです。<code>display.openLCD()</code>の<code>config.type</code>に指定した値が得られます。</li>
+</ul>
+<h2 id="lcd-width">lcd.width</h2>
+<ul>
+<li>{number}</li>
+<li>表示デバイスの横幅をピクセル数で示す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="lcd-height">lcd.height</h2>
+<ul>
+<li>{number}</li>
+<li>表示デバイスの高さをピクセル数で示す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="lcd-start-layer-buf-format-callback-">lcd.start(layer, buf, format, callback)</h2>
+<ul>
+<li><code>layer</code> {number} LCDのレイヤID。<code>0</code>~<code>3</code>の値。</li>
+<li><code>buf</code> {AlignedBuffer} LCD出力するバッファ。32バイトのアライメントである必要があります。</li>
+<li><code>format</code> {string} 入力画像(フレームバッファ)に用いるピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>,<code>&quot;rgb565&quot;</code>,<code>&quot;rgb888&quot;</code>,<code>&quot;argb8888&quot;</code>,<code>&quot;argb4444&quot;</code>のいずれかが指定可能。必須項目です。</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>画像の出力を開始します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Graphics_Start
+-->
+<h2 id="lcd-startsync-layer-buf-format-">lcd.startSync(layer, buf, format)</h2>
+<ul>
+<li><code>layer</code> {number} LCDのレイヤID。<code>0</code>~<code>3</code>の値。</li>
+<li><code>buf</code> {AlignedBuffer} LCD出力するバッファ。32バイトのアライメントである必要があります。</li>
+<li><code>format</code> {string} 入力画像(フレームバッファ)に用いるピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>,<code>&quot;rgb565&quot;</code>,<code>&quot;rgb888&quot;</code>,<code>&quot;argb8888&quot;</code>,<code>&quot;argb4444&quot;</code>のいずれかが指定可能。必須項目です。</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>lcd.start()</code>の同期版です。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h2 id="lcd-stop-layer-callback-">lcd.stop(layer, callback)</h2>
+<ul>
+<li><code>layer</code> {number} LCDのレイヤID。<code>0</code>~<code>3</code>の値。</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>画像の出力を停止します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Graphics_Stop
+-->
+<h2 id="lcd-stopsync-layer-">lcd.stopSync(layer)</h2>
+<ul>
+<li><code>layer</code> {number} LCDのレイヤID。<code>0</code>~<code>3</code>の値。</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>lcd.stop()</code>の同期版です。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h2 id="lcd-update-layer-buf-callback-">lcd.update(layer, buf, callback)</h2>
+<ul>
+<li><code>layer</code> {number} LCDのレイヤID。<code>0</code>~<code>3</code>の値。</li>
+<li><code>buf</code> {AlignedBuffer} LCD出力するバッファ。32バイトのアライメントである必要があります。</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>LCDに表示するフレームバッファを更新(置き換え)します。
+フレームバッファは<code>lcd.start()</code>の<code>format</code>で指定したフォーマットである必要があります。
+処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Graphics_Read_Change
+-->
+<h2 id="lcd-updatesync-layer-buf-">lcd.updateSync(layer, buf)</h2>
+<ul>
+<li><code>layer</code> {number} LCDのレイヤID。<code>0</code>~<code>3</code>の値。</li>
+<li><code>buf</code> {AlignedBuffer} LCD出力するバッファ。32バイトのアライメントである必要があります。</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>lcd.update()</code>の同期版です。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h2 id="lcd-close-callback-">lcd.close(callback)</h2>
+<ul>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>画像出力に関するハードウェアリソースを解放します。<code>lcd.start()</code>により画像の出力が開始されている場合、この関数の内部で自動的に<code>lcd.stop()</code>が呼び出されて停止されます。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<blockquote>
+<p><strong>注意</strong>: この関数を呼んだ後には、この<code>Lcd</code>インスタンスに対していかなる操作も行えません。このとき各プロパティの返す値は未定義であり、各関数の呼び出しを行うとエラーが発生します。</p>
+</blockquote>
+<!--
+* C++ライブラリ側API
+  * 使用しない
+-->
+<h2 id="lcd-closesync-">lcd.closeSync()</h2>
+<ul>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>lcd.close()</code>の同期版です。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/fixup.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,838 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH fixupモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-fixup-fixup-">GR-PEACH fixupモジュール (fixup)</h1>
+<p><code>fixup</code> モジュールは、IoT.jsの既存のモジュールを修理します。
+修理内容はユーザコードからはトランスペアレントです。
+現在、<code>&quot;http&quot;</code>および<code>&quot;https&quot;</code>に対応しています。
+これらのモジュールを使用する場合は、本モジュールにて修理を行ってください。</p>
+<h2 id="fixup-module1-module2-">fixup(module1[, module2, ...])</h2>
+<ul>
+<li><code>module1</code> {string} 修理するモジュールの名前。</li>
+<li><code>module2, ...</code> {string} 修理するモジュールの名前を任意の個数指定可能。</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>引数に指定されたモジュールを修理します。
+指定されたモジュールが見つからない場合や修理が不要なモジュールを指定した場合は何も行いません。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-comment">// http モジュールを修理する場合</span>
+<span class="hljs-keyword">var</span> fixup = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fixup'</span>);
+fixup(<span class="hljs-string">'http'</span>);                <span class="hljs-comment">// http を require する直前に追記</span>
+                              <span class="hljs-comment">// require('fixup')('http'); と記述するのと等価</span>
+<span class="hljs-keyword">var</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">'http'</span>);
+</code></pre>
+<pre><code class="lang-javascript"><span class="hljs-comment">// https モジュールを修理する場合</span>
+<span class="hljs-built_in">require</span>(<span class="hljs-string">'fixup'</span>)(<span class="hljs-string">'https'</span>);    <span class="hljs-comment">// https を require する直前に追記</span>
+<span class="hljs-keyword">var</span> https = <span class="hljs-built_in">require</span>(<span class="hljs-string">'https'</span>);
+</code></pre>
+<pre><code class="lang-javascript"><span class="hljs-comment">// http, https モジュールを修理する場合</span>
+<span class="hljs-built_in">require</span>(<span class="hljs-string">'fixup'</span>)(<span class="hljs-string">'http'</span>, <span class="hljs-string">'https'</span>); <span class="hljs-comment">// http, https を require する直前に追記</span>
+<span class="hljs-keyword">var</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">'http'</span>);
+<span class="hljs-keyword">var</span> https = <span class="hljs-built_in">require</span>(<span class="hljs-string">'https'</span>);
+</code></pre>
+<h2 id="fixup-modules-">fixup(modules)</h2>
+<ul>
+<li><code>modules</code> {Array} 修理するモジュールの名前を格納した配列。</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>modules</code>に配列で指定されたモジュールを修理します。</p>
+<pre><code class="lang-javascript"><span class="hljs-comment">// http, https モジュールを修理する場合</span>
+<span class="hljs-built_in">require</span>(<span class="hljs-string">'fixup'</span>)([ <span class="hljs-string">'http'</span>, <span class="hljs-string">'https'</span> ]); <span class="hljs-comment">// http, https を require する直前に追記</span>
+<span class="hljs-keyword">var</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">'http'</span>);
+<span class="hljs-keyword">var</span> https = <span class="hljs-built_in">require</span>(<span class="hljs-string">'https'</span>);
+</code></pre>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/graphics.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,1051 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH グラフィックスモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-graphics-">GR-PEACH グラフィックスモジュール (graphics)</h1>
+<p><code>graphics</code> モジュールは、フレームバッファへのグラフィックスの描画を行います。</p>
+<h2 id="new-graphics-config-">new Graphics(config)</h2>
+<ul>
+<li><code>config</code> {Object} グラフィックスの描画を行うフレームバッファの設定<ul>
+<li><code>buf</code> {AlignedBuffer} フレームバッファとして使用するバッファ。必須項目です。</li>
+<li><code>width</code> {number} フレームバッファの横幅(ピクセル数)。必須項目です。</li>
+<li><code>height</code> {number} フレームバッファの高さ(ピクセル数)。必須項目です。</li>
+<li><code>format</code> {string} フレームバッファのピクセルフォーマット。<code>&quot;rgb565&quot;</code>, <code>&quot;rgb888&quot;</code>, <code>&quot;argb8888&quot;</code>, <code>&quot;argb4444&quot;</code>のいずれかが指定できます。必須項目です。</li>
+</ul>
+</li>
+<li>戻り値: {Object} <code>Graphics</code>クラスのインスタンス</li>
+</ul>
+<p>グラフィックスの描画を行うフレームバッファの設定を行います。処理は同期で行われ、処理が完了すると<code>Graphics</code>クラスのインスタンスを返却します。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> display = <span class="hljs-built_in">require</span>(<span class="hljs-string">'display'</span>);
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  <span class="hljs-comment">/* グラフィックス描画... */</span>
+
+  <span class="hljs-comment">/* グラフィックスをLCDに表示 */</span>
+  <span class="hljs-keyword">var</span> lcd = display.openLCDSync({ <span class="hljs-attr">type</span>: <span class="hljs-string">'4.3inch'</span> });
+  lcd.startSync(<span class="hljs-number">0</span>, graphics.frameBuffer, <span class="hljs-string">'rgb565'</span>);
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h1 id="graphics-">Graphicsクラス</h1>
+<p>フレームバッファへのグラフィックスの描画を行うクラスです。</p>
+<p>本クラスで使用する色データは、<code>new Graphics()</code>の<code>config.format</code>で指定したフォーマットの1ピクセル当たりのデータを<code>number</code>で指定します。
+各フォーマットに対して、色データの各ビットの対応関係は以下のようになります。</p>
+<p><code>&quot;rgb565&quot;</code>  : <code>0bRRRRRGGGGGGBBBBB</code><br><code>&quot;argb4444&quot;</code> : <code>0bAAAARRRRGGGGBBBB</code><br><code>&quot;rgb888&quot;</code>  : <code>0bXXXXXXXXRRRRRRRRGGGGGGGGBBBBBBBB</code>(<code>X</code>のビットの値は無効)<br><code>&quot;argb8888&quot;</code> : <code>0bAAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB</code></p>
+<h2 id="graphics-framebuffer">graphics.frameBuffer</h2>
+<ul>
+<li>{AlignedBuffer}</li>
+<li>描画対象のフレームバッファを示すプロパティです。<code>new Graphics()</code>の<code>config.buf</code>に指定した値が得られます。</li>
+</ul>
+<h2 id="graphics-bufferwidth">graphics.bufferWidth</h2>
+<ul>
+<li>{number}</li>
+<li>フレームバッファの横幅(ピクセル数)を示す、読み取り専用プロパティです。<code>new Graphics()</code>の<code>config.width</code>に指定した値が得られます。</li>
+</ul>
+<h2 id="graphics-bufferheight">graphics.bufferHeight</h2>
+<ul>
+<li>{number}</li>
+<li>フレームバッファの高さ(ピクセル数)を示す、読み取り専用プロパティです。<code>new Graphics()</code>の<code>config.height</code>に指定した値が得られます。</li>
+</ul>
+<h2 id="graphics-bufferformat">graphics.bufferFormat</h2>
+<ul>
+<li>{string}</li>
+<li>フレームバッファのピクセルフォーマットを示す、読み取り専用プロパティです。<code>new Graphics()</code>の<code>config.format</code>に指定した値が得られます。</li>
+</ul>
+<h2 id="graphics-drawimage-image-x-y-">graphics.drawImage(image, x, y)</h2>
+<ul>
+<li><code>image</code> {Object} 転送元の画像データ<ul>
+<li><code>width</code> {number} 画像の幅(ピクセル数)。</li>
+<li><code>height</code> {number} 画像の高さ(ピクセル数)</li>
+<li><code>bitmap</code> {AlignedBuffer} 画素データ。ピクセルフォーマットは<code>graphics.bufferFormat</code>と一致している必要があります。</li>
+</ul>
+</li>
+<li><code>x</code> {number} 転送先の左上X座標 (省略時: <code>0</code>)</li>
+<li><code>y</code> {number} 転送先の左上Y座標 (省略時: <code>0</code>)</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>画像をフレームバッファに転送(コピー)します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<p>指定された各座標やサイズがフレームバッファのサイズを超える場合、サイズ内の範囲に切り詰められます。切り詰めた結果、転送する領域の横幅や高さが<code>0</code>以下となった場合は、転送を行わずに成功扱いで終了します。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> jpeg = <span class="hljs-built_in">require</span>(<span class="hljs-string">'jpeg'</span>);
+<span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  <span class="hljs-keyword">var</span> jpegData = fs.readFileSync(<span class="hljs-string">'/sd/input.jpg'</span>);
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(jpegData, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> image = jpeg.decodeSync(buf, {<span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawImage(image, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawline-startx-starty-endx-endy-color-">graphics.drawLine(startX, startY, endX, endY, color)</h2>
+<ul>
+<li><code>startX</code> {number} 線の始点のX座標</li>
+<li><code>startY</code> {number} 線の始点のY座標</li>
+<li><code>endX</code> {number} 線の終点のX座標</li>
+<li><code>endY</code> {number} 線の終点のY座標</li>
+<li><code>color</code> {number} 線の色</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに線を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を白で塗りつぶす */</span>
+  graphics.drawLine(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xF800</span>); <span class="hljs-comment">/* 赤の線を描画 */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawrect-x-y-width-height-color-fill-">graphics.drawRect(x, y, width, height, color, fill)</h2>
+<ul>
+<li><code>x</code> {number} 矩形の左上X座標</li>
+<li><code>y</code> {number} 矩形の左上Y座標</li>
+<li><code>width</code> {number} 矩形の幅</li>
+<li><code>height</code> {number} 矩形の高さ</li>
+<li><code>color</code> {number} 矩形の色</li>
+<li><code>fill</code> {boolean} <code>true</code>:塗りつぶしあり, <code>false</code>:塗りつぶしなし</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに矩形を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を白で塗りつぶす */</span>
+  graphics.drawRect(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0x0000</span>, <span class="hljs-literal">false</span>); <span class="hljs-comment">/* 黒の矩形を描画 */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawarc-centerx-centery-radius-startangle-endangle-color-">graphics.drawArc(centerX, centerY, radius, startAngle, endAngle, color)</h2>
+<ul>
+<li><code>centerX</code> {number} 弧の中心点のX座標</li>
+<li><code>centerY</code> {number} 弧の中心点のY座標</li>
+<li><code>radius</code> {number} 弧の半径</li>
+<li><code>startAngle</code> {number} 弧の始点の角度</li>
+<li><code>endAngle</code> {number} 弧の終点の角度</li>
+<li><code>color</code> {number} 弧の色</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに弧を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を白で塗りつぶす */</span>
+  graphics.drawArc(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0</span>, <span class="hljs-number">180</span>, <span class="hljs-number">0x07E0</span>); <span class="hljs-comment">/* 緑の半円を描画 */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawcircle-centerx-centery-radius-color-fill-">graphics.drawCircle(centerX, centerY, radius, color, fill)</h2>
+<ul>
+<li><code>centerX</code> {number} 円の中心点のX座標</li>
+<li><code>centerY</code> {number} 円の中心点のY座標</li>
+<li><code>radius</code> {number} 円の半径</li>
+<li><code>color</code> {number} 円の色</li>
+<li><code>fill</code> {boolean} <code>true</code>:塗りつぶしあり, <code>false</code>:塗りつぶしなし</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに円を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を白で塗りつぶす */</span>
+  graphics.drawCircle(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0x001F</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 青の円を描画 */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawellipse-centerx-centery-radiusx-radiusy-color-fill-">graphics.drawEllipse(centerX, centerY, radiusX, radiusY, color, fill)</h2>
+<ul>
+<li><code>centerX</code> {number} 楕円の中心点のX座標</li>
+<li><code>centerY</code> {number} 楕円の中心点のY座標</li>
+<li><code>radiusX</code> {number} 楕円のX方向の半径</li>
+<li><code>radiusY</code> {number} 楕円のY方向の半径</li>
+<li><code>color</code> {number} 楕円の色</li>
+<li><code>fill</code> {boolean} <code>true</code>:塗りつぶしあり, <code>false</code>:塗りつぶしなし</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに楕円を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を白で塗りつぶす */</span>
+  graphics.drawEllipse(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">50</span>, <span class="hljs-number">0x0000</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 黒の楕円を描画 */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawpolygon-centerx-centery-radius-sides-color-fill-">graphics.drawPolygon(centerX, centerY, radius, sides, color, fill)</h2>
+<ul>
+<li><code>centerX</code> {number} 正多角形の中心点のX座標</li>
+<li><code>centerY</code> {number} 正多角形の中心点のY座標</li>
+<li><code>radius</code> {number} 正多角形の中心点と頂点の距離(外接円の半径)</li>
+<li><code>sides</code> {number} 正多角形の辺の数</li>
+<li><code>color</code> {number} 正多角形の色</li>
+<li><code>fill</code> {boolean} <code>true</code>:塗りつぶしあり, <code>false</code>:塗りつぶしなし</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに正多角形を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0x0000</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を黒で塗りつぶす */</span>
+  graphics.drawPolygon(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 白の三角形を描画 */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="graphics-drawtext-text-x-y-size-color-background-">graphics.drawText(text, x, y, size, color, background)</h2>
+<ul>
+<li><code>text</code> {string} 描画する文字列。Ascii文字のみ対応しています。</li>
+<li><code>x</code> {number} 文字列のX座標</li>
+<li><code>y</code> {number} 文字列のY座標</li>
+<li><code>size</code> {number} 文字列のフォントサイズ。描画される文字は、幅<code>size×6ピクセル</code>、高さ<code>size×8ピクセル</code>になります。</li>
+<li><code>color</code> {number} 文字列の色</li>
+<li><code>background</code> {number} 文字列の背景の色</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>フレームバッファに文字列を描画します。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Graphics = <span class="hljs-built_in">require</span>(<span class="hljs-string">'graphics'</span>).Graphics;
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> graphics = <span class="hljs-keyword">new</span> Graphics({<span class="hljs-attr">buf</span>:buf, <span class="hljs-attr">width</span>:<span class="hljs-number">480</span>, <span class="hljs-attr">height</span>:<span class="hljs-number">272</span>, <span class="hljs-attr">format</span>:<span class="hljs-string">'rgb565'</span>});
+  graphics.drawRect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">480</span>, <span class="hljs-number">272</span>, <span class="hljs-number">0xFFFF</span>, <span class="hljs-literal">true</span>); <span class="hljs-comment">/* 背景を白で塗りつぶす */</span>
+  graphics.drawText(<span class="hljs-string">'Hello World!'</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">2</span>, <span class="hljs-number">0x0000</span>, <span class="hljs-number">0xFFFF</span>);
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/index.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,871 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH IoT.jsモジュール API仕様</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-iot-js-api-">GR-PEACH IoT.js モジュールAPI仕様</h1>
+<p>これらは GR-PEACH 向け IoT.js 環境で使用可能なモジュール群です。</p>
+<p>IoT.js の既存のモジュールの API 仕様については、以下をご参照ください。<br><a href="https://github.com/pando-project/iotjs/blob/acae9c8b2d40e7598b8d39b630b79113ce880a7e/docs/api/IoT.js-API-reference.md">https://github.com/pando-project/iotjs/blob/acae9c8b2d40e7598b8d39b630b79113ce880a7e/docs/api/IoT.js-API-reference.md</a></p>
+<!--
+htmlファイルへ変換するときに、リンク先が .md から .html へ変換されてしまうので注意
+-->
+<h1 id="-">モジュール一覧と主な機能</h1>
+<ul>
+<li><a href="aligned_buffer.html">aligned_bufferモジュール</a> - アライメント指定可能なバッファ</li>
+<li><a href="display.html">displayモジュール</a> - LCDシールド基板に搭載された液晶の操作</li>
+<li><a href="fixup.html">fixupモジュール</a> - IoT.jsの既存のモジュールの修理</li>
+<li><a href="graphics.html">graphicsモジュール</a> - フレームバッファへのグラフィックスの描画</li>
+<li><a href="jpeg.html">jpegモジュール</a> - マイコン内蔵のJPEGコーデックを利用したJPEGのエンコード・デコード</li>
+<li><a href="nic.html">nicモジュール</a> - ネットワーク環境の制御</li>
+<li><a href="video.html">videoモジュール</a> - カメラシールド基板に搭載されたカメラからの画像の取得</li>
+</ul>
+<h1 id="-">対象プラットフォーム</h1>
+<ul>
+<li>ハードウェア<ul>
+<li>GR-PEACH (株式会社コア)<ul>
+<li><a href="https://www.core.co.jp/product/m2m/gr-peach/index.html">https://www.core.co.jp/product/m2m/gr-peach/index.html</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li>ソフトウェア<ul>
+<li>JerryScript<ul>
+<li><a href="https://github.com/pando-project/jerryscript">https://github.com/pando-project/jerryscript</a></li>
+</ul>
+</li>
+<li>IoT.js<ul>
+<li><a href="https://github.com/pando-project/iotjs">https://github.com/pando-project/iotjs</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<h1 id="-">対象シールド基板</h1>
+<ul>
+<li><p>GR-PEACH WIRELESS CAMERA Shield (株式会社コア)</p>
+<ul>
+<li><a href="https://www.core.co.jp/product/m2m/gr-peach/audio-camera.html">https://www.core.co.jp/product/m2m/gr-peach/audio-camera.html</a></li>
+</ul>
+</li>
+<li><p>GR-PEACH 4.3inch LCD Shield (株式会社コア)</p>
+<ul>
+<li><a href="http://www.core.co.jp/product/m2m/gr-peach/gr-lcd.html">http://www.core.co.jp/product/m2m/gr-peach/gr-lcd.html</a></li>
+</ul>
+</li>
+</ul>
+<h1 id="-">使用例</h1>
+<pre><code class="lang-javascript"><span class="hljs-comment">/* カメラで撮影したフレームをLCDに表示する例 */</span>
+<span class="hljs-comment">/* (エラー処理は割愛) */</span>
+<span class="hljs-keyword">var</span> video = <span class="hljs-built_in">require</span>(<span class="hljs-string">'video'</span>);
+<span class="hljs-keyword">var</span> display = <span class="hljs-built_in">require</span>(<span class="hljs-string">'display'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">var</span> width = <span class="hljs-number">480</span>;
+<span class="hljs-keyword">var</span> height = <span class="hljs-number">272</span>;
+<span class="hljs-keyword">var</span> format = <span class="hljs-string">'rgb565'</span>;
+<span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(width * height * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+<span class="hljs-keyword">var</span> layer = <span class="hljs-number">0</span>;
+
+<span class="hljs-keyword">var</span> lcd = display.openLCDSync({
+  <span class="hljs-attr">type</span>: <span class="hljs-string">'4.3inch'</span>
+});
+<span class="hljs-keyword">var</span> camera = video.openCMOSCameraSync({
+  <span class="hljs-attr">width</span>: width, <span class="hljs-attr">height</span>: height, <span class="hljs-attr">format</span>: format, <span class="hljs-attr">type</span>: <span class="hljs-string">'ov7725'</span>
+});
+
+camera.startSync(buf);
+lcd.startSync(layer, buf, format);
+</code></pre>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/jpeg.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,967 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH JPEGモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-jpeg-jpeg-">GR-PEACH JPEGモジュール (jpeg)</h1>
+<p><code>jpeg</code> モジュールは、GR-PEACHマイコンに搭載されたJPEGコーデックを用いてJPEG画像のエンコード・デコードを行います。</p>
+<h2 id="jpeg-encode-image-callback-">jpeg.encode(image, callback)</h2>
+<ul>
+<li><code>image</code> {Object} エンコードする画像<ul>
+<li><code>width</code> {number} 画像の幅(ピクセル数)。必須項目です。この値は偶数でなければなりません。</li>
+<li><code>height</code> {number} 画像の高さ(ピクセル数)。必須項目です。</li>
+<li><code>format</code> {string} 画像のピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>のみが指定可能です。必須項目です。</li>
+<li><code>bitmap</code> {AlignedBuffer} 画素データ。必須項目です。32バイトのアライメントである必要があります。</li>
+</ul>
+</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+<li><code>jpegData</code> {AlignedBuffer} JPEGデータを格納したバッファ。32バイトのアライメントです。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>ビットマップ画像をJPEG画像に変換します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * JPEG_Converter::encode
+-->
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> jpeg = <span class="hljs-built_in">require</span>(<span class="hljs-string">'jpeg'</span>);
+<span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">var</span> bitmap = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+<span class="hljs-comment">/* bitmap に画像データを格納する... */</span>
+<span class="hljs-keyword">var</span> image = {
+  <span class="hljs-attr">width</span>: <span class="hljs-number">480</span>,
+  <span class="hljs-attr">height</span>: <span class="hljs-number">272</span>,
+  <span class="hljs-attr">format</span>: <span class="hljs-string">'ycbcr422'</span>,
+  <span class="hljs-attr">bitmap</span>: bitmap
+};
+jpeg.encode(image, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, jpegData</span>) </span>{
+  <span class="hljs-keyword">if</span> (err) {
+    <span class="hljs-built_in">console</span>.log(err);
+    <span class="hljs-keyword">return</span>;
+  }
+  <span class="hljs-comment">/* ファイルに保存する */</span>
+  fs.writeFile(<span class="hljs-string">'/sd/output.jpg'</span>, jpegData.toBuffer(), <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) </span>{
+  });
+});
+</code></pre>
+<h2 id="jpeg-encodesync-image-">jpeg.encodeSync(image)</h2>
+<ul>
+<li><code>image</code> {Object} エンコードするビットマップ画像<ul>
+<li><code>jpeg.encode()</code>の説明を参照</li>
+</ul>
+</li>
+<li>戻り値: {AlignedBuffer} JPEGデータを格納したバッファ。32バイトのアライメントです。</li>
+</ul>
+<p><code>jpeg.encode()</code>の同期版です。処理は同期で行われ、処理が完了するとJPEGデータを格納したバッファを返却します。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> jpeg = <span class="hljs-built_in">require</span>(<span class="hljs-string">'jpeg'</span>);
+<span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+
+<span class="hljs-keyword">var</span> bitmap = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span> * <span class="hljs-number">272</span> * <span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+<span class="hljs-comment">/* bitmap に画像データを格納する... */</span>
+<span class="hljs-keyword">var</span> image = {
+  <span class="hljs-attr">width</span>: <span class="hljs-number">480</span>,
+  <span class="hljs-attr">height</span>: <span class="hljs-number">272</span>,
+  <span class="hljs-attr">format</span>: <span class="hljs-string">'ycbcr422'</span>,
+  <span class="hljs-attr">bitmap</span>: bitmap
+};
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> jpegData = jpeg.encodeSync(image);
+  <span class="hljs-comment">/* ファイルに保存する */</span>
+  fs.writeFileSync(<span class="hljs-string">'/sd/output.jpg'</span>, jpegData.toBuffer());
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h2 id="jpeg-decode-jpegdata-config-callback-">jpeg.decode(jpegData, config, callback)</h2>
+<ul>
+<li><code>jpegData</code> {AlignedBuffer} JPEGデータを格納したバッファ。32バイトのアライメントである必要があります。</li>
+<li><code>config</code> {Object} デコード設定。<ul>
+<li><code>width</code> {number} 出力するビットマップの幅(ピクセル数)。この値は偶数でなければなりません。</li>
+<li><code>height</code> {number} 出力するビットマップの高さ(ピクセル数)。</li>
+<li><code>format</code> {string} 出力するビットマップのピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>,<code>&quot;rgb565&quot;</code>,<code>&quot;argb8888&quot;</code>のいずれか。</li>
+<li><code>alpha</code> {number} ピクセルフォーマットが<code>&quot;argb8888&quot;</code>のときの透過度。<code>0</code>~<code>255</code>の値。(省略時: <code>255</code>)</li>
+</ul>
+</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+<li><code>image</code> {Object} デコードされたビットマップ画像<ul>
+<li><code>width</code> {number} 画像の幅(ピクセル数)。</li>
+<li><code>height</code> {number} 画像の高さ(ピクセル数)。</li>
+<li><code>format</code> {string} 画像のピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>,<code>&quot;rgb565&quot;</code>,<code>&quot;argb8888&quot;</code>のいずれか。</li>
+<li><code>bitmap</code> {AlignedBuffer} 画素データ。32バイトのアライメントです。</li>
+</ul>
+</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>JPEGデータをビットマップ画像に変換します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * JPEG_Converter::decode
+-->
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> jpeg = <span class="hljs-built_in">require</span>(<span class="hljs-string">'jpeg'</span>);
+<span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
+<span class="hljs-keyword">var</span> config = {
+  <span class="hljs-attr">width</span>: <span class="hljs-number">480</span>,
+  <span class="hljs-attr">height</span>: <span class="hljs-number">272</span>,
+  <span class="hljs-attr">format</span>: <span class="hljs-string">'argb8888'</span>,
+  <span class="hljs-attr">alpha</span>: <span class="hljs-number">0xFF</span>
+};
+fs.readFile(<span class="hljs-string">'/sd/input.jpg'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, jpegData</span>) </span>{
+  <span class="hljs-keyword">if</span> (err) {
+    <span class="hljs-comment">/* ファイル読み込み失敗... */</span>
+    <span class="hljs-built_in">console</span>.log(err);
+    <span class="hljs-keyword">return</span>;
+  }
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(jpegData, <span class="hljs-number">32</span>);
+  jpeg.decode(buf, config, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, image</span>) </span>{
+    <span class="hljs-keyword">if</span> (err) {
+      <span class="hljs-comment">/* デコード失敗... */</span>
+      <span class="hljs-built_in">console</span>.log(err);
+      <span class="hljs-keyword">return</span>;
+    }
+    <span class="hljs-comment">/* 成功... */</span>
+  });
+});
+</code></pre>
+<h2 id="jpeg-decodesync-jpegdata-config-">jpeg.decodeSync(jpegData, config)</h2>
+<ul>
+<li><code>jpegData</code> {AlignedBuffer} JPEGデータを格納したバッファ。32バイトのアライメントである必要があります。</li>
+<li><code>config</code> {Object} デコード設定。<ul>
+<li><code>width</code> {number} 出力するビットマップの幅(ピクセル数)。この値は偶数でなければなりません。</li>
+<li><code>height</code> {number} 出力するビットマップの高さ(ピクセル数)。</li>
+<li><code>format</code> {string} 出力するビットマップのピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>,<code>&quot;rgb565&quot;</code>,<code>&quot;argb8888&quot;</code>のいずれか。</li>
+<li><code>alpha</code> {number} ピクセルフォーマットが<code>&quot;argb8888&quot;</code>のときの透過度。<code>0</code>~<code>255</code>の値。(省略時: <code>255</code>)</li>
+</ul>
+</li>
+<li>戻り値: {Object} デコードされたビットマップ画像<ul>
+<li><code>width</code> {number} 画像の幅(ピクセル数)。</li>
+<li><code>height</code> {number} 画像の高さ(ピクセル数)。</li>
+<li><code>format</code> {string} 画像のピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>,<code>&quot;rgb565&quot;</code>,<code>&quot;argb8888&quot;</code>のいずれか。</li>
+<li><code>bitmap</code> {AlignedBuffer} 画素データ。32バイトのアライメントです。</li>
+</ul>
+</li>
+</ul>
+<p><code>jpeg.decode()</code>の同期版です。処理は同期で行われ、処理が完了するとビットマップ画像を格納したオブジェクトを返却します。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> jpeg = <span class="hljs-built_in">require</span>(<span class="hljs-string">'jpeg'</span>);
+<span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
+<span class="hljs-keyword">var</span> config = {
+  <span class="hljs-attr">width</span>: <span class="hljs-number">480</span>,
+  <span class="hljs-attr">height</span>: <span class="hljs-number">272</span>,
+  <span class="hljs-attr">format</span>: <span class="hljs-string">'argb8888'</span>,
+  <span class="hljs-attr">alpha</span>: <span class="hljs-number">0xFF</span>
+};
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> jpegData = fs.readFileSync(<span class="hljs-string">'/sd/input.jpg'</span>);
+  <span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(jpegData, <span class="hljs-number">32</span>);
+  <span class="hljs-keyword">var</span> image = jpeg.decodeSync(buf, config);
+  <span class="hljs-comment">/* 成功... */</span>
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/nic.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,962 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH nicモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-nic-nic-">GR-PEACH nicモジュール (nic)</h1>
+<p><code>nic</code> モジュールは、ネットワーク環境を制御するためのモジュールです。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> nic = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nic'</span>);
+<span class="hljs-keyword">var</span> nics = nic.enumerate();
+<span class="hljs-built_in">console</span>.log( <span class="hljs-built_in">Object</span>.keys( nics ).length + <span class="hljs-string">"個のNICが搭載されています"</span> );
+<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>;
+<span class="hljs-built_in">Object</span>.keys( nics ).forEach( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
+    <span class="hljs-built_in">console</span>.log( ++ index + <span class="hljs-string">"個目は:"</span> + key );
+});
+
+<span class="hljs-keyword">var</span> eth0 = nics[<span class="hljs-string">"ETHERNET"</span>];
+<span class="hljs-keyword">if</span>( eth0 ) {
+    eth0.ifup();        <span class="hljs-comment">// use DHCP</span>
+    eth0.ntpdate({ <span class="hljs-attr">server</span>:<span class="hljs-string">"ntp.nict.jp"</span> });
+    <span class="hljs-built_in">console</span>.log( <span class="hljs-built_in">JSON</span>.stringify( eth0.ifconfig() ) );
+    <span class="hljs-built_in">console</span>.log( <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toString() );
+}
+</code></pre>
+<h2 id="nic-enumerate-">nic.enumerate()</h2>
+<ul>
+<li>戻り値: {Array} Nicオブジェクトの一覧を格納した連想配列<ul>
+<li><code>ETHERNET</code> {Nic} Ethernet Interface に対応するNicクラスのインスタンス</li>
+</ul>
+</li>
+</ul>
+<p>ボードに搭載された NIC 一覧を取得します。(現在、Ethernet Interface のみに対応しています)</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> nic = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nic'</span>);
+
+<span class="hljs-comment">// ★★ 一覧取得</span>
+<span class="hljs-keyword">var</span> nics = nic.enumerate();
+
+<span class="hljs-comment">// 一覧表示</span>
+<span class="hljs-built_in">console</span>.log( <span class="hljs-built_in">Object</span>.keys( nics ).length + <span class="hljs-string">"個のNICが搭載されています"</span> );
+<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>;
+<span class="hljs-built_in">Object</span>.keys( nics ).forEach( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
+    <span class="hljs-built_in">console</span>.log( ++ index + <span class="hljs-string">"個目は:"</span> + key );
+});
+</code></pre>
+<h1 id="nic-">Nicクラス</h1>
+<p>NIC の制御や状態の取得を行うクラスです。</p>
+<h2 id="nic-ifup-param-">nic.ifup([param])</h2>
+<ul>
+<li><code>param</code> {Object} ネットワーク設定。すべての項目を省略する場合、この引数自体を省略可能です。<ul>
+<li><code>ip</code> {string} IPアドレス(省略時、DHCP使用)</li>
+<li><code>netmask</code> {string} ネットマスク(省略時、DHCP使用)</li>
+<li><code>gateway</code> {string} ゲートウェイ(省略時、DHCP使用)</li>
+<li><code>dns</code> {string} DNSサーバ(省略可能)</li>
+</ul>
+</li>
+<li>戻り値: {boolean} <code>true</code>:接続成功、<code>false</code>:接続失敗</li>
+</ul>
+<p>ネットワークへ接続します。
+<code>param</code>を指定しない場合、および<code>ip</code>, <code>netmask</code>, <code>gateway</code>のどれか一つでも省略されている場合はDHCPを使用します。
+<code>ip</code>, <code>netmask</code>, <code>gateway</code>が全て指定されている場合は静的IPアドレスを使用します。
+<code>dns</code>はDHCP・静的IPアドレスのどちらを使用する場合でも省略可能です。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> nic = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nic'</span>);
+<span class="hljs-keyword">var</span> nics = nic.enumerate();
+<span class="hljs-keyword">var</span> eth0 = nics[<span class="hljs-string">"ETHERNET"</span>];
+<span class="hljs-keyword">if</span>( !eth0 ) {
+    <span class="hljs-keyword">return</span>;
+}
+
+<span class="hljs-comment">// ★★ ネットワークへ接続 (DHCP)</span>
+eth0.ifup();
+eth0.ifdown();
+
+<span class="hljs-comment">// ★★ ネットワークへ接続 (静的IPアドレス指定)</span>
+eth0.ifup({
+    <span class="hljs-attr">ip</span>: <span class="hljs-string">"192.168.123.100"</span>,
+    <span class="hljs-attr">netmask</span>: <span class="hljs-string">"255.255.255.0"</span>,
+    <span class="hljs-attr">gateway</span>: <span class="hljs-string">"192.168.123.1"</span>,
+    <span class="hljs-attr">dns</span>: <span class="hljs-string">"8.8.8.8"</span>
+});
+eth0.ifdown();
+</code></pre>
+<h2 id="nic-ifdown-">nic.ifdown()</h2>
+<ul>
+<li>戻り値: {boolean} <code>true</code>:切断成功、<code>false</code>:切断失敗</li>
+</ul>
+<p>ネットワークから切断します。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> nic = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nic'</span>);
+<span class="hljs-keyword">var</span> nics = nic.enumerate();
+<span class="hljs-keyword">var</span> eth0 = nics[<span class="hljs-string">"ETHERNET"</span>];
+<span class="hljs-keyword">if</span>( !eth0 ) {
+    <span class="hljs-keyword">return</span>;
+}
+eth0.ifup();
+
+<span class="hljs-comment">// ★★ ネットワークから切断</span>
+eth0.ifdown();
+</code></pre>
+<h2 id="nic-ifconfig-">nic.ifconfig()</h2>
+<ul>
+<li>戻り値: {Object} NIC の状態を格納したオブジェクト<ul>
+<li><code>NIC</code> {string} NIC の種類</li>
+<li><code>HWaddr</code> {string}} MACアドレス</li>
+<li><code>inet</code> {string} inetアドレス</li>
+<li><code>netmask</code> {string} ネットマスク</li>
+<li><code>gateway</code> {string} ゲートウェイ</li>
+</ul>
+</li>
+</ul>
+<p>NICの状態を取得します。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> nic = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nic'</span>);
+<span class="hljs-keyword">var</span> nics = nic.enumerate();
+<span class="hljs-keyword">var</span> eth0 = nics[<span class="hljs-string">"ETHERNET"</span>];
+<span class="hljs-keyword">if</span>( !eth0 ) {
+    <span class="hljs-keyword">return</span>;
+}
+eth0.ifup();
+
+<span class="hljs-comment">// ★★ NIC の状態を取得 (接続時)</span>
+<span class="hljs-keyword">var</span> conf = eth0.ifconfig();
+<span class="hljs-built_in">console</span>.log( <span class="hljs-built_in">JSON</span>.stringify( conf ) );
+
+eth0.ifdown();
+
+<span class="hljs-comment">// ★★ NIC の状態を取得 (切断時)</span>
+conf = eth0.ifconfig();
+<span class="hljs-built_in">console</span>.log( <span class="hljs-built_in">JSON</span>.stringify( conf ) );
+</code></pre>
+<h2 id="nic-ntpdate-param-">nic.ntpdate([param])</h2>
+<ul>
+<li><code>param</code> {Object} 時刻同期設定。すべての項目を省略する場合、この引数自体を省略可能です。<ul>
+<li><code>server</code> {string} NTPサーバ(省略時:<code>&quot;0.pool.ntp.org&quot;</code>)</li>
+<li><code>port</code> {number} ポート番号(省略時:<code>123</code>)</li>
+<li><code>timeout</code> {number} タイムアウト時間(単位:ミリ秒)(省略時:<code>10 * 1000</code>)</li>
+</ul>
+</li>
+<li>戻り値: {boolean} <code>true</code>:時刻同期成功、<code>false</code>:時刻同期失敗</li>
+</ul>
+<p>インターネット時刻と同期します。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> nic = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nic'</span>);
+<span class="hljs-keyword">var</span> nics = nic.enumerate();
+<span class="hljs-keyword">var</span> eth0 = nics[<span class="hljs-string">"ETHERNET"</span>];
+<span class="hljs-keyword">if</span>( !eth0 ) {
+    <span class="hljs-keyword">return</span>;
+}
+eth0.ifup();
+
+<span class="hljs-comment">// ★★ インターネット時刻と同期(デフォルトサーバ "0.pool.ntp.org" 使用)</span>
+<span class="hljs-keyword">if</span>( eth0.ntpdate() ) {
+    <span class="hljs-built_in">console</span>.log( <span class="hljs-string">'時刻同期成功'</span>, <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toString() );
+}
+<span class="hljs-keyword">else</span> {
+    <span class="hljs-built_in">console</span>.log( <span class="hljs-string">'時刻同期失敗'</span> );
+}
+
+<span class="hljs-comment">// ★★ インターネット時刻と同期(サーバ指定)</span>
+<span class="hljs-keyword">if</span>( eth0.ntpdate({ <span class="hljs-attr">server</span>:<span class="hljs-string">"ntp.nict.jp"</span> }) ) {
+    <span class="hljs-built_in">console</span>.log( <span class="hljs-string">'時刻同期成功'</span>, <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toString() );
+}
+<span class="hljs-keyword">else</span> {
+    <span class="hljs-built_in">console</span>.log( <span class="hljs-string">'時刻同期失敗'</span> );
+}
+
+eth0.ifdown();
+</code></pre>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/api/video.html	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,999 @@
+<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description"><meta name="keywords"><meta name="robots"><title>GR-PEACH ビデオモジュール</title><style>@font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');
+}
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  line-height: 1.5;
+  color: #24292e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+
+.markdown-body .pl-c {
+  color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: #6f42c1;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: #24292e;
+}
+
+.markdown-body .pl-ent {
+  color: #22863a;
+}
+
+.markdown-body .pl-k {
+  color: #d73a49;
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: #032f62;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: #e36209;
+}
+
+.markdown-body .pl-bu {
+  color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+  color: #fafbfc;
+  background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+  color: #fafbfc;
+  background-color: #d73a49;
+}
+
+.markdown-body .pl-c2::before {
+  content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: #22863a;
+}
+
+.markdown-body .pl-ml {
+  color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: #24292e;
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: #24292e;
+}
+
+.markdown-body .pl-md {
+  color: #b31d28;
+  background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+  color: #22863a;
+  background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+  color: #e36209;
+  background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+  color: #f6f8fa;
+  background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+  color: #586069;
+}
+
+.markdown-body .pl-sg {
+  color: #959da5;
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: #032f62;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  vertical-align: text-top;
+  fill: currentColor;
+}
+
+.markdown-body a {
+  background-color: transparent;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+  outline-width: 0;
+}
+
+.markdown-body strong {
+  font-weight: inherit;
+}
+
+.markdown-body strong {
+  font-weight: bolder;
+}
+
+.markdown-body h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+.markdown-body img {
+  border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+}
+
+.markdown-body input {
+  overflow: visible;
+}
+
+.markdown-body [type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+.markdown-body * {
+  box-sizing: border-box;
+}
+
+.markdown-body input {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body a {
+  color: #0366d6;
+  text-decoration: none;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body strong {
+  font-weight: 600;
+}
+
+.markdown-body hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body h1 {
+  font-size: 32px;
+  font-weight: 600;
+}
+
+.markdown-body h2 {
+  font-size: 24px;
+  font-weight: 600;
+}
+
+.markdown-body h3 {
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.markdown-body h4 {
+  font-size: 16px;
+  font-weight: 600;
+}
+
+.markdown-body h5 {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.markdown-body h6 {
+  font-size: 12px;
+  font-weight: 600;
+}
+
+.markdown-body p {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body code {
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+.markdown-body .octicon {
+  vertical-align: text-bottom;
+}
+
+.markdown-body .pl-0 {
+  padding-left: 0 !important;
+}
+
+.markdown-body .pl-1 {
+  padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+  padding-left: 8px !important;
+}
+
+.markdown-body .pl-3 {
+  padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+  padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+  padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+  padding-left: 40px !important;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+.markdown-body hr {
+  height: 0.25em;
+  padding: 0;
+  margin: 24px 0;
+  background-color: #e1e4e8;
+  border: 0;
+}
+
+.markdown-body blockquote {
+  padding: 0 1em;
+  color: #6a737d;
+  border-left: 0.25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #c6cbd1;
+  border-bottom-color: #959da5;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #959da5;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  margin-top: 24px;
+  margin-bottom: 16px;
+  font-weight: 600;
+  line-height: 1.25;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: #1b1f23;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 {
+  padding-bottom: 0.3em;
+  font-size: 2em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.5em;
+  border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h3 {
+  font-size: 1.25em;
+}
+
+.markdown-body h4 {
+  font-size: 1em;
+}
+
+.markdown-body h5 {
+  font-size: 0.875em;
+}
+
+.markdown-body h6 {
+  font-size: 0.85em;
+  color: #6a737d;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li {
+  word-wrap: break-all;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: 600;
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+}
+
+.markdown-body table th {
+  font-weight: 600;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+  border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+  background-color: #fff;
+  border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+  background-color: #f6f8fa;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+  padding-right: 20px;
+}
+
+.markdown-body code {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(27,31,35,0.05);
+  border-radius: 3px;
+}
+
+.markdown-body pre {
+  word-wrap: normal;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f6f8fa;
+  border-radius: 3px;
+}
+
+.markdown-body pre code {
+  display: inline;
+  max-width: auto;
+  padding: 0;
+  margin: 0;
+  overflow: visible;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+  color: #005cc5;
+  border-color: #005cc5;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #444d56;
+  vertical-align: middle;
+  background-color: #fafbfc;
+  border: solid 1px #d1d5da;
+  border-bottom-color: #c6cbd1;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #c6cbd1;
+}
+
+.markdown-body :checked+.radio-label {
+  position: relative;
+  z-index: 1;
+  border-color: #0366d6;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+  margin: 0 0.2em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+.markdown-body hr {
+  border-bottom-color: #eee;
+}
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #000;
+  color: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #e28964;
+}
+
+.hljs-string {
+  color: #65b042;
+}
+
+.hljs-subst {
+  color: #daefa3;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #e9c062;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-tag,
+.hljs-name {
+  color: #89bdff;
+}
+
+.hljs-class .hljs-title,
+.hljs-doctag {
+  text-decoration: underline;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #3387cc;
+}
+
+.hljs-params,
+.hljs-variable,
+.hljs-template-variable {
+  color: #3e87e3;
+}
+
+.hljs-attribute {
+  color: #cda869;
+}
+
+.hljs-meta {
+  color: #8996a8;
+}
+
+.hljs-formula {
+  background-color: #0e2231;
+  color: #f8f8f8;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #253b22;
+  color: #f8f8f8;
+}
+
+.hljs-deletion {
+  background-color: #420e09;
+  color: #f8f8f8;
+}
+
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-selector-id {
+  color: #8b98ab;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+</style></head><body class="markdown-body"><h1 id="gr-peach-video-">GR-PEACH ビデオモジュール (video)</h1>
+<p><code>video</code> モジュールは、WIRELESS CAMERA Shieldに接続されたカメラの制御や映像信号の取り込みを行います。</p>
+<ul>
+<li>対応するカメラは以下の通りです。<ul>
+<li><code>&quot;ov7725&quot;</code> - <a href="https://www.core.co.jp/product/m2m/gr-peach/audio-camera.html">GR-PEACH Wireless CAMERA Shield</a></li>
+</ul>
+</li>
+</ul>
+<p>画像の取り込みは、マイコンに搭載されたハードウェアリソース(VDC5)を用いてプログラムとは非同期に実行されます。  </p>
+<h2 id="video-opencmoscamera-config-callback-">video.openCMOSCamera(config, callback)</h2>
+<ul>
+<li><code>config</code> {Object} カメラの設定<ul>
+<li><code>width</code> {number} 画像の横幅(ピクセル数)。必須項目です。</li>
+<li><code>height</code> {number} 画像の高さ(ピクセル数)。必須項目です。</li>
+<li><code>format</code> {string} 希望するピクセルフォーマット。<code>&quot;ycbcr422&quot;</code>, <code>&quot;rgb565&quot;</code>, <code>&quot;rgb888&quot;</code>のいずれかが指定できます。必須項目です。</li>
+<li><code>type</code> {string} CMOSカメラの種類を示す文字列。<code>&quot;ov7725&quot;</code>のみ指定できます。(省略時: <code>&quot;ov7725&quot;</code>)</li>
+</ul>
+</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+<li><code>videoSource</code> {Object} <code>VideoSource</code>クラスのインスタンス (成功のとき)</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>CMOSカメラに接続します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Graphics_Video_init
+  * Display.Graphics_Dvinput_Port_Init
+  * Display.Graphics_Irq_Handler_Set (★graphicsとハンドラを共用する)
+  * Display.Video_Write_Setting
+-->
+<blockquote>
+<p><strong>注意</strong>: ハードウェアリソースを排他で使用するため、複数の<code>VideoSource</code>インスタンスを同時に使用することはできません。別のカメラを接続する場合は、先に生成されたインスタンスに対して<code>close()</code>を実行してください。</p>
+</blockquote>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> video = <span class="hljs-built_in">require</span>(<span class="hljs-string">'video'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span>*<span class="hljs-number">272</span>*<span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+
+video.openCMOSCamera({
+  <span class="hljs-attr">width</span>: <span class="hljs-number">480</span>, <span class="hljs-attr">height</span>: <span class="hljs-number">272</span>, <span class="hljs-attr">format</span>: <span class="hljs-string">'rgb565'</span>, <span class="hljs-attr">type</span>: <span class="hljs-string">'ov7725'</span>
+}, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, videoSource</span>) </span>{
+  <span class="hljs-keyword">if</span> (err) {
+    <span class="hljs-comment">/* video.openCMOSCamera 失敗... */</span>
+    <span class="hljs-built_in">console</span>.log(err);
+    <span class="hljs-keyword">return</span>;
+  }
+  <span class="hljs-comment">/* video.openCMOSCamera 成功... */</span>
+
+  videoSource.start(buf, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) </span>{
+    <span class="hljs-keyword">if</span> (err) {
+      <span class="hljs-comment">/* videoSource.start 失敗... */</span>
+      <span class="hljs-built_in">console</span>.log(err);
+      <span class="hljs-keyword">return</span>;
+    }
+    <span class="hljs-comment">/* videoSource.start 成功... */</span>
+
+    videoSource.stop(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) </span>{
+      <span class="hljs-keyword">if</span> (err) {
+        <span class="hljs-comment">/* videoSource.stop 失敗... */</span>
+        <span class="hljs-built_in">console</span>.log(err);
+        <span class="hljs-keyword">return</span>;
+      }
+      <span class="hljs-comment">/* videoSource.stop 成功... */</span>
+
+      videoSource.close(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">err</span>) </span>{
+        <span class="hljs-keyword">if</span> (err) {
+          <span class="hljs-comment">/* videoSource.close 失敗... */</span>
+          <span class="hljs-built_in">console</span>.log(err);
+          <span class="hljs-keyword">return</span>;
+        }
+        <span class="hljs-comment">/* videoSource.close 成功... */</span>
+
+      });
+    });
+  });
+});
+</code></pre>
+<h2 id="video-opencmoscamerasync-config-">video.openCMOSCameraSync(config)</h2>
+<ul>
+<li><code>config</code> {Object} カメラの設定<ul>
+<li><code>video.openCMOSCamera()</code>の説明を参照</li>
+</ul>
+</li>
+<li>戻り値: {Object} <code>VideoSource</code>クラスのインスタンス</li>
+</ul>
+<p><code>video.openCMOSCamera()</code>の同期版です。処理は同期で行われ、処理が完了すると<code>VideoSource</code>クラスのインスタンスを返却します。失敗すると例外をスローします。</p>
+<h4 id="-">使用例</h4>
+<pre><code class="lang-javascript"><span class="hljs-keyword">var</span> video = <span class="hljs-built_in">require</span>(<span class="hljs-string">'video'</span>);
+<span class="hljs-keyword">var</span> AlignedBuffer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aligned_buffer'</span>).AlignedBuffer;
+<span class="hljs-keyword">var</span> buf = <span class="hljs-keyword">new</span> AlignedBuffer(<span class="hljs-number">480</span>*<span class="hljs-number">272</span>*<span class="hljs-number">2</span>, <span class="hljs-number">32</span>);
+
+<span class="hljs-keyword">try</span> {
+  <span class="hljs-keyword">var</span> videoSource = video.openCMOSCameraSync({
+    <span class="hljs-attr">width</span>: <span class="hljs-number">480</span>, <span class="hljs-attr">height</span>: <span class="hljs-number">272</span>, <span class="hljs-attr">format</span>: <span class="hljs-string">'rgb565'</span>, <span class="hljs-attr">type</span>: <span class="hljs-string">'ov7725'</span>
+  });
+  <span class="hljs-comment">/* video.openCMOSCameraSync 成功... */</span>
+
+  videoSource.startSync(buf);
+  <span class="hljs-comment">/* videoSource.startSync 成功... */</span>
+
+  videoSource.stopSync();
+  <span class="hljs-comment">/* videoSource.stopSync 成功... */</span>
+
+  videoSource.closeSync();
+  <span class="hljs-comment">/* videoSource.closeSync 成功... */</span>
+
+} <span class="hljs-keyword">catch</span> (err) {
+  <span class="hljs-comment">/* 失敗... */</span>
+  <span class="hljs-built_in">console</span>.log(err);
+}
+</code></pre>
+<h1 id="videosource-">VideoSourceクラス</h1>
+<p>カメラの制御や映像ソースの取り込みを行うクラスです。</p>
+<h2 id="videosource-width">videoSource.width</h2>
+<ul>
+<li>{number}</li>
+<li>画像の幅をピクセル数で示す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="videosource-height">videoSource.height</h2>
+<ul>
+<li>{number}</li>
+<li>画像の高さをピクセル数で示す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="videosource-pixelformat">videoSource.pixelFormat</h2>
+<ul>
+<li>{string}</li>
+<li>ピクセルフォーマットを示す、読み取り専用プロパティです。<code>&quot;ycbcr422&quot;</code>, <code>&quot;rgb565&quot;</code>, <code>&quot;rgb888&quot;</code>のいずれかです。</li>
+</ul>
+<h2 id="videosource-pixelbytes">videoSource.pixelBytes</h2>
+<ul>
+<li>{number}</li>
+<li>1ピクセル当たりのバイト数を示す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="videosource-type">videoSource.type</h2>
+<ul>
+<li>{string}</li>
+<li>CMOSカメラの種類を示す文字列を返す、読み取り専用プロパティです。</li>
+</ul>
+<h2 id="videosource-start-buf-callback-">videoSource.start(buf, callback)</h2>
+<ul>
+<li><code>buf</code> {AlignedBuffer} カメラ入力を取り込むバッファ。32バイトのアライメントである必要があります。</li>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>カメラの撮影/信号の取り込みを開始します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Video_Start
+  * Display.Video_Stop
+-->
+<h2 id="videosource-startsync-buf-">videoSource.startSync(buf)</h2>
+<ul>
+<li><code>buf</code> {AlignedBuffer} カメラ入力を取り込むバッファ。32バイトのアライメントである必要があります。</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>videoSource.start()</code>の同期版です。処理は非同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h2 id="videosource-stop-callback-">videoSource.stop(callback)</h2>
+<ul>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>カメラの撮影/信号の取り込みを停止します。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<!--
+* C++ライブラリ側API
+  * Display.Video_Stop
+-->
+<h2 id="videosource-stopsync-">videoSource.stopSync()</h2>
+<ul>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>videoSource.stop()</code>の同期版です。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+<h2 id="videosource-close-callback-">videoSource.close(callback)</h2>
+<ul>
+<li><code>callback</code> {Function} コールバック関数<ul>
+<li><code>err</code> {Error|null} エラーオブジェクト(失敗のとき) または <code>null</code>(成功のとき)。</li>
+</ul>
+</li>
+<li>戻り値: {undefined}</li>
+</ul>
+<p>カメラの制御/信号取り込みに関するハードウェアリソースを解放します。<code>videoSource.start()</code>によりカメラの撮影/信号の取り込みが開始されている場合、この関数の内部で自動的に<code>videoSource.stop()</code>が呼び出されて停止されます。処理は非同期で行われ、処理が完了または失敗すると、コールバック関数が呼び出されます。</p>
+<blockquote>
+<p><strong>注意</strong>: この関数を呼んだ後には、この<code>VideoSource</code>インスタンスに対していかなる操作も行えません。このとき各プロパティの返す値は未定義であり、各関数の呼び出しを行うとエラーが発生します。</p>
+</blockquote>
+<!--
+* C++ライブラリ側API
+  * 使用しない
+-->
+<h2 id="videosource-closesync-">videoSource.closeSync()</h2>
+<ul>
+<li>戻り値: {undefined}</li>
+</ul>
+<p><code>videoSource.close()</code>の同期版です。処理は同期で行われ、処理が完了すると呼び出し元に戻ります。失敗すると例外をスローします。</p>
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/ƒlƒbƒgƒ[ƒNŠÂ‹«‚̐§Œä‚ɂ‚¢‚Ä.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,35 @@
+==================================
+  ƒlƒbƒgƒ[ƒNŠÂ‹«‚̐§Œä‚ɂ‚¢‚Ä
+==================================
+
+javascript ‚©‚çƒlƒbƒgƒ[ƒNŠÂ‹«‚𐧌䂷‚é•û–@‚ɂ‚¢‚Ä‹Lq‚µ‚Ü‚·B
+
+¡ nic ƒ‚ƒWƒ…[ƒ‹
+
+  nodejs ‚â iotjs ‚Å‚Í•W€ŽÀ‘•‚³‚ê‚Ä‚¢‚È‚¢Aƒlƒbƒgƒ[ƒNŠÂ‹«‚𐧌䂷‚邽‚ß‚Ì
+nic ƒ‚ƒWƒ…[ƒ‹‚ð•W€ŽÀ‘•‚µ‚Ä‚¢‚Ü‚·B
+
+
+¡ nic ƒ‚ƒWƒ…[ƒ‹‚Ì‹@”\
+
+  nic ƒ‚ƒWƒ…[ƒ‹‚ɂ͉º‹L‚Ì‹@”\‚ª‚ ‚è‚Ü‚·B
+
+  Eenumerate   - ƒ{[ƒh‚É“‹Ú‚³‚ꂽ NIC ˆê——‚ðŽæ“¾‚µ‚Ü‚·B
+  Eifup        - IPAmaskAgatewayA(dns)‚ðŽw’肵‚ălƒbƒgƒ[ƒN‚֐ڑ±‚µ‚Ü‚·B
+  Eifdown      - ƒlƒbƒgƒ[ƒN‚©‚çØ’f‚µ‚Ü‚·B
+  Eifconfig    - ó‘Ô‚ðŽæ“¾‚µ‚Ü‚·B
+  Entpdate     - ƒCƒ“ƒ^[ƒlƒbƒgŽž‚Æ“¯Šú‚µ‚Ü‚·B
+
+  “Á‚ÉŽw’肪‚È‚¢ê‡‚Í javascript ‚̐擪‚ÉŽŸ‚̃R[ƒh‚ðŠÜ‚ß‚Ä‚¨‚­‚±‚Æ‚ð
+‚¨Š©‚ß‚µ‚Ü‚·B
+
+    var nic = require('nic');
+    var eth = nic.enumerate().ETHERNET;
+    if( eth ) {
+        eth.ifup();                             // DHCP
+        eth.ntpdate({ server: "ntp.nict.jp" }); // Žž“¯Šú
+    }
+
+  nic ƒ‚ƒWƒ…[ƒ‹‚̏ڍׂɂ‚¢‚ẮAudoc/api/nic.htmlv‚ð‚²——‚­‚¾‚³‚¢B
+
+                                                                        ˆÈã
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/ƒrƒ‹ƒh•û–@.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,138 @@
+==============
+  ƒrƒ‹ƒh•û–@
+==============
+
+¡XV—š—ð
+
+  2018”N08ŒŽ27“ú iš1j‰ÓŠ‚̎菇‚ðXV
+  2018”N12ŒŽ20“ú iš2j‰ÓŠ‚̎菇‚ðXV
+                  •s—v‚Ȏ菇‚̍폜E®—
+  2019”N02ŒŽ01“ú  iotjs‚̎擾Œ³‚ð•ÏXi“à—e‚͕ύX‚È‚µj
+                 iš3j‰ÓŠ‚̎菇‚ðXV
+
+¡ƒrƒ‹ƒhŠÂ‹«\’z
+
+  “®ìŠm”FŠÂ‹«
+    OS : Ubuntu 16.04
+
+  1) ƒpƒbƒP[ƒWƒŠƒXƒg‚̍XV
+        sudo apt update
+
+  2) ƒCƒ“ƒXƒg[ƒ‹Ï‚݃pƒbƒP[ƒW‚̍XV
+        sudo apt upgrade
+
+  3) ƒpƒbƒP[ƒW‚̒ljÁ
+        sudo apt install [package]
+
+          ypackagez       : yversionz
+          build-essential   : 12.1ubuntu2
+          gyp               : 0.1+20150913git1f374df9-1ubuntu1
+          mercurial         : 3.7.3-1ubuntu1
+          cmake             : 3.5.1-1ubuntu3
+          git               : 1:2.7.4-0ubuntu1.4
+          python2.7         : 2.7.12-1ubuntu0~16.04.3
+          valgrind          : 1:3.11.0-1ubuntu4.2
+          python-pip        : 8.1.1-2ubuntu0.4
+
+  4) Mbed CLI ‚̃Cƒ“ƒXƒg[ƒ‹
+        sudo -H pip install mbed-cli
+
+  5) gcc-arm-none-eabi ‚̃Cƒ“ƒXƒg[ƒ‹iš2j
+    ˆÈ‰º‚ÌURL‚©‚ç gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 ‚ð
+    ƒ_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
+        https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
+
+    ƒ_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚ð”CˆÓ‚̃fƒBƒŒƒNƒgƒŠ‚ɉ𓀂µ‚Ü‚·B
+        tar xjf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2
+
+    ƒpƒX‚̐ݒè‚ðs‚¢‚Ü‚·B
+      # ŠÂ‹«•Ï”‚ðŽg—p‚·‚éê‡
+        export GCC_ARM_ROOT=ƒ‰ð“€æ‚̃pƒX/gcc-arm-none-eabi-6-2017-q2-update/bin„
+        export PATH=$GCC_ARM_ROOT:$PATH
+
+      # Mbed CLI ‚ÅŽw’è‚·‚éê‡
+        mbed config -G GCC_ARM_PATH $GCC_ARM_ROOT
+
+
+¡ƒrƒ‹ƒh•û–@‚ɂ‚¢‚Ä
+
+  ‰º‹L‚̃Rƒ}ƒ“ƒh‚ÅŠJ”­ŠÂ‹«‚̍\’zEƒrƒ‹ƒh‚ðs‚¢‚Ü‚·B
+
+    # ì‹ÆƒfƒBƒŒƒNƒgƒŠì¬
+        export WORK=${HOME}/work
+        mkdir -p ${WORK}
+        cd ${WORK}
+
+    # iotjsŽæ“¾
+        git clone https://github.com/pando-project/iotjs
+        cd iotjs
+        git checkout -b posix acae9c8b2d40e7598b8d39b630b79113ce880a7e
+
+    # mbed-osŽæ“¾
+        mkdir -p ${WORK}/iotjs/src/platform/mbedos5
+        cd ${WORK}/iotjs/src/platform/mbedos5
+
+        git clone -b mbed-os-5.9 https://github.com/ARMmbed/mbed-os.git
+        cd mbed-os
+        git checkout -b posix 50bd61a4a72332baa6b1bac6caccb44dc5423309
+
+    # sd-driverŽæ“¾
+        cd ${WORK}/iotjs/src/platform/mbedos5
+        git clone https://github.com/ARMmbed/sd-driver.git
+        cd sd-driver
+        git checkout -b posix c8ae38fb291e086232566b0f1372cfb69c277e84
+
+    # mbed-gr-libsŽæ“¾iš1j
+        cd ${WORK}/iotjs/src/platform/mbedos5
+        git clone https://github.com/d-kato/mbed-gr-libs
+        cd mbed-gr-libs
+        git checkout -b posix d921d611d596ecaebaab49070ef82450c583309c
+
+    # AsciiFontŽæ“¾iš3j
+        cd ${WORK}/iotjs/src/platform/mbedos5
+        mbed add https://os.mbed.com/teams/Renesas/code/AsciiFont/
+
+    # iotjsƒrƒ‹ƒh
+        cd ${WORK}/iotjs
+        ./tools/build.py --no-snapshot
+
+    # ƒ\[ƒXƒR[ƒh‚ð”z’uiš3j
+        # Šù‘¶‚̊‹«‚ɏ㏑‚«‚·‚éê‡‚́AˆÈ‰º‚̃tƒ@ƒCƒ‹íœ‚ðŽÀs‚µ‚Ä‚­‚¾‚³‚¢B
+            rm -rf ${WORK}/iotjs/deps/posix
+            rm -rf ${WORK}/iotjs/src/ext-modules
+            rm ${WORK}/iotjs/src/platform/mbedos5/iotjs_def.h
+
+        # [CDROM]‚Ì src/iotjs/* ‚ð iotjs/ ‚ɏ㏑‚«ƒRƒs[
+            cp -pr [CDROM]/src/iotjs/* ${WORK}/iotjs/
+
+    # lwipƒpƒbƒ`“K—p
+        cd ${WORK}/iotjs/src/platform/mbedos5/mbed-os
+        git apply lwip_improve.patch
+
+    # Mbed TLS ‚Å Wireless Camera Shield ‚É“‹Ú‚³‚ê‚Ä‚¢‚é ESP32 ‚̐^«—””­¶Ší
+    # ‚ðŽg—p‚·‚éê‡‚͈ȉº‚̎菇‚ðŽÀs‚µ‚Ä‚­‚¾‚³‚¢Biš2j
+        cd ${WORK}/iotjs/src/platform/mbedos5/mbed-os
+        git apply trng_support.patch
+
+    ##yƒm[ƒgz
+    ## Wireless Camera Shield ‚ðÚ‘±‚¹‚¸‚É IoT.js ‚𓮍삳‚¹‚½‚¢ê‡‚âA
+    ## ESP32 ƒpƒbƒ`‚ð“K—p‚µ‚È‚¢ê‡‚́A‰º‹L‚Q‰ÓŠ‚̕ύX‚ðs‚Á‚čărƒ‹ƒh‚µ‚Ä‚­‚¾‚³‚¢B
+        ƒtƒ@ƒCƒ‹ƒpƒXFiotjs / src / platform / mbedos5 / Makefile
+        35s–Ú:
+          •ÏX‘Oj    --cmake-param=-DENABLE_MODULE_VIDEO=ON                  \
+          •ÏXŒãj    --cmake-param=-DENABLE_MODULE_VIDEO=OFF                 \
+        ƒtƒ@ƒCƒ‹ƒpƒXFiotjs / src / platform / mbedos5 / mbed_app.json
+        107s–Ú:
+          •ÏX‘Oj    "ENABLE_MODULE_VIDEO=1",
+          •ÏXŒãj    "ENABLE_MODULE_VIDEO=0",
+
+    # mbedŠÂ‹«Œü‚¯ƒrƒ‹ƒh
+        cd ${WORK}/iotjs/src/platform/mbedos5
+        make clean; make DEBUG=0
+          ¦debugƒrƒ‹ƒh‚·‚éê‡‚Í DEBUG=1 ‚Æ‚µ‚Ä‚­‚¾‚³‚¢
+
+    # GR-PEACH ‚ɏ‘‚«ž‚ÞƒoƒCƒiƒŠƒtƒ@ƒCƒ‹‚ªˆÈ‰º‚ɐ¶¬‚³‚ê‚Ü‚·
+        ls -l ${WORK}/iotjs/src/platform/mbedos5/BUILD/RZ_A1H/GCC_ARM/iotjs.bin
+
+
+                                                                        ˆÈã
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/ƒ‚ƒWƒ…[ƒ‹‘Ήžó‹µ.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,28 @@
+======================
+  ƒ‚ƒWƒ…[ƒ‹‘Ήžó‹µ
+======================
+
+1) ‘Ήžƒ‚ƒWƒ…[ƒ‹‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~
+  IoT.js ‚̃‚ƒWƒ…[ƒ‹inodejs‚̃‚ƒWƒ…[ƒ‹‚É‘Š“–j‚Ì‚¤‚¿
+  ‰º‹Lƒ‚ƒWƒ…[ƒ‹‚ɂ‚¢‚Ä“®ìŠm”F‚ðŠ®—¹‚µ‚Ä‚¢‚Ü‚·B
+
+      assert, buffer, console, dgram, dns, events, fs, 
+      http, https, module, net, stream, timers, tls, process
+
+  ã‹LˆÈŠO‚̗Ⴆ‚Î BLE ‚Ȃǂ̃‚ƒWƒ…[ƒ‹‚ɂ͑Ήž‚µ‚Ä‚¢‚Ü‚¹‚ñB
+
+2) API Reference ‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~
+  Œ»ÝŽg—p’†‚Ì IoT.js ‚̃o[ƒWƒ‡ƒ“‚͈ȉº‚É‚È‚è‚Ü‚·B
+
+    IoT.js version
+        Wed Jul 4 12:03:55 2018
+        commit : acae9c8b2d40e7598b8d39b630b79113ce880a7e
+
+  ã‹Lƒo[ƒWƒ‡ƒ“‚ÌŠeƒ‚ƒWƒ…[ƒ‹‚Ì API Žd—l‚ɂ‚¢‚ẮAˆÈ‰º‚ð‚²ŽQÆ‚­‚¾‚³‚¢B
+
+    IoT.js API Reference
+      https://github.com/pando-project/iotjs/blob/acae9c8b2d40e7598b8d39b630b79113ce880a7e/docs/api/IoT.js-API-reference.md
+
+                                                                        ˆÈã
Binary file doc/ˆÚAŠÖ”ˆê——.xlsx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/Žg—p•û–@.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,10 @@
+============
+  Žg—p•û–@
+============
+
+Žg—p•û–@‚ɂ‚¢‚ẮA‰º‹L‚̃hƒLƒ…ƒƒ“ƒg‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+  - test/case.txt
+
+
+                                                                        ˆÈã
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/§ŒÀŽ–€.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,120 @@
+============
+  §ŒÀŽ–€
+============
+
+Œ»ÝAˆÈ‰º‚̐§ŒÀŽ–€‚ª‚ ‚è‚Ü‚·B
+
+¡§ŒÀŽ–€
+
+1) POSIX/LINUX ŠÖ”‚̈ڐAó‹µ‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ˆÚAŠÖ”‚Í IoT.js ‚𓮍삳‚¹‚邽‚ß‚É•K—v‚È‚à‚Ì‚Ì‚Ý‚Æ‚È‚è‚Ü‚·B
+  POSIX/LINUX ‚̊֐”Žd—l‚ÉŠ®‘S‘Ήž‚µ‚Ä‚¢‚é‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+  ˆÚAó‹µÚ×‚ɂ‚¢‚ẮA‰º‹L‚̃hƒLƒ…ƒƒ“ƒg‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+  - ˆÚAŠÖ”ˆê——.xlsx
+
+
+2) Å‘åƒ\ƒPƒbƒg”‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~
+  LWIP ‚É‚ÄŽg—p‰Â”\‚ȃ\ƒPƒbƒg”‚⃁ƒ‚ƒŠƒTƒCƒY“™‚ð‰º‹LÝ’èƒtƒ@ƒCƒ‹‚É‚Ä
+  Ý’肵‚Ä‚¢‚Ü‚·B
+  Ý’è‚ð•ÏX‚·‚éê‡‚͐ݒèƒtƒ@ƒCƒ‹‚ð•ÒW‚µ‚čărƒ‹ƒh‚µ‚Ä‚­‚¾‚³‚¢B
+
+    ƒtƒ@ƒCƒ‹ƒpƒXF
+        iotjs / src / platform / mbedos5 / mbed_app.json
+
+    161:  "target_overrides": {
+     +1:    "*": {
+     +1:      "lwip.socket-max": 60,
+     +1:      "lwip.tcp-server-max": 60,
+     +1:      "lwip.tcp-socket-max": 60,
+     +1:      "lwip.udp-socket-max": 60,
+     +1:      "lwip.pbuf-pool-size": 10,
+     +1:      "lwip.pbuf-pool-bufsize": 1072,
+     +1:      "lwip.mem-size": 3200
+     +1:    }
+     +1:  }
+
+
+3) IPv6 ‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~
+  mbed-os(5.9.3)‚̃fƒtƒHƒ‹ƒgÝ’è‚ÍIPv6‚ª–³Œø‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+  IPv6‚ð—LŒø‚É‚·‚éê‡‚͉º‹LÝ’èƒtƒ@ƒCƒ‹‚ð•ÒW‚µ‚čărƒ‹ƒh‚µ‚Ä‚­‚¾‚³‚¢B
+  ¦‚È‚¨ IPv6 ‚ð—LŒø‚É‚µ‚½ê‡‚̉e‹¿”͈͂¨‚æ‚Ñ“®ì‚ɂ‚¢‚Ä‚Í–¢Šm”F‚Å‚·B
+
+    ƒtƒ@ƒCƒ‹ƒpƒXF
+        iotjs / src / platform / mbedos5 / mbed_app.json
+
+    161:  "target_overrides": {
+     +1:    "*": {
+ <’ljÁ>:      "lwip.ipv6-enabled": true,
+     +1:      "lwip.socket-max": 60,
+     +1:      "lwip.tcp-server-max": 60,
+     +1:      "lwip.tcp-socket-max": 60,
+     +1:      "lwip.udp-socket-max": 60,
+     +1:      "lwip.pbuf-pool-size": 10,
+     +1:      "lwip.pbuf-pool-bufsize": 1072,
+     +1:      "lwip.mem-size": 3200
+     +1:    }
+     +1:  }
+
+
+4) ƒlƒbƒgƒ[ƒNŠÂ‹«‚̐§Œä‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  Œ»óAƒlƒbƒgƒ[ƒN‚ւ̐ڑ±‚Í EthernetInterface ƒNƒ‰ƒX‚Öƒ}ƒbƒsƒ“ƒO‚³‚ê‚é
+ƒfƒoƒCƒX(GR-Peach ‚̏ꍇ‚̓Iƒ“ƒ{[ƒh‚̃fƒoƒCƒX)‚Ì‚Ý‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚Ü‚·B
+  javascript ‚©‚琧Œä‚·‚é•û–@‚ɂ‚¢‚ẮA‰º‹L‚̃hƒLƒ…ƒƒ“ƒg‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+  - ƒlƒbƒgƒ[ƒNŠÂ‹«‚̐§Œä‚ɂ‚¢‚Ä.txt
+
+
+5) ƒJƒƒ‰ELCD‚̐§Œä‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  videoƒ‚ƒWƒ…[ƒ‹(ƒJƒƒ‰)‚Ædisplayƒ‚ƒWƒ…[ƒ‹(LCD)‚𓯎ž‚ÉŽg—p‚·‚éê‡A
+  display.openLCD() ‚ðŽÀsŒã‚É video.openCMOSCamera() ‚ðŽÀs‚µ‚Ä‚­‚¾‚³‚¢B
+
+  ‚Ü‚½Alcd.start() ‚Ì format ‚ÌŽw’è‚‚¢‚āAŠeƒŒƒCƒ„[‚ɑ΂µ‚ñŽÀsŽž‚Ì‚Ý
+  —LŒø‚É‚È‚è‚Ü‚·B
+  “ñ‰ñ–ڈȍ~‚͏‰‰ñ‚ƈقȂé format ‚ðŽw’肵‚Ä‚àA‰‰ñ‚̐ݒ肪—LŒø‚É‚È‚è‚Ü‚·B
+
+    —áj
+      lcd.startSync(0, buf, 'rgb565');
+      lcd.stopSync(0);
+      lcd.startSync(0, buf, 'rgb888'); // format ‚Í 'rgb565' ‚É‚È‚è‚Ü‚·
+
+
+6) IoT.js ƒIƒŠƒWƒiƒ‹‚Ì http(https) ƒ‚ƒWƒ…[ƒ‹‚Ì–â‘è‚ɂ‚¢‚Ä
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  IoT.js ƒIƒŠƒWƒiƒ‹‚Ì http(https) ƒ‚ƒWƒ…[ƒ‹‚ɂāAˆê‰ñ‚Ì SOCKET ’ʐM‚Å‚Í‘—‚è‚«‚ê
+  ‚È‚¢ƒTƒCƒY‚̃f[ƒ^‚𑗐M‚µ‚悤‚Æ‚·‚é‚ƁA“ñ‰ñ–ڈȍ~‚É‘—M‚³‚ê‚éƒf[ƒ^‚ðŠÜ‚ޗ̈æ
+  ‚ª‘—M‘O‚ɉð•ú (”j‰ó) ‚³‚ê‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚í‚©‚è‚Ü‚µ‚½B
+
+  ‚±‚Ì–â‘è‚ð‰ñ”ð‚·‚é‚½‚߁AŽŸ‚̑΍ô‚ðs‚¢‚Ü‚µ‚½B
+
+    1. IoT.js ƒIƒŠƒWƒiƒ‹‚Ì‘—MŠÖ” write() ‚ðƒI[ƒo[ƒ‰ƒCƒh‚µA‚»‚̊֐”“à•”‚Å
+       ƒf[ƒ^‚ð‚ ‚ç‚©‚¶‚߈ê‰ñ‚Ì SOCKET ’ʐM‚Å‘—‚è‚«‚ê‚éƒTƒCƒY‚É•ªŠ„‚µ‚Ä‚¨‚­B
+       •ªŠ„‚µ‚½ƒf[ƒ^‚𒀎ŸƒIƒŠƒWƒiƒ‹‚Ì‘—MŠÖ”‚É“n‚·B
+              - 4096 ƒoƒCƒg‚²‚Æ‚É•ªŠ„
+              - ƒ†[ƒUƒR[ƒh‚©‚ç‚Í write() ŠÖ”‚̓gƒ‰ƒ“ƒXƒyƒAƒŒƒ“ƒg
+    2. POSIX ‘w‚Ì SOCKET ‚Ö‚Ì‘—Mˆ—‚́Aˆø”‚ÅŽw’肳‚ꂽƒTƒCƒY•ª‚ð‘—‚èØ‚é‚Ü‚Å
+       ƒ‹[ƒv‚·‚éB
+
+  ã‹L 1. ‚ðŽÀŒ»‚·‚邽‚߁Ahttp(s) ƒ‚ƒWƒ…[ƒ‹‚ðŽg—p‚·‚éê‡‚Í fixup ƒ‚ƒWƒ…[ƒ‹‚ð
+  ŽŸ‚̂悤‚É require ‚µ‚Ä‚­‚¾‚³‚¢B
+
+    - http ƒ‚ƒWƒ…[ƒ‹‚ðŽg—p‚·‚éê‡F
+
+          require('fixup')('http');     // http ‚ð require ‚·‚é’¼‘O‚É’Ç‹L
+                                        // http ƒ‚ƒWƒ…[ƒ‹‚ðC—‚·‚éA‚̈Ó
+          var http = require('http');
+
+    - https ƒ‚ƒWƒ…[ƒ‹‚ðŽg—p‚·‚éê‡F
+
+          require('fixup')('https');    // https ‚ð require ‚·‚é’¼‘O‚É’Ç‹L
+                                        // https ƒ‚ƒWƒ…[ƒ‹‚ðC—‚·‚éA‚̈Ó
+          var https = require('https');
+
+  ‚±‚Ì‹Lq‚ð‚·‚é‚Æ IoT.js ƒIƒŠƒWƒiƒ‹‚Ì‘—MŠÖ”‚ª’u‚«Š·‚¦‚ç‚ê‚Ü‚·B
+
+                                                                        ˆÈã
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sample/client.js	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,140 @@
+//boc ---------- (BeginOfCode)
+// ■ JPEGデータを一定周期でサーバへ送信するサンプル
+var display = require('display');
+var video = require('video');
+var jpeg = require('jpeg');
+var nic = require('nic');
+var http = require('http');
+var AlignedBuffer = require('aligned_buffer').AlignedBuffer;
+require('fixup')('http');
+
+/************/
+/* settings */
+/************/
+// JPEGデータ送信先サーバのネットワーク設定
+var server = {
+	host: "172.27.1.196",		// HTTPサーバのIPアドレス(★)
+	port: 8000					// HTTPサーバのポート番号
+};
+
+// GR-PEACH のネットワーク設定
+var dhcp = true;				// DHCP使用フラグ
+var ifconfig = {
+	ip: "172.27.1.234",			// IPアドレス
+	netmask: "255.255.255.0",	// サブネットマスク
+	gateway: "172.27.1.1",		// デフォルトゲートウェイ
+	dns: "8.8.8.8"				// DNSサーバ
+};
+
+var interval = 1000;			// JPEGデータ送信周期(ミリ秒)
+/************/
+
+var width = 480;
+var height = 272;
+var video_format = 'ycbcr422';
+var pixel_bytes = 2;
+var alignment = 32;
+var video_buf = new AlignedBuffer(width * height * pixel_bytes, alignment);
+
+var lcd_config = {
+	type : '4.3inch'
+};
+var camera_config = {
+	width : width,
+	height : height,
+	format : video_format,
+	type : 'ov7725'
+};
+var jpeg_config = {
+	width : width,
+	height : height,
+	format : video_format
+};
+
+var eth = nic.enumerate().ETHERNET;
+if( eth ) {
+	if ( dhcp ) {
+		eth.ifup();							// DHCP
+	} else {
+		eth.ifup(ifconfig);					// 静的IPアドレス指定
+	}
+	eth.ntpdate({ server: "ntp.nict.jp" }); // 時刻同期
+}
+
+/* LCD初期化 */
+display.openLCD(lcd_config, function(err, lcd) {
+	if(err) {
+		console.log(err);
+		process.exit();
+	}
+
+	/* カメラ初期化 */
+	video.openCMOSCamera(camera_config, function(err, video_source) {
+		if(err) {
+			console.log(err);
+			process.exit();
+		}
+
+		/* カメラ映像をLCDへ出力開始 */
+		video_source.startSync(video_buf);
+		lcd.startSync(0, video_buf, video_format);
+
+		/* カメラ映像をサーバへ送信開始 */
+		snapshot();
+	});
+});
+
+var i = 0;
+/* カメラ映像をJPEGエンコードし、サーバへ送信する */
+function snapshot() {
+	jpeg_config.bitmap = new AlignedBuffer(video_buf, alignment);
+	jpeg.encode(jpeg_config, function(err, jpeg_data) {
+		if(err) {
+			console.log(err);
+			process.exit();
+		}
+		console.log(++i, ' : jpeg_data.length', jpeg_data.length);
+
+		/* HTTPリクエスト作成 */
+ 		var data = '{"image":"' + jpeg_data.toBuffer().toString('base64') + '"}';
+		var options = {
+			host: server.host,
+			port: server.port,
+			method: 'POST',
+			headers: {
+				'Host': server.host + ':' + server.port,
+				'Content-Type': 'application/json',
+				'Content-Length': data.length
+			}
+		};
+		var req = http.request(options, function(res) {
+			var body = '';
+			console.log( 'res.statusCode', res.statusCode);
+
+			res.on('data',function(chunk) {
+				body += chunk;
+			});
+			res.on('end',function() {
+				/* 送受信完了 */
+				console.log(body);
+				/* interval後に次の送信を開始する */
+				setTimeout(snapshot, interval);
+			});
+			res.on( 'error', function( err ) {
+				/* エラー終了 */
+				console.log( err );
+				process.exit();
+			});
+		});
+		req.on( 'error', function( err ) {
+			/* エラー終了 */
+			console.log( err );
+			process.exit();
+		});
+
+		/* リクエスト送信 */
+		req.write(data);
+		req.end();
+	});
+}
+//eoc ---------- (EndOfCode)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sample/readme.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,107 @@
+======================================
+  ŽÊ^‘—MƒTƒ“ƒvƒ‹ƒvƒƒOƒ‰ƒ€‚ɂ‚¢‚Ä
+======================================
+
+ŽÊ^‘—MƒTƒ“ƒvƒ‹ƒvƒƒOƒ‰ƒ€‚ɂ‚¢‚Äà–¾‚µ‚Ü‚·B
+
+¡ƒtƒ@ƒCƒ‹\¬
+
+  - server.js : PC ã‚ÅŽÀs‚·‚é Node.js ƒvƒƒOƒ‰ƒ€
+  - client.js : GR-PEACH ã‚ÅŽÀs‚·‚é IoT.js ƒvƒƒOƒ‰ƒ€
+
+¡“®ìà–¾
+
+  PC ‚ªHTTPƒT[ƒoAGR-PEACH ‚ªHTTPƒNƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚Ä“®ì‚µ‚Ü‚·B
+
+  GR-PEACH ‚ł́Aˆê’èŽüŠú‚ŃJƒƒ‰‚©‚çŽæ‚荞‚ñ‚¾‰æ‘œ‚ðJPEGƒGƒ“ƒR[ƒh‚µA
+  JPEGƒf[ƒ^‚ðƒT[ƒo‚Ö‘—M‚µ‚Ü‚·B
+
+  PC ‚Å‚ÍŽóM‚µ‚½JPEGƒf[ƒ^‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚µ‚Ü‚·B
+  ƒtƒ@ƒCƒ‹”‚̏ãŒÀ‚ð’´‚¦‚½ê‡Aƒtƒ@ƒCƒ‹–¼‚ðƒ[ƒe[ƒg‚µAŒÃ‚¢ƒtƒ@ƒCƒ‹‚ð
+  ã‘‚«‚µ‚Ü‚·B
+
+¡“®ìÝ’è
+
+  •K—v‚ɉž‚¶‚ăvƒƒOƒ‰ƒ€“à‚̃T[ƒoEƒNƒ‰ƒCƒAƒ“ƒg‚̐ݒè‚ð•ÏX‚µ‚Ä‚­‚¾‚³‚¢B
+  išj‚Ì•”•ª‚Í•K{€–Ú‚É‚È‚è‚Ü‚·B
+
+  - server.js
+
+  ˆÈ‰º‚̐ݒè‚̕ύX‚ª‰Â”\‚Å‚·B
+
+     7: const port      = 8000;         // HTTPƒT[ƒo‚̃|[ƒg”ԍ†
+    +1: const maxFileNo = 100;          // JPEGƒtƒ@ƒCƒ‹”‚̏ãŒÀ
+    +1: const path      = './jpeg/';    // JPEGƒtƒ@ƒCƒ‹•Û‘¶ƒtƒHƒ‹ƒ_
+
+  - client.js
+
+  ‚²Žg—p‚̊‹«‚ɍ‡‚킹‚Ä‘—MæƒT[ƒo‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B
+
+    15: var server = {
+    +1:     host: "172.27.1.196",       // HTTPƒT[ƒo‚ÌIPƒAƒhƒŒƒXišj
+    +1:     port: 8000                  // HTTPƒT[ƒo‚̃|[ƒg”ԍ†
+    +1: };
+
+  ‰ŠúÝ’è‚Å‚Í GR-PEACH ‚̃lƒbƒgƒ[ƒNÝ’è‚É‚Í DHCP ‚ðŽg—p‚µ‚Ü‚·B
+  DHCP ‚ðŽg—p‚µ‚È‚¢ê‡‚͈ȉº‚̕ϐ”‚ð false ‚É‚µ‚Ä‚­‚¾‚³‚¢B
+
+    21: var dhcp = true;                // DHCPŽg—pƒtƒ‰ƒO
+
+  DHCP ‚ðŽg—p‚µ‚È‚¢ê‡A‚²Žg—p‚̊‹«‚ɍ‡‚킹‚āAGR-PEACH‚̃lƒbƒgƒ[ƒNÝ’è‚ð
+  s‚Á‚Ä‚­‚¾‚³‚¢BiDHCP ‚ðŽg—p‚·‚éê‡AˆÈ‰º‚̐ݒè‚Í–³Œø‚Å‚·j
+
+    22: var ifconfig = {
+    +1:     ip: "172.27.1.234",         // IPƒAƒhƒŒƒX
+    +1:     netmask: "255.255.255.0",   // ƒTƒuƒlƒbƒgƒ}ƒXƒN
+    +1:     gateway: "172.27.1.1",      // ƒfƒtƒHƒ‹ƒgƒQ[ƒgƒEƒFƒC
+    +1:     dns: "8.8.8.8"              // DNSƒT[ƒo
+    +1: };
+
+  JPEGƒf[ƒ^‚Ì‘—MŽüŠú‚ð•ÏX‚·‚éê‡‚́AˆÈ‰º‚Ì’l‚ð•ÏX‚µ‚Ä‚­‚¾‚³‚¢B
+
+    29: var interval = 1000;            // JPEGƒf[ƒ^‘—MŽüŠú(ƒ~ƒŠ•b)
+
+¡ŽÀs€”õ
+
+  PC ‚É Node.js ‚ÌŽÀsŠÂ‹«‚ð\’z‚µ‚Ü‚·B
+
+    “®ìŠm”FŠÂ‹«
+      OS : Windows 8.1 Pro 64bit
+      Node.js : Windows Binary 64-bit v10.15.1
+
+  ˆÈ‰º‚ÌURL‚æ‚èANode.js ‚Ì Windows Binary (.zip) ‚ðƒ_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
+
+    https://nodejs.org/en/download/
+
+  ƒ_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚ð”CˆÓ‚̏ꏊ‚ɉ𓀂µ‚Ü‚·B
+  ‰ð“€‚µ‚½ƒtƒHƒ‹ƒ_“à‚É server.js ‚ð”z’u‚µ‚Ü‚·B
+
+¡ŽÀs•û–@
+
+  - ƒT[ƒo‚ÌŽÀs
+
+    server.js ‚ð”z’u‚µ‚½ƒtƒHƒ‹ƒ_‚ɂāAˆÈ‰º‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚µ‚Ü‚·B
+
+      node server.js
+
+  - ƒNƒ‰ƒCƒAƒ“ƒg‚ÌŽÀs
+
+    GR-PEACH ‚ð‹N“®‚·‚é‚ƁAƒVƒŠƒAƒ‹ƒRƒ“ƒ\[ƒ‹‚Ɉȉº‚̃ƒbƒZ[ƒW‚ª•\Ž¦‚³‚ê‚Ü‚·B
+
+        IoT.js for mbed-os...
+           mbed-os version: 5.9.3 
+           build timestamp: MMM DD YYYY HH:MM:SS 
+
+        input js fullpath here: 
+
+    [Enter]ƒL[‚𑗐M‚µ‚āAƒR[ƒh‚Ì“ü—̓‚[ƒh‚Ɉڍs‚µ‚Ü‚·B
+
+        input javascript code here: 
+
+    client.js ‚Ì“à—e‚ð‘S‚ăRƒs[‚µ‚Ä“\‚è•t‚¯‚é‚Əˆ—‚ªŽn‚Ü‚è‚Ü‚·B
+
+¡“®ìŠm”FŒ‹‰Ê
+
+  JPEGƒf[ƒ^‚Ì‘—MŽüŠú‚ð1ƒ~ƒŠ•b‚ɐݒ肵A100ŽžŠÔˆÈã˜A‘±‚µ‚Ä“®ì‚·‚邱‚Æ‚ðŠm”F‚µ‚Ü‚µ‚½B
+
+ˆÈã
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sample/server.js	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,54 @@
+const http = require('http');
+const fs = require('fs');
+
+/************/
+/* settings */
+/************/
+const port      = 8000;			// HTTPサーバのポート番号
+const maxFileNo = 100;			// JPEGファイル数の上限
+const path      = './jpeg/';	// JPEGファイル保存フォルダ
+/************/
+
+/* 画像保存ディレクトリ作成 */
+try {
+	fs.mkdirSync(path);
+} catch(err) {
+	if(err.code != 'EEXIST') {
+		console.log(err);
+		process.exit();
+	}
+}
+
+var fileNo = 1;
+var i = 0;
+/* サーバの作成 */
+const server = http.createServer(function(req, res) {
+	var body = '';
+	req.on('data', function(chunk) {
+//		console.log('chunk.length : ' + chunk.length);
+		body += chunk;
+	});
+	req.on('end', function() {
+		/* 受信したデータをファイルに保存 */
+		try {
+			var obj = JSON.parse(body);
+			var image = Buffer.from(obj.image, 'base64');
+			console.log(++i, 'Write : ' + path + 'image' + fileNo + '.jpg');
+			fs.writeFileSync(path + fileNo + '.jpg', image);
+			fileNo = (fileNo < maxFileNo) ? (fileNo + 1) : 1;
+		} catch(err) {
+			console.log(err);
+		}
+
+		/* クライアントへ OK を固定で返す */
+		res.setHeader('Content-Type', 'text/html');
+		res.writeHead(200, { 'Content-Type': 'text/plain' });
+		res.end('OK');
+	});
+	req.on('error', function(err) {
+		/* エラー終了 */
+		console.log(err);
+		res.end();
+	});
+});
+server.listen(port);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/.mbedignore	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,1 @@
+*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/case.txt	Thu Jul 11 18:49:37 2019 +0900
@@ -0,0 +1,1122 @@
+■テストケースについて
+
+    次の行で囲まれた部分がそれぞれのテストケースになります。
+    //boc ---------- (BeginOfCode)
+    //eoc ---------- (EndOfCode)
+
+・使用例)
+
+1)下記の //boc の *前行* から //eoc の *次行* までをクリップボードにコピーしておきます。
+
+//boc ---------- (BeginOfCode)
+console.log("001");
+//eoc ---------- (EndOfCode)
+
+2)GR-Peach をリセット(or BREAK信号を送信)します。
+    ※ GR-Peach には *必ず* microSD カードをセットしておいてください。
+
+    IoT.js for mbed-os...
+       mbed-os version: 5.9.3 
+       build timestamp: MMM DD YYYY HH:MM:SS 
+
+    input js fullpath here: 
+
+3)[Enter]キーを送信して、コードの入力モードに移行します。
+
+    input javascript code here: 
+
+4)クリップボードの内容を貼り付けると処理が始まります。(手入力でもOK)
+
+    input javascript code here: 
+    //boc ---------- (BeginOfCode)
+    console.log("001");
+    //eoc ---------- (EndOfCode)
+
+    ------- POSIX[  1][thr0] -->clock_getres(clk_id=6, res=0x2005aae4)
+    ------- POSIX[  2][thr0] <--clock_getres(clk_id=6, res={0.001000000}) = 0(errno:0)
+    ------- POSIX[  3][thr0] -->clock_gettime(clk_id=6, tp=0x2005aae4)
+                :
+                :
+
+
+
+■いくつかのテストケース
+
+
+
+//boc ---------- (BeginOfCode)
+//■ process.platform が "mbedos" か確認
+console.log( 'platform = ' + process.platform );
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ process 環境表示テスト
+console.log( 'platform' + JSON.stringify( process, null, "    " ) );
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ カレントパスのテスト
+console.log('current path: "' + process.cwd() + '"');
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ console 表示テスト (UTF8)
+console.log("001");
+console.log("002", "002");
+var val = "string";
+console.log("003", val);
+val = 123;
+console.log("004", val);
+val = 3.14;
+console.log("005", val);
+console.log("nihongo", "UTF8");
+console.log("nihongo", "日本語", "UTF8");
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ JSON.stringify、JSON.parse のテスト
+var obj = {abc:10, pi:3.14, str:"moji"};
+var json = JSON.stringify(obj);
+console.log( json );
+var copy = JSON.parse(json);
+console.log( copy );
+console.log( JSON.stringify(copy) );
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ chdir のテスト
+function CHECK( number, val, must_be)
+{
+    console.log( 'check', number, ': must be', must_be, ':', val == must_be ? 'OK' : 'NG' );
+}
+
+var currentPath = process.cwd();
+console.log('currentPath', process.cwd());
+
+try {
+    process.chdir('/sd');
+} catch(err) {
+    console.log('invalid path');
+}
+
+console.log('currentPath', process.cwd());
+CHECK(1, process.cwd(), '/sd');
+
+process.chdir(currentPath);
+console.log('currentPath', process.cwd());
+
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ Buffer のテスト (linux版と結果が同じであること)
+var buf = new Buffer('hello world', 'ascii');
+console.log(buf.toString('hex'));     // Prints: 68656c6c6f20776f726c64
+console.log(buf.toString('base64'));  // Prints: aGVsbG8gd29ybGQ=
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ setTimeout() のテスト
+setTimeout( function() {
+    console.log( new Date().getTime(), 'kita' );
+}, 3000);
+console.log( new Date().getTime(), 'setTimeout started');
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ setInterval() のテスト
+var count = 0;
+var tid = setInterval( function() {
+    console.log( new Date().getTime(), 'setInterval kita' );
+    if( ++ count >= 5 ) clearInterval( tid );
+}, 1000);
+console.log( new Date().getTime(), 'setInterval started');
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ setTimeout(), setInterval() のテスト
+setTimeout( function() {
+    console.log( new Date().getTime(), 'setTimeout1 kita' );
+}, 3500);
+console.log( new Date(), 'setTimeout1 started');
+
+setTimeout( function() {
+    console.log( new Date().getTime(), 'setTimeout2 kita' );
+}, 5500);
+console.log( new Date().getTime(), 'setTimeout2 started');
+
+var count = 0;
+var tid = setInterval( function() {
+    console.log( new Date().getTime(), 'setInterval kita' );
+    if( ++ count >= 5 ) clearInterval( tid );
+}, 2000);
+console.log( new Date().getTime(), 'setInterval started');
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ fs モジュールのテスト (同期)
+var fs = require('fs');
+var fname = "/sd/_temp_code.js";
+var stat = fs.statSync(fname);
+console.log( JSON.stringify(stat) );
+console.log( fs.readFileSync(fname) );
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ 正規表現のテスト
+var re = /(\w+)\s(\w+)/;
+var str = 'John Smith';
+var newstr = str.replace(re, '$2, $1');
+console.log(newstr);
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ 文字列分割テスト
+var text = 'Some text\nAnd some more\r\nAnd yet\rThis is the end';
+var lines = text.split(/\r\n|\r|\n/);
+console.log(lines); // logs [ 'Some text', 'And some more', 'And yet', 'This is the end' ]
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ 多国語テスト
+var text = 'Образец text на русском языке';
+var regex = /[\u0400-\u04FF]+/g;
+
+var match = regex.exec(text);
+console.log(match[0]);        // logs 'Образец'
+console.log(regex.lastIndex); // logs '7'
+
+var match2 = regex.exec(text);
+console.log(match2[0]);       // logs 'на' [did not log 'text']
+console.log(regex.lastIndex); // logs '15'
+
+// and so on
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+//■ 文字列操作テスト
+var url = 'http://xxx.domain.com';
+console.log(/[^.]+/.exec(url)[0].substr(7)); // logs 'xxx'
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■EventEmitterテスト
+var EventEmitter = require('events').EventEmitter;
+
+function asyncFunc() {
+  var ev = new EventEmitter;
+  console.log('in asyncFunc');
+  setTimeout(function () {
+    ev.emit('done', 'foo', 'bar');
+  }, 1000);
+  return ev;
+}
+
+var async = asyncFunc();
+async.on('done', function(arg1, arg2) {
+  console.log(arg1, arg2);
+});
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■streamテスト
+
+var Readable = require('stream').Readable;
+
+function CHECK( number, val, must_be)
+{
+    console.log( 'check', number, ': must be', must_be, ':', val == must_be ? 'OK' : 'NG' );
+}
+
+var readable1 = new Readable();
+var d = "";
+var e = "";
+
+
+readable1.on('error', function(err) {
+  e += ".";
+});
+
+readable1.on('data', function(data) {
+  d += data.toString();
+});
+
+readable1.on('end', function() {
+  e += 'e';
+});
+
+
+readable1.pause();
+readable1.push('abcde');
+readable1.push('12345');
+CHECK(1, d, '');
+CHECK(2, e, '');
+
+readable1.resume();
+CHECK(3, d, 'abcde12345');
+CHECK(4, e, '');
+
+readable1.push('a');
+readable1.push('1');
+readable1.push('b');
+readable1.push('2');
+CHECK(5, d, 'abcde12345a1b2');
+CHECK(6, e, '');
+
+CHECK(7, readable1.isPaused(), false);
+readable1.pause();
+CHECK(8, d, 'abcde12345a1b2');
+CHECK(9, e, '');
+CHECK(10, readable1.isPaused(), true);
+
+// Pause the readable again. This should do nothing.
+readable1.pause();
+CHECK(11, readable1.isPaused(), true);
+
+readable1.push('c');
+readable1.push('3');
+readable1.push('d');
+readable1.push('4');
+CHECK(12, d, 'abcde12345a1b2');
+CHECK(13, e, '');
+
+readable1.resume();
+CHECK(14, d, 'abcde12345a1b2c3d4');
+CHECK(15, e, '');
+
+readable1.push(null);
+CHECK(16, d, 'abcde12345a1b2c3d4');
+CHECK(17, e, 'e');
+
+readable1.push('push after eof');
+CHECK(18, d, 'abcde12345a1b2c3d4');
+CHECK(19, e, 'e.');
+
+
+// Create a readable stream without the new keyword.
+var readable2 = Readable({encoding: 'utf8'});
+
+// Read with irregular parameters from an empty stream.
+CHECK(20, readable2.read(-2), null);
+CHECK(21, readable2.read(0), null);
+
+readable2.push('qwerty');
+CHECK(22, readable2.read(6), 'qwerty');
+
+// Throw not implemented Error when we trying to read less length data.
+readable2.push('new-data');
+
+var readable3 = new Readable();
+var readable3End = false;
+var paused = false;
+var str = 'test';
+
+readable3.on('data', function(data) {
+  CHECK(23, paused, true);
+  CHECK(24, data, str);
+});
+
+readable3.on('end', function() {
+  readable3End = true;
+});
+
+readable3.pause();
+readable3.push(str);
+readable3.push(null);
+
+setTimeout(function() {
+  paused = true;
+  readable3.resume();
+}, 1000);
+
+
+process.on('exit', function() {
+  CHECK(25, readable2 instanceof Readable, true);
+  CHECK(26, readable3End, true);
+});
+
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ dns モジュールの簡易テスト
+var dns = require('dns');
+dns.lookup('www.google.co.jp', function(err, address, family) {
+    console.log('www.google.co.jp -> address: %j family: IPv%s', address, family);
+});
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ nic モジュールの簡易テスト
+var nic = require('nic');
+// 一覧取得
+var nics = nic.enumerate();
+// 一覧確認
+console.log( Object.keys( nics ).length + "個のNICが搭載されています" );
+var index = 0;
+Object.keys( nics ).forEach( function(key) {
+    console.log( ++ index + "個目は:" + key );
+});
+// 使い方
+var eth0 = nics["ETHERNET"];
+if( eth0 ) {
+    eth0.ifup();        // use DHCP
+    eth0.ntpdate({ server:"ntp.nict.jp" });
+    console.log( JSON.stringify( eth0.ifconfig() ) );
+    console.log( new Date().toString() );
+}
+var wifi = nics["WIFI_BP3595"];
+if( wifi ) {
+    wifi.ifup( {
+        wifi: {
+            ssid: "<SSID>",
+            password: "<PASSWORD>",
+            security: "WPA_WPA2"    // 候補:WEP, WPA, WPA2, WPA_WPA2
+        },
+        ip: "192.168.10.123",
+        netmask: "255.255.255.0",
+        gateway: "192.168.10.1",
+        dns: "8.8.8.8"
+    });
+    wifi.ntpdate();
+    console.log( JSON.stringify( wifi.ifconfig() ) );
+    console.log( new Date().toString() );
+}
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ http クライアントのテスト
+
+var cli = require('http');
+require('fixup')('http');
+cli.get({ host: 'www.google.com' }, function(res) {
+	console.log( 'res.statusCode', res.statusCode);
+	res.on('data', function(chunk) {
+		console.log( chunk.toString() );
+	});
+	res.on('end', function() {
+		console.log( 'end' );
+	});
+});
+
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ https クライアントのテスト
+
+var cli = require('https');
+require('fixup')('https');
+cli.get({ host: 'www.google.com' }, function(res) {
+	console.log( 'res.statusCode', res.statusCode);
+	res.on('data', function(chunk) {
+		console.log( chunk.toString() );
+	});
+	res.on('end', function() {
+		console.log( 'end' );
+	});
+});
+
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ カメラ入力をJPEGファイルに保存する
+var video = require('video');
+var jpeg = require('jpeg');
+var fs = require('fs');
+var AlignedBuffer = require('aligned_buffer').AlignedBuffer;
+
+var width = 480;
+var height = 272;
+var video_format = 'ycbcr422';
+var pixel_bytes = 2;
+var alignment = 32;
+var video_buf = new AlignedBuffer(width * height * pixel_bytes, alignment);
+
+var camera_config = {
+    width : width,
+    height : height,
+    format : video_format,
+    type : 'ov7725'
+};
+var jpeg_config = {
+    width : width,
+    height : height,
+    format : video_format
+};
+
+var interval = 1*1000; // 画像保存周期(ms)
+var count = 10; // 保存する画像ファイル数
+
+// カメラの初期化
+video.openCMOSCamera(camera_config, function(err, video_source){
+    if(err) {
+        console.log(err);
+        return;
+    }
+    // 映像の取り込み開始
+    video_source.start(video_buf, function(err) {
+        if(err) {
+            console.log(err);
+            return;
+        }
+        // interval の周期で count 数のJPEG画像を保存
+        var i = 0;
+        var timer = setInterval(function() {
+            if(i >= count) {
+                clearInterval(timer);
+                video_source.stopSync(); // 映像の取り込み停止
+                video_source.closeSync(); // カメラリソースの解放
+                return;
+            }
+            jpeg_config.bitmap = new AlignedBuffer(video_buf, alignment);
+            var jpeg_data = jpeg.encodeSync(jpeg_config);
+            fs.writeFileSync('/sd/image' + i + '.jpg', jpeg_data.toBuffer());
+            console.log('/sd/image' + i + '.jpg');
+            i++;
+        }, interval);
+    });
+});
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ LCDのグラフィックス描画テスト
+var display = require('display');
+var Graphics = require('graphics').Graphics;
+var AlignedBuffer = require('aligned_buffer').AlignedBuffer;
+
+var width = 480;
+var height = 272;
+var pixel_bytes = 2;
+var alignment = 32;
+
+var buf_size = width * height * pixel_bytes;
+
+var lcd_config = {
+    type : '4.3inch'
+};
+
+// レイヤー0用フレームバッファ初期化
+var format0 = 'rgb565';
+var buf0 = new AlignedBuffer(buf_size, alignment);
+var graphics0 = new Graphics({buf:buf0, width:width, height:height, format:format0});
+graphics0.drawRect(0,0,width,height,0xFFFF,true); // 全領域を白で塗りつぶし
+
+// レイヤー1用フレームバッファ初期化
+var format1 = 'argb4444';
+var buf1 = new AlignedBuffer(buf_size, alignment);
+var graphics1 = new Graphics({buf:buf1, width:width, height:height, format:format1});
+graphics1.drawRect(0,0,width,height,0x0000,true); // 全領域を完全透過
+
+var interval = 1*1000; // LCD表示切り替え周期(ms)
+
+// LCDの初期化
+display.openLCD(lcd_config, function(err, lcd) {
+    if(err) {
+        console.log(err);
+        return;
+    }
+
+    var i = 0;
+    var timer = setInterval(function(){
+        switch(i) {
+        case 0:
+            // レイヤー0の表示を開始(白背景)
+            lcd.startSync(0, graphics0.frameBuffer, format0);
+            break;
+        case 1:
+            // レイヤー1の表示を開始(白背景に赤の円)
+            graphics1.drawCircle(100,100,50,0xFF00,true);
+            lcd.startSync(1, graphics1.frameBuffer, format1);
+            break;
+        case 2:
+            // レイヤー0のフレームバッファを切り替え(青背景に赤の円)
+            var new_buf0 = new AlignedBuffer(buf_size, alignment);
+            var new_graphics0 = new Graphics({buf:new_buf0, width:width, height:height, format:format0});
+            new_graphics0.drawRect(0,0,width,height,0x001F,true); // 全領域を青で塗りつぶし
+            lcd.updateSync(0, new_graphics0.frameBuffer);
+            break;
+        case 3:
+            // レイヤー0の表示を停止(黒背景に赤の円)
+            lcd.stopSync(0);
+            break;
+        case 4:
+            // レイヤー1の表示を停止(黒背景)
+            lcd.stopSync(1);
+            break;
+        default:
+            // LCDリソースの解放
+            lcd.closeSync();
+            clearInterval(timer);
+            break;
+        }
+        i++;
+    }, interval);
+});
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ カメラ入力をGoogle Vision APIに送信し、検出結果をLCDに描画するテスト
+var display = require('display');
+var video = require('video');
+var jpeg = require('jpeg');
+var https = require('https');
+var AlignedBuffer = require('aligned_buffer').AlignedBuffer;
+var Graphics = require('graphics').Graphics;
+require('fixup')('https');
+
+var width = 480;
+var height = 272;
+var video_format = 'ycbcr422';
+var pixel_bytes = 2;
+var alignment = 32;
+var video_buf = new AlignedBuffer(width * height * pixel_bytes, alignment);
+
+var result_format = 'argb4444';
+var result_color = 0xF00F;
+var result_pixel_bytes = 2;
+
+var lcd_config = {
+    type : '4.3inch'
+};
+var camera_config = {
+    width : width,
+    height : height,
+    format : video_format,
+    type : 'ov7725'
+};
+var jpeg_config = {
+    width : width,
+    height : height,
+    format : video_format
+};
+
+var key = 'key=<your APIKey>';
+var timeout = 10*1000;
+var detection_type = 'FACE_DETECTION';
+//var detection_type = 'OBJECT_LOCALIZATION';
+
+var lcd;
+display.openLCD(lcd_config, function(err, lcd_) {
+    console.log('LCD Open Callback');
+
+    if(!err) {
+        lcd = lcd_;
+        lcd.start(0, video_buf, video_format, function(err){
+            if(!err) console.log('LCD Layer 0 Start');
+            else     console.log(err);
+        });
+
+        console.log('Camera Open Start');
+        video.openCMOSCamera(camera_config, function(err, video_source){
+            if(!err) {
+                video_source.start(video_buf, function(){
+                    console.log('Camera Start');
+
+                    // 10秒後にJPEGエンコード開始
+                    setTimeout(function() {
+                        console.log('JPEG Encode Start');
+                        video_source.stopSync();
+                        jpeg_config.bitmap = new AlignedBuffer(video_buf, alignment);
+                        jpeg.encode(jpeg_config, function(err, data) {
+                            console.log('JPEG Encode Callback');
+                            if(!err && data) {
+                                use_google_vision_api(data.toBuffer().toString('base64'));
+                            } else {
+                                console.log(err);
+                            }
+                        });
+                    }, timeout);
+                });
+            }
+            else {
+                console.log(err);
+            }
+        });
+    }
+    else {
+        console.log(err);
+    }
+});
+
+console.log('LCD Open Start');
+
+function use_google_vision_api(image) {
+    var host = 'vision.googleapis.com';
+    var port = 443;
+    var path = '/v1/images:annotate';
+
+    var data = '{"requests":[{"image":{"content":"'
+            + image 
+            + '"},"features":[{"type":"' + detection_type + '"}]},]}';
+
+    var options = {
+        host: host,
+        port: port,
+        path: path + '?' + key,
+        method: 'POST',
+        headers: {
+            'Host': host + ':' + port,
+            'Content-Type': 'application/json',
+            'Content-Length': data.length
+        }
+    };
+
+    var req = https.request(options, function(res) {
+        var body = '';
+        console.log( 'res.statusCode', res.statusCode);
+
+        res.on('data',function(chunk) {
+            body += chunk;
+        });
+        res.on('end',function() {
+            console.log(body);
+            drawResult(JSON.parse(body));
+        });
+    });
+    req.on( 'error', function( e ) {
+        console.log( 'error' );
+        console.log( e.message );
+    });
+
+    req.writeEntire = function(data, block_size) {
+        block_size = block_size || 1024;
+        for(var i = 0; i < data.length; i += block_size) {
+            this.write(data.slice(i, i + block_size));
+        }
+    };
+    req.writeEntire(data);
+    req.end();
+}
+
+function drawResult(res) {
+    switch(detection_type) {
+    case 'FACE_DETECTION':
+        drawFace(res);
+        break;
+    case 'OBJECT_LOCALIZATION':
+        drawObject(res);
+        break;
+    default:
+        break;
+    }
+}
+
+function drawObject(res) {
+    var result_buf = new AlignedBuffer(width*height*result_pixel_bytes, alignment);
+    var result = new Graphics({buf:result_buf, width:width, height:height, format:result_format});
+    result.drawRect(0, 0, width, height, 0x0000, true);
+
+    // response format
+    // https://cloud.google.com/vision/docs/reference/rest/v1/images/annotate?hl=ja#LocalizedObjectAnnotation
+    var objects = res.responses[0].localizedObjectAnnotations;
+    objects.forEach(function(e, index){
+        var rect = e.boundingPoly.normalizedVertices;
+        rect.forEach(function(e) {
+            e.x *= width;
+            e.y *= height;
+        });
+        result.drawRect(rect[0].x,
+                   rect[0].y,
+                   rect[1].x - rect[0].x,
+                   rect[3].y - rect[0].y,
+                   result_color, false);
+        result.drawText(e.name, rect[0].x + 1, rect[0].y + 1, 1, result_color, 0x0000);
+    });
+
+    lcd.startSync(2, result.frameBuffer, result_format);
+}
+
+function drawFace(res) {
+    var result_buf = new AlignedBuffer(width*height*result_pixel_bytes, alignment);
+    var result = new Graphics({buf:result_buf, width:width, height:height, format:result_format});
+    result.drawRect(0, 0, width, height, 0x0000, true);
+
+    var background_buf = new AlignedBuffer(width*height*result_pixel_bytes, alignment);
+    var background_format = 'rgb565';
+    var background = new Graphics({buf : background_buf, width:width, height:height, format:background_format});
+    background.drawRect(0, 0, width, height, 0xFFFF, true);
+
+    result.drawPolyline = function ( positions, close, color ) {
+        for(var i = 0; i < positions.length - 1; i++) {
+            this.drawLine(positions[i].x,
+                              positions[i].y,
+                              positions[i+1].x,
+                              positions[i+1].y,
+                              color);
+        }
+        if(close) {
+            this.drawLine(positions[positions.length-1].x,
+                              positions[positions.length-1].y,
+                              positions[0].x,
+                              positions[0].y,
+                              color);
+        }
+    };
+
+    // response format
+    // https://cloud.google.com/vision/docs/reference/rest/v1/images/annotate?hl=ja#FaceAnnotation
+
+    res.responses[0].faceAnnotations.forEach(function(faceAnnotation){
+
+        var landmarks = faceAnnotation.landmarks;
+        landmarks.findIndex = function(type) {
+            var ret;
+            this.forEach(function(e, index) {
+                if(e.type == type) ret = index;
+            });
+            return ret;
+        };
+
+        var outline = [];
+        outline.push(landmarks[landmarks.findIndex('LEFT_EAR_TRAGION')].position);
+        outline.push(landmarks[landmarks.findIndex('CHIN_LEFT_GONION')].position);
+        outline.push(landmarks[landmarks.findIndex('CHIN_GNATHION')].position);
+        outline.push(landmarks[landmarks.findIndex('CHIN_RIGHT_GONION')].position);
+        outline.push(landmarks[landmarks.findIndex('RIGHT_EAR_TRAGION')].position);
+        result.drawPolyline(outline, false, result_color);
+
+        var left_eyeblow = [];
+        left_eyeblow.push(landmarks[landmarks.findIndex('LEFT_OF_LEFT_EYEBROW')].position);
+        left_eyeblow.push(landmarks[landmarks.findIndex('LEFT_EYEBROW_UPPER_MIDPOINT')].position);
+        left_eyeblow.push(landmarks[landmarks.findIndex('RIGHT_OF_LEFT_EYEBROW')].position);
+        result.drawPolyline(left_eyeblow, false, result_color);
+
+        var right_eyeblow = [];
+        right_eyeblow.push(landmarks[landmarks.findIndex('LEFT_OF_RIGHT_EYEBROW')].position);
+        right_eyeblow.push(landmarks[landmarks.findIndex('RIGHT_EYEBROW_UPPER_MIDPOINT')].position);
+        right_eyeblow.push(landmarks[landmarks.findIndex('RIGHT_OF_RIGHT_EYEBROW')].position);
+        result.drawPolyline(right_eyeblow, false, result_color);
+
+        var left_eye = [];
+        left_eye.push(landmarks[landmarks.findIndex('LEFT_EYE_TOP_BOUNDARY')].position);
+        left_eye.push(landmarks[landmarks.findIndex('LEFT_EYE_RIGHT_CORNER')].position);
+        left_eye.push(landmarks[landmarks.findIndex('LEFT_EYE_BOTTOM_BOUNDARY')].position);
+        left_eye.push(landmarks[landmarks.findIndex('LEFT_EYE_LEFT_CORNER')].position);
+        result.drawPolyline(left_eye, true, result_color);
+
+        var eye = landmarks[landmarks.findIndex('LEFT_EYE')].position
+        result.drawCircle(eye.x, eye.y, 2, result_color, true);
+        eye = landmarks[landmarks.findIndex('RIGHT_EYE')].position
+        result.drawCircle(eye.x, eye.y, 2, result_color, true);
+
+        var right_eye = [];
+        right_eye.push(landmarks[landmarks.findIndex('RIGHT_EYE_TOP_BOUNDARY')].position);
+        right_eye.push(landmarks[landmarks.findIndex('RIGHT_EYE_RIGHT_CORNER')].position);
+        right_eye.push(landmarks[landmarks.findIndex('RIGHT_EYE_BOTTOM_BOUNDARY')].position);
+        right_eye.push(landmarks[landmarks.findIndex('RIGHT_EYE_LEFT_CORNER')].position);
+        result.drawPolyline(right_eye, true, result_color);
+
+        var nose = [];
+        nose.push(landmarks[landmarks.findIndex('NOSE_BOTTOM_LEFT')].position);
+        nose.push(landmarks[landmarks.findIndex('NOSE_TIP')].position);
+        nose.push(landmarks[landmarks.findIndex('NOSE_BOTTOM_RIGHT')].position);
+        nose.push(landmarks[landmarks.findIndex('NOSE_BOTTOM_CENTER')].position);
+        nose.push(landmarks[landmarks.findIndex('NOSE_BOTTOM_LEFT')].position);
+        nose.push(landmarks[landmarks.findIndex('MIDPOINT_BETWEEN_EYES')].position);
+        nose.push(landmarks[landmarks.findIndex('NOSE_BOTTOM_RIGHT')].position);
+        result.drawPolyline(nose, false, result_color);
+
+        var mouth = [];
+        mouth.push(landmarks[landmarks.findIndex('MOUTH_LEFT')].position);
+        mouth.push(landmarks[landmarks.findIndex('UPPER_LIP')].position);
+        mouth.push(landmarks[landmarks.findIndex('MOUTH_RIGHT')].position);
+        mouth.push(landmarks[landmarks.findIndex('LOWER_LIP')].position);
+        mouth.push(landmarks[landmarks.findIndex('MOUTH_LEFT')].position);
+        mouth.push(landmarks[landmarks.findIndex('MOUTH_CENTER')].position);
+        mouth.push(landmarks[landmarks.findIndex('MOUTH_RIGHT')].position);
+        result.drawPolyline(mouth, false, result_color);
+
+    });
+
+    lcd.start(2, result.frameBuffer, result_format, function(){
+        console.log('lcd start callback');
+        setTimeout(function(){
+            lcd.startSync(1, background.frameBuffer, background_format);
+            lcd.stopSync(0);
+        }, timeout);
+    });
+}
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ ランダムグラフィックス描画テスト
+var display = require('display');
+var Graphics = require('graphics').Graphics;
+var AlignedBuffer = require('aligned_buffer').AlignedBuffer;
+
+var width = 480;
+var height = 272;
+var graphics_format = 'rgb565';
+var text_format = 'argb4444';
+var pixel_bytes = 2;
+var alignment = 32;
+var color_mask = 0xFFFF;
+var text_color = 0xF000;
+var text_background = 0xFFFF;
+
+var buf_size = width * height * pixel_bytes;
+var interval = 10;
+var count = 500;
+
+var lcd_config = {
+    type : '4.3inch'
+};
+
+var graphcis_buf = new AlignedBuffer(buf_size, alignment);
+var canvas = new Graphics({buf:graphcis_buf, width:width, height:height, format:graphics_format});
+canvas.drawRect(0,0,width,height,0xFFFF,true);
+var text_buf = new AlignedBuffer(buf_size, alignment);
+var text = new Graphics({buf:text_buf, width:width, height:height, format:text_format});
+text.drawRect(0,0,width,height,0x0000,true);
+
+var start_index = 0;
+var drawRandomGraphics = [
+    { type : "Line",      func : drawRandomLine },
+    { type : "Rectangle", func : drawRandomRect },
+    { type : "Arc",       func : drawRandomArc },
+    { type : "Circle",    func : drawRandomCircle },
+    { type : "Ellipse",   func : drawRandomEllipse },
+    { type : "Polygon",   func : drawRandomPolygon }
+];
+
+function drawRandomLine(g) {
+    var sx = Math.floor(Math.random() * width);
+    var sy = Math.floor(Math.random() * height);
+    var ex = Math.floor(Math.random() * width);
+    var ey = Math.floor(Math.random() * height);
+    var color = Math.floor(Math.random() * color_mask);
+    g.drawLine(sx, sy, ex, ey, color);
+}
+
+function drawRandomRect(g) {
+    var x = Math.floor(Math.random() * width);
+    var y = Math.floor(Math.random() * height);
+    var w = Math.floor(Math.random() * width);
+    var h = Math.floor(Math.random() * height);
+    var color = Math.floor(Math.random() * color_mask);
+    var fill = Math.round(Math.random());
+    g.drawRect(x, y, w, h, color, fill);
+}
+
+function drawRandomArc(g) {
+    var x = Math.floor(Math.random() * width);
+    var y = Math.floor(Math.random() * height);
+    var radius = Math.floor(Math.random() * height);
+    var start = Math.floor(Math.random() * 360);
+    var end = Math.floor(Math.random() * 360);
+    var color = Math.floor(Math.random() * color_mask);
+    g.drawArc(x, y, radius, start, end, color);
+}
+
+function drawRandomCircle(g) {
+    var x = Math.floor(Math.random() * width);
+    var y = Math.floor(Math.random() * height);
+    var radius = Math.floor(Math.random() * height);
+    var color = Math.floor(Math.random() * color_mask);
+    var fill = Math.round(Math.random());
+    g.drawCircle(x, y, radius, color, fill);
+}
+
+function drawRandomEllipse(g) {
+    var cx = Math.floor(Math.random() * width);
+    var cy = Math.floor(Math.random() * height);
+    var rx = Math.floor(Math.random() * height);
+    var ry = Math.floor(Math.random() * height);
+    var color = Math.floor(Math.random() * color_mask);
+    var fill = Math.round(Math.random());
+    g.drawEllipse(cx, cy, rx, ry, color, fill);
+}
+
+function drawRandomPolygon(g) {
+    var x = Math.floor(Math.random() * width);
+    var y = Math.floor(Math.random() * height);
+    var radius = Math.floor(Math.random() * height);
+    var sides = Math.floor(Math.random() * 10) + 3;
+    var color = Math.floor(Math.random() * color_mask);
+    var fill = Math.round(Math.random());
+    g.drawPolygon(x, y, radius, sides, color, fill);
+}
+
+display.openLCD(lcd_config, function(err, lcd) {
+    if(!err) {
+        lcd.startSync(0, canvas.frameBuffer, graphics_format);
+        lcd.startSync(1, text.frameBuffer, text_format);
+
+        var draw = function(index) {
+            var type = drawRandomGraphics[index].type;
+            canvas.drawRect(0, 0, width, height, 0xFFFF, true);
+            text.drawRect(0, 0, width, height, 0x0000, true);
+            text.drawText('Draw Random ' + type, 0, 0, 2, text_color, text_background);
+
+            var timer = setInterval(function() {
+                drawRandomGraphics[index].func(canvas);
+            }, interval);
+
+            setTimeout(function() {
+                clearInterval(timer);
+                if(++index < drawRandomGraphics.length) {
+                    draw(index);
+                }
+            }, interval * count);
+        }
+        draw(start_index);
+    }
+});
+//eoc ---------- (EndOfCode)
+
+
+
+
+
+//boc ---------- (BeginOfCode)
+// ■ JPEG画像の連続表示テスト
+// 事前に contents_microSD.zip を解凍し、frames フォルダを microSD カード直下に
+// コピーしてください
+var display = require('display');
+var jpeg = require('jpeg');
+var fs = require('fs');
+var AlignedBuffer = require('aligned_buffer').AlignedBuffer;
+var Graphics = require('graphics').Graphics;
+
+var width = 480;
+var height = 272;
+var format = 'rgb565';
+var pixel_bytes = 2;
+var alignment = 32;
+var buf = new AlignedBuffer(width * height * pixel_bytes, alignment);
+var canvas = new Graphics({buf:buf, width:width, height:height, format:format});
+canvas.drawRect(0,0,width,height,0xFFFF,true);
+
+var lcd_config = {
+    type : '4.3inch'
+};
+
+var file_num = 14315;
+
+display.openLCD(lcd_config, function(err, lcd) {
+    if(!err) {
+        lcd.start(0, canvas.frameBuffer, format, function() {
+            var i = 1;
+            var interval = setInterval(function() {
+                if(i > file_num) {
+                    clearInterval(interval);
+                    return;
+                }
+                body(i++);
+            }, 1);
+        });
+    } else {
+        console.log(err);
+    }
+});
+
+function body(i) {
+    var dir = ('000' + Math.floor(i / 100)).slice(-3);
+    var file = ('00000' + i).slice(-5) + '.jpg';
+    var path = '/sd/frames/' + dir + '/' + file;
+    var jpeg_data = new AlignedBuffer(fs.readFileSync(path), alignment);
+
+    var decode_config = {
+        width : 384,
+        height : 216,
+        format : format
+    };
+
+    var image = jpeg.decodeSync(jpeg_data, decode_config);
+    canvas.drawImage(image, 48, 28);
+}
+//eoc ---------- (EndOfCode)
Binary file test/contents_microSD.zip has changed