カメラブロックは、APIを提供しているWi-Fi 対応カメラをMESHからコントロールするためのソフトウェアブロックです。
今回の例では、シンプルに写真を撮影する、"TakePicture" Functionを備えたブロックを実装します。
ここでは、RICOH THETA Web APIを利用して、株式会社リコー製「THETA SC」をコントロールします。
ブロックを利用するには、カメラとMESHアプリの動作端末を同一ネットワークに接続してください。
カメラブロック : コード
"TakePicture" Function
"TakePicture" Functionのソースコードは以下の通りです。
Initialize
return {
runtimeValues : { sessionId: "" }
}
Receive
/*** No Receive Codes ***/
Execute
//Theta Endpoint URLの設定(デフォルトは192.168.1.1)
var endPointURL = "http://192.168.1.1"
var startSessionJSONData = {
name: "camera.startSession"
}
ajax( {
url : endPointURL + "/osc/commands/execute",
type : "post",
data : JSON.stringify( startSessionJSONData),
contentType: "application/json",
dataType: "json",
timeout : 5000,
success : function (contents) {
//取得したセッションIDをruntimeValuesに保管
runtimeValues.sessionId = contents.results.sessionId;
log("Theta session started: " + runtimeValues.sessionId);
//CaptureModeのチェック
checkCaptureMode(endPointURL);
//シャッターを切る
takeThetaPicture(endPointURL);
//セッションのクローズ
closeThetaSession(endPointURL);
callbackSuccess( {
resultType : "continue",
runtimeValues : runtimeValues
});
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
log(XMLHttpRequest + " | " + textStatus + " | " + errorThrown);
callbackSuccess({
resultType: "continue"
});
}
});
function checkCaptureMode(endPointURL) {
var getOptionsJSONData = {
name: "camera.getOptions",
parameters: {
sessionId: runtimeValues.sessionId,
optionNames: ["captureMode"]
}
}
ajax( {
url : endPointURL + "/osc/commands/execute",
type : "post",
data : JSON.stringify( getOptionsJSONData),
contentType: "application/json",
dataType: "json",
timeout : 5000,
success : function (contents) {
log("CaptureMode: " + JSON.stringify(contents.results.options.captureMode));
if(contents.results.options.captureMode != "image"){
log("Please change capture mode to take photo");
callbackSuccess({
resultType: "stop"
});
};
callbackSuccess( {
resultType : "continue"
});
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
log("Error:" + textStatus + " " + errorThrown);
callbackSuccess({
resultType: "continue"
});
}
} );
}
function takeThetaPicture(endPointURL) {
var takePictureJSONData = {
name: "camera.takePicture",
parameters: {
sessionId: runtimeValues.sessionId
}
}
ajax( {
url : endPointURL + "/osc/commands/execute",
type : "post",
data : JSON.stringify( takePictureJSONData),
contentType: "application/json",
dataType: "json",
timeout : 5000,
success : function (contents) {
log("Took picture");
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
log("Error:" + textStatus + " " + errorThrown);
callbackSuccess({
resultType: "continue"
});
}
} );
}
function closeThetaSession(endPointURL) {
var closeSessionJSONData = {
name: "camera.closeSession",
parameters: {
sessionId: runtimeValues.sessionId
}
}
ajax( {
url : endPointURL + "/osc/commands/execute",
type : "post",
data : JSON.stringify( closeSessionJSONData),
contentType: "application/json",
dataType: "json",
timeout : 5000,
success : function (contents) {
log("Theta session closed: " + runtimeValues.sessionId);
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
log("Error:" + textStatus + " " + errorThrown);
callbackSuccess({
resultType: "continue"
});
}
} );
}
return {
resultType : "continue"
};
Result
/*** No Result Codes ***/
カメラブロック : Import用 JSONデータ
以下にImport用のJSONデータを記載します。「Import機能」を参考にJSONデータをImportすることで、SDK上でブロックの作成、設定項目、コードの確認、編集が可能です。
Import用 JSONデータ
{"formatVersion":"1.0","tagData":{"name":"Take 360 photo","icon":"data:image/png;base64,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","description":"リコーTHETA Sを使って360度写真を撮影します。","functions":[{"id":"function_0","name":"TakePicture","connector":{"inputs":[{"label":""}],"outputs":[{"label":""}]},"properties":[],"extension":{"initialize":"return {\n\truntimeValues : { sessionId: \"\" }\n}","receive":"","execute":"//Theta Endpoint URLの設定(デフォルトは192.168.1.1)\nvar endPointURL = \"http://192.168.1.1\"\n\nvar startSessionJSONData = {\n\tname: \"camera.startSession\"\n} \n\najax( {\n\turl : endPointURL + \"/osc/commands/execute\",\n\ttype : \"post\",\n\tdata : JSON.stringify( startSessionJSONData),\n\tcontentType: \"application/json\",\n\tdataType: \"json\",\n\ttimeout : 5000,\n\tsuccess : function (contents) {\n\t\t//取得したセッションIDをruntimeValuesに保管\n\t\truntimeValues.sessionId = contents.results.sessionId;\n\t\tlog(\"Theta session started: \" + runtimeValues.sessionId);\n\t\t//CaptureModeのチェック\n\t\tcheckCaptureMode(endPointURL);\n\t\t//シャッターを切る\n\t\ttakeThetaPicture(endPointURL);\n\t\t//セッションのクローズ\n\t\tcloseThetaSession(endPointURL);\n\t\tcallbackSuccess( {\n\t\t\t\t\tresultType : \"continue\", \n\t\t\t\t\truntimeValues : runtimeValues\n\t\t});\n\t},\n\terror : function (XMLHttpRequest, textStatus, errorThrown) {\n\t\tlog(XMLHttpRequest + \" | \" + textStatus + \" | \" + errorThrown);\t\t\n\t\tcallbackSuccess({\n\t\t\tresultType: \"continue\"\n\t\t});\n\t}\n});\n\nfunction checkCaptureMode(endPointURL) {\n\tvar getOptionsJSONData = {\n\t\tname: \"camera.getOptions\",\n\t\tparameters: {\n\t\t\tsessionId: runtimeValues.sessionId,\n\t\t\toptionNames: [\"captureMode\"]\n\t\t}\n\t} \n\t\n\tajax( {\n\t\turl : endPointURL + \"/osc/commands/execute\",\n\t\ttype : \"post\",\n\t\tdata : JSON.stringify( getOptionsJSONData),\n\t\tcontentType: \"application/json\",\n\t\tdataType: \"json\",\n\t\ttimeout : 5000,\n\t\tsuccess : function (contents) {\n\t\t\tlog(\"CaptureMode: \" + JSON.stringify(contents.results.options.captureMode));\n\t\t\tif(contents.results.options.captureMode != \"image\"){\n\t\t\t\tlog(\"Please change capture mode to take photo\");\n\t\t\t\tcallbackSuccess({\n\t\t\t\t\tresultType: \"stop\"\n\t\t\t\t});\n\t\t\t};\t\n\t\t\tcallbackSuccess( {\n\t\t\t\t\tresultType : \"continue\"\n\t\t\t});\n\t\t},\n\t\terror : function (XMLHttpRequest, textStatus, errorThrown) {\n\t\t\tlog(\"Error:\" + textStatus + \" \" + errorThrown);\t\t\n\t\t\tcallbackSuccess({\n\t\t\t\tresultType: \"continue\"\n\t\t\t});\n\t\t}\n\t} );\n}\n\nfunction takeThetaPicture(endPointURL) {\n\tvar takePictureJSONData = {\n\t\tname: \"camera.takePicture\",\n\t\tparameters: {\n\t\t\tsessionId: runtimeValues.sessionId\n\t\t}\n\t} \n\n\tajax( {\n\t\turl : endPointURL + \"/osc/commands/execute\",\n\t\ttype : \"post\",\n\t\tdata : JSON.stringify( takePictureJSONData),\n\t\tcontentType: \"application/json\",\n\t\tdataType: \"json\",\n\t\ttimeout : 5000,\n\t\tsuccess : function (contents) {\n\t\t\t\tlog(\"Took picture\");\n\t\t},\n\t\terror : function (XMLHttpRequest, textStatus, errorThrown) {\n\t\t\tlog(\"Error:\" + textStatus + \" \" + errorThrown);\t\t\n\t\t\tcallbackSuccess({\n\t\t\t\tresultType: \"continue\"\n\t\t\t});\n\t\t}\n\t} );\n}\n\nfunction closeThetaSession(endPointURL) {\n\tvar closeSessionJSONData = {\n\t\tname: \"camera.closeSession\",\n\t\tparameters: {\n\t\t\tsessionId: runtimeValues.sessionId\n\t\t}\n\t} \n\n\tajax( {\n\t\turl : endPointURL + \"/osc/commands/execute\",\n\t\ttype : \"post\",\n\t\tdata : JSON.stringify( closeSessionJSONData),\n\t\tcontentType: \"application/json\",\n\t\tdataType: \"json\",\n\t\ttimeout : 5000,\n\t\tsuccess : function (contents) {\n\t\t\tlog(\"Theta session closed: \" + runtimeValues.sessionId);\n\t\t\t},\n\t\terror : function (XMLHttpRequest, textStatus, errorThrown) {\n\t\t\tlog(\"Error:\" + textStatus + \" \" + errorThrown);\t\t\n\t\t\tcallbackSuccess({\n\t\t\t\tresultType: \"continue\"\n\t\t\t});\n\t\t}\n\t} );\n}\n\nreturn {\n\tresultType : \"continue\"\n};","result":""}}]}}
以下のリンクからダウンロードできます。