diff --git a/404.html b/404.html index 7791962824..fc9ae62533 100644 --- a/404.html +++ b/404.html @@ -17,13 +17,13 @@ - +

404

That's a Four-Oh-Four.
Take me home.
- + diff --git a/assets/img/action-http.f6bcdfa1.png b/assets/img/action-http.f6bcdfa1.png new file mode 100644 index 0000000000..a9ff082ef1 Binary files /dev/null and b/assets/img/action-http.f6bcdfa1.png differ diff --git a/assets/img/action-word-forms.189a1c7a.png b/assets/img/action-word-forms.189a1c7a.png new file mode 100644 index 0000000000..60bf5fe7ad Binary files /dev/null and b/assets/img/action-word-forms.189a1c7a.png differ diff --git a/assets/img/word-forms-modal.2999b06d.png b/assets/img/word-forms-modal.2999b06d.png new file mode 100644 index 0000000000..1f7e30d928 Binary files /dev/null and b/assets/img/word-forms-modal.2999b06d.png differ diff --git a/assets/js/10.be2ef49a.js b/assets/js/10.60ffe4e9.js similarity index 99% rename from assets/js/10.be2ef49a.js rename to assets/js/10.60ffe4e9.js index fd3387f779..b5b3558f26 100644 --- a/assets/js/10.be2ef49a.js +++ b/assets/js/10.60ffe4e9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{278:function(t,e,i){},279:function(t,e,i){},284:function(t,e,i){"use strict";i(278)},285:function(t,e,i){var n=i(17),a=i(9),s=i(16);t.exports=function(t){return"string"==typeof t||!a(t)&&s(t)&&"[object String]"==n(t)}},286:function(t,e){t.exports=function(t){return null==t}},287:function(t,e,i){"use strict";i(279)},330:function(t,e,i){"use strict";var n={name:"FancyLink",props:{path:{type:String,required:!0},icon:{type:Array,default:["fas","question"]}},computed:{valid(){return void 0!==this.$site.pages.find(({regularPath:t})=>t===this.path)},target(){return this.valid?this.path:"#"}}},a=i(2),s={name:"PageEdit",components:{FancyLink:Object(a.a)(n,(function(){var t=this._self._c;return t("router-link",{staticClass:"fancy-link",attrs:{to:this.target,target:this.valid?"_blank":"",rel:this.valid?"noopener":""}},[t("font-awesome-icon",{attrs:{icon:this.icon}})],1)}),[],!1,null,"1adcbc30",null).exports},computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"},editPreambleText(){return this.$themeLocaleConfig.editPreambleText||this.$site.themeConfig.editPreambleText||""}}},r=(i(284),Object(a.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.$page.editLink?e("div",{staticClass:"edit-link"},[t.editPreambleText?e("div",{staticClass:"edit-preamble"},[t._v(t._s(t.editPreambleText))]):t._e(),t._v(" "),e("div",{staticClass:"edit-text"},[e("a",{attrs:{href:t.$page.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink"),t._v(" "),e("span",{staticClass:"edit-guides"},[e("FancyLink",{attrs:{id:"editor-guide",path:"/guide/editor.html",icon:["fas","pencil-alt"],title:"Open Website Editor Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"markdown-guide",path:"/guide/markdown.html",icon:["fab","markdown"],title:"Open Website Markdown Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"developer-guide",path:"/guide/docs.html",icon:["fas","info-circle"],title:"Open Website Developer Guide"}})],1)],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("div",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText))]),t._v(" "),e("div",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null));e.a=r.exports},331:function(t,e,i){"use strict";i(111);var n=i(276),a=i(285),s=i.n(a),r=i(286),o=i.n(r),d={name:"PageNav",props:["sidebarItems"],computed:{prev(){return u(l.PREV,this)},next(){return u(l.NEXT,this)}}};const l={NEXT:{resolveLink:function(t,e){return c(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return c(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function u(t,{$themeConfig:e,$page:i,$route:a,$site:r,sidebarItems:d}){const{resolveLink:l,getThemeLinkConfig:u,getPageLinkConfig:c}=t,h=u(e),p=c(i),g=o()(p)?h:p;return!1===g?void 0:s()(g)?Object(n.i)(r.pages,g,a.path):l(i,d)}function c(t,e,i){const n=[];!function t(e,i){for(let n=0,a=e.length;n({isSidebarOpen:!1,isMounted:!1,lockJumbotron:!1}),computed:{...Object(n.b)(["settings"]),shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(d.j)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){"undefined"!=typeof setTimeout&&setTimeout(()=>{this.isMounted=!0},500),this.$router.afterEach(()=>{this.isSidebarOpen=!1})},beforeMount(){this.isMounted=!1},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},toggleSidebarFromNavbar(t){this.toggleSidebar(t),this.settings.page.settings.display&&this.$store.commit("hideSettings")},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,i=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(i)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},p=(i(400),Object(u.a)(h,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebarFromNavbar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),e("main",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],staticClass:"page"},[e("JumboTron",{class:{mounted:t.isMounted,lock:t.lockJumbotron},attrs:{id:"home-jumbotron"}},[e("Content",{attrs:{"slot-key":"jumbotron"}})],1),t._v(" "),e("Content",{staticClass:"theme-default-content"}),t._v(" "),e("PageEdit"),t._v(" "),e("PageNav",t._b({},"PageNav",{sidebarItems:t.sidebarItems},!1))],1)],1)}),[],!1,null,"6c88de97",null));e.default=p.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{278:function(t,e,i){},279:function(t,e,i){},284:function(t,e,i){"use strict";i(278)},285:function(t,e,i){var n=i(17),a=i(9),s=i(16);t.exports=function(t){return"string"==typeof t||!a(t)&&s(t)&&"[object String]"==n(t)}},286:function(t,e){t.exports=function(t){return null==t}},287:function(t,e,i){"use strict";i(279)},330:function(t,e,i){"use strict";var n={name:"FancyLink",props:{path:{type:String,required:!0},icon:{type:Array,default:["fas","question"]}},computed:{valid(){return void 0!==this.$site.pages.find(({regularPath:t})=>t===this.path)},target(){return this.valid?this.path:"#"}}},a=i(2),s={name:"PageEdit",components:{FancyLink:Object(a.a)(n,(function(){var t=this._self._c;return t("router-link",{staticClass:"fancy-link",attrs:{to:this.target,target:this.valid?"_blank":"",rel:this.valid?"noopener":""}},[t("font-awesome-icon",{attrs:{icon:this.icon}})],1)}),[],!1,null,"1adcbc30",null).exports},computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"},editPreambleText(){return this.$themeLocaleConfig.editPreambleText||this.$site.themeConfig.editPreambleText||""}}},r=(i(284),Object(a.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.$page.editLink?e("div",{staticClass:"edit-link"},[t.editPreambleText?e("div",{staticClass:"edit-preamble"},[t._v(t._s(t.editPreambleText))]):t._e(),t._v(" "),e("div",{staticClass:"edit-text"},[e("a",{attrs:{href:t.$page.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink"),t._v(" "),e("span",{staticClass:"edit-guides"},[e("FancyLink",{attrs:{id:"editor-guide",path:"/guide/editor.html",icon:["fas","pencil-alt"],title:"Open Website Editor Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"markdown-guide",path:"/guide/markdown.html",icon:["fab","markdown"],title:"Open Website Markdown Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"developer-guide",path:"/guide/docs.html",icon:["fas","info-circle"],title:"Open Website Developer Guide"}})],1)],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("div",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText))]),t._v(" "),e("div",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null));e.a=r.exports},331:function(t,e,i){"use strict";i(111);var n=i(276),a=i(285),s=i.n(a),r=i(286),o=i.n(r),d={name:"PageNav",props:["sidebarItems"],computed:{prev(){return u(l.PREV,this)},next(){return u(l.NEXT,this)}}};const l={NEXT:{resolveLink:function(t,e){return c(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return c(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function u(t,{$themeConfig:e,$page:i,$route:a,$site:r,sidebarItems:d}){const{resolveLink:l,getThemeLinkConfig:u,getPageLinkConfig:c}=t,h=u(e),p=c(i),g=o()(p)?h:p;return!1===g?void 0:s()(g)?Object(n.i)(r.pages,g,a.path):l(i,d)}function c(t,e,i){const n=[];!function t(e,i){for(let n=0,a=e.length;n({isSidebarOpen:!1,isMounted:!1,lockJumbotron:!1}),computed:{...Object(n.b)(["settings"]),shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(d.j)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){"undefined"!=typeof setTimeout&&setTimeout(()=>{this.isMounted=!0},500),this.$router.afterEach(()=>{this.isSidebarOpen=!1})},beforeMount(){this.isMounted=!1},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},toggleSidebarFromNavbar(t){this.toggleSidebar(t),this.settings.page.settings.display&&this.$store.commit("hideSettings")},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,i=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(i)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},p=(i(400),Object(u.a)(h,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebarFromNavbar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),e("main",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],staticClass:"page"},[e("JumboTron",{class:{mounted:t.isMounted,lock:t.lockJumbotron},attrs:{id:"home-jumbotron"}},[e("Content",{attrs:{"slot-key":"jumbotron"}})],1),t._v(" "),e("Content",{staticClass:"theme-default-content"}),t._v(" "),e("PageEdit"),t._v(" "),e("PageNav",t._b({},"PageNav",{sidebarItems:t.sidebarItems},!1))],1)],1)}),[],!1,null,"6c88de97",null));e.default=p.exports}}]); \ No newline at end of file diff --git a/assets/js/100.9ed26305.js b/assets/js/100.9ed26305.js new file mode 100644 index 0000000000..659c15fa4e --- /dev/null +++ b/assets/js/100.9ed26305.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[100],{1259:function(e,t,r){"use strict";r.r(t);var a=r(2),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"rfid-reader"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rfid-reader"}},[e._v("#")]),e._v(" RFID Reader")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),e._v(" "),t("p",[e._v("The RFIDReader component provides an interface to the ID-Innovations RFID reader modules. These modules are available for example from Sparkfun electronics. The recognized ID-Tags are transferred from the module to a COM port, where the RFIDReader components reads the ID and puts it to the output port as an ASCII string. The RFIDReader can be useful to switch to a different a model (e.g. for another users or use cases) or to change parameters of a running model.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(837),alt:"Screenshot: RFIDReader plugin",title:"Screenshot: RFIDReader plugin"}})]),e._v(" "),t("p",[e._v("RFIDReader plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an ID-Innovations RFID reader to be connected to a COM port via the Sparkfun USB breakout board or a UART/USB bridge or converter cable. Dedicated drivers have to be installed (e.g. the FTDI VCP drivers for the Sparkfun breakout board). All needed components are contained in the Sparkfun RFID Starter Kit:")]),e._v(" "),t("p",[t("img",{attrs:{src:r(838),alt:"RFID Starter Kit",title:"RFID Starter Kit"}})]),e._v(" "),t("p",[e._v("RFID Starter Kit")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("tagID [string]:")]),e._v(" A recognized TagID is put out on this port as a sequence of 12 hexadecimal numbers in an ASCII string.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("comPort [string]:")]),e._v(" The COM port where the RFID reader module is connected to (e.g “COM5”)")]),e._v(" "),t("li",[t("strong",[e._v("baudRate [integer]:")]),e._v(" The baudrate for communication with the RFID reader module, should be 9600 for the ID Innovations modules")])])])}),[],!1,null,null,null);t.default=o.exports},837:function(e,t,r){e.exports=r.p+"assets/img/rfidreader.808198ba.jpg"},838:function(e,t,r){e.exports=r.p+"assets/img/rfidreader_kit.967bb765.jpg"}}]); \ No newline at end of file diff --git a/assets/js/100.2f7bc547.js b/assets/js/101.2a59b178.js similarity index 89% rename from assets/js/100.2f7bc547.js rename to assets/js/101.2a59b178.js index e44e05965a..3d417ad62a 100644 --- a/assets/js/100.2f7bc547.js +++ b/assets/js/101.2a59b178.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[100],{1256:function(t,e,r){"use strict";r.r(e);var a=r(2),o=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Inertial Measurement)")]),t._v(" "),e("p",[t._v("The RazorIMU plugin provides the serial output of the 9DOF Razor Inertial Measurement Unit at three output ports: pitch, yaw and roll. These three values represent the orientation in terms of rotation along the three axes of the coordinate system.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(834),alt:"Screenshot: RazorIMU plugin",title:"Screenshot: RazorIMU plugin"}})]),t._v(" "),e("p",[t._v("RazorIMU plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This plugin requires a 9DOF Razor IMU module connected to the AsTeRICS platform via a UART/USB converter cable (e.g. an FTDI cable) which creates a COM port. The Razor IMU module (and also the converter cable) is available at SparkFun electronics. It has to be updated with the Sparkfun 9DOF Razor IMU AHRS firmware. (The COM port must be determined by looking in the device manager window and cannot be automatically detected like with dedicated AsTeRICS CIMs.) The required baud rate is 57600.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(835),alt:"RazorIMU",title:"RazorIMU"}})]),t._v(" "),e("p",[t._v("RazorIMU module")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("pitch [double]:")]),t._v(" The value for the current pitch.")]),t._v(" "),e("li",[e("strong",[t._v("yaw [double]:")]),t._v(" The value for the current yaw.")]),t._v(" "),e("li",[e("strong",[t._v("roll [double]:")]),t._v(" The value for the current roll.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("comPort [String]:")]),t._v(" The name of the COM port the IMU is connected to.")]),t._v(" "),e("li",[e("strong",[t._v("baudRate [integer]:")]),t._v(" The baud rate the IMU is transferring its data at.")]),t._v(" "),e("li",[e("strong",[t._v("operationMode [String]:")]),t._v(" Designates the operation mode (currently only “PitchYawRoll” is available).")])])])}),[],!1,null,null,null);e.default=o.exports},834:function(t,e,r){t.exports=r.p+"assets/img/razorimu.870eca5a.jpg"},835:function(t,e,r){t.exports=r.p+"assets/img/razorimu_picture.a4cedfe8.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{1260:function(t,e,r){"use strict";r.r(e);var a=r(2),o=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Inertial Measurement)")]),t._v(" "),e("p",[t._v("The RazorIMU plugin provides the serial output of the 9DOF Razor Inertial Measurement Unit at three output ports: pitch, yaw and roll. These three values represent the orientation in terms of rotation along the three axes of the coordinate system.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(839),alt:"Screenshot: RazorIMU plugin",title:"Screenshot: RazorIMU plugin"}})]),t._v(" "),e("p",[t._v("RazorIMU plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This plugin requires a 9DOF Razor IMU module connected to the AsTeRICS platform via a UART/USB converter cable (e.g. an FTDI cable) which creates a COM port. The Razor IMU module (and also the converter cable) is available at SparkFun electronics. It has to be updated with the Sparkfun 9DOF Razor IMU AHRS firmware. (The COM port must be determined by looking in the device manager window and cannot be automatically detected like with dedicated AsTeRICS CIMs.) The required baud rate is 57600.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(840),alt:"RazorIMU",title:"RazorIMU"}})]),t._v(" "),e("p",[t._v("RazorIMU module")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("pitch [double]:")]),t._v(" The value for the current pitch.")]),t._v(" "),e("li",[e("strong",[t._v("yaw [double]:")]),t._v(" The value for the current yaw.")]),t._v(" "),e("li",[e("strong",[t._v("roll [double]:")]),t._v(" The value for the current roll.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("comPort [String]:")]),t._v(" The name of the COM port the IMU is connected to.")]),t._v(" "),e("li",[e("strong",[t._v("baudRate [integer]:")]),t._v(" The baud rate the IMU is transferring its data at.")]),t._v(" "),e("li",[e("strong",[t._v("operationMode [String]:")]),t._v(" Designates the operation mode (currently only “PitchYawRoll” is available).")])])])}),[],!1,null,null,null);e.default=o.exports},839:function(t,e,r){t.exports=r.p+"assets/img/razorimu.870eca5a.jpg"},840:function(t,e,r){t.exports=r.p+"assets/img/razorimu_picture.a4cedfe8.jpg"}}]); \ No newline at end of file diff --git a/assets/js/101.fb3f52a0.js b/assets/js/102.92346527.js similarity index 91% rename from assets/js/101.fb3f52a0.js rename to assets/js/102.92346527.js index e434d78229..658c03a769 100644 --- a/assets/js/101.fb3f52a0.js +++ b/assets/js/102.92346527.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{1259:function(e,t,r){"use strict";r.r(t);var o=r(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"sensorboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sensorboard"}},[e._v("#")]),e._v(" Sensorboard")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),e._v(" "),t("p",[e._v("This component provides the sensor signals from the Sensorboard CIM module, which has been developed in course of the Master Thesis of Yat-Sin Yeung at the UAS Technikum Wien. The Sensorboard is part of the head-mounted Smart Vision Module setup but can also be used as a stand-alone unit for movement analysis. The Sensorboard contains a 3-axis accelerometer, a 3-axis gyroscope, a 3-axis compass module, one analogue pressure sensor (a sip/puff sensor) and a connection to an optical IR-object tracking sensor which can track the position of up to 4 infrared LEDs in the field of view of the sensor."),t("br"),e._v("\nFurthermore, the Sensorboard contains a USB hub so that a USB camera can be connected.")]),e._v(" "),t("p",[e._v("The sensorboard is necessary for the headpose-compensated eye gaze tracking applications of the SVM. It can be used also for other applications like remote IR-led tracking or as inertial measurement unit."),t("br"),e._v("\nFor a detailled description of the Sensorboard and its application for eye-tracking please refer to the files Documentation/DIYGuides/SVM_Eyetracking_Yeung.pdf and Documentation/DIYGuides/SmartVisionModule.pdf")]),e._v(" "),t("p",[t("img",{attrs:{src:r(838),alt:"Screenshot: Sensorboard plugin",title:"Screenshot: Sensorboard plugin"}})]),e._v(" "),t("p",[e._v("The Sensorboard plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The Sensorboard has to be connected to an USB port. Design files and firmware of the Sensorboard can be found in the folder CIMs/Sensorboard.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(839),alt:"Screenshot: the Sensorboard PCB",title:"Screenshot: Sensorboard PCB"}})]),e._v(" "),t("p",[e._v("The Sensorboard PCB")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("accX/Y/Z [integer]:")]),e._v(" the three axis output of the acceleration sensor")]),e._v(" "),t("li",[t("strong",[e._v("gyroX/Y/Z [integer]:")]),e._v(" the three axis output of the gyroscope sensor")]),e._v(" "),t("li",[t("strong",[e._v("compassX/Y/Z [integer]:")]),e._v(" the three axis output of the compass sensor")]),e._v(" "),t("li",[t("strong",[e._v("pt1x - pt4x [integer]:")])]),e._v(" "),t("li",[t("strong",[e._v("pt1y - pt4y [integer]:")]),e._v(" The x/y corrdinates of the IR-LED tracking camera (0-1022, 1023 if no LED detected)")]),e._v(" "),t("li",[t("strong",[e._v("pressure [integer]:")]),e._v(" the output of the pressure (sip/puff) sensor")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("refreshInterval [integer]:")]),e._v(" the refresh interval for sensor values in milliseconds (should not be less than 20).")])])])}),[],!1,null,null,null);t.default=s.exports},838:function(e,t,r){e.exports=r.p+"assets/img/sensorboard_plugin.38fd7418.jpg"},839:function(e,t,r){e.exports=r.p+"assets/img/sensorboard.0f3cc561.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{1265:function(e,t,r){"use strict";r.r(t);var o=r(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"sensorboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sensorboard"}},[e._v("#")]),e._v(" Sensorboard")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),e._v(" "),t("p",[e._v("This component provides the sensor signals from the Sensorboard CIM module, which has been developed in course of the Master Thesis of Yat-Sin Yeung at the UAS Technikum Wien. The Sensorboard is part of the head-mounted Smart Vision Module setup but can also be used as a stand-alone unit for movement analysis. The Sensorboard contains a 3-axis accelerometer, a 3-axis gyroscope, a 3-axis compass module, one analogue pressure sensor (a sip/puff sensor) and a connection to an optical IR-object tracking sensor which can track the position of up to 4 infrared LEDs in the field of view of the sensor."),t("br"),e._v("\nFurthermore, the Sensorboard contains a USB hub so that a USB camera can be connected.")]),e._v(" "),t("p",[e._v("The sensorboard is necessary for the headpose-compensated eye gaze tracking applications of the SVM. It can be used also for other applications like remote IR-led tracking or as inertial measurement unit."),t("br"),e._v("\nFor a detailled description of the Sensorboard and its application for eye-tracking please refer to the files Documentation/DIYGuides/SVM_Eyetracking_Yeung.pdf and Documentation/DIYGuides/SmartVisionModule.pdf")]),e._v(" "),t("p",[t("img",{attrs:{src:r(844),alt:"Screenshot: Sensorboard plugin",title:"Screenshot: Sensorboard plugin"}})]),e._v(" "),t("p",[e._v("The Sensorboard plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The Sensorboard has to be connected to an USB port. Design files and firmware of the Sensorboard can be found in the folder CIMs/Sensorboard.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(845),alt:"Screenshot: the Sensorboard PCB",title:"Screenshot: Sensorboard PCB"}})]),e._v(" "),t("p",[e._v("The Sensorboard PCB")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("accX/Y/Z [integer]:")]),e._v(" the three axis output of the acceleration sensor")]),e._v(" "),t("li",[t("strong",[e._v("gyroX/Y/Z [integer]:")]),e._v(" the three axis output of the gyroscope sensor")]),e._v(" "),t("li",[t("strong",[e._v("compassX/Y/Z [integer]:")]),e._v(" the three axis output of the compass sensor")]),e._v(" "),t("li",[t("strong",[e._v("pt1x - pt4x [integer]:")])]),e._v(" "),t("li",[t("strong",[e._v("pt1y - pt4y [integer]:")]),e._v(" The x/y corrdinates of the IR-LED tracking camera (0-1022, 1023 if no LED detected)")]),e._v(" "),t("li",[t("strong",[e._v("pressure [integer]:")]),e._v(" the output of the pressure (sip/puff) sensor")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("refreshInterval [integer]:")]),e._v(" the refresh interval for sensor values in milliseconds (should not be less than 20).")])])])}),[],!1,null,null,null);t.default=s.exports},844:function(e,t,r){e.exports=r.p+"assets/img/sensorboard_plugin.38fd7418.jpg"},845:function(e,t,r){e.exports=r.p+"assets/img/sensorboard.0f3cc561.jpg"}}]); \ No newline at end of file diff --git a/assets/js/102.43ed92e6.js b/assets/js/103.51981429.js similarity index 90% rename from assets/js/102.43ed92e6.js rename to assets/js/103.51981429.js index bdeff71480..5aef16fb9a 100644 --- a/assets/js/102.43ed92e6.js +++ b/assets/js/103.51981429.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{1261:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Simulation)")]),e._v(" "),t("p",[e._v("The SignalShaper component can be used to generate signal composed from basic linear functions.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(841),alt:"Screenshot: SignalShaper plugin",title:"Screenshot: SignalShaper plugin"}})]),e._v(" "),t("p",[e._v("SignalShaper plugin")]),e._v(" "),t("p",[t("img",{attrs:{src:n(842),alt:"Example composed signal created from three linear signals",title:"Example composed signal"}})]),e._v(" "),t("p",[e._v("Example composed signal created from three linear signals")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [double]:")]),e._v(" The output port for the signal.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" Start the signal generation. If this event is received during signal generation, the signal generation is restarted.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("interval [integer]:")]),e._v(" The sampling  rate in milliseconds.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("numberOfLines [integer]:")]),e._v(" The number of linear signals used to shape the output signal.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("behaviourAfterFinish [**"),t("strong",[e._v("integer*")]),e._v("*]:")]),e._v(" Defines the component behaviour after all signal lines have been sent:")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("do nothing:")]),e._v(" stop any action.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("repeat:")]),e._v(" Send the signal lines from beginning.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("send the last value:")]),e._v(" Continue to send the last value of the signal.")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("beginValue1…beginValue5 [double]:")]),e._v(" The begin value of the linear signals.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("endValue1…endValue5 [double]:")]),e._v(" The end value of the linear signals.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("time1…time5 [integer]:")]),e._v(" The duration of the linear signals in milliseconds.")])])])])}),[],!1,null,null,null);t.default=s.exports},841:function(e,t,n){e.exports=n.p+"assets/img/signalshaper.cb5abd80.jpg"},842:function(e,t,n){e.exports=n.p+"assets/img/signalshaper.0a42d503.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{1267:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Simulation)")]),e._v(" "),t("p",[e._v("The SignalShaper component can be used to generate signal composed from basic linear functions.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(848),alt:"Screenshot: SignalShaper plugin",title:"Screenshot: SignalShaper plugin"}})]),e._v(" "),t("p",[e._v("SignalShaper plugin")]),e._v(" "),t("p",[t("img",{attrs:{src:n(849),alt:"Example composed signal created from three linear signals",title:"Example composed signal"}})]),e._v(" "),t("p",[e._v("Example composed signal created from three linear signals")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [double]:")]),e._v(" The output port for the signal.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" Start the signal generation. If this event is received during signal generation, the signal generation is restarted.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("interval [integer]:")]),e._v(" The sampling  rate in milliseconds.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("numberOfLines [integer]:")]),e._v(" The number of linear signals used to shape the output signal.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("behaviourAfterFinish [**"),t("strong",[e._v("integer*")]),e._v("*]:")]),e._v(" Defines the component behaviour after all signal lines have been sent:")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("do nothing:")]),e._v(" stop any action.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("repeat:")]),e._v(" Send the signal lines from beginning.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("send the last value:")]),e._v(" Continue to send the last value of the signal.")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("beginValue1…beginValue5 [double]:")]),e._v(" The begin value of the linear signals.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("endValue1…endValue5 [double]:")]),e._v(" The end value of the linear signals.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("time1…time5 [integer]:")]),e._v(" The duration of the linear signals in milliseconds.")])])])])}),[],!1,null,null,null);t.default=s.exports},848:function(e,t,n){e.exports=n.p+"assets/img/signalshaper.cb5abd80.jpg"},849:function(e,t,n){e.exports=n.p+"assets/img/signalshaper.0a42d503.png"}}]); \ No newline at end of file diff --git a/assets/js/103.8d054b65.js b/assets/js/104.06644d41.js similarity index 97% rename from assets/js/103.8d054b65.js rename to assets/js/104.06644d41.js index 60de2abddc..a5c7c111bb 100644 --- a/assets/js/103.8d054b65.js +++ b/assets/js/104.06644d41.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{1263:function(E,R,t){"use strict";t.r(R);var A=t(2),e=Object(A.a)({},(function(){var E=this,R=E._self._c;return R("ContentSlotsDistributor",{attrs:{"slot-key":E.$parent.slotKey}},[R("h1",{attrs:{id:"space-navigtor-3d-mouse"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#space-navigtor-3d-mouse"}},[E._v("#")]),E._v(" Space Navigtor 3D Mouse")]),E._v(" "),R("p",[E._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),E._v(" "),R("p",[E._v("This component interfaces the 3Dconnexion 3D Mouse device.")]),E._v(" "),R("p",[R("img",{attrs:{src:t(844),alt:"Screenshot: SpaceNavigator3DMouse plugin",title:"Screenshot: SpaceNavigator3DMouse plugin"}})]),E._v(" "),R("p",[E._v("SpaceNavigator3DMouse plugin")]),E._v(" "),R("h2",{attrs:{id:"requirements"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[E._v("#")]),E._v(" Requirements")]),E._v(" "),R("p",[E._v("The 3D Mouse device connected to the platform")]),E._v(" "),R("p",[R("img",{attrs:{src:t(845),alt:"SpaceNavigator 3DMouse",title:"SpaceNavigator 3DMouse"}})]),E._v(" "),R("p",[E._v("SpaceNavigator 3DMouse")]),E._v(" "),R("h2",{attrs:{id:"output-port-description"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[E._v("#")]),E._v(" Output Port Description")]),E._v(" "),R("ul",[R("li",[R("strong",[E._v("mouseX [integer]:")]),E._v(" Data of axis X.")]),E._v(" "),R("li",[R("strong",[E._v("mouseY [integer]:")]),E._v(" Data of axis Y.")]),E._v(" "),R("li",[R("strong",[E._v("mouseZ [integer]:")]),E._v(" Data of axis Z.")]),E._v(" "),R("li",[R("strong",[E._v("mouseRx [integer]:")]),E._v(" Data of rotation of axis X.")]),E._v(" "),R("li",[R("strong",[E._v("mouseRy [integer]:")]),E._v(" Data of rotation of axis Y.")]),E._v(" "),R("li",[R("strong",[E._v("mouseRz [integer]:")]),E._v(" Data of rotation of axis Z.")]),E._v(" "),R("li",[R("strong",[E._v("buttons [integer]:")]),E._v(" Data of selected buttons combination.")])]),E._v(" "),R("h2",{attrs:{id:"properties"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[E._v("#")]),E._v(" Properties")]),E._v(" "),R("ul",[R("li",[R("strong",[E._v("interval [integer]:")]),E._v(" The interval of capturing 3D mouse state (ms).")])])])}),[],!1,null,null,null);R.default=e.exports},844:function(E,R,t){E.exports=t.p+"assets/img/spacenavigator3dmouse.7ec48af0.jpg"},845:function(E,R){E.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAEYAUEDASIAAhEBAxEB/8QAHQABAAEFAQEBAAAAAAAAAAAAAAcBAwQFBgIICf/EAEgQAAEDAwIDBgMEBggEBQUAAAEAAgMEBREGIRIxQQcTIlFxgRRhoQgykbEjQmJygsEVJDNSkqKy8ENT4fEWFzRz0TWDk6PC/8QAGQEBAQEBAQEAAAAAAAAAAAAAAAECAwQF/8QALhEBAQACAQMDAgQFBQAAAAAAAAECEQMEITEFEkFRkRMUYXEiI4Gh8AYyUuHx/9oADAMBAAIRAxEAPwD7LREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBETIQETK11xv1jtv/ANRvNuo//fqWR/mUGxRa23X+xXLj/o69W6s4McfcVTJOHJwM4Jxk7LZICISAmQgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgImVEnbp26ab7M2PtzWC8aicwOjt0UgaIgdw6Z+/dgjcDBcegxugliWRkTHSSPaxjRlznHAA8yVEWuvtH9luluOKO8SX+qacdzZ4xOD/APcJbH/m9l8edpHafrPtEqJH6nvchoHHMdspx3VKwZyBwD7/AO88uPpyXGungbsxrW4+S1Mfqzt9G6q+19qaoLmaW0db6Fp5S3KV87vXgYWAH3Puor1D2/8AbBd3ET6zqaNu/goYY4MfLLW5x75+aj19U3pjGeixamUS7kbhWyfBus666lvt8uEc19vNxur+L71bUvnLfTjJx7LKEcTHAiRo9OELRGur2f2coDQNgGt/+FnRw6gkpmVEQdM14yA1jDssd17NhE6Bjge+jaM7nwldNaNRttwBtd1qKCQc30tS+BxP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qZKvs303McwNrKT5RVBI/wA/EtPWdk1JLk096qYz07yFr/yws2LEVh++M8uasOIzspFquyS7MHFTXuimIOzZKd0Y/EF35LXS9lGrACWT2d/y+IkBP4x/zWdLtxkRA4t+YSnd+kB6fJdjB2Vaue4iSS0RDq41Dz9BGtnR9j9xyHVGoKZh6tjpXO+pcPyT2rtw1VKC0DO+Fr5JAHZ/NTBTdkltBHxl4rph5RtZH+YK3tu7OtIUXC4WhlRIB9+pkdLn2J4R7AK6R89xvdPOKenY+eY8o4ml7j7DddJadAauupaY7W6jjP8AxKt4iDfbd30X0LR0dLRQiCjpoaaIHPBEwNbn0Cvq6EVWLsdoo+GW+3OarcN+4ph3UfoScuPtwqQbHYbNZIjHabZTUgP3nRsHG/8Aedzd7lbRFRQBVREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREH//2Q=="}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{1266:function(E,R,t){"use strict";t.r(R);var A=t(2),e=Object(A.a)({},(function(){var E=this,R=E._self._c;return R("ContentSlotsDistributor",{attrs:{"slot-key":E.$parent.slotKey}},[R("h1",{attrs:{id:"space-navigtor-3d-mouse"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#space-navigtor-3d-mouse"}},[E._v("#")]),E._v(" Space Navigtor 3D Mouse")]),E._v(" "),R("p",[E._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),E._v(" "),R("p",[E._v("This component interfaces the 3Dconnexion 3D Mouse device.")]),E._v(" "),R("p",[R("img",{attrs:{src:t(846),alt:"Screenshot: SpaceNavigator3DMouse plugin",title:"Screenshot: SpaceNavigator3DMouse plugin"}})]),E._v(" "),R("p",[E._v("SpaceNavigator3DMouse plugin")]),E._v(" "),R("h2",{attrs:{id:"requirements"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[E._v("#")]),E._v(" Requirements")]),E._v(" "),R("p",[E._v("The 3D Mouse device connected to the platform")]),E._v(" "),R("p",[R("img",{attrs:{src:t(847),alt:"SpaceNavigator 3DMouse",title:"SpaceNavigator 3DMouse"}})]),E._v(" "),R("p",[E._v("SpaceNavigator 3DMouse")]),E._v(" "),R("h2",{attrs:{id:"output-port-description"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[E._v("#")]),E._v(" Output Port Description")]),E._v(" "),R("ul",[R("li",[R("strong",[E._v("mouseX [integer]:")]),E._v(" Data of axis X.")]),E._v(" "),R("li",[R("strong",[E._v("mouseY [integer]:")]),E._v(" Data of axis Y.")]),E._v(" "),R("li",[R("strong",[E._v("mouseZ [integer]:")]),E._v(" Data of axis Z.")]),E._v(" "),R("li",[R("strong",[E._v("mouseRx [integer]:")]),E._v(" Data of rotation of axis X.")]),E._v(" "),R("li",[R("strong",[E._v("mouseRy [integer]:")]),E._v(" Data of rotation of axis Y.")]),E._v(" "),R("li",[R("strong",[E._v("mouseRz [integer]:")]),E._v(" Data of rotation of axis Z.")]),E._v(" "),R("li",[R("strong",[E._v("buttons [integer]:")]),E._v(" Data of selected buttons combination.")])]),E._v(" "),R("h2",{attrs:{id:"properties"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[E._v("#")]),E._v(" Properties")]),E._v(" "),R("ul",[R("li",[R("strong",[E._v("interval [integer]:")]),E._v(" The interval of capturing 3D mouse state (ms).")])])])}),[],!1,null,null,null);R.default=e.exports},846:function(E,R,t){E.exports=t.p+"assets/img/spacenavigator3dmouse.7ec48af0.jpg"},847:function(E,R){E.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAEYAUEDASIAAhEBAxEB/8QAHQABAAEFAQEBAAAAAAAAAAAAAAcBAwQFBgIICf/EAEgQAAEDAwIDBgMEBggEBQUAAAEAAgMEBREGIRIxQQcTIlFxgRRhoQgykbEjQmJygsEVJDNSkqKy8ENT4fEWFzRz0TWDk6PC/8QAGQEBAQEBAQEAAAAAAAAAAAAAAAECAwQF/8QALhEBAQACAQMDAgQFBQAAAAAAAAECEQMEITEFEkFRkRMUYXEiI4Gh8AYyUuHx/9oADAMBAAIRAxEAPwD7LREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBETIQETK11xv1jtv/ANRvNuo//fqWR/mUGxRa23X+xXLj/o69W6s4McfcVTJOHJwM4Jxk7LZICISAmQgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgImVEnbp26ab7M2PtzWC8aicwOjt0UgaIgdw6Z+/dgjcDBcegxugliWRkTHSSPaxjRlznHAA8yVEWuvtH9luluOKO8SX+qacdzZ4xOD/APcJbH/m9l8edpHafrPtEqJH6nvchoHHMdspx3VKwZyBwD7/AO88uPpyXGungbsxrW4+S1Mfqzt9G6q+19qaoLmaW0db6Fp5S3KV87vXgYWAH3Puor1D2/8AbBd3ET6zqaNu/goYY4MfLLW5x75+aj19U3pjGeixamUS7kbhWyfBus666lvt8uEc19vNxur+L71bUvnLfTjJx7LKEcTHAiRo9OELRGur2f2coDQNgGt/+FnRw6gkpmVEQdM14yA1jDssd17NhE6Bjge+jaM7nwldNaNRttwBtd1qKCQc30tS+BxP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qZKvs303McwNrKT5RVBI/wA/EtPWdk1JLk096qYz07yFr/yws2LEVh++M8uasOIzspFquyS7MHFTXuimIOzZKd0Y/EF35LXS9lGrACWT2d/y+IkBP4x/zWdLtxkRA4t+YSnd+kB6fJdjB2Vaue4iSS0RDq41Dz9BGtnR9j9xyHVGoKZh6tjpXO+pcPyT2rtw1VKC0DO+Fr5JAHZ/NTBTdkltBHxl4rph5RtZH+YK3tu7OtIUXC4WhlRIB9+pkdLn2J4R7AK6R89xvdPOKenY+eY8o4ml7j7DddJadAauupaY7W6jjP8AxKt4iDfbd30X0LR0dLRQiCjpoaaIHPBEwNbn0Cvq6EVWLsdoo+GW+3OarcN+4ph3UfoScuPtwqQbHYbNZIjHabZTUgP3nRsHG/8Aedzd7lbRFRQBVREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREH//2Q=="}}]); \ No newline at end of file diff --git a/assets/js/104.619ff3eb.js b/assets/js/105.b2ef62ed.js similarity index 96% rename from assets/js/104.619ff3eb.js rename to assets/js/105.b2ef62ed.js index cb2f8db422..0cc4f2a654 100644 --- a/assets/js/104.619ff3eb.js +++ b/assets/js/105.b2ef62ed.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{1267:function(t,e,r){"use strict";r.r(e);var s=r(2),l=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"trackir"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#trackir"}},[t._v("#")]),t._v(" TrackIR")]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Computer Vision)")]),t._v(" "),e("p",[t._v("The TrackIR input component plugin provides an interface to the TrackIR 5 head tracker, see: https://www.trackir.com/\nThe TrackIR 5 can measure the head orientation in 6DOF (Yaw, Pitch, Roll, X, Y, Z).\nThis data can be utilized for mouse cursor control and other purposes.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(851),alt:"TrackIR device",title:"TrackIR device"}})]),t._v(" "),e("p",[e("img",{attrs:{src:r(852),alt:"Screenshot: TrackIR plugin",title:"Screenshot: TrackIR plugin"}})]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This software component requires the TrackIR device being connected to an USB port, and the TrackIR software running.")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Yaw [double], Pitch [double], Roll [double]:")]),t._v(" These output ports provide current yaw, pitch and roll rotation values (the range of the values depends on the speed settings in the TrackIR software).")]),t._v(" "),e("li",[e("strong",[t._v("X [double], Y [double], Z [double]:")]),t._v(" This output port provides the X, Y and Z translation values (the range of the values depends on the speed settings in the TrackIR software).")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("start:")]),t._v(" An incoming event on this port starts the TrackIR data output.")]),t._v(" "),e("li",[e("strong",[t._v("stop:")]),t._v(" An incoming event on this port stops the TrackIR data output.")]),t._v(" "),e("li",[e("strong",[t._v("center:")]),t._v(" An incoming event on this port sets the TrackIR coordinates to 0 (the user should look straigt to the middle of the screen in order to get a correct center position).")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("autoStart [boolean]:")]),t._v(" This property specifies if the data output is started automatically (if value is true) or if of a start event must be sent via the dedicated event listener port (if value is false).")]),t._v(" "),e("li",[e("strong",[t._v("pollingIntervar [integer]:")]),t._v(" This property defines the polling-interval (update-interval) for getting sensor value updates (given in milliseconds), for example: a value of 10 results in 100 updates per second. The maximum update rate for the TrackIR 5 is 125 Hz (8 ms)")])])])}),[],!1,null,null,null);e.default=l.exports},851:function(t,e,r){t.exports=r.p+"assets/img/trackir_device.1b95f179.jpg"},852:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAAE8CAIAAABIDRrlAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAA66SURBVHhe7Zx9bFbVHYA7ioqUfgAVESitSrvSAloEobrSgoYJ0yK04sfA6cAPglHUqolfrdSIoxH8hgWF6SJuYET0HyKLaMj81kaNkkiUZCRbjNtIFGOyZnO/ce4uN7dvS3vU8ju/Pk+eNPc9vW+bnPfpyXnJy8n6DsAEpAxGIGUwAimDEUgZjEDKYARSBiOQMhiBlMEIpAxGIGUwAimDEUgZjEDKYARSBiOQMhiBlMEIpAxGIGUwAimDEUgZjEDKYARSBiOQMhiBlMEIpAxGIGUwAimDEUgZjEDKYARSBiOQMhiBlMEIpAxGIGUwAimDEUgZjEDKYARSBiOQMhiBlMEIpAxGIGUwAimDEUgZjBBqygcOHNi9e/cu6IL9+/dHM9VvCC/lRx55ZNy4sVlwJAoL86+4YtGXX34ZTZx1Qkq5o6Ojrq6moOC4tWtGtb9f2vGvid/9ZxJmdN/n5dueL5k+vaCwsOCdd96JZtA0IaXc3Nw0ZsyQv/21IvWyYVfKX/vSpUXl5cXffvttNIl2CSZl2RwPHJgtK03q1cLu/fqrCWPG5Kxbty6aR7sEk/LOnTsHDRrIpsLDpUvHLF16RTSPdgkm5ba2tilThqZeJOyJzc0n1tVVR/Nol2BSbmlpqasblnqRsCe2kLIqSNlbUtYFKXtLyrogZW9JWRek7C0p64KUvSVlXZCyt6SsC1L2lpR1QcrekrIuSNlbUtYFKXtLyrr4kVJ+953SyspB3xyckBq3JCnronPK+/8yPj8/O/ovE/9H0kzec0QzplxcfOw//l4pF60rR0Y/9xBuMKW7J+O3lEjKuuhmVd7yx+LGxvzUYA89Ysryw91g59/i/pbaVp8kX0n5qGMtZblwbbkRidItqCvvOdHdkByUJyZTlvH4WZ1TlnCnTx/ceSvigiblo47BlOM0JVMXoqvN7T0k03hw+wslccryxDj3jCnLdfLvIZaUlWAw5Ti+pDIu1YrxnU6X8q23npAcT6bs1m8h448VSVkJxlOWh1GJh94RyrdSK6sMuu8mW+y8KsvXzltqJykrwXLKqWuXcnyn063KmzYWJUvNuMFI/rSkpKwEyylLkVKqXLja5NpduBvkOrlXlmrjmjOmHCeb/HXJ8XhEm6SsC4+UJVO3eZBGZ8/OTWbtxmUkTtk9VwYlyowpu4dysyzhpKwQCylj95KyLkjZW1LWBSl7S8q6IGVvSVkXpOwtKeuClL0lZV2QsrekrAtS9paUdUHK3pKyLkjZW1LWBSl7S8q6IGVvSVkXpOwtKeuClL0lZV2QsrekrAtS9paUdUHK3pKyLjZs2DBuXG7qRcKeeOedI847b1Y0j3YJJuX29vasrKwD/9T7/47UOnfuiKampmge7RJMyh0dHXl5g2++6YTU64Td2/5+6YABP9myZUs0j3YJJuX9+/fLqpydPWDd46NTrxZ2pXRc9tMhQwsL2traonm0SzApb9u2bUhe3rLVq4fk5Uw8LW/FisLm5hOxK2V/XD9vWPbAATMb589ZvHhBQ0M0j3YJJuXW1taKqVP/8Pnnj7/++sKbbjpz9qyJ1ZOxKyfXVZ9/1VV3b94sM9Z4ww01tbXRPNolmJRbWlomVlfLC4O9lZR1QcrekrIuSNlbUtYFKXtLyrogZW9JWRek7C0p64KUvSVlXZCyt6SsC1L2lpR1QcrekrIuSNlbUtYFKXtLyrogZW9JWRek7C0p64KUvSVlXZCyt6SsC1L2lpR1QcrekrIuSLl7n9m7977t269saZFwU1ZMmza2uLg5E62trVu3bt23b180yyFDyhZcs3Nn6aRJWVlZY4cPn3DSSSlL8/NPzck5Y8yYzp4+alTu8ccPzM5uamrq6OiI5jpMSDl4f79nz+iSkvEjRmyaM+eF+fM7u2Hq1McqKv586aVduXrGjKE5ObJIR3MdJqQcvEtaW4fn5j5z/vmpgmOPmLJ4z1lnydr89ddfR9MdIKR8lL1lw4YLly1LXq9/66284cNltyCsf/NNeXh2fb27oaisbOVzz8nFottvdxfirIULa0tKUvkm7UnKf7roIvl1b7zxRjTdAULKR9/Js2Zt+vBDuahtaJB24/G2HTtc5VKwjMtDqW35Aw/ISPwUseKMMy4ZPz6Vb9KepCzKD9+1a1c03QFCykdft8QmV18Z+d+anJVVVVcX3yBr9s3r1sk9yTtFUnaQ8tHXrb5Sqltx4y1HnKy7Yf7y5bISy9fla9a4O52k7CBlFcqGQXS7C1mD46bdqixNl1ZVuazlu3Kd3IecfvbZDWVlqXyTkrIubKcsgbqVWJRw3ds+aTfeSMg22vUtK/TIkpJ4oyyev2TJlLFjU/km7UnK2+bNk9/40UcfRdMdIKSsQik1/heJ3nr35s3ZAwb8prY2VXBsT1L+ZWVlcVFRNNdhQspHWdlFyHIYL8l+1i5YkDNo0BUTJtxbU9PZpvLyFcXFj55zTkZX1dTMGTduYHZ20LsLgZSNeGVLS9Epp8hfRW/JGTz4nJkz29vbo4kOFlK2byOfjFMFKXtLyrogZW9JWRek7C0p64KUvSVlXZCyt6SsC1L2lpR1QcrekrIuSNlbUtYFKXtLyrogZW9JWRek7C0p64KUu5cjXUjZghzpIpCyCpetXl3b2Ogubn3iieS3YifV1Dz9ySepQZEjXRykrEuPlDnSxUHKfe3Dr712ziWX1F9zjfvke9uOHTLYsmWLFCwdu0G3Qsudxxx7rDw8ecKEZz79VFL+9cqV7gb3LCdHujhIua91gbqlVwp2mbqUZSS5Kg/OzU0mKykvvuMOuZCbXetODg9wkHJf61bl+KH0KtuGzimnehWTG4zZixbF46TsIOW+lpR/JEi5r3UbDBelhOt67Zyy2HmDkTFljnRxkHJf61ZlyVTScRtlGYxTdqHHfcs98W1dpcyRLg5S7mtTG4zvL0e6OEi5r/3BUxY50kUgZSNypAsp27eRT8apgpS9JWVdkLK3pKwLUvaWlHVByt6Ssi5I2VtS1gUpe0vKuiBlb0lZF6TsLSnrgpS9JWVdkLK3pKwLUvaWlHVByt3LkS6kbEGOdBFIOSQXXHfdxg8++O3bb19yyy3xIEe6OEg5JDOmzJEuDlJW5G1PPimN5hcW1l97rTyceeiYFcE9FDOmzJEuDlJWpKQ8srhYYpXry++8My64pKKiZcsWuciYMocHOEhZkZLysrY2dy35Pv7666lxUu4GUlYkKX8fSFmRyZR7vsHgSBcHKSsymbIoBUteQjyYMWWOdHGQcvBypIuDlC3IkS4CKRuRI11I2b6NfDJOFaTsLSnrgpS9JWVdkLK3pKwLUvaWlHVByt6Ssi5I2VtS1gUpe0vKuiBlb0lZF6TsLSnrgpS9JWVdkLK3pKwLUu5ejnQhZQtypItAysHLkS4OUg5ejnRxkHIwPtnePjg31/037Olz58rO2I1zpIuDlENyxaOPLrzxxvtefFG+xoMcHuAg5cCU9bhw1KjkCCk7SDkwSbkrSDkk3QbDfY0HOdLFQcrBGL/te+rjj4vKyuK3fRzp4iDl4OVIFwcpW5AjXQRSNiJHupCyfRv5ZJwqSNlbUtYFKXtLyrogZW9JWRek7C0p64KUvSVlXZCyt6SsC1L2lpR1QcrekrIuSNlbUtYFKXtLyrogZW9JWRek3L0c6ULKFuRIF4GUg5cjXRykHLwc6eIg5WD81V13XXP//Z2vOdLFQcrB+Mynn1YemoHNe/eWT5kSj3N4gIOUQ/Lcyy57+NVXH3j55V8sWRIPkrKDlEPyto0bZV8hu4u7N2+OB0nZQcohKXsM2VokdxciR7o4SDkwZ118cfyGz8mRLg5SDkl5w1daVSXb5eQgR7o4SDkYZYssC2dqSXZypItAykbkSBdStm8jn4xTBSl7S8q6IGVvSVkXpOwtKeuClL0lZV2QsrekrAtS9paUdUHK3pKyLkjZW1LWBSl7S8q6IGVvSVkXpOwtKeuClLuXI11I2YIc6SKQcvBypIuDlIOXI10cpBySpVVV7vPywh1PP+0GOdLFQcrh+eArr8xevDh+yOEBDlIOzGc/+6xs8uTkCCk7SDkwZy9aJKtycoSUHaQckrc/9ZS8yUsNcqSLg5SDUbYWUltM3DRHujhIOXg50sVByhbkSBeBlI3IkS6kbN9GPhmnClL2lpR1QcrekrIuSNlbUtbFD5Lyvc8///PLL+/GhuuvTz3FgKSsix8k5esfeiinaMioa0dmdNh5Q0dPODX1FAOSsi6am5t/kJSHThpe8011Rst/V0rK4RJMylu3bs0fNiz1IvXW/pnyhVdfXT9vXjSPdgkm5b1792ZlZT24a1fqdeqV/TPliqlTW1tbo3m0SzApC2fPmDHt3HNTr1Ov7Icp3/jYY8cNGrRnz55oEu0SUsr79u2TV+VnF1yw4b33Ui9YD+1vKV/Z0nJ8Tk5bW1s0g6YJKWVBVpczp03LHjjw1MpKeRfYW4tKS48rOWbsuwUZLbxv8KBhx6eeEqiyqRiSn5+Xn79p06Zo7qwTWMpCR0fH7t27165de+hMkt7R0NCQW5Yz+bOTM3ryQyNOKCqMbg2cVatWvfTSSwcOHIhmrR8QXsrfh2effXZk1YgF/56Z0TM3V46vKo9uhdAg5cOSctCQ8mFJOWhI+bCkHDSkfFhSDpp+nXL19omj60fUfzWDlA3Qf1OWjvNH5pVVlBbNHelqJuWg6acpS8cFI/PXr1//xRdfnFY9qXTuyVIzKQdNf0w57tgNxjVP3lBOyuHS71LOHT1E9hVxxw6p+YzqyUOKB5NyuPS7lAsKD6/HSVzNlVWV0WMIjX6XcsaOHVLzwoULowcQGv0r5YMHD0ZXXXDEG0At/StlMAwpgxFIGYxAymAEUgYjkDIYgZTBCKQMRiBlMAIpgxFIGYxAymAEUgYjkDIYgZTBCKQMRiBlMAIpgxFIGYxAymAEUgYjkDIYgZTBCKQMRiBlMAIpgxFIGYxAymAEUgYjkDIYgZTBCKQMRiBlMAIpgxFIGYxAymAEUgYjkDKY4Lvv/gv+QnZQ/Di/ewAAAABJRU5ErkJggg=="}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{1275:function(t,e,r){"use strict";r.r(e);var s=r(2),l=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"trackir"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#trackir"}},[t._v("#")]),t._v(" TrackIR")]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Computer Vision)")]),t._v(" "),e("p",[t._v("The TrackIR input component plugin provides an interface to the TrackIR 5 head tracker, see: https://www.trackir.com/\nThe TrackIR 5 can measure the head orientation in 6DOF (Yaw, Pitch, Roll, X, Y, Z).\nThis data can be utilized for mouse cursor control and other purposes.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(860),alt:"TrackIR device",title:"TrackIR device"}})]),t._v(" "),e("p",[e("img",{attrs:{src:r(861),alt:"Screenshot: TrackIR plugin",title:"Screenshot: TrackIR plugin"}})]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This software component requires the TrackIR device being connected to an USB port, and the TrackIR software running.")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Yaw [double], Pitch [double], Roll [double]:")]),t._v(" These output ports provide current yaw, pitch and roll rotation values (the range of the values depends on the speed settings in the TrackIR software).")]),t._v(" "),e("li",[e("strong",[t._v("X [double], Y [double], Z [double]:")]),t._v(" This output port provides the X, Y and Z translation values (the range of the values depends on the speed settings in the TrackIR software).")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("start:")]),t._v(" An incoming event on this port starts the TrackIR data output.")]),t._v(" "),e("li",[e("strong",[t._v("stop:")]),t._v(" An incoming event on this port stops the TrackIR data output.")]),t._v(" "),e("li",[e("strong",[t._v("center:")]),t._v(" An incoming event on this port sets the TrackIR coordinates to 0 (the user should look straigt to the middle of the screen in order to get a correct center position).")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("autoStart [boolean]:")]),t._v(" This property specifies if the data output is started automatically (if value is true) or if of a start event must be sent via the dedicated event listener port (if value is false).")]),t._v(" "),e("li",[e("strong",[t._v("pollingIntervar [integer]:")]),t._v(" This property defines the polling-interval (update-interval) for getting sensor value updates (given in milliseconds), for example: a value of 10 results in 100 updates per second. The maximum update rate for the TrackIR 5 is 125 Hz (8 ms)")])])])}),[],!1,null,null,null);e.default=l.exports},860:function(t,e,r){t.exports=r.p+"assets/img/trackir_device.1b95f179.jpg"},861:function(t,e){t.exports="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/105.6b578adf.js b/assets/js/106.5fc62fe8.js similarity index 94% rename from assets/js/105.6b578adf.js rename to assets/js/106.5fc62fe8.js index 0fd220170b..95b4b956ae 100644 --- a/assets/js/105.6b578adf.js +++ b/assets/js/106.5fc62fe8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{1270:function(e,t,i){"use strict";i.r(t);var o=i(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"wiimote"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wiimote"}},[e._v("#")]),e._v(" WiiMote")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),e._v(" "),t("p",[e._v("The WiiMote component interfaces to the Nintendo WiiMote controller via Bluetooth and the WiiYourself! library. It provides various sensor values including the Wiimote buttons and the tracked IR-points of the Wiimote IR front camera and the Joystick position of the Nunchuk extension.")]),e._v(" "),t("p",[e._v("Contains WiiYourself! wiimote code by gl.tter - see "),t("a",{attrs:{href:"http://gl.tter.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://gl.tter.org"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For Wiimote connection and pairing, please see e.g. "),t("a",{attrs:{href:"http://code.google.com/p/giimote/wiki/GettingConnected",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:i(856),alt:"Screenshot: WiiMote plugin",title:"Screenshot: WiiMote plugin"}})]),e._v(" "),t("p",[e._v("WiiMote plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A Wiimote controller has to be available and paired with the Bluetooth radio module of the system.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(857),alt:"WiiMote and Nunchuk",title:"WiiMote and Nunchuk"}})]),e._v(" "),t("p",[e._v("WiiMote and Nunchuk")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pitch [integer]:")]),e._v(" The calculated pitch orientation of the Wiimote controller (in degrees)")]),e._v(" "),t("li",[t("strong",[e._v("roll [integer]:")]),e._v(" The calculated roll orientation of the Wiimote controller (in degrees)")]),e._v(" "),t("li",[t("strong",[e._v("point1X [integer]:")]),e._v(" The X position of the first visible IR point (0-1023)")]),e._v(" "),t("li",[t("strong",[e._v("point1Y [integer]:")]),e._v(" The Y position of the first visible IR point (0-768)")]),e._v(" "),t("li",[t("strong",[e._v("point2X [integer]:")]),e._v(" The X position of the second visible IR point (0-1023)")]),e._v(" "),t("li",[t("strong",[e._v("point2Y [integer]:")]),e._v(" The Y position of the second visible IR point (0-768)")]),e._v(" "),t("li",[t("strong",[e._v("nunX [integer]:")]),e._v(" The X-position of the analog joystick on the Nunchuk extension (if connected)")]),e._v(" "),t("li",[t("strong",[e._v("nunY [integer]:")]),e._v(" The Y-position of the analog joystick on the Nunchuk extension (if connected)")]),e._v(" "),t("li",[t("strong",[e._v("battery [integer]:")]),e._v(" The battery level (0-100%)")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pressedUp:")]),e._v(" Up direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedUp:")]),e._v(" Up direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedDown:")]),e._v(" Down direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedDown:")]),e._v(" Down direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedLeft:")]),e._v(" Left direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedLeft:")]),e._v(" Left direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedRight:")]),e._v(" Right direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedRight:")]),e._v(" Right direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedA:")]),e._v(" A direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedA:")]),e._v(" A direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedB:")]),e._v(" B direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedB:")]),e._v(" B direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressed1:")]),e._v(" 1 direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("released1:")]),e._v(" 1 direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressed2:")]),e._v(" 2 direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("released2:")]),e._v(" 2 direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedPlus:")]),e._v(" Plus direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedPlus:")]),e._v(" Plus direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedMinus:")]),e._v(" Minus direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedMinus:")]),e._v(" Minus direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedHome:")]),e._v(" Home direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedHome:")]),e._v(" Home direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedNunchuckC:")]),e._v(" NunchuckC direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedNunchuckC:")]),e._v(" NunchuckC direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedNunchuckZ:")]),e._v(" NunchuckZ direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedNunchuckZ:")]),e._v(" NunchuckZ direction button released")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("updatePeriod [integer]:")]),e._v(" This property defines how often the WiiMote is queried for new data (in milliseconds)")])])])}),[],!1,null,null,null);t.default=r.exports},856:function(e,t,i){e.exports=i.p+"assets/img/wiimote.7e82ebda.jpg"},857:function(e,t,i){e.exports=i.p+"assets/img/wiimote_picture.0684eac1.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{1276:function(e,t,i){"use strict";i.r(t);var o=i(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"wiimote"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wiimote"}},[e._v("#")]),e._v(" WiiMote")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),e._v(" "),t("p",[e._v("The WiiMote component interfaces to the Nintendo WiiMote controller via Bluetooth and the WiiYourself! library. It provides various sensor values including the Wiimote buttons and the tracked IR-points of the Wiimote IR front camera and the Joystick position of the Nunchuk extension.")]),e._v(" "),t("p",[e._v("Contains WiiYourself! wiimote code by gl.tter - see "),t("a",{attrs:{href:"http://gl.tter.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://gl.tter.org"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For Wiimote connection and pairing, please see e.g. "),t("a",{attrs:{href:"http://code.google.com/p/giimote/wiki/GettingConnected",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:i(862),alt:"Screenshot: WiiMote plugin",title:"Screenshot: WiiMote plugin"}})]),e._v(" "),t("p",[e._v("WiiMote plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A Wiimote controller has to be available and paired with the Bluetooth radio module of the system.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(863),alt:"WiiMote and Nunchuk",title:"WiiMote and Nunchuk"}})]),e._v(" "),t("p",[e._v("WiiMote and Nunchuk")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pitch [integer]:")]),e._v(" The calculated pitch orientation of the Wiimote controller (in degrees)")]),e._v(" "),t("li",[t("strong",[e._v("roll [integer]:")]),e._v(" The calculated roll orientation of the Wiimote controller (in degrees)")]),e._v(" "),t("li",[t("strong",[e._v("point1X [integer]:")]),e._v(" The X position of the first visible IR point (0-1023)")]),e._v(" "),t("li",[t("strong",[e._v("point1Y [integer]:")]),e._v(" The Y position of the first visible IR point (0-768)")]),e._v(" "),t("li",[t("strong",[e._v("point2X [integer]:")]),e._v(" The X position of the second visible IR point (0-1023)")]),e._v(" "),t("li",[t("strong",[e._v("point2Y [integer]:")]),e._v(" The Y position of the second visible IR point (0-768)")]),e._v(" "),t("li",[t("strong",[e._v("nunX [integer]:")]),e._v(" The X-position of the analog joystick on the Nunchuk extension (if connected)")]),e._v(" "),t("li",[t("strong",[e._v("nunY [integer]:")]),e._v(" The Y-position of the analog joystick on the Nunchuk extension (if connected)")]),e._v(" "),t("li",[t("strong",[e._v("battery [integer]:")]),e._v(" The battery level (0-100%)")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pressedUp:")]),e._v(" Up direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedUp:")]),e._v(" Up direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedDown:")]),e._v(" Down direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedDown:")]),e._v(" Down direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedLeft:")]),e._v(" Left direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedLeft:")]),e._v(" Left direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedRight:")]),e._v(" Right direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedRight:")]),e._v(" Right direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedA:")]),e._v(" A direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedA:")]),e._v(" A direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedB:")]),e._v(" B direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedB:")]),e._v(" B direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressed1:")]),e._v(" 1 direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("released1:")]),e._v(" 1 direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressed2:")]),e._v(" 2 direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("released2:")]),e._v(" 2 direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedPlus:")]),e._v(" Plus direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedPlus:")]),e._v(" Plus direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedMinus:")]),e._v(" Minus direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedMinus:")]),e._v(" Minus direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedHome:")]),e._v(" Home direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedHome:")]),e._v(" Home direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedNunchuckC:")]),e._v(" NunchuckC direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedNunchuckC:")]),e._v(" NunchuckC direction button released")]),e._v(" "),t("li",[t("strong",[e._v("pressedNunchuckZ:")]),e._v(" NunchuckZ direction button pressed")]),e._v(" "),t("li",[t("strong",[e._v("releasedNunchuckZ:")]),e._v(" NunchuckZ direction button released")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("updatePeriod [integer]:")]),e._v(" This property defines how often the WiiMote is queried for new data (in milliseconds)")])])])}),[],!1,null,null,null);t.default=r.exports},862:function(e,t,i){e.exports=i.p+"assets/img/wiimote.7e82ebda.jpg"},863:function(e,t,i){e.exports=i.p+"assets/img/wiimote_picture.0684eac1.jpg"}}]); \ No newline at end of file diff --git a/assets/js/106.7e7ba6d4.js b/assets/js/107.a1ed4f99.js similarity index 97% rename from assets/js/106.7e7ba6d4.js rename to assets/js/107.a1ed4f99.js index db9d36ab8a..7a93999d4a 100644 --- a/assets/js/106.7e7ba6d4.js +++ b/assets/js/107.a1ed4f99.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{1276:function(A,e,o){"use strict";o.r(e);var t=o(2),r=Object(t.a)({},(function(){var A=this,e=A._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("h1",{attrs:{id:"switch-mouse-solution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#switch-mouse-solution"}},[A._v("#")]),A._v(" Switch Mouse Solution")]),A._v(" "),e("h2",{attrs:{id:"objective"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[A._v("#")]),A._v(" Objective")]),A._v(" "),e("p",[A._v("Mouse control by switch input. This model demonstrates mouse cursor control via 2 switches or (alternatively) 2 keyboard keys. (There are other models for "),e("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=https://127.0.0.1:8083&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/useCaseDemos/mouseControl/crosshairCursorControl_1key.acs",target:"_blank",rel:"noopener noreferrer"}},[A._v("single-switch"),e("OutboundLink")],1),A._v(" or "),e("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=https://127.0.0.1:8083&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/useCaseDemos/mouseControl/crosshairCursorControl_4keys%20_events.acs",target:"_blank",rel:"noopener noreferrer"}},[A._v("4-switch"),e("OutboundLink")],1),A._v(" cursor control available in the "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/bin/ARE/models/useCaseDemos/mouseControl",target:"_blank",rel:"noopener noreferrer"}},[e("code",[A._v("ARE/models")]),e("OutboundLink")],1),A._v(" folder.)\nInstead of a mouse cursor, a crosshair indicator is displayed on the screen, scanning from the top to the bottom and from the left to the right.")]),A._v(" "),e("h2",{attrs:{id:"mouse-movement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mouse-movement"}},[A._v("#")]),A._v(" Mouse movement")]),A._v(" "),e("p",[A._v("By pressing the "),e("code",[A._v("right")]),A._v(" cursor key the crosshair should move accordingly from the left to the right as long as you keep the key pressed. Subsequently, press the "),e("code",[A._v("down")]),A._v(" cursor key to move the cross from the top to the bottom. As soon as the keys are released, the left click is performed by dwelling (stopping movement and waiting for some time). When the crosshair exits the screen, it wraps around and enters the screen from the other side. Thus, every position on the screen can be reached.")]),A._v(" "),e("p",[e("img",{attrs:{src:o(861),alt:"Cross marking the click position on the screen"}})]),A._v(" "),e("p",[e("em",[A._v("Fig. 1: Crosshair indicating the current mouse position. Red horizontal line indicating a movement from top to bottom.")])]),A._v(" "),e("h2",{attrs:{id:"tooltips"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tooltips"}},[A._v("#")]),A._v(" Tooltips")]),A._v(" "),e("p",[A._v("In order to perform special clicks, so called “tooltips” are available: Press "),e("code",[A._v("right")]),A._v(" and "),e("code",[A._v("down")]),A._v(" cursor keys simultaneously in order to show the tooltips, which look like this:")]),A._v(" "),e("p",[e("img",{attrs:{src:o(862),alt:"Cross marking the click position on the screen"}})]),A._v(" "),e("p",[e("em",[A._v("Fig. 2: Tooltip next to the crosshair, shows symbol for double click")])]),A._v(" "),e("p",[A._v("By pressing one of "),e("code",[A._v("right")]),A._v(" or "),e("code",[A._v("down")]),A._v(" cursor keys again it’s possible to navigate through the tooltips where functions like double click, right click, dragging or keyboard shortcuts like "),e("code",[A._v("Ctrl + C")]),A._v(" and "),e("code",[A._v("Ctrl + V")]),A._v(" can be chosen.")]),A._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[A._v("#")]),A._v(" Requirements")]),A._v(" "),e("ul",[e("li",[A._v("Switch\n"),e("ul",[e("li",[A._v("Keyboard key ("),e("code",[A._v("Cursor right")]),A._v(", "),e("code",[A._v("Cursor down")]),A._v(") or")]),A._v(" "),e("li",[A._v("external Switch (e.g. "),e("a",{attrs:{href:"https://www.asterics-foundation.org/projects/fabi/",target:"_blank",rel:"noopener noreferrer"}},[A._v("FABI"),e("OutboundLink")],1),A._v(") attached and configured to emulate "),e("code",[A._v("Cursor right")]),A._v("and "),e("code",[A._v("Cursor down")]),A._v(" keys.")])])]),A._v(" "),e("li",[A._v("AsTeRICS installed and ARE running")]),A._v(" "),e("li",[A._v("OS: Windows, Linux (incl. RPi), Mac OSX")])]),A._v(" "),e("h2",{attrs:{id:"major-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#major-plugins"}},[A._v("#")]),A._v(" Major Plugins")]),A._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"/plugins/sensors/KeyCapture"}},[A._v("KeyCapture")])]),A._v(" "),e("li",[e("a",{attrs:{href:"/plugins/actuators/Mouse"}},[A._v("Mouse")])]),A._v(" "),e("li",[e("a",{attrs:{href:"/plugins/actuators/CrosshairCursorControl"}},[A._v("CrosshairCursorControl")])]),A._v(" "),e("li",[e("a",{attrs:{href:"/plugins/actuators/Tooltip"}},[A._v("Tooltip")])])])])}),[],!1,null,null,null);e.default=r.exports},861:function(A,e){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOcAAACICAYAAAAcVvyvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAK6SURBVHhe7dqxCQQxEATBC/1CU2b6AF4gd6+pgjHXbEfo2WSstf7Gd4kzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SJOGEqcMNSz33fbx3dzurHxE2dhN6cbGz9xFnZzurHxE2dhN6cbGz9xFnZzurHx81oLQ4kzxCeEFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOEv2/gGKHeaVHFo/ZAAAAABJRU5ErkJggg=="},862:function(A,e){A.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{1282:function(A,e,o){"use strict";o.r(e);var t=o(2),r=Object(t.a)({},(function(){var A=this,e=A._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("h1",{attrs:{id:"switch-mouse-solution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#switch-mouse-solution"}},[A._v("#")]),A._v(" Switch Mouse Solution")]),A._v(" "),e("h2",{attrs:{id:"objective"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[A._v("#")]),A._v(" Objective")]),A._v(" "),e("p",[A._v("Mouse control by switch input. This model demonstrates mouse cursor control via 2 switches or (alternatively) 2 keyboard keys. (There are other models for "),e("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=https://127.0.0.1:8083&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/useCaseDemos/mouseControl/crosshairCursorControl_1key.acs",target:"_blank",rel:"noopener noreferrer"}},[A._v("single-switch"),e("OutboundLink")],1),A._v(" or "),e("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=https://127.0.0.1:8083&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/useCaseDemos/mouseControl/crosshairCursorControl_4keys%20_events.acs",target:"_blank",rel:"noopener noreferrer"}},[A._v("4-switch"),e("OutboundLink")],1),A._v(" cursor control available in the "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/bin/ARE/models/useCaseDemos/mouseControl",target:"_blank",rel:"noopener noreferrer"}},[e("code",[A._v("ARE/models")]),e("OutboundLink")],1),A._v(" folder.)\nInstead of a mouse cursor, a crosshair indicator is displayed on the screen, scanning from the top to the bottom and from the left to the right.")]),A._v(" "),e("h2",{attrs:{id:"mouse-movement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mouse-movement"}},[A._v("#")]),A._v(" Mouse movement")]),A._v(" "),e("p",[A._v("By pressing the "),e("code",[A._v("right")]),A._v(" cursor key the crosshair should move accordingly from the left to the right as long as you keep the key pressed. Subsequently, press the "),e("code",[A._v("down")]),A._v(" cursor key to move the cross from the top to the bottom. As soon as the keys are released, the left click is performed by dwelling (stopping movement and waiting for some time). When the crosshair exits the screen, it wraps around and enters the screen from the other side. Thus, every position on the screen can be reached.")]),A._v(" "),e("p",[e("img",{attrs:{src:o(866),alt:"Cross marking the click position on the screen"}})]),A._v(" "),e("p",[e("em",[A._v("Fig. 1: Crosshair indicating the current mouse position. Red horizontal line indicating a movement from top to bottom.")])]),A._v(" "),e("h2",{attrs:{id:"tooltips"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tooltips"}},[A._v("#")]),A._v(" Tooltips")]),A._v(" "),e("p",[A._v("In order to perform special clicks, so called “tooltips” are available: Press "),e("code",[A._v("right")]),A._v(" and "),e("code",[A._v("down")]),A._v(" cursor keys simultaneously in order to show the tooltips, which look like this:")]),A._v(" "),e("p",[e("img",{attrs:{src:o(867),alt:"Cross marking the click position on the screen"}})]),A._v(" "),e("p",[e("em",[A._v("Fig. 2: Tooltip next to the crosshair, shows symbol for double click")])]),A._v(" "),e("p",[A._v("By pressing one of "),e("code",[A._v("right")]),A._v(" or "),e("code",[A._v("down")]),A._v(" cursor keys again it’s possible to navigate through the tooltips where functions like double click, right click, dragging or keyboard shortcuts like "),e("code",[A._v("Ctrl + C")]),A._v(" and "),e("code",[A._v("Ctrl + V")]),A._v(" can be chosen.")]),A._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[A._v("#")]),A._v(" Requirements")]),A._v(" "),e("ul",[e("li",[A._v("Switch\n"),e("ul",[e("li",[A._v("Keyboard key ("),e("code",[A._v("Cursor right")]),A._v(", "),e("code",[A._v("Cursor down")]),A._v(") or")]),A._v(" "),e("li",[A._v("external Switch (e.g. "),e("a",{attrs:{href:"https://www.asterics-foundation.org/projects/fabi/",target:"_blank",rel:"noopener noreferrer"}},[A._v("FABI"),e("OutboundLink")],1),A._v(") attached and configured to emulate "),e("code",[A._v("Cursor right")]),A._v("and "),e("code",[A._v("Cursor down")]),A._v(" keys.")])])]),A._v(" "),e("li",[A._v("AsTeRICS installed and ARE running")]),A._v(" "),e("li",[A._v("OS: Windows, Linux (incl. RPi), Mac OSX")])]),A._v(" "),e("h2",{attrs:{id:"major-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#major-plugins"}},[A._v("#")]),A._v(" Major Plugins")]),A._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"/plugins/sensors/KeyCapture"}},[A._v("KeyCapture")])]),A._v(" "),e("li",[e("a",{attrs:{href:"/plugins/actuators/Mouse"}},[A._v("Mouse")])]),A._v(" "),e("li",[e("a",{attrs:{href:"/plugins/actuators/CrosshairCursorControl"}},[A._v("CrosshairCursorControl")])]),A._v(" "),e("li",[e("a",{attrs:{href:"/plugins/actuators/Tooltip"}},[A._v("Tooltip")])])])])}),[],!1,null,null,null);e.default=r.exports},866:function(A,e){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOcAAACICAYAAAAcVvyvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAK6SURBVHhe7dqxCQQxEATBC/1CU2b6AF4gd6+pgjHXbEfo2WSstf7Gd4kzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SLOEHG2iDNEnC3iDBFnizhDxNkizhBxtogzRJwt4gwRZ4s4Q8TZIs4QcbaIM0ScLeIMEWeLOEPE2SJOGEqcMNSz33fbx3dzurHxE2dhN6cbGz9xFnZzurHxE2dhN6cbGz9xFnZzurHx81oLQ4kzxCeEFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOFvEGSLOFnGGiLNFnCHibBFniDhbxBkizhZxhoizRZwh4mwRZ4g4W8QZIs4WcYaIs0WcIeJsEWeIOEv2/gGKHeaVHFo/ZAAAAABJRU5ErkJggg=="},867:function(A,e){A.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/107.bea33520.js b/assets/js/108.04893d44.js similarity index 98% rename from assets/js/107.bea33520.js rename to assets/js/108.04893d44.js index f631c4d049..6f313bd696 100644 --- a/assets/js/107.bea33520.js +++ b/assets/js/108.04893d44.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{401:function(e,t,n){e.exports=n.p+"assets/img/openhab-show-synced-control.2ac0761e.gif"},923:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"environmental-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environmental-control"}},[e._v("#")]),e._v(" Environmental Control")]),e._v(" "),t("p",[e._v("AsTeRICS has many plugins for environmental control like "),t("strong",[e._v("KNX")]),e._v(", "),t("strong",[e._v("EnOcean")]),e._v(", "),t("strong",[e._v("IrTrans")]),e._v(", "),t("strong",[e._v("Phillips Hue")]),e._v(" or "),t("strong",[e._v("OpenHAB")]),e._v(". Check the "),t("RouterLink",{attrs:{to:"/plugins/"}},[e._v("Plugins")]),e._v(" page and filter by "),t("code",[e._v("Home Control")]),e._v(".")],1),e._v(" "),t("p",[e._v("On this page you will find some tutorials of how to use such plugins to control your environment and how to create and accessible user interface for it.")]),e._v(" "),t("h2",{attrs:{id:"openhab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openhab"}},[e._v("#")]),e._v(" OpenHAB")]),e._v(" "),t("p",[e._v("OpenHAB is an Open Source Home Automation SW that let’s you control light, heating and other appliances of your Smart Home. Such appliances or devices are called "),t("strong",[e._v("things")]),e._v(" which are represented as "),t("strong",[e._v("items")]),e._v(" in a user interface. OpenHAB provides several user interfaces and means of voice control.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Accessible User Interface")]),e._v(" "),t("p",[e._v("This tutorial explains how to control an OpenHAB instance and it’s configured items by an AsTeRICS model and how to create an "),t("strong",[e._v("accessible user interface")]),e._v(" for it using AsTeRICS Grid.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("This tutorial is based on OpenHAB v3.x but should also work with OpenHAB v2.x")])]),e._v(" "),t("ol",[t("li",[e._v("Read the "),t("a",{attrs:{href:"https://www.openhab.org/docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenHAB concept page"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.openhab.org/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install OpenHAB"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Download the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/download/v4.1.0/demo-conf-openhab2.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("openhab2 demo configuration zip file"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Restore the demo configuration using openhab-cli (Linux) by entering "),t("code",[e._v("sudo openhab-cli restore demo-conf-openhab2.zip")]),e._v(" in the command line. On other systems extract the .zip file and copy the "),t("code",[e._v("conf/items")]),e._v(" and the "),t("code",[e._v("conf/sitemaps")]),e._v(" folder to your OpenHAB config folder.")]),e._v(" "),t("li",[e._v("Start OpenHAB")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/componentTests/processors/openHAB_simple_test.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download OpenHAB model"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=http://127.0.0.1:8081&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/componentTests/processors/openHAB_simple_test.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open OpenHAB model in WebACS"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Start the ARE ("),t("code",[e._v("ARE.exe")]),e._v(" or "),t("code",[e._v("start.bat")]),e._v(" or "),t("code",[e._v("start.sh")]),e._v(")")]),e._v(" "),t("li",[e._v("Open model in ARE or Upload model from ACS")]),e._v(" "),t("li",[e._v("Start model in ARE")]),e._v(" "),t("li",[e._v("Open the "),t("a",{attrs:{href:"http://localhost:8080/basicui/app?w=GF_Kitchen&sitemap=demo",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenHAB Basic UI of the Kitchen"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("In the ARE GUI: Click on "),t("code",[e._v("Item Light_GF_Kitchen_Ceiling ON")]),e._v(" or "),t("code",[e._v("Item Light_GF_Kitchen_Ceiling OFF")]),e._v(". You should see the switching of the item in the basic UI accordingly.\n"),t("img",{attrs:{src:n(401),alt:"Screenshot: OpenHAB Basic UI of Kitchen and ARE GUI with buttons to control OpenHAB items. Animation showing light and roller shutter items switched on and off and the temperature slider changing the temperature"}})]),e._v(" "),t("li",[e._v("Change a value in the basic UI, you should get an event in the event visualizer of the ARE GUI.")])]),e._v(" "),t("h3",{attrs:{id:"accessible-ui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accessible-ui"}},[e._v("#")]),e._v(" Accessible UI")]),e._v(" "),t("p",[e._v("You can use AsTeRICS Grid to create an accessible UI for controlling your Smart Home using OpenHAB.")]),e._v(" "),t("ol",[t("li",[e._v("Open "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS Grid"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("See "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html#asterics-action"}},[e._v("AsTeRICS Action")]),e._v(": To know how to execute an action of an AsTeRICS model in a running ARE instance.")],1),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("Download from ARE")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Component")]),e._v(", select "),t("code",[e._v("openHAB.1_c")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Send data")]),e._v(" "),t("ol",[t("li",[e._v("Select "),t("code",[e._v("actionString")])]),e._v(" "),t("li",[e._v("Set item name and state value, e.g. "),t("code",[e._v("@OPENHAB:Light_GF_Kitchen_Ceiling,ON")]),e._v(" or "),t("code",[e._v("Light_GF_Kitchen_Ceiling,ON")]),e._v(" ("),t("RouterLink",{attrs:{to:"/plugins/processors/OpenHAB.html#input-port-description"}},[e._v("See plugin documentation")]),e._v(")")],1)])]),e._v(" "),t("li",[e._v("Test action by clicking on "),t("code",[e._v("Test Action")])]),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("OK")]),e._v(" to save the action.")])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{401:function(e,t,n){e.exports=n.p+"assets/img/openhab-show-synced-control.2ac0761e.gif"},927:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"environmental-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environmental-control"}},[e._v("#")]),e._v(" Environmental Control")]),e._v(" "),t("p",[e._v("AsTeRICS has many plugins for environmental control like "),t("strong",[e._v("KNX")]),e._v(", "),t("strong",[e._v("EnOcean")]),e._v(", "),t("strong",[e._v("IrTrans")]),e._v(", "),t("strong",[e._v("Phillips Hue")]),e._v(" or "),t("strong",[e._v("OpenHAB")]),e._v(". Check the "),t("RouterLink",{attrs:{to:"/plugins/"}},[e._v("Plugins")]),e._v(" page and filter by "),t("code",[e._v("Home Control")]),e._v(".")],1),e._v(" "),t("p",[e._v("On this page you will find some tutorials of how to use such plugins to control your environment and how to create and accessible user interface for it.")]),e._v(" "),t("h2",{attrs:{id:"openhab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openhab"}},[e._v("#")]),e._v(" OpenHAB")]),e._v(" "),t("p",[e._v("OpenHAB is an Open Source Home Automation SW that let’s you control light, heating and other appliances of your Smart Home. Such appliances or devices are called "),t("strong",[e._v("things")]),e._v(" which are represented as "),t("strong",[e._v("items")]),e._v(" in a user interface. OpenHAB provides several user interfaces and means of voice control.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Accessible User Interface")]),e._v(" "),t("p",[e._v("This tutorial explains how to control an OpenHAB instance and it’s configured items by an AsTeRICS model and how to create an "),t("strong",[e._v("accessible user interface")]),e._v(" for it using AsTeRICS Grid.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("This tutorial is based on OpenHAB v3.x but should also work with OpenHAB v2.x")])]),e._v(" "),t("ol",[t("li",[e._v("Read the "),t("a",{attrs:{href:"https://www.openhab.org/docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenHAB concept page"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.openhab.org/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install OpenHAB"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Download the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/download/v4.1.0/demo-conf-openhab2.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("openhab2 demo configuration zip file"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Restore the demo configuration using openhab-cli (Linux) by entering "),t("code",[e._v("sudo openhab-cli restore demo-conf-openhab2.zip")]),e._v(" in the command line. On other systems extract the .zip file and copy the "),t("code",[e._v("conf/items")]),e._v(" and the "),t("code",[e._v("conf/sitemaps")]),e._v(" folder to your OpenHAB config folder.")]),e._v(" "),t("li",[e._v("Start OpenHAB")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/componentTests/processors/openHAB_simple_test.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download OpenHAB model"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=http://127.0.0.1:8081&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/componentTests/processors/openHAB_simple_test.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open OpenHAB model in WebACS"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Start the ARE ("),t("code",[e._v("ARE.exe")]),e._v(" or "),t("code",[e._v("start.bat")]),e._v(" or "),t("code",[e._v("start.sh")]),e._v(")")]),e._v(" "),t("li",[e._v("Open model in ARE or Upload model from ACS")]),e._v(" "),t("li",[e._v("Start model in ARE")]),e._v(" "),t("li",[e._v("Open the "),t("a",{attrs:{href:"http://localhost:8080/basicui/app?w=GF_Kitchen&sitemap=demo",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenHAB Basic UI of the Kitchen"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("In the ARE GUI: Click on "),t("code",[e._v("Item Light_GF_Kitchen_Ceiling ON")]),e._v(" or "),t("code",[e._v("Item Light_GF_Kitchen_Ceiling OFF")]),e._v(". You should see the switching of the item in the basic UI accordingly.\n"),t("img",{attrs:{src:n(401),alt:"Screenshot: OpenHAB Basic UI of Kitchen and ARE GUI with buttons to control OpenHAB items. Animation showing light and roller shutter items switched on and off and the temperature slider changing the temperature"}})]),e._v(" "),t("li",[e._v("Change a value in the basic UI, you should get an event in the event visualizer of the ARE GUI.")])]),e._v(" "),t("h3",{attrs:{id:"accessible-ui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accessible-ui"}},[e._v("#")]),e._v(" Accessible UI")]),e._v(" "),t("p",[e._v("You can use AsTeRICS Grid to create an accessible UI for controlling your Smart Home using OpenHAB.")]),e._v(" "),t("ol",[t("li",[e._v("Open "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS Grid"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("See "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html#asterics-action"}},[e._v("AsTeRICS Action")]),e._v(": To know how to execute an action of an AsTeRICS model in a running ARE instance.")],1),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("Download from ARE")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Component")]),e._v(", select "),t("code",[e._v("openHAB.1_c")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Send data")]),e._v(" "),t("ol",[t("li",[e._v("Select "),t("code",[e._v("actionString")])]),e._v(" "),t("li",[e._v("Set item name and state value, e.g. "),t("code",[e._v("@OPENHAB:Light_GF_Kitchen_Ceiling,ON")]),e._v(" or "),t("code",[e._v("Light_GF_Kitchen_Ceiling,ON")]),e._v(" ("),t("RouterLink",{attrs:{to:"/plugins/processors/OpenHAB.html#input-port-description"}},[e._v("See plugin documentation")]),e._v(")")],1)])]),e._v(" "),t("li",[e._v("Test action by clicking on "),t("code",[e._v("Test Action")])]),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("OK")]),e._v(" to save the action.")])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/108.1383efd5.js b/assets/js/109.2f90b273.js similarity index 96% rename from assets/js/108.1383efd5.js rename to assets/js/109.2f90b273.js index 008f047d13..7c5788242a 100644 --- a/assets/js/108.1383efd5.js +++ b/assets/js/109.2f90b273.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{289:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_74b8c615b8455605.d7a70de8.png"},940:function(e,t,n){"use strict";n.r(t);var o=n(2),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-development-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-development-overview"}},[e._v("#")]),e._v(" ARE Development Overview")]),e._v(" "),t("h2",{attrs:{id:"the-asterics-runtime-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-asterics-runtime-environment"}},[e._v("#")]),e._v(" The AsTeRICS Runtime Environment")]),e._v(" "),t("p",[e._v("The AsTeRICS Runtime environment (ARE) is an OSGi-based middleware [3] which allows software plugins to run in parallel. The plugins usually represent a sensor or an actuator and are implemented as independent OSGi bundles. The runtime environment identifies AsTeRICS plugins from other OSGi bundles based on metadata defined inside the plugins.")]),e._v(" "),t("p",[e._v("The ARE expects from plugin-developers to define the structure of their plugins (properties, inputs, outputs and event ports) in XML files. Based on these XMLs, the middleware constructs a runtime representation of each installed AsTeRICS plugin.")]),e._v(" "),t("p",[e._v("Furthermore, the ARE expects a runtime model (system model) which usually comes from the AsTeRICS Configuration Suite (ACS). The ACS is running on a Windows Personal Computer (.net 4.0 required) and mainly used to graphically design the layout of the system as a network of interconnected components. The system model is another XML file that defines the components participating in a specific application, connections between them, events and other properties. Based on this file, ARE knows which plugins to activate and how to define the data flow between them. Since the system model represents the main communication means between the ACS and the ARE, it is expected to be a serialisable object, easy to transfer and translate. ARE and ACS communicate through an appropriate TCP/IP-based communication protocol named ASAPI.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(289),alt:""}})]),e._v(" "),t("p",[e._v("The ARE also provides “services” to plugin developers (for example communication support for COM ports) and it allows reporting errors on the runtime environment, registering event listeners and interacting with its graphical user interface (ARE GUI).")]),e._v(" "),t("p",[e._v("The ARE GUI is a simple graphical environment developed to allow end-users to interact directly with the runtime environment. It may be used to modify runtime parameters of a model via buttons or sliders, and to monitor live signals and events of the running model.")]),e._v(" "),t("h2",{attrs:{id:"are-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-components"}},[e._v("#")]),e._v(" ARE Components")]),e._v(" "),t("p",[e._v("The ARE consist of the following main parts:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("The ARE middleware")])]),e._v(" "),t("li",[t("p",[e._v("ARE plugins (also referred to as “components”) – sensor, processor and actuator modules which provide functional building blocks for assistive functionalities")])]),e._v(" "),t("li",[t("p",[e._v("A service layer which provides infrastructure to the ARE components,"),t("br"),e._v("\nfor example COM port and communication management for connection of the Communication Interface Modules (CIMs)")])])]),e._v(" "),t("p",[e._v("The ARE is commonly deployed on an embedded device, running an appropriate operating system (OS), typically an embedded variant of Windows. On top of the OS, an appropriate Java Virtual Machine (JVM) is used to host the OSGi component framework which provides support for modularity and dynamic loading/unloading of components.")]),e._v(" "),t("p",[e._v("All the core components of the framework (described in detail later) are defined as OSGi modules. Certain components that need to access legacy code (e.g., written in C or C++) are also deployed on top of OSGi, and are interfaced to the native code using Java Native Interface (JNI) as needed. In this regard, and with the exception of the pluggable components that use native code interfaces with platform-specific JNI bindings, the ARE middleware is expected to be "),t("em",[e._v("platform independent")]),e._v(".")]),e._v(" "),t("p",[e._v("The implementation requires basically JAVA 1.7 (JDK/JRE 7) and an OSGi framework (which is part of the source code downloads).")]),e._v(" "),t("h2",{attrs:{id:"about-osgi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-osgi"}},[e._v("#")]),e._v(" About OSGi")]),e._v(" "),t("p",[e._v("The Open Service Gateway initiative (OSGi) is an open specification that enables the modular assembly of software built with the Java technology [3]. The OSGi Service Platform facilitates the componentization of software modules and applications and assures interoperability of applications and services over a variety of networked devices.")]),e._v(" "),t("p",[e._v("OSGi technology is the dynamic module system for Java™. Java provides the portability that is required to support products on many different platforms. The OSGi technology provides the standardized primitives that allow applications to be constructed from small, reusable and collaborative components. These components can be composed into an application and deployed; The OSGi Service Platform provides a service-oriented architecture that enables these components to dynamically discover each other for collaboration, and thereby forms the optimal basis for the AsTeRICS middleware.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{295:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_74b8c615b8455605.d7a70de8.png"},944:function(e,t,n){"use strict";n.r(t);var o=n(2),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-development-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-development-overview"}},[e._v("#")]),e._v(" ARE Development Overview")]),e._v(" "),t("h2",{attrs:{id:"the-asterics-runtime-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-asterics-runtime-environment"}},[e._v("#")]),e._v(" The AsTeRICS Runtime Environment")]),e._v(" "),t("p",[e._v("The AsTeRICS Runtime environment (ARE) is an OSGi-based middleware [3] which allows software plugins to run in parallel. The plugins usually represent a sensor or an actuator and are implemented as independent OSGi bundles. The runtime environment identifies AsTeRICS plugins from other OSGi bundles based on metadata defined inside the plugins.")]),e._v(" "),t("p",[e._v("The ARE expects from plugin-developers to define the structure of their plugins (properties, inputs, outputs and event ports) in XML files. Based on these XMLs, the middleware constructs a runtime representation of each installed AsTeRICS plugin.")]),e._v(" "),t("p",[e._v("Furthermore, the ARE expects a runtime model (system model) which usually comes from the AsTeRICS Configuration Suite (ACS). The ACS is running on a Windows Personal Computer (.net 4.0 required) and mainly used to graphically design the layout of the system as a network of interconnected components. The system model is another XML file that defines the components participating in a specific application, connections between them, events and other properties. Based on this file, ARE knows which plugins to activate and how to define the data flow between them. Since the system model represents the main communication means between the ACS and the ARE, it is expected to be a serialisable object, easy to transfer and translate. ARE and ACS communicate through an appropriate TCP/IP-based communication protocol named ASAPI.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(295),alt:""}})]),e._v(" "),t("p",[e._v("The ARE also provides “services” to plugin developers (for example communication support for COM ports) and it allows reporting errors on the runtime environment, registering event listeners and interacting with its graphical user interface (ARE GUI).")]),e._v(" "),t("p",[e._v("The ARE GUI is a simple graphical environment developed to allow end-users to interact directly with the runtime environment. It may be used to modify runtime parameters of a model via buttons or sliders, and to monitor live signals and events of the running model.")]),e._v(" "),t("h2",{attrs:{id:"are-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-components"}},[e._v("#")]),e._v(" ARE Components")]),e._v(" "),t("p",[e._v("The ARE consist of the following main parts:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("The ARE middleware")])]),e._v(" "),t("li",[t("p",[e._v("ARE plugins (also referred to as “components”) – sensor, processor and actuator modules which provide functional building blocks for assistive functionalities")])]),e._v(" "),t("li",[t("p",[e._v("A service layer which provides infrastructure to the ARE components,"),t("br"),e._v("\nfor example COM port and communication management for connection of the Communication Interface Modules (CIMs)")])])]),e._v(" "),t("p",[e._v("The ARE is commonly deployed on an embedded device, running an appropriate operating system (OS), typically an embedded variant of Windows. On top of the OS, an appropriate Java Virtual Machine (JVM) is used to host the OSGi component framework which provides support for modularity and dynamic loading/unloading of components.")]),e._v(" "),t("p",[e._v("All the core components of the framework (described in detail later) are defined as OSGi modules. Certain components that need to access legacy code (e.g., written in C or C++) are also deployed on top of OSGi, and are interfaced to the native code using Java Native Interface (JNI) as needed. In this regard, and with the exception of the pluggable components that use native code interfaces with platform-specific JNI bindings, the ARE middleware is expected to be "),t("em",[e._v("platform independent")]),e._v(".")]),e._v(" "),t("p",[e._v("The implementation requires basically JAVA 1.7 (JDK/JRE 7) and an OSGi framework (which is part of the source code downloads).")]),e._v(" "),t("h2",{attrs:{id:"about-osgi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-osgi"}},[e._v("#")]),e._v(" About OSGi")]),e._v(" "),t("p",[e._v("The Open Service Gateway initiative (OSGi) is an open specification that enables the modular assembly of software built with the Java technology [3]. The OSGi Service Platform facilitates the componentization of software modules and applications and assures interoperability of applications and services over a variety of networked devices.")]),e._v(" "),t("p",[e._v("OSGi technology is the dynamic module system for Java™. Java provides the portability that is required to support products on many different platforms. The OSGi technology provides the standardized primitives that allow applications to be constructed from small, reusable and collaborative components. These components can be composed into an application and deployed; The OSGi Service Platform provides a service-oriented architecture that enables these components to dynamically discover each other for collaboration, and thereby forms the optimal basis for the AsTeRICS middleware.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/11.968d785a.js b/assets/js/11.641d5d65.js similarity index 99% rename from assets/js/11.968d785a.js rename to assets/js/11.641d5d65.js index 42871b0ec9..2ff4b12c7d 100644 --- a/assets/js/11.968d785a.js +++ b/assets/js/11.641d5d65.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{278:function(t,e,a){},279:function(t,e,a){},284:function(t,e,a){"use strict";a(278)},285:function(t,e,a){var s=a(17),i=a(9),n=a(16);t.exports=function(t){return"string"==typeof t||!i(t)&&n(t)&&"[object String]"==s(t)}},286:function(t,e){t.exports=function(t){return null==t}},287:function(t,e,a){"use strict";a(279)},330:function(t,e,a){"use strict";var s={name:"FancyLink",props:{path:{type:String,required:!0},icon:{type:Array,default:["fas","question"]}},computed:{valid(){return void 0!==this.$site.pages.find(({regularPath:t})=>t===this.path)},target(){return this.valid?this.path:"#"}}},i=a(2),n={name:"PageEdit",components:{FancyLink:Object(i.a)(s,(function(){var t=this._self._c;return t("router-link",{staticClass:"fancy-link",attrs:{to:this.target,target:this.valid?"_blank":"",rel:this.valid?"noopener":""}},[t("font-awesome-icon",{attrs:{icon:this.icon}})],1)}),[],!1,null,"1adcbc30",null).exports},computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"},editPreambleText(){return this.$themeLocaleConfig.editPreambleText||this.$site.themeConfig.editPreambleText||""}}},r=(a(284),Object(i.a)(n,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.$page.editLink?e("div",{staticClass:"edit-link"},[t.editPreambleText?e("div",{staticClass:"edit-preamble"},[t._v(t._s(t.editPreambleText))]):t._e(),t._v(" "),e("div",{staticClass:"edit-text"},[e("a",{attrs:{href:t.$page.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink"),t._v(" "),e("span",{staticClass:"edit-guides"},[e("FancyLink",{attrs:{id:"editor-guide",path:"/guide/editor.html",icon:["fas","pencil-alt"],title:"Open Website Editor Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"markdown-guide",path:"/guide/markdown.html",icon:["fab","markdown"],title:"Open Website Markdown Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"developer-guide",path:"/guide/docs.html",icon:["fas","info-circle"],title:"Open Website Developer Guide"}})],1)],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("div",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText))]),t._v(" "),e("div",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null));e.a=r.exports},331:function(t,e,a){"use strict";a(111);var s=a(276),i=a(285),n=a.n(i),r=a(286),o=a.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(d.PREV,this)},next(){return c(d.NEXT,this)}}};const d={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:a,$route:i,$site:r,sidebarItems:l}){const{resolveLink:d,getThemeLinkConfig:c,getPageLinkConfig:p}=t,u=c(e),h=p(a),g=o()(h)?u:h;return!1===g?void 0:n()(g)?Object(s.i)(r.pages,g,i.path):d(a,l)}function p(t,e,a){const s=[];!function t(e,a){for(let s=0,i=e.length;s({isSidebarOpen:!1}),computed:{...Object(s.b)(["settings"]),shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(h.j)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1,this.$store.commit("hideSettings")})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},v=Object(n.a)(g,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}]}):e("Page",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{278:function(t,e,a){},279:function(t,e,a){},284:function(t,e,a){"use strict";a(278)},285:function(t,e,a){var s=a(17),i=a(9),n=a(16);t.exports=function(t){return"string"==typeof t||!i(t)&&n(t)&&"[object String]"==s(t)}},286:function(t,e){t.exports=function(t){return null==t}},287:function(t,e,a){"use strict";a(279)},330:function(t,e,a){"use strict";var s={name:"FancyLink",props:{path:{type:String,required:!0},icon:{type:Array,default:["fas","question"]}},computed:{valid(){return void 0!==this.$site.pages.find(({regularPath:t})=>t===this.path)},target(){return this.valid?this.path:"#"}}},i=a(2),n={name:"PageEdit",components:{FancyLink:Object(i.a)(s,(function(){var t=this._self._c;return t("router-link",{staticClass:"fancy-link",attrs:{to:this.target,target:this.valid?"_blank":"",rel:this.valid?"noopener":""}},[t("font-awesome-icon",{attrs:{icon:this.icon}})],1)}),[],!1,null,"1adcbc30",null).exports},computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"},editPreambleText(){return this.$themeLocaleConfig.editPreambleText||this.$site.themeConfig.editPreambleText||""}}},r=(a(284),Object(i.a)(n,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.$page.editLink?e("div",{staticClass:"edit-link"},[t.editPreambleText?e("div",{staticClass:"edit-preamble"},[t._v(t._s(t.editPreambleText))]):t._e(),t._v(" "),e("div",{staticClass:"edit-text"},[e("a",{attrs:{href:t.$page.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink"),t._v(" "),e("span",{staticClass:"edit-guides"},[e("FancyLink",{attrs:{id:"editor-guide",path:"/guide/editor.html",icon:["fas","pencil-alt"],title:"Open Website Editor Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"markdown-guide",path:"/guide/markdown.html",icon:["fab","markdown"],title:"Open Website Markdown Guide"}}),t._v(" "),e("FancyLink",{attrs:{id:"developer-guide",path:"/guide/docs.html",icon:["fas","info-circle"],title:"Open Website Developer Guide"}})],1)],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("div",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText))]),t._v(" "),e("div",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null));e.a=r.exports},331:function(t,e,a){"use strict";a(111);var s=a(276),i=a(285),n=a.n(i),r=a(286),o=a.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(d.PREV,this)},next(){return c(d.NEXT,this)}}};const d={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:a,$route:i,$site:r,sidebarItems:l}){const{resolveLink:d,getThemeLinkConfig:c,getPageLinkConfig:p}=t,u=c(e),h=p(a),g=o()(h)?u:h;return!1===g?void 0:n()(g)?Object(s.i)(r.pages,g,i.path):d(a,l)}function p(t,e,a){const s=[];!function t(e,a){for(let s=0,i=e.length;s({isSidebarOpen:!1}),computed:{...Object(s.b)(["settings"]),shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(h.j)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1,this.$store.commit("hideSettings")})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},v=Object(n.a)(g,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}]}):e("Page",{directives:[{name:"show",rawName:"v-show",value:!t.settings.page.settings.display,expression:"!settings.page.settings.display"}],attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file diff --git a/assets/js/109.8feda814.js b/assets/js/110.c6a81ff1.js similarity index 99% rename from assets/js/109.8feda814.js rename to assets/js/110.c6a81ff1.js index 9c4bad806f..a21fed7812 100644 --- a/assets/js/109.8feda814.js +++ b/assets/js/110.c6a81ff1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{302:function(t,a,s){t.exports=s.p+"assets/img/DeveloperManual_html_17298a48a6d250c5.fbefb96e.png"},947:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"plugin-advanced"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-advanced"}},[t._v("#")]),t._v(" Plugin Advanced")]),t._v(" "),a("h2",{attrs:{id:"writing-asterics-plugin-code"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#writing-asterics-plugin-code"}},[t._v("#")]),t._v(" Writing AsTeRICS Plugin Code")]),t._v(" "),a("h3",{attrs:{id:"are-coding-guidelines"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#are-coding-guidelines"}},[t._v("#")]),t._v(" ARE Coding Guidelines")]),t._v(" "),a("p",[t._v("Coding guidelines are necessary to allow new developers to quickly find their through the code of the ARE. They are created in such a way to provide means for developers to understand code of each other but they also make sure that non-technical users can find their way through a model in ACS.")]),t._v(" "),a("p",[t._v("If you use Eclipse as IDE, "),a("strong",[t._v("you can import predefined clean up, code template and formatting settings")]),t._v(", which cover some of the coding guidelines (see 4.1.1).")]),t._v(" "),a("p",[t._v("The basic coding guidelines are:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("Plugins, ports and properties should be named intuitively in the bundle descriptor. Only if necessary, the corresponding variables in the plugin code should be named differently. However they should adhere to the naming conventions stated in section 4.1.3 and different names should be commented in the code sections which translate the name into the variable (getInputPort(), getRuntimeProperty() …)")])]),t._v(" "),a("li",[a("p",[t._v("Variable names should always use the Java naming conventions")])]),t._v(" "),a("li",[a("p",[t._v("Every method should be preceded by a JavaDoc compatible header in order to allow new developer to grasp what is going on in it")])]),t._v(" "),a("li",[a("p",[t._v("Where reasonable code comments should be added to improve understanding of code internals")])]),t._v(" "),a("li",[a("p",[t._v("Code should be indented by four spaces per indentations stage. Indentations should be done using space and "),a("strong",[t._v("not tabs")]),t._v(". Tabs should be converted to spaces.")])]),t._v(" "),a("li",[a("p",[t._v("Opening parentheses should be placed in the same line")])])]),t._v(" "),a("h2",{attrs:{id:"eclipse-code-style-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#eclipse-code-style-settings"}},[t._v("#")]),t._v(" Eclipse Code Style Settings")]),t._v(" "),a("p",[t._v("If you use Eclipse as IDE, you can import predefined clean up, code template and formatting settings. The files are located in the AsTeRICS/ARE folder of the checkout github repository.")]),t._v(" "),a("ul",[a("li",[a("p",[a("strong",[t._v("Eclipse - Code Style - Clean Up.xml")]),t._v(": Definitions for cleanup, e.g. remove unused imports and unused variables")])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Eclipse - Code Style - Code Templates.xml")]),t._v(": Contains default file header including license information (see 4.1.5) and default class comment (see 4.1.6).")])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Eclipse - Code Style - Formatter.xml")]),t._v(": Contains code formatting definitions e.g. 4 spaces instead of tabs.")])])]),t._v(" "),a("p",[t._v("You can import the settings by")]),t._v(" "),a("ol",[a("li",[a("p",[t._v("selecting the project folder and clicking right mouse button")])]),t._v(" "),a("li",[a("p",[t._v("opening ‘Properties’ entry of popup menu")])]),t._v(" "),a("li",[a("p",[t._v("Opening ‘Java Code Style’/Clean Up|Code Templates|Formatter respectively")])])]),t._v(" "),a("h2",{attrs:{id:"port-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#port-naming-conventions"}},[t._v("#")]),t._v(" Port Naming Conventions")]),t._v(" "),a("p",[t._v("Variables of port instances should be named with a prefix indicating what kind of port it is. The rest of the port name should indicate the port’s use and adhere to the standard Java variable naming conventions. The available prefixes are:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("ip: indicates that the port is an instance of IRuntimeInputPort")])]),t._v(" "),a("li",[a("p",[t._v("op: indicates that the port is an instance of IRuntimeOutputPort")])]),t._v(" "),a("li",[a("p",[t._v("elp: indicates that the port is an instance of IRuntimeEventListenerPort")])]),t._v(" "),a("li",[a("p",[t._v("etp: indicates that the port is an instance of IRuntimeEventTriggererPort")])])]),t._v(" "),a("p",[t._v("A variable holding an event listener port could therefore be named "),a("em",[t._v("elpKeyPressed")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"property-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#property-naming-conventions"}},[t._v("#")]),t._v(" Property Naming Conventions")]),t._v(" "),a("p",[t._v("Plugin properties should be directly mapped to a variable in the plugin code. The variable’s should be prepended with the prefix "),a("em",[t._v("prop")]),t._v(" and adhere to standard Java naming conventions. Thus a property could be named "),a("em",[t._v("InputGainValue")]),t._v(" and the corresponding variable should be named "),a("em",[t._v("propInputGainValue")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"bundle-descriptor-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bundle-descriptor-naming-conventions"}},[t._v("#")]),t._v(" Bundle Descriptor Naming Conventions")]),t._v(" "),a("p",[t._v("The bundle descriptor should serve as an abstraction layer between the user who creates models in the ACS and the developer. Thus the names for plugins, ports and properties in the bundle descriptor should be as intuitive as possible. Names in the bundle descriptor should not include prefixes because the added information is also conveyed in the presentation of plugins in the ACS.")]),t._v(" "),a("p",[t._v("The bundle descriptor can translate intuitive names (e.g. input.switch) to the canonical names of plugins (e.g. GpioInputInstance) allowing coexistence of a user and a developer language. This method of name translation can be applied for plugin names, port names and property names.")]),t._v(" "),a("h2",{attrs:{id:"asterics-are-service-and-plugin-source-file-header"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#asterics-are-service-and-plugin-source-file-header"}},[t._v("#")]),t._v(" AsTeRICS ARE, service and plugin source file header")]),t._v(" "),a("p",[t._v("Each source file of ARE, of ARE services, ARE plugins and tools which will be released as open source should have the following header:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('/*\n * AsTeRICS - Assistive Technology Rapid Integration and Construction Set\n * \n * \n * d8888 88888888888 8888888b. 8888888 .d8888b. .d8888b. \n * d88888 888 888 Y88b 888 d88P Y88b d88P Y88b\n * d88P888 888 888 888 888 888 888 Y88b. \n * d88P 888 .d8888b 888 .d88b. 888 d88P 888 888 "Y888b. \n * d88P 888 88K 888 d8P Y8b 8888888P" 888 888 "Y88b.\n * d88P 888 "Y8888b. 888 88888888 888 T88b 888 888 888 "888\n * d8888888888 X88 888 Y8b. 888 T88b 888 Y88b d88P Y88b d88P\n * d88P 888 88888P\' 888 "Y8888 888 T88b 8888888 "Y8888P" "Y8888P" \n *\n *\n * homepage: http://www.asterics.org \n *\n * This project has been partly funded by the European Commission, \n * Grant Agreement Number 247730\n * \n * \n * Dual License: MIT or GPL v3.0 with "CLASSPATH" exception\n * (please refer to the folder LICENSE)\n * \n */')]),t._v("\n")])])]),a("h2",{attrs:{id:"javadoc-compatible-comments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#javadoc-compatible-comments"}},[t._v("#")]),t._v(" JavaDoc compatible comments")]),t._v(" "),a("p",[t._v("JavaDoc compatible comments should be used to indicate the author of a source file, and to describe the purpose of a function/method/class and the respective parameters and return values.")]),t._v(" "),a("p",[t._v("Example for a source file header info:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Bardisplayinstance.java\n * Purpose of this module:\n * Implements the Bardisplay actuator plugin\n * \n * @author Chris Veigl [veigl@technikum-wien.at]\n * Date: Mar 7, 2011\n */")]),t._v("\n")])])]),a("p",[t._v("Example for a method of a class:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n* Returns the value of the given property\n* @param propertyName the name of the property\n* @return the property value\n*/")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"implementing-asterics-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementing-asterics-components"}},[t._v("#")]),t._v(" Implementing AsTeRICS components")]),t._v(" "),a("p",[t._v("This section describes the basic steps required for implementing an AsTeRICS component including a brief introduction to OSGi. To illustrate the implementation steps, we take a walk-through with the implementation of a simple processor component.")]),t._v(" "),a("p",[t._v("The AsTeRICS schemata of the XML descriptors include two concepts: the "),a("em",[t._v("bundle descriptors")]),t._v(" and the "),a("em",[t._v("deployment descriptors")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"the-bundle-descriptors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-bundle-descriptors"}},[t._v("#")]),t._v(" The Bundle Descriptors")]),t._v(" "),a("p",[t._v("Bundle descriptors are used to describe the content of an individual bundle (typically encapsulating one or more components). As such, they contain information about the included "),a("em",[t._v("components")]),t._v(", their "),a("em",[t._v("ports")]),t._v(", their customizable "),a("em",[t._v("properties")]),t._v(" and optionally their GUI.")]),t._v(" "),a("p",[t._v("The following shows a bundle descriptor of a simple processor-plugin (subtype for the ACS components menu is “Basic Math”). The plugin provides an averaging function for n values (property “buffer-size”) and has one input port and one output port for integer values:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentTypes")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentType")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.averager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("canonical_name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("eu.asterics.component.processor.averager.AveragerComponent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("subtype")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Basic Math"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("processor"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Linked list-based averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Input port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("multiplicity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("one-to-one"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mustBeConnected")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("out_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Output port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("buffer-size"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("50"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("The size of the averager's buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-deployment-descriptor"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-deployment-descriptor"}},[t._v("#")]),t._v(" The Deployment Descriptor")]),t._v(" "),a("p",[t._v("Deployment descriptors instruct the ARE of the desired application deployment structure. The deployment descriptor is typically composed in the AsTeRICS Configuration Suite (ACS) but can also be written with a text editor (as the bundle descriptor). Basically the deployment descriptor contains several component descriptions (copied from the corresponding bundle descriptors), actual property values and the channel connection between input- and output ports of the components.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The "),a("em",[t._v("type_id")]),t._v(" argument of the "),a("em",[t._v("component")]),t._v(" element in the deployment descriptor must match the "),a("em",[t._v("id")]),t._v(" argument of the "),a("em",[t._v("componentType")]),t._v(" element on the bundle descriptor. This is how the ARE detects the referred plugin type in the deployment model.")])]),t._v(" "),a("p",[t._v("The following demo deployment descriptor describes a simple model containing two plugins and one channel:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("model")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("deployment_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("components")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Source of two signal cahnnels "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Signal Target"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channels")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channel")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("channel.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Connects SignalSource.1 (outport 1) \n to SignalTarget.1 (in_x)"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("source")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-manifest-file"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-manifest-file"}},[t._v("#")]),t._v(" The Manifest file")]),t._v(" "),a("p",[t._v("The Manifest file tells the bundle name and other informations like import packages and .dlls to the OSGi. A typical Manifest looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-processors.averager\nBundle-SymbolicName: eu.asterics.component.processor.averager\nBundle-Version: 0.1.0\nDynamicImport-Package: *\n\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The empty line at the end of the Manifest file. It seems that OSGi needs that empty line in order to work properly.")])]),t._v(" "),a("h2",{attrs:{id:"structure-of-osgi-bundles-containing-are-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-osgi-bundles-containing-are-components"}},[t._v("#")]),t._v(" Structure of OSGi bundles containing ARE components")]),t._v(" "),a("p",[t._v("As a common OSGi bundle, an AsTeRICS component must be packaged in a JAR file, containing the class files (object code) and the Manifest file. In addition to these, the AsTeRICS middleware expects the "),a("em",[t._v("bundle descriptor")]),t._v(". At this point, it should be noted that it is possible to include "),a("em",[t._v("multiple")]),t._v(" AsTeRICS components in a single OSGi bundle, as long as the bundle descriptor describes all of them.")]),t._v(" "),a("p",[t._v("Overall, the file structure in a typical AsTeRICS bundle looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("/\n+- eu/\n +- asterics/\n +- component/\n +- ...\n+- lib/\n +- native/\n +- my_library.dll\n+- META-INF/\n +- MANIFEST.MF\n+- bundle_descriptor.xml\n")])])]),a("p",[t._v("The Java object code is included in the corresponding folders representing the package structure (e.g., “/eu/asterics/component/…” etc). Optionally, if libraries are needed - native or not-, then they are included in the “/lib” folder. The Manifest is included in the “META-INF” folder as per the standard Java/OSGi practice. Finally, the AsTeRICS bundle descriptor is included directly in the root of the JAR file (i.e. “/”).")]),t._v(" "),a("h2",{attrs:{id:"component-lifecyle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#component-lifecyle"}},[t._v("#")]),t._v(" Component lifecyle")]),t._v(" "),a("p",[t._v("An ARE component implementation needs to realise the actual component with its lifecycle (i.e., ways to access its ports and properties, and methods realizing its lifecycle). This is illustrated in the following code:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("runtime")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Lifecycle support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pause")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("resume")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Component support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeOutputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getOutputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventListenerPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventListenerPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventTriggererPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventTriggererPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" newValue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" syncedValuesReceived "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("img",{attrs:{src:s(302),alt:""}})]),t._v(" "),a("p",[t._v("The lifecycle support methods are used to intercept AsTeRICS events concerning the component’s lifecycle. In principle, a component can be any of the following:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("READY,")])]),t._v(" "),a("li",[a("p",[t._v("ACTIVE,")])]),t._v(" "),a("li",[a("p",[t._v("SUSPENDED and")])]),t._v(" "),a("li",[a("p",[t._v("STOPPED")])])]),t._v(" "),a("p",[t._v("These states and their possible transitions are illustrated in the figure on the right:")]),t._v(" "),a("p",[t._v("The rest of the methods are used for supporting the component operations, namely accessing the input/output ports of the component, as well as getting/setting its supported properties.")]),t._v(" "),a("h2",{attrs:{id:"threading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#threading"}},[t._v("#")]),t._v(" Threading")]),t._v(" "),a("p",[t._v("For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"writing-plugins-using-swing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#writing-plugins-using-swing"}},[t._v("#")]),t._v(" Writing plugins using Swing")]),t._v(" "),a("p",[t._v("If a plugin provides a Swing GUI it should only use the asynchronous method")]),t._v(" "),a("p",[a("code",[t._v("SwingUtilities.invokeLater(…)")])]),t._v(" "),a("p",[t._v("(and not the synchronous one) to perform the GUI updates. This is to prevent a potential thread deadlock if an action was originally triggered by a Swing GUI event e.g. by a button click in the ARE GUI. For detailed information about the ARE threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"long-lasting-method-calls"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#long-lasting-method-calls"}},[t._v("#")]),t._v(" Long lasting method calls")]),t._v(" "),a("p",[t._v("If a method call performs a long lasting task and there is no need to await the termination of it, the task should be handed over to a worker thread (see 5.9) to not block ModelExecutor thread. For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"sensor-callbacks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sensor-callbacks"}},[t._v("#")]),t._v(" Sensor callbacks")]),t._v(" "),a("p",[t._v("In case you write a plugin that uses a separate thread to generate data (e.g. FrameGrabber, Timer,…) you should explicitly use the method")]),t._v(" "),a("p",[a("code",[t._v("AstericsModelExecutionThreadPool.instance.execute(…)")])]),t._v(" "),a("p",[t._v("This is to ensure that corresponding data will be delivered within the same task execution. For detailed information about the threading concept see 9. Below is an example of the FacetrackerLK plugin in the callback method for new arriving coordinates:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("newCoordinates_callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsModelExecutionThreadPool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Runnable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n opNoseX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opNoseY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"contributing-a-developed-plugin-git-pull-request"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing-a-developed-plugin-git-pull-request"}},[t._v("#")]),t._v(" Contributing a developed plugin (git pull request)")]),t._v(" "),a("p",[t._v("The AsTeRICS platform is designed as an open and modular platform. The idea is to make it easy for others to develop assistive plugins any end-user in the world could benefit from. Hence, we would love to get your contribution back to the github repository to be able to ship the new plugin with future releases. For this purpose, please send a pull request.")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://help.github.com/articles/using-pull-requests/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://help.github.com/articles/using-pull-requests/"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{302:function(t,a,s){t.exports=s.p+"assets/img/DeveloperManual_html_17298a48a6d250c5.fbefb96e.png"},949:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"plugin-advanced"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-advanced"}},[t._v("#")]),t._v(" Plugin Advanced")]),t._v(" "),a("h2",{attrs:{id:"writing-asterics-plugin-code"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#writing-asterics-plugin-code"}},[t._v("#")]),t._v(" Writing AsTeRICS Plugin Code")]),t._v(" "),a("h3",{attrs:{id:"are-coding-guidelines"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#are-coding-guidelines"}},[t._v("#")]),t._v(" ARE Coding Guidelines")]),t._v(" "),a("p",[t._v("Coding guidelines are necessary to allow new developers to quickly find their through the code of the ARE. They are created in such a way to provide means for developers to understand code of each other but they also make sure that non-technical users can find their way through a model in ACS.")]),t._v(" "),a("p",[t._v("If you use Eclipse as IDE, "),a("strong",[t._v("you can import predefined clean up, code template and formatting settings")]),t._v(", which cover some of the coding guidelines (see 4.1.1).")]),t._v(" "),a("p",[t._v("The basic coding guidelines are:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("Plugins, ports and properties should be named intuitively in the bundle descriptor. Only if necessary, the corresponding variables in the plugin code should be named differently. However they should adhere to the naming conventions stated in section 4.1.3 and different names should be commented in the code sections which translate the name into the variable (getInputPort(), getRuntimeProperty() …)")])]),t._v(" "),a("li",[a("p",[t._v("Variable names should always use the Java naming conventions")])]),t._v(" "),a("li",[a("p",[t._v("Every method should be preceded by a JavaDoc compatible header in order to allow new developer to grasp what is going on in it")])]),t._v(" "),a("li",[a("p",[t._v("Where reasonable code comments should be added to improve understanding of code internals")])]),t._v(" "),a("li",[a("p",[t._v("Code should be indented by four spaces per indentations stage. Indentations should be done using space and "),a("strong",[t._v("not tabs")]),t._v(". Tabs should be converted to spaces.")])]),t._v(" "),a("li",[a("p",[t._v("Opening parentheses should be placed in the same line")])])]),t._v(" "),a("h2",{attrs:{id:"eclipse-code-style-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#eclipse-code-style-settings"}},[t._v("#")]),t._v(" Eclipse Code Style Settings")]),t._v(" "),a("p",[t._v("If you use Eclipse as IDE, you can import predefined clean up, code template and formatting settings. The files are located in the AsTeRICS/ARE folder of the checkout github repository.")]),t._v(" "),a("ul",[a("li",[a("p",[a("strong",[t._v("Eclipse - Code Style - Clean Up.xml")]),t._v(": Definitions for cleanup, e.g. remove unused imports and unused variables")])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Eclipse - Code Style - Code Templates.xml")]),t._v(": Contains default file header including license information (see 4.1.5) and default class comment (see 4.1.6).")])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Eclipse - Code Style - Formatter.xml")]),t._v(": Contains code formatting definitions e.g. 4 spaces instead of tabs.")])])]),t._v(" "),a("p",[t._v("You can import the settings by")]),t._v(" "),a("ol",[a("li",[a("p",[t._v("selecting the project folder and clicking right mouse button")])]),t._v(" "),a("li",[a("p",[t._v("opening ‘Properties’ entry of popup menu")])]),t._v(" "),a("li",[a("p",[t._v("Opening ‘Java Code Style’/Clean Up|Code Templates|Formatter respectively")])])]),t._v(" "),a("h2",{attrs:{id:"port-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#port-naming-conventions"}},[t._v("#")]),t._v(" Port Naming Conventions")]),t._v(" "),a("p",[t._v("Variables of port instances should be named with a prefix indicating what kind of port it is. The rest of the port name should indicate the port’s use and adhere to the standard Java variable naming conventions. The available prefixes are:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("ip: indicates that the port is an instance of IRuntimeInputPort")])]),t._v(" "),a("li",[a("p",[t._v("op: indicates that the port is an instance of IRuntimeOutputPort")])]),t._v(" "),a("li",[a("p",[t._v("elp: indicates that the port is an instance of IRuntimeEventListenerPort")])]),t._v(" "),a("li",[a("p",[t._v("etp: indicates that the port is an instance of IRuntimeEventTriggererPort")])])]),t._v(" "),a("p",[t._v("A variable holding an event listener port could therefore be named "),a("em",[t._v("elpKeyPressed")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"property-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#property-naming-conventions"}},[t._v("#")]),t._v(" Property Naming Conventions")]),t._v(" "),a("p",[t._v("Plugin properties should be directly mapped to a variable in the plugin code. The variable’s should be prepended with the prefix "),a("em",[t._v("prop")]),t._v(" and adhere to standard Java naming conventions. Thus a property could be named "),a("em",[t._v("InputGainValue")]),t._v(" and the corresponding variable should be named "),a("em",[t._v("propInputGainValue")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"bundle-descriptor-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bundle-descriptor-naming-conventions"}},[t._v("#")]),t._v(" Bundle Descriptor Naming Conventions")]),t._v(" "),a("p",[t._v("The bundle descriptor should serve as an abstraction layer between the user who creates models in the ACS and the developer. Thus the names for plugins, ports and properties in the bundle descriptor should be as intuitive as possible. Names in the bundle descriptor should not include prefixes because the added information is also conveyed in the presentation of plugins in the ACS.")]),t._v(" "),a("p",[t._v("The bundle descriptor can translate intuitive names (e.g. input.switch) to the canonical names of plugins (e.g. GpioInputInstance) allowing coexistence of a user and a developer language. This method of name translation can be applied for plugin names, port names and property names.")]),t._v(" "),a("h2",{attrs:{id:"asterics-are-service-and-plugin-source-file-header"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#asterics-are-service-and-plugin-source-file-header"}},[t._v("#")]),t._v(" AsTeRICS ARE, service and plugin source file header")]),t._v(" "),a("p",[t._v("Each source file of ARE, of ARE services, ARE plugins and tools which will be released as open source should have the following header:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('/*\n * AsTeRICS - Assistive Technology Rapid Integration and Construction Set\n * \n * \n * d8888 88888888888 8888888b. 8888888 .d8888b. .d8888b. \n * d88888 888 888 Y88b 888 d88P Y88b d88P Y88b\n * d88P888 888 888 888 888 888 888 Y88b. \n * d88P 888 .d8888b 888 .d88b. 888 d88P 888 888 "Y888b. \n * d88P 888 88K 888 d8P Y8b 8888888P" 888 888 "Y88b.\n * d88P 888 "Y8888b. 888 88888888 888 T88b 888 888 888 "888\n * d8888888888 X88 888 Y8b. 888 T88b 888 Y88b d88P Y88b d88P\n * d88P 888 88888P\' 888 "Y8888 888 T88b 8888888 "Y8888P" "Y8888P" \n *\n *\n * homepage: http://www.asterics.org \n *\n * This project has been partly funded by the European Commission, \n * Grant Agreement Number 247730\n * \n * \n * Dual License: MIT or GPL v3.0 with "CLASSPATH" exception\n * (please refer to the folder LICENSE)\n * \n */')]),t._v("\n")])])]),a("h2",{attrs:{id:"javadoc-compatible-comments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#javadoc-compatible-comments"}},[t._v("#")]),t._v(" JavaDoc compatible comments")]),t._v(" "),a("p",[t._v("JavaDoc compatible comments should be used to indicate the author of a source file, and to describe the purpose of a function/method/class and the respective parameters and return values.")]),t._v(" "),a("p",[t._v("Example for a source file header info:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Bardisplayinstance.java\n * Purpose of this module:\n * Implements the Bardisplay actuator plugin\n * \n * @author Chris Veigl [veigl@technikum-wien.at]\n * Date: Mar 7, 2011\n */")]),t._v("\n")])])]),a("p",[t._v("Example for a method of a class:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n* Returns the value of the given property\n* @param propertyName the name of the property\n* @return the property value\n*/")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"implementing-asterics-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementing-asterics-components"}},[t._v("#")]),t._v(" Implementing AsTeRICS components")]),t._v(" "),a("p",[t._v("This section describes the basic steps required for implementing an AsTeRICS component including a brief introduction to OSGi. To illustrate the implementation steps, we take a walk-through with the implementation of a simple processor component.")]),t._v(" "),a("p",[t._v("The AsTeRICS schemata of the XML descriptors include two concepts: the "),a("em",[t._v("bundle descriptors")]),t._v(" and the "),a("em",[t._v("deployment descriptors")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"the-bundle-descriptors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-bundle-descriptors"}},[t._v("#")]),t._v(" The Bundle Descriptors")]),t._v(" "),a("p",[t._v("Bundle descriptors are used to describe the content of an individual bundle (typically encapsulating one or more components). As such, they contain information about the included "),a("em",[t._v("components")]),t._v(", their "),a("em",[t._v("ports")]),t._v(", their customizable "),a("em",[t._v("properties")]),t._v(" and optionally their GUI.")]),t._v(" "),a("p",[t._v("The following shows a bundle descriptor of a simple processor-plugin (subtype for the ACS components menu is “Basic Math”). The plugin provides an averaging function for n values (property “buffer-size”) and has one input port and one output port for integer values:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentTypes")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentType")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.averager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("canonical_name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("eu.asterics.component.processor.averager.AveragerComponent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("subtype")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Basic Math"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("processor"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Linked list-based averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Input port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("multiplicity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("one-to-one"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mustBeConnected")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("out_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Output port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("buffer-size"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("50"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("The size of the averager's buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-deployment-descriptor"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-deployment-descriptor"}},[t._v("#")]),t._v(" The Deployment Descriptor")]),t._v(" "),a("p",[t._v("Deployment descriptors instruct the ARE of the desired application deployment structure. The deployment descriptor is typically composed in the AsTeRICS Configuration Suite (ACS) but can also be written with a text editor (as the bundle descriptor). Basically the deployment descriptor contains several component descriptions (copied from the corresponding bundle descriptors), actual property values and the channel connection between input- and output ports of the components.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The "),a("em",[t._v("type_id")]),t._v(" argument of the "),a("em",[t._v("component")]),t._v(" element in the deployment descriptor must match the "),a("em",[t._v("id")]),t._v(" argument of the "),a("em",[t._v("componentType")]),t._v(" element on the bundle descriptor. This is how the ARE detects the referred plugin type in the deployment model.")])]),t._v(" "),a("p",[t._v("The following demo deployment descriptor describes a simple model containing two plugins and one channel:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("model")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("deployment_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("components")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Source of two signal cahnnels "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Signal Target"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channels")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channel")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("channel.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Connects SignalSource.1 (outport 1) \n to SignalTarget.1 (in_x)"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("source")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-manifest-file"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-manifest-file"}},[t._v("#")]),t._v(" The Manifest file")]),t._v(" "),a("p",[t._v("The Manifest file tells the bundle name and other informations like import packages and .dlls to the OSGi. A typical Manifest looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-processors.averager\nBundle-SymbolicName: eu.asterics.component.processor.averager\nBundle-Version: 0.1.0\nDynamicImport-Package: *\n\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The empty line at the end of the Manifest file. It seems that OSGi needs that empty line in order to work properly.")])]),t._v(" "),a("h2",{attrs:{id:"structure-of-osgi-bundles-containing-are-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-osgi-bundles-containing-are-components"}},[t._v("#")]),t._v(" Structure of OSGi bundles containing ARE components")]),t._v(" "),a("p",[t._v("As a common OSGi bundle, an AsTeRICS component must be packaged in a JAR file, containing the class files (object code) and the Manifest file. In addition to these, the AsTeRICS middleware expects the "),a("em",[t._v("bundle descriptor")]),t._v(". At this point, it should be noted that it is possible to include "),a("em",[t._v("multiple")]),t._v(" AsTeRICS components in a single OSGi bundle, as long as the bundle descriptor describes all of them.")]),t._v(" "),a("p",[t._v("Overall, the file structure in a typical AsTeRICS bundle looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("/\n+- eu/\n +- asterics/\n +- component/\n +- ...\n+- lib/\n +- native/\n +- my_library.dll\n+- META-INF/\n +- MANIFEST.MF\n+- bundle_descriptor.xml\n")])])]),a("p",[t._v("The Java object code is included in the corresponding folders representing the package structure (e.g., “/eu/asterics/component/…” etc). Optionally, if libraries are needed - native or not-, then they are included in the “/lib” folder. The Manifest is included in the “META-INF” folder as per the standard Java/OSGi practice. Finally, the AsTeRICS bundle descriptor is included directly in the root of the JAR file (i.e. “/”).")]),t._v(" "),a("h2",{attrs:{id:"component-lifecyle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#component-lifecyle"}},[t._v("#")]),t._v(" Component lifecyle")]),t._v(" "),a("p",[t._v("An ARE component implementation needs to realise the actual component with its lifecycle (i.e., ways to access its ports and properties, and methods realizing its lifecycle). This is illustrated in the following code:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("runtime")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Lifecycle support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pause")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("resume")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Component support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeOutputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getOutputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventListenerPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventListenerPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventTriggererPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventTriggererPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" newValue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" syncedValuesReceived "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("img",{attrs:{src:s(302),alt:""}})]),t._v(" "),a("p",[t._v("The lifecycle support methods are used to intercept AsTeRICS events concerning the component’s lifecycle. In principle, a component can be any of the following:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("READY,")])]),t._v(" "),a("li",[a("p",[t._v("ACTIVE,")])]),t._v(" "),a("li",[a("p",[t._v("SUSPENDED and")])]),t._v(" "),a("li",[a("p",[t._v("STOPPED")])])]),t._v(" "),a("p",[t._v("These states and their possible transitions are illustrated in the figure on the right:")]),t._v(" "),a("p",[t._v("The rest of the methods are used for supporting the component operations, namely accessing the input/output ports of the component, as well as getting/setting its supported properties.")]),t._v(" "),a("h2",{attrs:{id:"threading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#threading"}},[t._v("#")]),t._v(" Threading")]),t._v(" "),a("p",[t._v("For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"writing-plugins-using-swing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#writing-plugins-using-swing"}},[t._v("#")]),t._v(" Writing plugins using Swing")]),t._v(" "),a("p",[t._v("If a plugin provides a Swing GUI it should only use the asynchronous method")]),t._v(" "),a("p",[a("code",[t._v("SwingUtilities.invokeLater(…)")])]),t._v(" "),a("p",[t._v("(and not the synchronous one) to perform the GUI updates. This is to prevent a potential thread deadlock if an action was originally triggered by a Swing GUI event e.g. by a button click in the ARE GUI. For detailed information about the ARE threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"long-lasting-method-calls"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#long-lasting-method-calls"}},[t._v("#")]),t._v(" Long lasting method calls")]),t._v(" "),a("p",[t._v("If a method call performs a long lasting task and there is no need to await the termination of it, the task should be handed over to a worker thread (see 5.9) to not block ModelExecutor thread. For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"sensor-callbacks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sensor-callbacks"}},[t._v("#")]),t._v(" Sensor callbacks")]),t._v(" "),a("p",[t._v("In case you write a plugin that uses a separate thread to generate data (e.g. FrameGrabber, Timer,…) you should explicitly use the method")]),t._v(" "),a("p",[a("code",[t._v("AstericsModelExecutionThreadPool.instance.execute(…)")])]),t._v(" "),a("p",[t._v("This is to ensure that corresponding data will be delivered within the same task execution. For detailed information about the threading concept see 9. Below is an example of the FacetrackerLK plugin in the callback method for new arriving coordinates:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("newCoordinates_callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsModelExecutionThreadPool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Runnable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n opNoseX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opNoseY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"contributing-a-developed-plugin-git-pull-request"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing-a-developed-plugin-git-pull-request"}},[t._v("#")]),t._v(" Contributing a developed plugin (git pull request)")]),t._v(" "),a("p",[t._v("The AsTeRICS platform is designed as an open and modular platform. The idea is to make it easy for others to develop assistive plugins any end-user in the world could benefit from. Hence, we would love to get your contribution back to the github repository to be able to ship the new plugin with future releases. For this purpose, please send a pull request.")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://help.github.com/articles/using-pull-requests/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://help.github.com/articles/using-pull-requests/"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/110.68aa748b.js b/assets/js/111.7d085339.js similarity index 99% rename from assets/js/110.68aa748b.js rename to assets/js/111.7d085339.js index 6af2b99b80..cf7d0cbc5e 100644 --- a/assets/js/110.68aa748b.js +++ b/assets/js/111.7d085339.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{424:function(t,s,a){t.exports=a.p+"assets/img/Websocket-echo-connection.441c16d0.jpg"},959:function(t,s,a){"use strict";a.r(s);var n=a(2),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"websocket-tutorial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#websocket-tutorial"}},[t._v("#")]),t._v(" Websocket Tutorial")]),t._v(" "),s("p",[t._v("In this tutorial you will learn how to use the AsTeRICS websocket functionality with Javascript from within a web client.")]),t._v(" "),s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("A web socket is defined as a two-way communication between the servers and the clients, which mean both the parties communicate and exchange data at the same time. The Websocket protocol is specified in the "),s("a",{attrs:{href:"https://tools.ietf.org/html/rfc6455",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC6455"),s("OutboundLink")],1),t._v(" and the corresponding client-side "),s("a",{attrs:{href:"https://www.w3.org/TR/websockets/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Websocket API"),s("OutboundLink")],1),t._v(" is defined by the W3C.\nFor more information about web sockets see the following tutorials")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mozilla - web sockets tutorial"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.tutorialspoint.com/websockets/websockets_overview.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tutorialspoint - web sockets tutorial"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("The AsTeRICS Runtime Environment (ARE) provides a websocket at "),s("code",[t._v("ws://localhost:8082/ws/astericsData")]),t._v(" which can be used to send data from a running AsTeRICS model to a web client or vice versa.")]),t._v(" "),s("h2",{attrs:{id:"example-1-web-socket-echo"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-1-web-socket-echo"}},[t._v("#")]),t._v(" Example 1 - Web socket echo")]),t._v(" "),s("p",[t._v("Sends a text message to the ARE model and echoes the sent message back to the web client.")]),t._v(" "),s("h3",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed and ARE running"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&processors/WebSocket.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebSocket plugin"),s("OutboundLink")],1)])]),t._v(" "),s("h3",{attrs:{id:"create-model-with-websocket-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-model-with-websocket-plugin"}},[t._v("#")]),t._v(" Create model with WebSocket plugin")]),t._v(" "),s("ol",[s("li",[t._v("Open the "),s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/?areBaseURI=http://localhost:8081",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebACS"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("Add a WebSocket plugin (Components tab, Processors/Web/WebSocket)")]),t._v(" "),s("li",[t._v("Connect the output port "),s("code",[t._v("OutA")]),t._v(" to its input port "),s("code",[t._v("InA")]),t._v(": This sends messages received from a websocket client back to the client.")]),t._v(" "),s("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),s("li",[t._v("Deploy model to ARE by clicking "),s("code",[t._v("Connect to ARE")]),t._v(" and "),s("code",[t._v("Upload Model")])]),t._v(" "),s("li",[t._v("Start model by clicking "),s("code",[t._v("Start Model")])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(424),alt:"Websocket plugin with output port OutA connected to input port InA"}})]),t._v(" "),s("h3",{attrs:{id:"create-web-page-with-web-socket-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-web-page-with-web-socket-client"}},[t._v("#")]),t._v(" Create web page with web socket client")]),t._v(" "),s("p",[t._v("Using a text editor, copy the following code and save it as websocket.html somewhere on your hard drive. Then simply open it in a browser. The page will automatically connect, send a message, display the response, and close the connection.")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token doctype"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("charset")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("utf-8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("WebSocket Test"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("language")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("javascript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}},[s("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Set URI of AsTERICS websocket.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" wsUri "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ws://localhost:8082/ws/astericsData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n This method is called on page load.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("init")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n output "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("testWebSocket")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Opens a connection to the specified web socket and defines callback functions.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("testWebSocket")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Instantiates and opens web socket. ")]),t._v("\n websocket "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebSocket")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wsUri"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onopen")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onOpen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onclose")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onClose")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onmessage")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onerror")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called as soon as the web socket was opened successfully.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onOpen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"CONNECTED"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doSend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"WebSocket rocks"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called as soon as the web socket was closed.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onClose")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DISCONNECTED"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called in case of a received message from the web socket server.\n */")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'RESPONSE: '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("close")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called in case of an error during connect or send.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ERROR: '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doSend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENT: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Actually sends the message to the web socket.")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" pre "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createElement")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n pre"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("style"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("wordWrap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"break-word"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n pre"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("innerHTML "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendChild")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pre"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Register function init to be called on page load.")]),t._v("\n window"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEventListener")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"load"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" init"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n ")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("WebSocket Test"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("h3",{attrs:{id:"resulting-output"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resulting-output"}},[t._v("#")]),t._v(" Resulting output")]),t._v(" "),s("p",[t._v("In case of success you should see something like this:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("WebSocket Test\n\nCONNECTED\n\nSENT: WebSocket rocks\n\nRESPONSE: WebSocket rocks\n\nDISCONNECTED\n")])])]),s("p",[t._v("In case of an error check if the ARE is running and the model with the WebSocket plugin is deployed and started.")]),t._v(" "),s("h2",{attrs:{id:"example-2-web-socket-demo-with-signal-data-live-chart"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-2-web-socket-demo-with-signal-data-live-chart"}},[t._v("#")]),t._v(" Example 2 - Web socket demo with signal data live chart")]),t._v(" "),s("p",[t._v("To try a more advanced web socket demo receiving signal data and visualizing it, please visit this "),s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/index.html#submenuSolutionDemos:asterics-networkio-websocket",target:"_blank",rel:"noopener noreferrer"}},[t._v("web socket demo"),s("OutboundLink")],1),t._v(" to see how it works.\nYou can also clone and edit the corresponding "),s("a",{attrs:{href:"https://github.com/asterics/asterics-networkio-websocket",target:"_blank",rel:"noopener noreferrer"}},[t._v("git repository"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"references"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&processors/WebSocket.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebSocket plugin"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mozilla - web sockets tutorial"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.tutorialspoint.com/websockets/websockets_overview.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tutorialspoint - web sockets tutorial"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://tools.ietf.org/html/rfc6455",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC6455"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.w3.org/TR/websockets/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Websocket API"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{424:function(t,s,a){t.exports=a.p+"assets/img/Websocket-echo-connection.441c16d0.jpg"},962:function(t,s,a){"use strict";a.r(s);var n=a(2),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"websocket-tutorial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#websocket-tutorial"}},[t._v("#")]),t._v(" Websocket Tutorial")]),t._v(" "),s("p",[t._v("In this tutorial you will learn how to use the AsTeRICS websocket functionality with Javascript from within a web client.")]),t._v(" "),s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("A web socket is defined as a two-way communication between the servers and the clients, which mean both the parties communicate and exchange data at the same time. The Websocket protocol is specified in the "),s("a",{attrs:{href:"https://tools.ietf.org/html/rfc6455",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC6455"),s("OutboundLink")],1),t._v(" and the corresponding client-side "),s("a",{attrs:{href:"https://www.w3.org/TR/websockets/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Websocket API"),s("OutboundLink")],1),t._v(" is defined by the W3C.\nFor more information about web sockets see the following tutorials")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mozilla - web sockets tutorial"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.tutorialspoint.com/websockets/websockets_overview.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tutorialspoint - web sockets tutorial"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("The AsTeRICS Runtime Environment (ARE) provides a websocket at "),s("code",[t._v("ws://localhost:8082/ws/astericsData")]),t._v(" which can be used to send data from a running AsTeRICS model to a web client or vice versa.")]),t._v(" "),s("h2",{attrs:{id:"example-1-web-socket-echo"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-1-web-socket-echo"}},[t._v("#")]),t._v(" Example 1 - Web socket echo")]),t._v(" "),s("p",[t._v("Sends a text message to the ARE model and echoes the sent message back to the web client.")]),t._v(" "),s("h3",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed and ARE running"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&processors/WebSocket.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebSocket plugin"),s("OutboundLink")],1)])]),t._v(" "),s("h3",{attrs:{id:"create-model-with-websocket-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-model-with-websocket-plugin"}},[t._v("#")]),t._v(" Create model with WebSocket plugin")]),t._v(" "),s("ol",[s("li",[t._v("Open the "),s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/?areBaseURI=http://localhost:8081",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebACS"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("Add a WebSocket plugin (Components tab, Processors/Web/WebSocket)")]),t._v(" "),s("li",[t._v("Connect the output port "),s("code",[t._v("OutA")]),t._v(" to its input port "),s("code",[t._v("InA")]),t._v(": This sends messages received from a websocket client back to the client.")]),t._v(" "),s("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),s("li",[t._v("Deploy model to ARE by clicking "),s("code",[t._v("Connect to ARE")]),t._v(" and "),s("code",[t._v("Upload Model")])]),t._v(" "),s("li",[t._v("Start model by clicking "),s("code",[t._v("Start Model")])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(424),alt:"Websocket plugin with output port OutA connected to input port InA"}})]),t._v(" "),s("h3",{attrs:{id:"create-web-page-with-web-socket-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-web-page-with-web-socket-client"}},[t._v("#")]),t._v(" Create web page with web socket client")]),t._v(" "),s("p",[t._v("Using a text editor, copy the following code and save it as websocket.html somewhere on your hard drive. Then simply open it in a browser. The page will automatically connect, send a message, display the response, and close the connection.")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token doctype"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("charset")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("utf-8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("WebSocket Test"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("language")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("javascript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}},[s("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Set URI of AsTERICS websocket.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" wsUri "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ws://localhost:8082/ws/astericsData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n This method is called on page load.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("init")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n output "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("testWebSocket")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Opens a connection to the specified web socket and defines callback functions.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("testWebSocket")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Instantiates and opens web socket. ")]),t._v("\n websocket "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebSocket")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wsUri"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onopen")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onOpen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onclose")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onClose")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onmessage")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onerror")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called as soon as the web socket was opened successfully.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onOpen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"CONNECTED"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doSend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"WebSocket rocks"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called as soon as the web socket was closed.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onClose")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DISCONNECTED"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called in case of a received message from the web socket server.\n */")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'RESPONSE: '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("close")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n Called in case of an error during connect or send.\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("evt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ERROR: '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" evt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doSend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENT: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Actually sends the message to the web socket.")]),t._v("\n websocket"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeToScreen")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" pre "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createElement")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n pre"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("style"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("wordWrap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"break-word"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n pre"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("innerHTML "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendChild")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pre"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Register function init to be called on page load.")]),t._v("\n window"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEventListener")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"load"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" init"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n ")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("WebSocket Test"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("h3",{attrs:{id:"resulting-output"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resulting-output"}},[t._v("#")]),t._v(" Resulting output")]),t._v(" "),s("p",[t._v("In case of success you should see something like this:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("WebSocket Test\n\nCONNECTED\n\nSENT: WebSocket rocks\n\nRESPONSE: WebSocket rocks\n\nDISCONNECTED\n")])])]),s("p",[t._v("In case of an error check if the ARE is running and the model with the WebSocket plugin is deployed and started.")]),t._v(" "),s("h2",{attrs:{id:"example-2-web-socket-demo-with-signal-data-live-chart"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-2-web-socket-demo-with-signal-data-live-chart"}},[t._v("#")]),t._v(" Example 2 - Web socket demo with signal data live chart")]),t._v(" "),s("p",[t._v("To try a more advanced web socket demo receiving signal data and visualizing it, please visit this "),s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/index.html#submenuSolutionDemos:asterics-networkio-websocket",target:"_blank",rel:"noopener noreferrer"}},[t._v("web socket demo"),s("OutboundLink")],1),t._v(" to see how it works.\nYou can also clone and edit the corresponding "),s("a",{attrs:{href:"https://github.com/asterics/asterics-networkio-websocket",target:"_blank",rel:"noopener noreferrer"}},[t._v("git repository"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"references"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&processors/WebSocket.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebSocket plugin"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mozilla - web sockets tutorial"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.tutorialspoint.com/websockets/websockets_overview.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tutorialspoint - web sockets tutorial"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://tools.ietf.org/html/rfc6455",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC6455"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.w3.org/TR/websockets/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Websocket API"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/111.3f3a9d60.js b/assets/js/112.4c9f4ae0.js similarity index 96% rename from assets/js/111.3f3a9d60.js rename to assets/js/112.4c9f4ae0.js index e16c1e5288..4fe86914f1 100644 --- a/assets/js/111.3f3a9d60.js +++ b/assets/js/112.4c9f4ae0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{425:function(e,t,r){e.exports=r.p+"assets/img/grid_default_en.e1d52b18.jpg"},963:function(e,t,r){"use strict";r.r(t);var i=r(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"dynamic-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-grid"}},[e._v("#")]),e._v(" Dynamic grid")]),e._v(" "),t("p",[e._v("This chapter is about the technical background of the dynamic grid system which visualizes grids and grid elements in AsTeRICS Grid.")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html#general"}},[e._v("General")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html#gridlist-and-gridjs"}},[e._v("GridList and grid.js")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html#repositioning-and-resizing-of-elements"}},[e._v("Repositioning and resizing of elements")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"general"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general"}},[e._v("#")]),e._v(" General")]),e._v(" "),t("p",[e._v("When opening AsTeRICS Grid in the main view the latest used grid is shown:")]),e._v(" "),t("p",[t("img",{attrs:{src:r(425),alt:"default grid"}})]),e._v(" "),t("p",[e._v("From a technical perspective this grid is a unordered list ("),t("code",[e._v("
    ")]),e._v(") where each list element ("),t("code",[e._v("
  • ")]),e._v(") represents a grid element. HTML representations for these grid elements are generated in "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/templates.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("templates.js"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"gridlist-and-grid-js"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gridlist-and-grid-js"}},[e._v("#")]),e._v(" GridList and grid.js")]),e._v(" "),t("p",[e._v("Positioning of the grid elements is done by the "),t("a",{attrs:{href:"https://github.com/klues/grid",target:"_blank",rel:"noopener noreferrer"}},[e._v("GridList library"),t("OutboundLink")],1),e._v(". It is initialized and used in the file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/grid.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("grid.js"),t("OutboundLink")],1),e._v(". All relevant code for functionalities like repositioning or resizing can be found there. Styling of the grid and it’s elements is done by the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/css/gridlist.css",target:"_blank",rel:"noopener noreferrer"}},[e._v("gridlist.css"),t("OutboundLink")],1),e._v(" stylesheet.")]),e._v(" "),t("p",[e._v("For undo and redo functionalities of the edit view "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/grid.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("grid.js"),t("OutboundLink")],1),e._v(" uses the functions of the file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/service/data/undoService.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("undoService.js"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"repositioning-and-resizing-of-elements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#repositioning-and-resizing-of-elements"}},[e._v("#")]),e._v(" Repositioning and resizing of elements")]),e._v(" "),t("p",[e._v("Repositioning of elements is already supported by default by the "),t("a",{attrs:{href:"https://github.com/klues/grid",target:"_blank",rel:"noopener noreferrer"}},[e._v("GridList library"),t("OutboundLink")],1),e._v(". For resizing of elements the "),t("a",{attrs:{href:"https://jqueryui.com/resizable/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Resizable"),t("OutboundLink")],1),e._v(" functionality of jQueryUI is used. The code for connecting jQueryUI Resizable with GridList can be found in the function "),t("code",[e._v("getResizeOptions()")]),e._v(" in the "),t("code",[e._v("resize")]),e._v(" handler about at "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/grid.js#L151",target:"_blank",rel:"noopener noreferrer"}},[e._v("grid.js:151"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/02_tools.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{426:function(e,t,r){e.exports=r.p+"assets/img/grid_default_en.e1d52b18.jpg"},967:function(e,t,r){"use strict";r.r(t);var i=r(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"dynamic-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-grid"}},[e._v("#")]),e._v(" Dynamic grid")]),e._v(" "),t("p",[e._v("This chapter is about the technical background of the dynamic grid system which visualizes grids and grid elements in AsTeRICS Grid.")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html#general"}},[e._v("General")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html#gridlist-and-gridjs"}},[e._v("GridList and grid.js")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html#repositioning-and-resizing-of-elements"}},[e._v("Repositioning and resizing of elements")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"general"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general"}},[e._v("#")]),e._v(" General")]),e._v(" "),t("p",[e._v("When opening AsTeRICS Grid in the main view the latest used grid is shown:")]),e._v(" "),t("p",[t("img",{attrs:{src:r(426),alt:"default grid"}})]),e._v(" "),t("p",[e._v("From a technical perspective this grid is a unordered list ("),t("code",[e._v("
      ")]),e._v(") where each list element ("),t("code",[e._v("
    • ")]),e._v(") represents a grid element. HTML representations for these grid elements are generated in "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/templates.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("templates.js"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"gridlist-and-grid-js"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gridlist-and-grid-js"}},[e._v("#")]),e._v(" GridList and grid.js")]),e._v(" "),t("p",[e._v("Positioning of the grid elements is done by the "),t("a",{attrs:{href:"https://github.com/klues/grid",target:"_blank",rel:"noopener noreferrer"}},[e._v("GridList library"),t("OutboundLink")],1),e._v(". It is initialized and used in the file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/grid.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("grid.js"),t("OutboundLink")],1),e._v(". All relevant code for functionalities like repositioning or resizing can be found there. Styling of the grid and it’s elements is done by the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/css/gridlist.css",target:"_blank",rel:"noopener noreferrer"}},[e._v("gridlist.css"),t("OutboundLink")],1),e._v(" stylesheet.")]),e._v(" "),t("p",[e._v("For undo and redo functionalities of the edit view "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/grid.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("grid.js"),t("OutboundLink")],1),e._v(" uses the functions of the file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/service/data/undoService.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("undoService.js"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"repositioning-and-resizing-of-elements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#repositioning-and-resizing-of-elements"}},[e._v("#")]),e._v(" Repositioning and resizing of elements")]),e._v(" "),t("p",[e._v("Repositioning of elements is already supported by default by the "),t("a",{attrs:{href:"https://github.com/klues/grid",target:"_blank",rel:"noopener noreferrer"}},[e._v("GridList library"),t("OutboundLink")],1),e._v(". For resizing of elements the "),t("a",{attrs:{href:"https://jqueryui.com/resizable/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Resizable"),t("OutboundLink")],1),e._v(" functionality of jQueryUI is used. The code for connecting jQueryUI Resizable with GridList can be found in the function "),t("code",[e._v("getResizeOptions()")]),e._v(" in the "),t("code",[e._v("resize")]),e._v(" handler about at "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/grid.js#L151",target:"_blank",rel:"noopener noreferrer"}},[e._v("grid.js:151"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/02_tools.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/112.934894e9.js b/assets/js/113.eac7451d.js similarity index 98% rename from assets/js/112.934894e9.js rename to assets/js/113.eac7451d.js index 430edf99c6..0626f02818 100644 --- a/assets/js/112.934894e9.js +++ b/assets/js/113.eac7451d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{426:function(e,t,n){e.exports=n.p+"assets/img/main.a269c26b.png"},964:function(e,t,n){"use strict";n.r(t);var r=n(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"vue-js"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vue-js"}},[e._v("#")]),e._v(" Vue.js")]),e._v(" "),t("p",[e._v("This chapter is about "),t("a",{attrs:{href:"https://vuejs.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vue.js"),t("OutboundLink")],1),e._v(", the single-page application framework used for AsTeRICS Grid.")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#general"}},[e._v("General")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#component-structure"}},[e._v("Component structure")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#used-components"}},[e._v("Used components")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"general"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general"}},[e._v("#")]),e._v(" General")]),e._v(" "),t("p",[e._v("In AsTeRICS Grid "),t("a",{attrs:{href:"https://vuejs.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vue.js"),t("OutboundLink")],1),e._v(" is used in order to manage views and it’s elements in components and to create all kinds of interactivity in the UI. In Vue.js components can be organized in single "),t("code",[e._v(".vue")]),e._v(" files, containing the HTML, Javascript and CSS needed for this component. These are the files and folders that are important regarding the usage of Vue.js:")]),e._v(" "),t("ul",[t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/master/src/vue-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/vue-components"),t("OutboundLink")],1)]),e._v(": contains all Vue.js single-file components ("),t("code",[e._v(".vue")]),e._v(" files)")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("index.html"),t("OutboundLink")],1)]),e._v(": contains the HTML for the main Vue wrapper component consisting of the navigation sidebar and a placeholder for the currently show view")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/mainVue.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/js/vue/mainVue.js"),t("OutboundLink")],1)]),e._v(": Javascript part for the main Vue component in "),t("code",[e._v("index.html")])]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/vuePluginManager.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/js/vue/vuePluginManager.js"),t("OutboundLink")],1)]),e._v(": defines custom Vue directives and filters that can be used globally, e.g. a "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/07_i18n.html#vuejs-filter"}},[e._v("translate filter")]),e._v(".")],1)]),e._v(" "),t("h2",{attrs:{id:"component-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-structure"}},[e._v("#")]),e._v(" Component structure")]),e._v(" "),t("p",[e._v("The main Vue wrapper component is defined in "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("index.html"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/mainVue.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("mainVue.js"),t("OutboundLink")],1),e._v(". This line in "),t("code",[e._v("index.html")]),e._v(" is a placeholder for the currently shown view of the application:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('\n')])])]),t("p",[e._v("The method "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/mainVue.js",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("MainVue.setViewComponent()")]),t("OutboundLink")],1),e._v(" is used in order to change the currently shown view. This method is primarily used by "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/router.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("router.js"),t("OutboundLink")],1),e._v(" which chooses the correct view based on the current "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Fragment_identifier",target:"_blank",rel:"noopener noreferrer"}},[e._v("URL hash"),t("OutboundLink")],1),e._v(" in the address. For instance "),t("code",[e._v("https://grid.asterics.eu/#grids")]),e._v(" has the hash "),t("code",[e._v("#grids")]),e._v(" and therefore will render the "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#manage-grids-view"}},[e._v("manage grids")]),e._v(" component which is defined in file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/vue-components/views/allGridsView.vue",target:"_blank",rel:"noopener noreferrer"}},[e._v("allGridsView.vue"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("Figure 1 highlights the Vue.js components that are used for the main view:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(426),alt:""}}),e._v(" "),t("em",[e._v("Fig. 1: Vue component structure of the main view, red part is replaced depending on the current navigation")])]),e._v(" "),t("h2",{attrs:{id:"used-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#used-components"}},[e._v("#")]),e._v(" Used components")]),e._v(" "),t("p",[e._v("The used Vue components can be found in the folder "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/master/src/vue-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/vue-components"),t("OutboundLink")],1),e._v(" which contains the following folders:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("components")]),e._v(": generic components that can be used in various places across the application:\n"),t("ul",[t("li",[t("strong",[e._v("comparisonComponent.vue")]),e._v(": accordion component showing a comparison between online and offline users (information only)")]),e._v(" "),t("li",[t("strong",[e._v("headerIcon.vue")]),e._v(": component used in the header of different views which shows a hamburger menu and the AsTeRICS Grid logo")])])]),e._v(" "),t("li",[t("strong",[e._v("modals")]),e._v(": contains all kinds of modals (popup dialogs):\n"),t("ul",[t("li",[t("strong",[e._v("addMultipleModal.vue")]),e._v(": modal for importing multiple new grid elements at once, used in "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#edit-view"}},[e._v("edit view")])],1),e._v(" "),t("li",[t("strong",[e._v("editActionsModal.vue")]),e._v(": action edit modal for a grid element, see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/05_actions.html#edit-actions-modal"}},[e._v("Actions")]),e._v(" chapter in user documentation. The file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/vue-components/modals/editActionsSub/editAREAction.vue",target:"_blank",rel:"noopener noreferrer"}},[e._v("editAREAction.vue"),t("OutboundLink")],1),e._v(" is a sub-component of this modal containing the configuration of an "),t("RouterLink",{attrs:{to:"/develop/documentation_user/05_actions.html#asterics-action"}},[e._v("AsTeRICS action")]),e._v(".")],1),e._v(" "),t("li",[t("strong",[e._v("editGridModal.vue")]),e._v(": edit modal for a grid element (label and image), see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/03_appearance_layout.html#edit-modal"}},[e._v("Grid appearance and layout")]),e._v(" in user documentation")],1),e._v(" "),t("li",[t("strong",[e._v("importDictionaryModal.vue")]),e._v(": modal for importing new words to a dictionary, see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/07_dictionaries.html#add-words"}},[e._v("Dictionaries")]),e._v(" in user documentation")],1),e._v(" "),t("li",[t("strong",[e._v("inputOptionsModal.vue")]),e._v(": modal for setting input options like e.g. scanning, see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/04_input_options.html"}},[e._v("Input Options")]),e._v(" in user documentation")],1)])]),e._v(" "),t("li",[t("strong",[e._v("views")]),e._v(": contains different views which are rendered into the component placeholder described in "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#component-structure"}},[e._v("component structure")]),e._v(":\n"),t("ul",[t("li",[t("strong",[e._v("aboutView.vue")]),e._v(": view containing general information about AsTeRICS Grid")]),e._v(" "),t("li",[t("strong",[e._v("addOfflineView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/06_users.html#offline-users"}},[e._v("Offline users")])],1),e._v(" "),t("li",[t("strong",[e._v("allGridsView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#manage-grids-view"}},[e._v("Manage grids view")])],1),e._v(" "),t("li",[t("strong",[e._v("dictionariesView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#manage-dictionaries-view"}},[e._v("Manage dictionaries view")])],1),e._v(" "),t("li",[t("strong",[e._v("gridEditView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#edit-view"}},[e._v("Edit view")])],1),e._v(" "),t("li",[t("strong",[e._v("gridView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#main-view"}},[e._v("Main view")])],1),e._v(" "),t("li",[t("strong",[e._v("loginView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#change-user-view"}},[e._v("Change user view")])],1),e._v(" "),t("li",[t("strong",[e._v("registerView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/06_users.html#online-users"}},[e._v("Online users")])],1),e._v(" "),t("li",[t("strong",[e._v("welcomeView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#welcome-view"}})],1)])],1)]),e._v(" "),t("p",[e._v("For general information about the structure and usage of Vue.js components, see the official documentation, for instance "),t("a",{attrs:{href:"https://vuejs.org/v2/guide/components.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Component Basics"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/05_datamodel.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{425:function(e,t,n){e.exports=n.p+"assets/img/main.a269c26b.png"},966:function(e,t,n){"use strict";n.r(t);var r=n(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"vue-js"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vue-js"}},[e._v("#")]),e._v(" Vue.js")]),e._v(" "),t("p",[e._v("This chapter is about "),t("a",{attrs:{href:"https://vuejs.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vue.js"),t("OutboundLink")],1),e._v(", the single-page application framework used for AsTeRICS Grid.")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#general"}},[e._v("General")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#component-structure"}},[e._v("Component structure")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#used-components"}},[e._v("Used components")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"general"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general"}},[e._v("#")]),e._v(" General")]),e._v(" "),t("p",[e._v("In AsTeRICS Grid "),t("a",{attrs:{href:"https://vuejs.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vue.js"),t("OutboundLink")],1),e._v(" is used in order to manage views and it’s elements in components and to create all kinds of interactivity in the UI. In Vue.js components can be organized in single "),t("code",[e._v(".vue")]),e._v(" files, containing the HTML, Javascript and CSS needed for this component. These are the files and folders that are important regarding the usage of Vue.js:")]),e._v(" "),t("ul",[t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/master/src/vue-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/vue-components"),t("OutboundLink")],1)]),e._v(": contains all Vue.js single-file components ("),t("code",[e._v(".vue")]),e._v(" files)")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("index.html"),t("OutboundLink")],1)]),e._v(": contains the HTML for the main Vue wrapper component consisting of the navigation sidebar and a placeholder for the currently show view")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/mainVue.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/js/vue/mainVue.js"),t("OutboundLink")],1)]),e._v(": Javascript part for the main Vue component in "),t("code",[e._v("index.html")])]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/vuePluginManager.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/js/vue/vuePluginManager.js"),t("OutboundLink")],1)]),e._v(": defines custom Vue directives and filters that can be used globally, e.g. a "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/07_i18n.html#vuejs-filter"}},[e._v("translate filter")]),e._v(".")],1)]),e._v(" "),t("h2",{attrs:{id:"component-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-structure"}},[e._v("#")]),e._v(" Component structure")]),e._v(" "),t("p",[e._v("The main Vue wrapper component is defined in "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("index.html"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/mainVue.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("mainVue.js"),t("OutboundLink")],1),e._v(". This line in "),t("code",[e._v("index.html")]),e._v(" is a placeholder for the currently shown view of the application:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('\n')])])]),t("p",[e._v("The method "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/vue/mainVue.js",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("MainVue.setViewComponent()")]),t("OutboundLink")],1),e._v(" is used in order to change the currently shown view. This method is primarily used by "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/router.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("router.js"),t("OutboundLink")],1),e._v(" which chooses the correct view based on the current "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Fragment_identifier",target:"_blank",rel:"noopener noreferrer"}},[e._v("URL hash"),t("OutboundLink")],1),e._v(" in the address. For instance "),t("code",[e._v("https://grid.asterics.eu/#grids")]),e._v(" has the hash "),t("code",[e._v("#grids")]),e._v(" and therefore will render the "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#manage-grids-view"}},[e._v("manage grids")]),e._v(" component which is defined in file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/vue-components/views/allGridsView.vue",target:"_blank",rel:"noopener noreferrer"}},[e._v("allGridsView.vue"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("Figure 1 highlights the Vue.js components that are used for the main view:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(425),alt:""}}),e._v(" "),t("em",[e._v("Fig. 1: Vue component structure of the main view, red part is replaced depending on the current navigation")])]),e._v(" "),t("h2",{attrs:{id:"used-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#used-components"}},[e._v("#")]),e._v(" Used components")]),e._v(" "),t("p",[e._v("The used Vue components can be found in the folder "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/master/src/vue-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/vue-components"),t("OutboundLink")],1),e._v(" which contains the following folders:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("components")]),e._v(": generic components that can be used in various places across the application:\n"),t("ul",[t("li",[t("strong",[e._v("comparisonComponent.vue")]),e._v(": accordion component showing a comparison between online and offline users (information only)")]),e._v(" "),t("li",[t("strong",[e._v("headerIcon.vue")]),e._v(": component used in the header of different views which shows a hamburger menu and the AsTeRICS Grid logo")])])]),e._v(" "),t("li",[t("strong",[e._v("modals")]),e._v(": contains all kinds of modals (popup dialogs):\n"),t("ul",[t("li",[t("strong",[e._v("addMultipleModal.vue")]),e._v(": modal for importing multiple new grid elements at once, used in "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#edit-view"}},[e._v("edit view")])],1),e._v(" "),t("li",[t("strong",[e._v("editActionsModal.vue")]),e._v(": action edit modal for a grid element, see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/05_actions.html#edit-actions-modal"}},[e._v("Actions")]),e._v(" chapter in user documentation. The file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/vue-components/modals/editActionsSub/editAREAction.vue",target:"_blank",rel:"noopener noreferrer"}},[e._v("editAREAction.vue"),t("OutboundLink")],1),e._v(" is a sub-component of this modal containing the configuration of an "),t("RouterLink",{attrs:{to:"/develop/documentation_user/05_actions.html#asterics-action"}},[e._v("AsTeRICS action")]),e._v(".")],1),e._v(" "),t("li",[t("strong",[e._v("editGridModal.vue")]),e._v(": edit modal for a grid element (label and image), see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/03_appearance_layout.html#edit-modal"}},[e._v("Grid appearance and layout")]),e._v(" in user documentation")],1),e._v(" "),t("li",[t("strong",[e._v("importDictionaryModal.vue")]),e._v(": modal for importing new words to a dictionary, see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/07_dictionaries.html#add-words"}},[e._v("Dictionaries")]),e._v(" in user documentation")],1),e._v(" "),t("li",[t("strong",[e._v("inputOptionsModal.vue")]),e._v(": modal for setting input options like e.g. scanning, see chapter "),t("RouterLink",{attrs:{to:"/develop/documentation_user/04_input_options.html"}},[e._v("Input Options")]),e._v(" in user documentation")],1)])]),e._v(" "),t("li",[t("strong",[e._v("views")]),e._v(": contains different views which are rendered into the component placeholder described in "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/04_vuejs.html#component-structure"}},[e._v("component structure")]),e._v(":\n"),t("ul",[t("li",[t("strong",[e._v("aboutView.vue")]),e._v(": view containing general information about AsTeRICS Grid")]),e._v(" "),t("li",[t("strong",[e._v("addOfflineView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/06_users.html#offline-users"}},[e._v("Offline users")])],1),e._v(" "),t("li",[t("strong",[e._v("allGridsView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#manage-grids-view"}},[e._v("Manage grids view")])],1),e._v(" "),t("li",[t("strong",[e._v("dictionariesView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#manage-dictionaries-view"}},[e._v("Manage dictionaries view")])],1),e._v(" "),t("li",[t("strong",[e._v("gridEditView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#edit-view"}},[e._v("Edit view")])],1),e._v(" "),t("li",[t("strong",[e._v("gridView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#main-view"}},[e._v("Main view")])],1),e._v(" "),t("li",[t("strong",[e._v("loginView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#change-user-view"}},[e._v("Change user view")])],1),e._v(" "),t("li",[t("strong",[e._v("registerView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/06_users.html#online-users"}},[e._v("Online users")])],1),e._v(" "),t("li",[t("strong",[e._v("welcomeView.vue")]),e._v(": see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/02_navigation.html#welcome-view"}})],1)])],1)]),e._v(" "),t("p",[e._v("For general information about the structure and usage of Vue.js components, see the official documentation, for instance "),t("a",{attrs:{href:"https://vuejs.org/v2/guide/components.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Component Basics"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/03_grid.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/05_datamodel.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/113.ecac696f.js b/assets/js/114.7e16d923.js similarity index 99% rename from assets/js/113.ecac696f.js rename to assets/js/114.7e16d923.js index 632e743c70..2885d1084d 100644 --- a/assets/js/113.ecac696f.js +++ b/assets/js/114.7e16d923.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{427:function(e,t,a){e.exports=a.p+"assets/img/data_storage_layers_en.f40ca1cb.png"},965:function(e,t,a){"use strict";a.r(t);var r=a(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"data-storage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-storage"}},[e._v("#")]),e._v(" Data storage")]),e._v(" "),t("p",[e._v("This chapter is about the data storage concept used in AsTeRICS Grid, meaning where and how user configuration and application data is stored.")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#introduction"}},[e._v("Introduction")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#data-storage-abstraction-layers"}},[e._v("Abstraction layers")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#one-database-per-user"}},[e._v("One database per user")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#authentication-layer"}},[e._v("Authentication layer")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#inspecting-locally-saved-data"}},[e._v("Inspecting locally saved data")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("Since AsTeRICS Grid is designed to work offline, all configuration and user data have to be accessible without internet connection. There are the following possibilities for providing a data storage for an offline web-application:")]),e._v(" "),t("ol",[t("li",[e._v("Any external locally running storage service, e.g. any locally running database like MySQL or MariaDB. This possibility has the downside that users would have to install additional Software in order to use AsTeRICS Grid.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage",target:"_blank",rel:"noopener noreferrer"}},[e._v("LocalStorage"),t("OutboundLink")],1),e._v(", a browser internal storage which is capable to store key-value pairs of string values. However the amount of data is "),t("a",{attrs:{href:"https://www.html5rocks.com/en/tutorials/offline/quota-research/",target:"_blank",rel:"noopener noreferrer"}},[e._v("limited to about 5-10MB"),t("OutboundLink")],1),e._v(" in many browsers which is often too little to store all grids in AsTeRICS Grid.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",target:"_blank",rel:"noopener noreferrer"}},[e._v("IndexedDB"),t("OutboundLink")],1),e._v(", a browser internal storage for big amounts of structured data")])]),e._v(" "),t("p",[e._v("AsTeRICS Grid uses LocalStorage for temporary data which should not synchronized with the cloud (e.g. hashed encryption password) and IndexedDB for the majority of configuration like e.g. data of stored grids. For online users all data that is stored in IndexedDB is synchronized with the cloud, for offline users (see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/06_users.html"}},[e._v("Users")]),e._v(") data is only stored locally on the device.")],1),e._v(" "),t("p",[e._v("For accessing IndexedDB in a more comfortable manner and making synchronization with a remote "),t("a",{attrs:{href:"http://couchdb.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CouchDB"),t("OutboundLink")],1),e._v(" possible, the Javascript library "),t("a",{attrs:{href:"https://pouchdb.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PouchDB"),t("OutboundLink")],1),e._v(" is used.")]),e._v(" "),t("h2",{attrs:{id:"data-storage-abstraction-layers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-storage-abstraction-layers"}},[e._v("#")]),e._v(" Data storage abstraction layers")]),e._v(" "),t("p",[e._v("All Javascript modules regarding storage of data in AsTeRICS Grid can be found in the folder "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/master/src/js/service/data",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/js/service/data"),t("OutboundLink")],1),e._v(". Figure 1 shows the relevant files and their relationships:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(427),alt:"Concept of data storage layers"}})]),e._v(" "),t("p",[t("em",[e._v("Figure 1: Concept of data storage layers")])]),e._v(" "),t("p",[e._v("These are the responsibilities and functions of the different modules:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("dataService.js")]),e._v(": provides access to data objects on an application based abstraction level; implements methods that make it possible to get and save the objects described in chapter "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/05_datamodel.html"}},[e._v("Data model")]),e._v(", e.g. "),t("code",[e._v("GridData")]),e._v(" objects.")],1),e._v(" "),t("li",[t("strong",[e._v("databaseService.js")]),e._v(": implements "),t("a",{attrs:{href:"https://de.wikipedia.org/wiki/CRUD",target:"_blank",rel:"noopener noreferrer"}},[e._v("CRUD"),t("OutboundLink")],1),e._v(" methods for generic data model objects, methods for switching databases (users) and initializes databases with default data. This layer also does encryption and decryption of data using "),t("code",[e._v("filterService.js")]),e._v(". This level of abstraction is still quite independent of "),t("a",{attrs:{href:"https://pouchdb.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PouchDB"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",target:"_blank",rel:"noopener noreferrer"}},[e._v("IndexedDB"),t("OutboundLink")],1),e._v(" and theoretically could also use a different backend.")]),e._v(" "),t("li",[t("strong",[e._v("pouchDbService.js")]),e._v(": performs queries and actions on a PouchDB instance actually accessing the IndexedDB or CouchDB databases. It also caches queries for performance optimizations and broadcasts events if updates from the remote database are recognized.")]),e._v(" "),t("li",[t("strong",[e._v("pouchDBAdapter.js")]),e._v(": manages which actual database should be used, a local PouchDB instance or a remote CouchDB. Also sets up synchronization between both.")]),e._v(" "),t("li",[t("strong",[e._v("undoService.js")]),e._v(": is used by "),t("code",[e._v("grid.js")]),e._v(" in order to pass updates on grids to "),t("code",[e._v("dataService.js")]),e._v(" while keeping track of changes and providing an undo and redo functionality")]),e._v(" "),t("li",[t("strong",[e._v("filterService.js")]),e._v(": provides methods in order to convert objects used in the application to (encrypted) objects that should be saved to database and vice versa. If an object with an outdated data model version passes these methods, additional filter functions are inserted in order to upgrade the data model.")]),e._v(" "),t("li",[t("strong",[e._v("encryptionService.js")]),e._v(": provides methods for AES encryption and decryption and hasing of data objects and strings using the "),t("a",{attrs:{href:"https://github.com/bitwiseshiftleft/sjcl",target:"_blank",rel:"noopener noreferrer"}},[e._v("sjcl"),t("OutboundLink")],1),e._v(" library")]),e._v(" "),t("li",[t("strong",[e._v("localStorageService.js")]),e._v(": accesses the browser internal "),t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage",target:"_blank",rel:"noopener noreferrer"}},[e._v("LocalStorage"),t("OutboundLink")],1),e._v(" for saving data like the last active user or hashed user passwords - in general data which should not be synchronized to cloud or aren’t suitable for a user’s database.")])]),e._v(" "),t("h2",{attrs:{id:"one-database-per-user"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-database-per-user"}},[e._v("#")]),e._v(" One database per user")]),e._v(" "),t("p",[e._v("AsTeRICS Grid implements the idea of "),t("a",{attrs:{href:"https://www.joshmorony.com/creating-a-multiple-user-app-with-pouchdb-couchdb/",target:"_blank",rel:"noopener noreferrer"}},[e._v("one database per user"),t("OutboundLink")],1),e._v(". For each user a new database is created. Offline users have an own IndexedDB database within the browser and online users have both a local IndexedDB database and an online CouchDB database which are kept in sync by "),t("a",{attrs:{href:"https://pouchdb.com/guides/replication.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("replication features"),t("OutboundLink")],1),e._v(" of the PouchDB library. Advantages of this approach are:")]),e._v(" "),t("ul",[t("li",[e._v("access rights are easy to manage, each user can access their own database and nothing else")]),e._v(" "),t("li",[e._v("it’s easy to delete all data of a user, just delete their database")]),e._v(" "),t("li",[e._v("replication and synchronizing is simple, the whole user database can be replicated on the local device")])]),e._v(" "),t("h2",{attrs:{id:"authentication-layer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication-layer"}},[e._v("#")]),e._v(" Authentication layer")]),e._v(" "),t("p",[e._v("The one-database-per-user approach needs a layer for managing user accounts and the corresponding CouchDB user databases (only for online users). For AsTeRICS Grid the framework "),t("a",{attrs:{href:"https://github.com/sen-su/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin"),t("OutboundLink")],1),e._v(" is used. It provides an API in order to register and login users and creates the corresponding CouchDB databases in the background. However the "),t("a",{attrs:{href:"https://github.com/colinskow/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("original superlogin project"),t("OutboundLink")],1),e._v(" seems to be no longer maintained and therefore AsTeRICS Grid uses a more up-to-date "),t("a",{attrs:{href:"https://github.com/sen-su/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("fork"),t("OutboundLink")],1),e._v(" of it.")]),e._v(" "),t("p",[e._v("The file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/superlogin/start.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin/start.js"),t("OutboundLink")],1),e._v(" starts superlogin and contains it’s configuration (= server side). The file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/service/loginService.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("loginService.js"),t("OutboundLink")],1),e._v(" is the client-side counterpart which uses the library "),t("a",{attrs:{href:"https://www.npmjs.com/package/superlogin-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin-client"),t("OutboundLink")],1),e._v(" in order to connect to and make use of the superlogin server.")]),e._v(" "),t("p",[e._v("In order to start superlogin a CouchDB instance must be running on the same machine and the correct CouchDB parameters have to be inserted in "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/superlogin/start.js#L43",target:"_blank",rel:"noopener noreferrer"}},[e._v("start.js:43"),t("OutboundLink")],1),e._v(". Then use "),t("code",[e._v("npm run start-superlogin-dev")]),e._v(" or "),t("code",[e._v("npm run start-superlogin-prod")]),e._v(" in order to start superlogin in development or production mode.")]),e._v(" "),t("h2",{attrs:{id:"inspecting-locally-saved-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#inspecting-locally-saved-data"}},[e._v("#")]),e._v(" Inspecting locally saved data")]),e._v(" "),t("p",[e._v("For examining the locally saved data of AsTeRICS Grid do the following (e.g. in Firefox or Chrome browser):")]),e._v(" "),t("ol",[t("li",[e._v("open developer tools ("),t("code",[e._v("Ctrl + Shift + I")]),e._v(" or "),t("code",[e._v("right click -> Inspect")]),e._v(")")]),e._v(" "),t("li",[e._v("go to "),t("code",[e._v("Application")]),e._v(" (Chrome) or "),t("code",[e._v("Web-Storage")]),e._v(" (Firefox)")]),e._v(" "),t("li",[e._v("open "),t("code",[e._v("LocalStorage")]),e._v(" or "),t("code",[e._v("IndexedDB")]),e._v(" to inspect the data saved in these storages")])]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/05_datamodel.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/07_i18n.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[114],{427:function(e,t,a){e.exports=a.p+"assets/img/data_storage_layers_en.f40ca1cb.png"},969:function(e,t,a){"use strict";a.r(t);var r=a(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"data-storage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-storage"}},[e._v("#")]),e._v(" Data storage")]),e._v(" "),t("p",[e._v("This chapter is about the data storage concept used in AsTeRICS Grid, meaning where and how user configuration and application data is stored.")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#introduction"}},[e._v("Introduction")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#data-storage-abstraction-layers"}},[e._v("Abstraction layers")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#one-database-per-user"}},[e._v("One database per user")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#authentication-layer"}},[e._v("Authentication layer")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/06_data_storage.html#inspecting-locally-saved-data"}},[e._v("Inspecting locally saved data")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("Since AsTeRICS Grid is designed to work offline, all configuration and user data have to be accessible without internet connection. There are the following possibilities for providing a data storage for an offline web-application:")]),e._v(" "),t("ol",[t("li",[e._v("Any external locally running storage service, e.g. any locally running database like MySQL or MariaDB. This possibility has the downside that users would have to install additional Software in order to use AsTeRICS Grid.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage",target:"_blank",rel:"noopener noreferrer"}},[e._v("LocalStorage"),t("OutboundLink")],1),e._v(", a browser internal storage which is capable to store key-value pairs of string values. However the amount of data is "),t("a",{attrs:{href:"https://www.html5rocks.com/en/tutorials/offline/quota-research/",target:"_blank",rel:"noopener noreferrer"}},[e._v("limited to about 5-10MB"),t("OutboundLink")],1),e._v(" in many browsers which is often too little to store all grids in AsTeRICS Grid.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",target:"_blank",rel:"noopener noreferrer"}},[e._v("IndexedDB"),t("OutboundLink")],1),e._v(", a browser internal storage for big amounts of structured data")])]),e._v(" "),t("p",[e._v("AsTeRICS Grid uses LocalStorage for temporary data which should not synchronized with the cloud (e.g. hashed encryption password) and IndexedDB for the majority of configuration like e.g. data of stored grids. For online users all data that is stored in IndexedDB is synchronized with the cloud, for offline users (see "),t("RouterLink",{attrs:{to:"/develop/documentation_user/06_users.html"}},[e._v("Users")]),e._v(") data is only stored locally on the device.")],1),e._v(" "),t("p",[e._v("For accessing IndexedDB in a more comfortable manner and making synchronization with a remote "),t("a",{attrs:{href:"http://couchdb.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CouchDB"),t("OutboundLink")],1),e._v(" possible, the Javascript library "),t("a",{attrs:{href:"https://pouchdb.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PouchDB"),t("OutboundLink")],1),e._v(" is used.")]),e._v(" "),t("h2",{attrs:{id:"data-storage-abstraction-layers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-storage-abstraction-layers"}},[e._v("#")]),e._v(" Data storage abstraction layers")]),e._v(" "),t("p",[e._v("All Javascript modules regarding storage of data in AsTeRICS Grid can be found in the folder "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/master/src/js/service/data",target:"_blank",rel:"noopener noreferrer"}},[e._v("src/js/service/data"),t("OutboundLink")],1),e._v(". Figure 1 shows the relevant files and their relationships:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(427),alt:"Concept of data storage layers"}})]),e._v(" "),t("p",[t("em",[e._v("Figure 1: Concept of data storage layers")])]),e._v(" "),t("p",[e._v("These are the responsibilities and functions of the different modules:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("dataService.js")]),e._v(": provides access to data objects on an application based abstraction level; implements methods that make it possible to get and save the objects described in chapter "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/05_datamodel.html"}},[e._v("Data model")]),e._v(", e.g. "),t("code",[e._v("GridData")]),e._v(" objects.")],1),e._v(" "),t("li",[t("strong",[e._v("databaseService.js")]),e._v(": implements "),t("a",{attrs:{href:"https://de.wikipedia.org/wiki/CRUD",target:"_blank",rel:"noopener noreferrer"}},[e._v("CRUD"),t("OutboundLink")],1),e._v(" methods for generic data model objects, methods for switching databases (users) and initializes databases with default data. This layer also does encryption and decryption of data using "),t("code",[e._v("filterService.js")]),e._v(". This level of abstraction is still quite independent of "),t("a",{attrs:{href:"https://pouchdb.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PouchDB"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",target:"_blank",rel:"noopener noreferrer"}},[e._v("IndexedDB"),t("OutboundLink")],1),e._v(" and theoretically could also use a different backend.")]),e._v(" "),t("li",[t("strong",[e._v("pouchDbService.js")]),e._v(": performs queries and actions on a PouchDB instance actually accessing the IndexedDB or CouchDB databases. It also caches queries for performance optimizations and broadcasts events if updates from the remote database are recognized.")]),e._v(" "),t("li",[t("strong",[e._v("pouchDBAdapter.js")]),e._v(": manages which actual database should be used, a local PouchDB instance or a remote CouchDB. Also sets up synchronization between both.")]),e._v(" "),t("li",[t("strong",[e._v("undoService.js")]),e._v(": is used by "),t("code",[e._v("grid.js")]),e._v(" in order to pass updates on grids to "),t("code",[e._v("dataService.js")]),e._v(" while keeping track of changes and providing an undo and redo functionality")]),e._v(" "),t("li",[t("strong",[e._v("filterService.js")]),e._v(": provides methods in order to convert objects used in the application to (encrypted) objects that should be saved to database and vice versa. If an object with an outdated data model version passes these methods, additional filter functions are inserted in order to upgrade the data model.")]),e._v(" "),t("li",[t("strong",[e._v("encryptionService.js")]),e._v(": provides methods for AES encryption and decryption and hasing of data objects and strings using the "),t("a",{attrs:{href:"https://github.com/bitwiseshiftleft/sjcl",target:"_blank",rel:"noopener noreferrer"}},[e._v("sjcl"),t("OutboundLink")],1),e._v(" library")]),e._v(" "),t("li",[t("strong",[e._v("localStorageService.js")]),e._v(": accesses the browser internal "),t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage",target:"_blank",rel:"noopener noreferrer"}},[e._v("LocalStorage"),t("OutboundLink")],1),e._v(" for saving data like the last active user or hashed user passwords - in general data which should not be synchronized to cloud or aren’t suitable for a user’s database.")])]),e._v(" "),t("h2",{attrs:{id:"one-database-per-user"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-database-per-user"}},[e._v("#")]),e._v(" One database per user")]),e._v(" "),t("p",[e._v("AsTeRICS Grid implements the idea of "),t("a",{attrs:{href:"https://www.joshmorony.com/creating-a-multiple-user-app-with-pouchdb-couchdb/",target:"_blank",rel:"noopener noreferrer"}},[e._v("one database per user"),t("OutboundLink")],1),e._v(". For each user a new database is created. Offline users have an own IndexedDB database within the browser and online users have both a local IndexedDB database and an online CouchDB database which are kept in sync by "),t("a",{attrs:{href:"https://pouchdb.com/guides/replication.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("replication features"),t("OutboundLink")],1),e._v(" of the PouchDB library. Advantages of this approach are:")]),e._v(" "),t("ul",[t("li",[e._v("access rights are easy to manage, each user can access their own database and nothing else")]),e._v(" "),t("li",[e._v("it’s easy to delete all data of a user, just delete their database")]),e._v(" "),t("li",[e._v("replication and synchronizing is simple, the whole user database can be replicated on the local device")])]),e._v(" "),t("h2",{attrs:{id:"authentication-layer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication-layer"}},[e._v("#")]),e._v(" Authentication layer")]),e._v(" "),t("p",[e._v("The one-database-per-user approach needs a layer for managing user accounts and the corresponding CouchDB user databases (only for online users). For AsTeRICS Grid the framework "),t("a",{attrs:{href:"https://github.com/sen-su/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin"),t("OutboundLink")],1),e._v(" is used. It provides an API in order to register and login users and creates the corresponding CouchDB databases in the background. However the "),t("a",{attrs:{href:"https://github.com/colinskow/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("original superlogin project"),t("OutboundLink")],1),e._v(" seems to be no longer maintained and therefore AsTeRICS Grid uses a more up-to-date "),t("a",{attrs:{href:"https://github.com/sen-su/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("fork"),t("OutboundLink")],1),e._v(" of it.")]),e._v(" "),t("p",[e._v("The file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/superlogin/start.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin/start.js"),t("OutboundLink")],1),e._v(" starts superlogin and contains it’s configuration (= server side). The file "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/src/js/service/loginService.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("loginService.js"),t("OutboundLink")],1),e._v(" is the client-side counterpart which uses the library "),t("a",{attrs:{href:"https://www.npmjs.com/package/superlogin-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin-client"),t("OutboundLink")],1),e._v(" in order to connect to and make use of the superlogin server.")]),e._v(" "),t("p",[e._v("In order to start superlogin a CouchDB instance must be running on the same machine and the correct CouchDB parameters have to be inserted in "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/blob/master/superlogin/start.js#L43",target:"_blank",rel:"noopener noreferrer"}},[e._v("start.js:43"),t("OutboundLink")],1),e._v(". Then use "),t("code",[e._v("npm run start-superlogin-dev")]),e._v(" or "),t("code",[e._v("npm run start-superlogin-prod")]),e._v(" in order to start superlogin in development or production mode.")]),e._v(" "),t("h2",{attrs:{id:"inspecting-locally-saved-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#inspecting-locally-saved-data"}},[e._v("#")]),e._v(" Inspecting locally saved data")]),e._v(" "),t("p",[e._v("For examining the locally saved data of AsTeRICS Grid do the following (e.g. in Firefox or Chrome browser):")]),e._v(" "),t("ol",[t("li",[e._v("open developer tools ("),t("code",[e._v("Ctrl + Shift + I")]),e._v(" or "),t("code",[e._v("right click -> Inspect")]),e._v(")")]),e._v(" "),t("li",[e._v("go to "),t("code",[e._v("Application")]),e._v(" (Chrome) or "),t("code",[e._v("Web-Storage")]),e._v(" (Firefox)")]),e._v(" "),t("li",[e._v("open "),t("code",[e._v("LocalStorage")]),e._v(" or "),t("code",[e._v("IndexedDB")]),e._v(" to inspect the data saved in these storages")])]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/05_datamodel.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/develop/asterics-grid/07_i18n.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/114.1c156b53.js b/assets/js/115.fe49264c.js similarity index 99% rename from assets/js/114.1c156b53.js rename to assets/js/115.fe49264c.js index f1df44250e..50dd670c22 100644 --- a/assets/js/114.1c156b53.js +++ b/assets/js/115.fe49264c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[114],{428:function(t,a,s){t.exports=s.p+"assets/img/Computer-Vision-BuildPath.ccb70d21.jpg"},984:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"computer-vision-using-javacv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#computer-vision-using-javacv"}},[t._v("#")]),t._v(" Computer Vision using JavaCV")]),t._v(" "),a("h2",{attrs:{id:"objective"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[t._v("#")]),t._v(" Objective")]),t._v(" "),a("p",[t._v("This tutorial demonstrates how to use the APIs for computer vision tasks in AsTeRICS. The tutorial does not show how to create an "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Plugin-Development",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS plugin"),a("OutboundLink")],1),t._v(" where the API would be used normally.")]),t._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("AsTeRICS has several computer vision plugins (e.g. "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&sensors/XFacetrackerLK.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("XFacetrackerLK"),a("OutboundLink")],1),t._v(" for face tracking).")]),t._v(" "),a("p",[t._v("To simplify the development of such plugins and adding crossplatform support easily, AsTeRICS 3.0 uses a subset of "),a("a",{attrs:{href:"https://github.com/bytedeco/javacv/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV 1.3"),a("OutboundLink")],1),t._v(". Additionally, the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE/services/ComputerVision/src/main/java/eu/asterics/mw/computervision",target:"_blank",rel:"noopener noreferrer"}},[t._v("computervision service"),a("OutboundLink")],1),t._v(" provides helper classes for frame grabbing, face detection and frame visualization.")]),t._v(" "),a("h2",{attrs:{id:"javacv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#javacv"}},[t._v("#")]),t._v(" JavaCV")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV"),a("OutboundLink")],1),t._v(" is a Java wrapper for commonly used computer vision libraries and uses "),a("a",{attrs:{href:"https://github.com/bytedeco/javacpp",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCPP technology"),a("OutboundLink")],1),t._v(" for the binding of native libraries (based on JNI). "),a("a",{attrs:{href:"https://github.com/bytedeco/javacpp-presets/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCPP Presets"),a("OutboundLink")],1),t._v(" define the respective bindings (e.g. OpenCV, FFmpeg, OpenKinect, videoInput, flandmark, ARToolkitPlus, …) that can then be used within Java.")]),t._v(" "),a("h2",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Java IDE ("),a("a",{attrs:{href:"http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/neon3",target:"_blank",rel:"noopener noreferrer"}},[t._v("Eclipse"),a("OutboundLink")],1),t._v(" recommended)")]),t._v(" "),a("li",[a("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java Development Kit 8"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Webcam or USB camera or RaspiCam")])]),t._v(" "),a("h2",{attrs:{id:"preparation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#preparation"}},[t._v("#")]),t._v(" Preparation")]),t._v(" "),a("ol",[a("li",[t._v("Start Eclipse")]),t._v(" "),a("li",[t._v("Create a new Java project ("),a("code",[t._v("File/New/Java Project")]),t._v(")")]),t._v(" "),a("li",[t._v("Add the following libraries to the build configuration ("),a("code",[t._v("Project/Properties/Java Build Path/Libraries")]),t._v(")")])]),t._v(" "),a("ul",[a("li",[a("code",[t._v("/asterics.ARE.jar")])]),t._v(" "),a("li",[a("code",[t._v("/asterics.mw.computervision.jar")])]),t._v(" "),a("li",[a("code",[t._v("/javacv-1.3.0-basic-windows.jar")]),t._v(" (on Linux/Mac OSX use "),a("code",[t._v("javacv-1.3.0-basic-linux|macosx.jar")]),t._v(")")]),t._v(" "),a("li",[a("code",[t._v("/../APE/lib/commons-io-2.4.jar")])]),t._v(" "),a("li",[a("code",[t._v("/../APE/lib/commons-codec-1.11.jar")])])]),t._v(" "),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Copy the directory "),a("code",[t._v("/data/service.computervision")]),t._v(" to "),a("code",[t._v("/data/")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(428),alt:"Build path dialog with external libraries"}})]),t._v(" "),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Create a main class "),a("code",[t._v("FaceDetectionExample")]),t._v(" and copy and paste the following template code into it")])]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("awt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Dimension")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("awt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Point")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Imports OpenCV wrapper (classes, methods and constants)")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bytedeco"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("javacpp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("opencv_core"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bytedeco"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("javacpp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("opencv_imgproc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bytedeco"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("javacv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FrameGrabber")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetection")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GrabbedImageListener")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GrabbedImageListener")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Utility class which simplifies face detection and drawing.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetection")]),t._v(" faceDetection"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Define camera device and id for frame display window.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" camDeviceKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FaceDetectionExample"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//CvPoint is an OpenCV structure for describing point: https://docs.opencv.org/3.2.0/dc/dd1/structCvPoint.html")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//We can allocate native arrays using constructors taking an integer as argument.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvPoint")]),t._v(" hatPoints "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),t._v(" faceDetectionExample"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n faceDetectionExample"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Listener method which is called for each grabbed frame.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("imageGrabbed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IplImage")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("h2",{attrs:{id:"example-1-face-detection-and-face-rectangle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-1-face-detection-and-face-rectangle"}},[t._v("#")]),t._v(" Example 1 - Face detection and face rectangle")]),t._v(" "),a("p",[t._v("The computer vision service in AsTeRICS provides convinience methods that facilitate the task of frame grabbing ("),a("code",[t._v("class SharedFrameGrabber")]),t._v(") and visualization ("),a("code",[t._v("SharedCanvasFrame")]),t._v(").")]),t._v(" "),a("h3",{attrs:{id:"init-and-start-grabbing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#init-and-start-grabbing"}},[t._v("#")]),t._v(" Init and Start grabbing")]),t._v(" "),a("ol",[a("li",[t._v("Create a "),a("a",{attrs:{href:"https://github.com/bytedeco/javacv/wiki/Video-Preview-and-Video-Recording-Classes",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("FrameGrabber")]),a("OutboundLink")],1),t._v(" instance, which is an abstraction of a frame grabbing functionality implemented by a computer vision library (e.g. videoInput, OpenCV). Using the method "),a("code",[t._v("getFrameGrabber(...)")]),t._v(" returns the default frame grabber ("),a("strong",[t._v("Windows")]),t._v(": videoInput, "),a("strong",[t._v("Linux")]),t._v(": FFmpeg, "),a("strong",[t._v("Mac OSX")]),t._v(": OpenCV) for the platform the program is running on.")]),t._v(" "),a("li",[t._v("Register a "),a("code",[t._v("GrabbedImageListener")]),t._v(" which receives grabbed frames")]),t._v(" "),a("li",[t._v("Create window for displaying video frames.")]),t._v(" "),a("li",[t._v("Start grabbing.")])]),t._v(" "),a("p",[t._v("Copy and paste the following code into the method "),a("code",[t._v("public void start()")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Get a frame grabber for the device with the given key (either a number e.g. 0 or a device path e.g. /dev/video0)")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//This is dependent on the used frame grabber (e.g. FFMpeg only supports device paths)")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FrameGrabber")]),t._v(" grabber "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Register a listener to receive the grabbed images of type IplImage.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("registerGrabbedImageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Create a window which is used to display the video frame.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Face Detection Example"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" grabber"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getGamma")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Point")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Starts grabbing in a dedicated thread and notifies all registered listeners with the IplImage frame grabbed.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("startGrabbing")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"face-detection-and-drawing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#face-detection-and-drawing"}},[t._v("#")]),t._v(" Face detection and drawing")]),t._v(" "),a("p",[t._v("The class "),a("code",[t._v("FaceDetection")]),t._v(" provides convinience methods for face detection using a "),a("a",{attrs:{href:"https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Haar cascade for the face"),a("OutboundLink")],1),t._v(" and drawing with typical parameters.")]),t._v(" "),a("p",[t._v("Copy and paste the following code into the method "),a("code",[t._v("public void imageGrabbed(IplImage frame)")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Utility method which does face detection with standard parameters.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvRect")]),t._v(" faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceDetection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("detectFace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n faceDetection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("drawFaceRect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Finally show the image with added drawings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("showImage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"stop-grabbing-cleanup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stop-grabbing-cleanup"}},[t._v("#")]),t._v(" Stop grabbing & cleanup")]),t._v(" "),a("p",[t._v("Finally you must stop grabbing, deregister the "),a("code",[t._v("GrabbedImageListener")]),t._v(" and dispose the window showing the video frame.")]),t._v(" "),a("p",[t._v("Copy and paste the following code into the method "),a("code",[t._v("public void stop()")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Stop the grabber thread.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopGrabbing")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Deregister this as listener.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("deregisterGrabbedImageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Dispose the window for frame visualization. ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("disposeFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"example-2-drawing-a-hat-on-top-of-the-face"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-2-drawing-a-hat-on-top-of-the-face"}},[t._v("#")]),t._v(" Example 2 - Drawing a hat on top of the face")]),t._v(" "),a("p",[t._v("This example shows how to use the "),a("a",{attrs:{href:"https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("drawing functions"),a("OutboundLink")],1),t._v(" of OpenCV to draw a hat on top of the facial position. Generally you can use both the C-API or the C+±API of OpenCV with similar syntax. Nevertheless, there are some rules of how to "),a("a",{attrs:{href:"https://github.com/bytedeco/javacv/wiki/Converting-OpenCV",target:"_blank",rel:"noopener noreferrer"}},[t._v("convert OpenCV code to JavaCV code"),a("OutboundLink")],1),t._v(".\nYou can draw a rectangle with "),a("code",[t._v("cvRectangle(...)")]),t._v(" and draw a filled polygon with "),a("code",[t._v("cvFillConvexPoly(...)")]),t._v(".")]),t._v(" "),a("p",[t._v("Use the code of "),a("a",{attrs:{href:"#example-1---face-detection-and-face-rectangle"}},[t._v("Example 1")]),t._v(" and overwrite the implementation of the method "),a("code",[t._v("public void imageGrabbed(...)")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Utility method which does face detection with standard parameters.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvRect")]),t._v(" faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceDetection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("detectFace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Draw a red face rectangle with cvRectangle")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvRectangle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("w"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvScalar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RED")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CV_AA")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Draw a green hat on top of the face.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//To access or pass as argument the elements of a native array, ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//call position() before. --\x3e position(0) refers to the first element.")]),t._v("\n hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvFillConvexPoly")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvScalar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("GREEN")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CV_AA")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finally show the image with added drawings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("showImage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/v3.0/ARE/components/sensor.XfacetrackerLK/src/main/java/eu/asterics/component/sensor/XfacetrackerLK/XFacetrackerLKInstance.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("Source code of class XFacetrackerLK"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE/services/ComputerVision/src/main/java/eu/asterics/mw/computervision",target:"_blank",rel:"noopener noreferrer"}},[t._v("computervision service"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV 1.3"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv/wiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV 1.3 Wiki"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"groups.google.com/group/javacv"}},[t._v("JavaCV google group")])]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv-examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV examples including OpenCV Cookbook"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/MasteringOpenCV/code",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenCV examples for HCI (ch6, ch7): Mastering OpenCV with Practical Computer Vision Projects"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[115],{428:function(t,a,s){t.exports=s.p+"assets/img/Computer-Vision-BuildPath.ccb70d21.jpg"},986:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"computer-vision-using-javacv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#computer-vision-using-javacv"}},[t._v("#")]),t._v(" Computer Vision using JavaCV")]),t._v(" "),a("h2",{attrs:{id:"objective"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[t._v("#")]),t._v(" Objective")]),t._v(" "),a("p",[t._v("This tutorial demonstrates how to use the APIs for computer vision tasks in AsTeRICS. The tutorial does not show how to create an "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Plugin-Development",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS plugin"),a("OutboundLink")],1),t._v(" where the API would be used normally.")]),t._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("AsTeRICS has several computer vision plugins (e.g. "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&sensors/XFacetrackerLK.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("XFacetrackerLK"),a("OutboundLink")],1),t._v(" for face tracking).")]),t._v(" "),a("p",[t._v("To simplify the development of such plugins and adding crossplatform support easily, AsTeRICS 3.0 uses a subset of "),a("a",{attrs:{href:"https://github.com/bytedeco/javacv/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV 1.3"),a("OutboundLink")],1),t._v(". Additionally, the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE/services/ComputerVision/src/main/java/eu/asterics/mw/computervision",target:"_blank",rel:"noopener noreferrer"}},[t._v("computervision service"),a("OutboundLink")],1),t._v(" provides helper classes for frame grabbing, face detection and frame visualization.")]),t._v(" "),a("h2",{attrs:{id:"javacv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#javacv"}},[t._v("#")]),t._v(" JavaCV")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV"),a("OutboundLink")],1),t._v(" is a Java wrapper for commonly used computer vision libraries and uses "),a("a",{attrs:{href:"https://github.com/bytedeco/javacpp",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCPP technology"),a("OutboundLink")],1),t._v(" for the binding of native libraries (based on JNI). "),a("a",{attrs:{href:"https://github.com/bytedeco/javacpp-presets/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCPP Presets"),a("OutboundLink")],1),t._v(" define the respective bindings (e.g. OpenCV, FFmpeg, OpenKinect, videoInput, flandmark, ARToolkitPlus, …) that can then be used within Java.")]),t._v(" "),a("h2",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Java IDE ("),a("a",{attrs:{href:"http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/neon3",target:"_blank",rel:"noopener noreferrer"}},[t._v("Eclipse"),a("OutboundLink")],1),t._v(" recommended)")]),t._v(" "),a("li",[a("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java Development Kit 8"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Webcam or USB camera or RaspiCam")])]),t._v(" "),a("h2",{attrs:{id:"preparation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#preparation"}},[t._v("#")]),t._v(" Preparation")]),t._v(" "),a("ol",[a("li",[t._v("Start Eclipse")]),t._v(" "),a("li",[t._v("Create a new Java project ("),a("code",[t._v("File/New/Java Project")]),t._v(")")]),t._v(" "),a("li",[t._v("Add the following libraries to the build configuration ("),a("code",[t._v("Project/Properties/Java Build Path/Libraries")]),t._v(")")])]),t._v(" "),a("ul",[a("li",[a("code",[t._v("/asterics.ARE.jar")])]),t._v(" "),a("li",[a("code",[t._v("/asterics.mw.computervision.jar")])]),t._v(" "),a("li",[a("code",[t._v("/javacv-1.3.0-basic-windows.jar")]),t._v(" (on Linux/Mac OSX use "),a("code",[t._v("javacv-1.3.0-basic-linux|macosx.jar")]),t._v(")")]),t._v(" "),a("li",[a("code",[t._v("/../APE/lib/commons-io-2.4.jar")])]),t._v(" "),a("li",[a("code",[t._v("/../APE/lib/commons-codec-1.11.jar")])])]),t._v(" "),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Copy the directory "),a("code",[t._v("/data/service.computervision")]),t._v(" to "),a("code",[t._v("/data/")])])]),t._v(" "),a("p",[a("img",{attrs:{src:s(428),alt:"Build path dialog with external libraries"}})]),t._v(" "),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Create a main class "),a("code",[t._v("FaceDetectionExample")]),t._v(" and copy and paste the following template code into it")])]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("awt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Dimension")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("awt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Point")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Imports OpenCV wrapper (classes, methods and constants)")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bytedeco"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("javacpp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("opencv_core"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bytedeco"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("javacpp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("opencv_imgproc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bytedeco"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("javacv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FrameGrabber")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetection")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GrabbedImageListener")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("computervision"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GrabbedImageListener")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Utility class which simplifies face detection and drawing.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetection")]),t._v(" faceDetection"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Define camera device and id for frame display window.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" camDeviceKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FaceDetectionExample"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//CvPoint is an OpenCV structure for describing point: https://docs.opencv.org/3.2.0/dc/dd1/structCvPoint.html")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//We can allocate native arrays using constructors taking an integer as argument.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvPoint")]),t._v(" hatPoints "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),t._v(" faceDetectionExample"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n faceDetectionExample"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FaceDetectionExample")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Listener method which is called for each grabbed frame.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("imageGrabbed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IplImage")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("h2",{attrs:{id:"example-1-face-detection-and-face-rectangle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-1-face-detection-and-face-rectangle"}},[t._v("#")]),t._v(" Example 1 - Face detection and face rectangle")]),t._v(" "),a("p",[t._v("The computer vision service in AsTeRICS provides convinience methods that facilitate the task of frame grabbing ("),a("code",[t._v("class SharedFrameGrabber")]),t._v(") and visualization ("),a("code",[t._v("SharedCanvasFrame")]),t._v(").")]),t._v(" "),a("h3",{attrs:{id:"init-and-start-grabbing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#init-and-start-grabbing"}},[t._v("#")]),t._v(" Init and Start grabbing")]),t._v(" "),a("ol",[a("li",[t._v("Create a "),a("a",{attrs:{href:"https://github.com/bytedeco/javacv/wiki/Video-Preview-and-Video-Recording-Classes",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("FrameGrabber")]),a("OutboundLink")],1),t._v(" instance, which is an abstraction of a frame grabbing functionality implemented by a computer vision library (e.g. videoInput, OpenCV). Using the method "),a("code",[t._v("getFrameGrabber(...)")]),t._v(" returns the default frame grabber ("),a("strong",[t._v("Windows")]),t._v(": videoInput, "),a("strong",[t._v("Linux")]),t._v(": FFmpeg, "),a("strong",[t._v("Mac OSX")]),t._v(": OpenCV) for the platform the program is running on.")]),t._v(" "),a("li",[t._v("Register a "),a("code",[t._v("GrabbedImageListener")]),t._v(" which receives grabbed frames")]),t._v(" "),a("li",[t._v("Create window for displaying video frames.")]),t._v(" "),a("li",[t._v("Start grabbing.")])]),t._v(" "),a("p",[t._v("Copy and paste the following code into the method "),a("code",[t._v("public void start()")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Get a frame grabber for the device with the given key (either a number e.g. 0 or a device path e.g. /dev/video0)")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//This is dependent on the used frame grabber (e.g. FFMpeg only supports device paths)")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FrameGrabber")]),t._v(" grabber "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Register a listener to receive the grabbed images of type IplImage.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("registerGrabbedImageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Create a window which is used to display the video frame.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Face Detection Example"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" grabber"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getGamma")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Point")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Starts grabbing in a dedicated thread and notifies all registered listeners with the IplImage frame grabbed.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("startGrabbing")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"face-detection-and-drawing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#face-detection-and-drawing"}},[t._v("#")]),t._v(" Face detection and drawing")]),t._v(" "),a("p",[t._v("The class "),a("code",[t._v("FaceDetection")]),t._v(" provides convinience methods for face detection using a "),a("a",{attrs:{href:"https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Haar cascade for the face"),a("OutboundLink")],1),t._v(" and drawing with typical parameters.")]),t._v(" "),a("p",[t._v("Copy and paste the following code into the method "),a("code",[t._v("public void imageGrabbed(IplImage frame)")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Utility method which does face detection with standard parameters.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvRect")]),t._v(" faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceDetection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("detectFace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n faceDetection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("drawFaceRect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Finally show the image with added drawings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("showImage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"stop-grabbing-cleanup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stop-grabbing-cleanup"}},[t._v("#")]),t._v(" Stop grabbing & cleanup")]),t._v(" "),a("p",[t._v("Finally you must stop grabbing, deregister the "),a("code",[t._v("GrabbedImageListener")]),t._v(" and dispose the window showing the video frame.")]),t._v(" "),a("p",[t._v("Copy and paste the following code into the method "),a("code",[t._v("public void stop()")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Stop the grabber thread.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopGrabbing")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Deregister this as listener.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedFrameGrabber")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("deregisterGrabbedImageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camDeviceKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Dispose the window for frame visualization. ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("disposeFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"example-2-drawing-a-hat-on-top-of-the-face"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-2-drawing-a-hat-on-top-of-the-face"}},[t._v("#")]),t._v(" Example 2 - Drawing a hat on top of the face")]),t._v(" "),a("p",[t._v("This example shows how to use the "),a("a",{attrs:{href:"https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("drawing functions"),a("OutboundLink")],1),t._v(" of OpenCV to draw a hat on top of the facial position. Generally you can use both the C-API or the C+±API of OpenCV with similar syntax. Nevertheless, there are some rules of how to "),a("a",{attrs:{href:"https://github.com/bytedeco/javacv/wiki/Converting-OpenCV",target:"_blank",rel:"noopener noreferrer"}},[t._v("convert OpenCV code to JavaCV code"),a("OutboundLink")],1),t._v(".\nYou can draw a rectangle with "),a("code",[t._v("cvRectangle(...)")]),t._v(" and draw a filled polygon with "),a("code",[t._v("cvFillConvexPoly(...)")]),t._v(".")]),t._v(" "),a("p",[t._v("Use the code of "),a("a",{attrs:{href:"#example-1---face-detection-and-face-rectangle"}},[t._v("Example 1")]),t._v(" and overwrite the implementation of the method "),a("code",[t._v("public void imageGrabbed(...)")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Utility method which does face detection with standard parameters.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvRect")]),t._v(" faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceDetection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("detectFace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faceRect "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" faceRect"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Draw a red face rectangle with cvRectangle")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvRectangle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("w"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvScalar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RED")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CV_AA")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Draw a green hat on top of the face.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//To access or pass as argument the elements of a native array, ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//call position() before. --\x3e position(0) refers to the first element.")]),t._v("\n hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" w "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("y")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cvFillConvexPoly")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" hatPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CvScalar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("GREEN")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CV_AA")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finally show the image with added drawings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SharedCanvasFrame")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("showImage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("canvasInstanceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" frame"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/v3.0/ARE/components/sensor.XfacetrackerLK/src/main/java/eu/asterics/component/sensor/XfacetrackerLK/XFacetrackerLKInstance.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("Source code of class XFacetrackerLK"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE/services/ComputerVision/src/main/java/eu/asterics/mw/computervision",target:"_blank",rel:"noopener noreferrer"}},[t._v("computervision service"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv/tree/1.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV 1.3"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv/wiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV 1.3 Wiki"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"groups.google.com/group/javacv"}},[t._v("JavaCV google group")])]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bytedeco/javacv-examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaCV examples including OpenCV Cookbook"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/MasteringOpenCV/code",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenCV examples for HCI (ch6, ch7): Mastering OpenCV with Practical Computer Vision Projects"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/115.fccc3e22.js b/assets/js/116.32a5f605.js similarity index 99% rename from assets/js/115.fccc3e22.js rename to assets/js/116.32a5f605.js index 4881cee98f..859c0777de 100644 --- a/assets/js/115.fccc3e22.js +++ b/assets/js/116.32a5f605.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[115],{302:function(t,a,s){t.exports=s.p+"assets/img/DeveloperManual_html_17298a48a6d250c5.fbefb96e.png"},985:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"plugin-development-advanced"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-development-advanced"}},[t._v("#")]),t._v(" Plugin Development Advanced")]),t._v(" "),a("p",[t._v("In this manual some advanced topics of plugin development are listed.")]),t._v(" "),a("h2",{attrs:{id:"port-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#port-naming-conventions"}},[t._v("#")]),t._v(" Port Naming Conventions")]),t._v(" "),a("p",[t._v("Variables of port instances should be named with a prefix indicating what kind of port it is. The rest of the port name should indicate the port’s use and adhere to the standard Java variable naming conventions. The available prefixes are:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("ip: indicates that the port is an instance of IRuntimeInputPort")])]),t._v(" "),a("li",[a("p",[t._v("op: indicates that the port is an instance of IRuntimeOutputPort")])]),t._v(" "),a("li",[a("p",[t._v("elp: indicates that the port is an instance of IRuntimeEventListenerPort")])]),t._v(" "),a("li",[a("p",[t._v("etp: indicates that the port is an instance of IRuntimeEventTriggererPort")])])]),t._v(" "),a("p",[t._v("A variable holding an event listener port could therefore be named "),a("em",[t._v("elpKeyPressed")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"property-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#property-naming-conventions"}},[t._v("#")]),t._v(" Property Naming Conventions")]),t._v(" "),a("p",[t._v("Plugin properties should be directly mapped to a variable in the plugin code. The variable’s should be prepended with the prefix "),a("em",[t._v("prop")]),t._v(" and adhere to standard Java naming conventions. Thus a property could be named "),a("em",[t._v("InputGainValue")]),t._v(" and the corresponding variable should be named "),a("em",[t._v("propInputGainValue")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"bundle-descriptor-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bundle-descriptor-naming-conventions"}},[t._v("#")]),t._v(" Bundle Descriptor Naming Conventions")]),t._v(" "),a("p",[t._v("The bundle descriptor should serve as an abstraction layer between the user who creates models in the ACS and the developer. Thus the names for plugins, ports and properties in the bundle descriptor should be as intuitive as possible. Names in the bundle descriptor should not include prefixes because the added information is also conveyed in the presentation of plugins in the ACS.")]),t._v(" "),a("p",[t._v("The bundle descriptor can translate intuitive names (e.g. input.switch) to the canonical names of plugins (e.g. GpioInputInstance) allowing coexistence of a user and a developer language. This method of name translation can be applied for plugin names, port names and property names.")]),t._v(" "),a("h2",{attrs:{id:"asterics-are-service-and-plugin-source-file-header"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#asterics-are-service-and-plugin-source-file-header"}},[t._v("#")]),t._v(" AsTeRICS ARE, service and plugin source file header")]),t._v(" "),a("p",[t._v("Each source file of ARE, of ARE services, ARE plugins and tools which will be released as open source should have the following header:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('/*\n * AsTeRICS - Assistive Technology Rapid Integration and Construction Set\n * \n * \n * d8888 88888888888 8888888b. 8888888 .d8888b. .d8888b. \n * d88888 888 888 Y88b 888 d88P Y88b d88P Y88b\n * d88P888 888 888 888 888 888 888 Y88b. \n * d88P 888 .d8888b 888 .d88b. 888 d88P 888 888 "Y888b. \n * d88P 888 88K 888 d8P Y8b 8888888P" 888 888 "Y88b.\n * d88P 888 "Y8888b. 888 88888888 888 T88b 888 888 888 "888\n * d8888888888 X88 888 Y8b. 888 T88b 888 Y88b d88P Y88b d88P\n * d88P 888 88888P\' 888 "Y8888 888 T88b 8888888 "Y8888P" "Y8888P" \n *\n *\n * homepage: http://www.asterics.org \n *\n * This project has been partly funded by the European Commission, \n * Grant Agreement Number 247730\n * \n * \n * Dual License: MIT or GPL v3.0 with "CLASSPATH" exception\n * (please refer to the folder LICENSE)\n * \n */')]),t._v("\n")])])]),a("h2",{attrs:{id:"javadoc-compatible-comments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#javadoc-compatible-comments"}},[t._v("#")]),t._v(" JavaDoc compatible comments")]),t._v(" "),a("p",[t._v("JavaDoc compatible comments should be used to indicate the author of a source file, and to describe the purpose of a function/method/class and the respective parameters and return values.")]),t._v(" "),a("p",[t._v("Example for a source file header info:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Bardisplayinstance.java\n * Purpose of this module:\n * Implements the Bardisplay actuator plugin\n * \n * @author Chris Veigl [veigl@technikum-wien.at]\n * Date: Mar 7, 2011\n */")]),t._v("\n")])])]),a("p",[t._v("Example for a method of a class:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n* Returns the value of the given property\n* @param propertyName the name of the property\n* @return the property value\n*/")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"implementing-asterics-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementing-asterics-components"}},[t._v("#")]),t._v(" Implementing AsTeRICS components")]),t._v(" "),a("p",[t._v("This section describes the basic steps required for implementing an AsTeRICS component including a brief introduction to OSGi. To illustrate the implementation steps, we take a walk-through with the implementation of a simple processor component.")]),t._v(" "),a("p",[t._v("The AsTeRICS schemata of the XML descriptors include two concepts: the "),a("em",[t._v("bundle descriptors")]),t._v(" and the "),a("em",[t._v("deployment descriptors")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"the-bundle-descriptors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-bundle-descriptors"}},[t._v("#")]),t._v(" The Bundle Descriptors")]),t._v(" "),a("p",[t._v("Bundle descriptors are used to describe the content of an individual bundle (typically encapsulating one or more components). As such, they contain information about the included "),a("em",[t._v("components")]),t._v(", their "),a("em",[t._v("ports")]),t._v(", their customizable "),a("em",[t._v("properties")]),t._v(" and optionally their GUI.")]),t._v(" "),a("p",[t._v("The following shows a bundle descriptor of a simple processor-plugin (subtype for the ACS components menu is “Basic Math”). The plugin provides an averaging function for n values (property “buffer-size”) and has one input port and one output port for integer values:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentTypes")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentType")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.averager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("canonical_name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("eu.asterics.component.processor.averager.AveragerComponent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("subtype")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Basic Math"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("processor"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Linked list-based averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Input port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("multiplicity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("one-to-one"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mustBeConnected")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("out_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Output port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("buffer-size"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("50"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("The size of the averager's buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-deployment-descriptor"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-deployment-descriptor"}},[t._v("#")]),t._v(" The Deployment Descriptor")]),t._v(" "),a("p",[t._v("Deployment descriptors instruct the ARE of the desired application deployment structure. The deployment descriptor is typically composed in the AsTeRICS Configuration Suite (ACS) but can also be written with a text editor (as the bundle descriptor). Basically the deployment descriptor contains several component descriptions (copied from the corresponding bundle descriptors), actual property values and the channel connection between input- and output ports of the components.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The "),a("em",[t._v("type_id")]),t._v(" argument of the "),a("em",[t._v("component")]),t._v(" element in the deployment descriptor must match the "),a("em",[t._v("id")]),t._v(" argument of the "),a("em",[t._v("componentType")]),t._v(" element on the bundle descriptor. This is how the ARE detects the referred plugin type in the deployment model.")])]),t._v(" "),a("p",[t._v("The following demo deployment descriptor describes a simple model containing two plugins and one channel:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("model")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("deployment_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("components")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Source of two signal cahnnels "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Signal Target"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channels")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channel")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("channel.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Connects SignalSource.1 (outport 1) \n to SignalTarget.1 (in_x)"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("source")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-manifest-file"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-manifest-file"}},[t._v("#")]),t._v(" The Manifest file")]),t._v(" "),a("p",[t._v("The Manifest file tells the bundle name and other informations like import packages and .dlls to the OSGi. A typical Manifest looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-processors.averager\nBundle-SymbolicName: eu.asterics.component.processor.averager\nBundle-Version: 0.1.0\nDynamicImport-Package: *\n\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The empty line at the end of the Manifest file. It seems that OSGi needs that empty line in order to work properly.")])]),t._v(" "),a("h2",{attrs:{id:"structure-of-osgi-bundles-containing-are-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-osgi-bundles-containing-are-components"}},[t._v("#")]),t._v(" Structure of OSGi bundles containing ARE components")]),t._v(" "),a("p",[t._v("As a common OSGi bundle, an AsTeRICS component must be packaged in a JAR file, containing the class files (object code) and the Manifest file. In addition to these, the AsTeRICS middleware expects the "),a("em",[t._v("bundle descriptor")]),t._v(". At this point, it should be noted that it is possible to include "),a("em",[t._v("multiple")]),t._v(" AsTeRICS components in a single OSGi bundle, as long as the bundle descriptor describes all of them.")]),t._v(" "),a("p",[t._v("Overall, the file structure in a typical AsTeRICS bundle looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("/\n+- eu/\n +- asterics/\n +- component/\n +- ...\n+- lib/\n +- native/\n +- my_library.dll\n+- META-INF/\n +- MANIFEST.MF\n+- bundle_descriptor.xml\n")])])]),a("p",[t._v("The Java object code is included in the corresponding folders representing the package structure (e.g., “/eu/asterics/component/…” etc). Optionally, if libraries are needed - native or not-, then they are included in the “/lib” folder. The Manifest is included in the “META-INF” folder as per the standard Java/OSGi practice. Finally, the AsTeRICS bundle descriptor is included directly in the root of the JAR file (i.e. “/”).")]),t._v(" "),a("h2",{attrs:{id:"component-lifecyle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#component-lifecyle"}},[t._v("#")]),t._v(" Component lifecyle")]),t._v(" "),a("p",[t._v("An ARE component implementation needs to realise the actual component with its lifecycle (i.e., ways to access its ports and properties, and methods realizing its lifecycle). This is illustrated in the following code:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("runtime")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Lifecycle support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pause")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("resume")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Component support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeOutputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getOutputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventListenerPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventListenerPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventTriggererPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventTriggererPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" newValue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" syncedValuesReceived "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("img",{attrs:{src:s(302),alt:""}})]),t._v(" "),a("p",[t._v("The lifecycle support methods are used to intercept AsTeRICS events concerning the component’s lifecycle. In principle, a component can be any of the following:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("READY,")])]),t._v(" "),a("li",[a("p",[t._v("ACTIVE,")])]),t._v(" "),a("li",[a("p",[t._v("SUSPENDED and")])]),t._v(" "),a("li",[a("p",[t._v("STOPPED")])])]),t._v(" "),a("p",[t._v("These states and their possible transitions are illustrated in the figure on the right:")]),t._v(" "),a("p",[t._v("The rest of the methods are used for supporting the component operations, namely accessing the input/output ports of the component, as well as getting/setting its supported properties.")]),t._v(" "),a("h2",{attrs:{id:"threading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#threading"}},[t._v("#")]),t._v(" Threading")]),t._v(" "),a("p",[t._v("For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"writing-plugins-using-swing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#writing-plugins-using-swing"}},[t._v("#")]),t._v(" Writing plugins using Swing")]),t._v(" "),a("p",[t._v("If a plugin provides a Swing GUI it should only use the asynchronous method")]),t._v(" "),a("p",[a("code",[t._v("SwingUtilities.invokeLater(…)")])]),t._v(" "),a("p",[t._v("(and not the synchronous one) to perform the GUI updates. This is to prevent a potential thread deadlock if an action was originally triggered by a Swing GUI event e.g. by a button click in the ARE GUI. For detailed information about the ARE threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"long-lasting-method-calls"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#long-lasting-method-calls"}},[t._v("#")]),t._v(" Long lasting method calls")]),t._v(" "),a("p",[t._v("If a method call performs a long lasting task and there is no need to await the termination of it, the task should be handed over to a worker thread (see 5.9) to not block ModelExecutor thread. For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"sensor-callbacks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sensor-callbacks"}},[t._v("#")]),t._v(" Sensor callbacks")]),t._v(" "),a("p",[t._v("In case you write a plugin that uses a separate thread to generate data (e.g. FrameGrabber, Timer,…) you should explicitly use the method")]),t._v(" "),a("p",[a("code",[t._v("AstericsModelExecutionThreadPool.instance.execute(…)")])]),t._v(" "),a("p",[t._v("This is to ensure that corresponding data will be delivered within the same task execution. For detailed information about the threading concept see 9. Below is an example of the FacetrackerLK plugin in the callback method for new arriving coordinates:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("newCoordinates_callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsModelExecutionThreadPool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Runnable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n opNoseX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opNoseY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"contributing-a-developed-plugin-git-pull-request"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing-a-developed-plugin-git-pull-request"}},[t._v("#")]),t._v(" Contributing a developed plugin (git pull request)")]),t._v(" "),a("p",[t._v("The AsTeRICS platform is designed as an open and modular platform. The idea is to make it easy for others to develop assistive plugins any end-user in the world could benefit from. Hence, we would love to get your contribution back to the github repository to be able to ship the new plugin with future releases. For this purpose, please send a pull request.")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://help.github.com/articles/using-pull-requests/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://help.github.com/articles/using-pull-requests/"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{302:function(t,a,s){t.exports=s.p+"assets/img/DeveloperManual_html_17298a48a6d250c5.fbefb96e.png"},987:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"plugin-development-advanced"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-development-advanced"}},[t._v("#")]),t._v(" Plugin Development Advanced")]),t._v(" "),a("p",[t._v("In this manual some advanced topics of plugin development are listed.")]),t._v(" "),a("h2",{attrs:{id:"port-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#port-naming-conventions"}},[t._v("#")]),t._v(" Port Naming Conventions")]),t._v(" "),a("p",[t._v("Variables of port instances should be named with a prefix indicating what kind of port it is. The rest of the port name should indicate the port’s use and adhere to the standard Java variable naming conventions. The available prefixes are:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("ip: indicates that the port is an instance of IRuntimeInputPort")])]),t._v(" "),a("li",[a("p",[t._v("op: indicates that the port is an instance of IRuntimeOutputPort")])]),t._v(" "),a("li",[a("p",[t._v("elp: indicates that the port is an instance of IRuntimeEventListenerPort")])]),t._v(" "),a("li",[a("p",[t._v("etp: indicates that the port is an instance of IRuntimeEventTriggererPort")])])]),t._v(" "),a("p",[t._v("A variable holding an event listener port could therefore be named "),a("em",[t._v("elpKeyPressed")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"property-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#property-naming-conventions"}},[t._v("#")]),t._v(" Property Naming Conventions")]),t._v(" "),a("p",[t._v("Plugin properties should be directly mapped to a variable in the plugin code. The variable’s should be prepended with the prefix "),a("em",[t._v("prop")]),t._v(" and adhere to standard Java naming conventions. Thus a property could be named "),a("em",[t._v("InputGainValue")]),t._v(" and the corresponding variable should be named "),a("em",[t._v("propInputGainValue")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"bundle-descriptor-naming-conventions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bundle-descriptor-naming-conventions"}},[t._v("#")]),t._v(" Bundle Descriptor Naming Conventions")]),t._v(" "),a("p",[t._v("The bundle descriptor should serve as an abstraction layer between the user who creates models in the ACS and the developer. Thus the names for plugins, ports and properties in the bundle descriptor should be as intuitive as possible. Names in the bundle descriptor should not include prefixes because the added information is also conveyed in the presentation of plugins in the ACS.")]),t._v(" "),a("p",[t._v("The bundle descriptor can translate intuitive names (e.g. input.switch) to the canonical names of plugins (e.g. GpioInputInstance) allowing coexistence of a user and a developer language. This method of name translation can be applied for plugin names, port names and property names.")]),t._v(" "),a("h2",{attrs:{id:"asterics-are-service-and-plugin-source-file-header"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#asterics-are-service-and-plugin-source-file-header"}},[t._v("#")]),t._v(" AsTeRICS ARE, service and plugin source file header")]),t._v(" "),a("p",[t._v("Each source file of ARE, of ARE services, ARE plugins and tools which will be released as open source should have the following header:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('/*\n * AsTeRICS - Assistive Technology Rapid Integration and Construction Set\n * \n * \n * d8888 88888888888 8888888b. 8888888 .d8888b. .d8888b. \n * d88888 888 888 Y88b 888 d88P Y88b d88P Y88b\n * d88P888 888 888 888 888 888 888 Y88b. \n * d88P 888 .d8888b 888 .d88b. 888 d88P 888 888 "Y888b. \n * d88P 888 88K 888 d8P Y8b 8888888P" 888 888 "Y88b.\n * d88P 888 "Y8888b. 888 88888888 888 T88b 888 888 888 "888\n * d8888888888 X88 888 Y8b. 888 T88b 888 Y88b d88P Y88b d88P\n * d88P 888 88888P\' 888 "Y8888 888 T88b 8888888 "Y8888P" "Y8888P" \n *\n *\n * homepage: http://www.asterics.org \n *\n * This project has been partly funded by the European Commission, \n * Grant Agreement Number 247730\n * \n * \n * Dual License: MIT or GPL v3.0 with "CLASSPATH" exception\n * (please refer to the folder LICENSE)\n * \n */')]),t._v("\n")])])]),a("h2",{attrs:{id:"javadoc-compatible-comments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#javadoc-compatible-comments"}},[t._v("#")]),t._v(" JavaDoc compatible comments")]),t._v(" "),a("p",[t._v("JavaDoc compatible comments should be used to indicate the author of a source file, and to describe the purpose of a function/method/class and the respective parameters and return values.")]),t._v(" "),a("p",[t._v("Example for a source file header info:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Bardisplayinstance.java\n * Purpose of this module:\n * Implements the Bardisplay actuator plugin\n * \n * @author Chris Veigl [veigl@technikum-wien.at]\n * Date: Mar 7, 2011\n */")]),t._v("\n")])])]),a("p",[t._v("Example for a method of a class:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n* Returns the value of the given property\n* @param propertyName the name of the property\n* @return the property value\n*/")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"implementing-asterics-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementing-asterics-components"}},[t._v("#")]),t._v(" Implementing AsTeRICS components")]),t._v(" "),a("p",[t._v("This section describes the basic steps required for implementing an AsTeRICS component including a brief introduction to OSGi. To illustrate the implementation steps, we take a walk-through with the implementation of a simple processor component.")]),t._v(" "),a("p",[t._v("The AsTeRICS schemata of the XML descriptors include two concepts: the "),a("em",[t._v("bundle descriptors")]),t._v(" and the "),a("em",[t._v("deployment descriptors")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"the-bundle-descriptors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-bundle-descriptors"}},[t._v("#")]),t._v(" The Bundle Descriptors")]),t._v(" "),a("p",[t._v("Bundle descriptors are used to describe the content of an individual bundle (typically encapsulating one or more components). As such, they contain information about the included "),a("em",[t._v("components")]),t._v(", their "),a("em",[t._v("ports")]),t._v(", their customizable "),a("em",[t._v("properties")]),t._v(" and optionally their GUI.")]),t._v(" "),a("p",[t._v("The following shows a bundle descriptor of a simple processor-plugin (subtype for the ACS components menu is “Basic Math”). The plugin provides an averaging function for n values (property “buffer-size”) and has one input port and one output port for integer values:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentTypes")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("componentType")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.averager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("canonical_name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("eu.asterics.component.processor.averager.AveragerComponent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("subtype")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Basic Math"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("processor"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Linked list-based averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Input port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("multiplicity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("one-to-one"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mustBeConnected")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("out_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Output port of averager"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("buffer-size"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("integer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("50"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("The size of the averager's buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-deployment-descriptor"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-deployment-descriptor"}},[t._v("#")]),t._v(" The Deployment Descriptor")]),t._v(" "),a("p",[t._v("Deployment descriptors instruct the ARE of the desired application deployment structure. The deployment descriptor is typically composed in the AsTeRICS Configuration Suite (ACS) but can also be written with a text editor (as the bundle descriptor). Basically the deployment descriptor contains several component descriptions (copied from the corresponding bundle descriptors), actual property values and the channel connection between input- and output ports of the components.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The "),a("em",[t._v("type_id")]),t._v(" argument of the "),a("em",[t._v("component")]),t._v(" element in the deployment descriptor must match the "),a("em",[t._v("id")]),t._v(" argument of the "),a("em",[t._v("componentType")]),t._v(" element on the bundle descriptor. This is how the ARE detects the referred plugin type in the deployment model.")])]),t._v(" "),a("p",[t._v("The following demo deployment descriptor describes a simple model containing two plugins and one channel:")]),t._v(" "),a("div",{staticClass:"language-xml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("model")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("noNamespaceSchemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("deployment_model.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("components")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Source of two signal cahnnels "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("outputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type_id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("A Signal Target"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ports")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("inputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("portTypeID")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channels")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("channel")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("channel.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Connects SignalSource.1 (outport 1) \n to SignalTarget.1 (in_x)"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("source")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("sensor.SignalSource.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("outport1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("component")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("actuator.SignalTarget.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("port")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("in_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"the-manifest-file"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-manifest-file"}},[t._v("#")]),t._v(" The Manifest file")]),t._v(" "),a("p",[t._v("The Manifest file tells the bundle name and other informations like import packages and .dlls to the OSGi. A typical Manifest looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-processors.averager\nBundle-SymbolicName: eu.asterics.component.processor.averager\nBundle-Version: 0.1.0\nDynamicImport-Package: *\n\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The empty line at the end of the Manifest file. It seems that OSGi needs that empty line in order to work properly.")])]),t._v(" "),a("h2",{attrs:{id:"structure-of-osgi-bundles-containing-are-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-osgi-bundles-containing-are-components"}},[t._v("#")]),t._v(" Structure of OSGi bundles containing ARE components")]),t._v(" "),a("p",[t._v("As a common OSGi bundle, an AsTeRICS component must be packaged in a JAR file, containing the class files (object code) and the Manifest file. In addition to these, the AsTeRICS middleware expects the "),a("em",[t._v("bundle descriptor")]),t._v(". At this point, it should be noted that it is possible to include "),a("em",[t._v("multiple")]),t._v(" AsTeRICS components in a single OSGi bundle, as long as the bundle descriptor describes all of them.")]),t._v(" "),a("p",[t._v("Overall, the file structure in a typical AsTeRICS bundle looks as follows:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("/\n+- eu/\n +- asterics/\n +- component/\n +- ...\n+- lib/\n +- native/\n +- my_library.dll\n+- META-INF/\n +- MANIFEST.MF\n+- bundle_descriptor.xml\n")])])]),a("p",[t._v("The Java object code is included in the corresponding folders representing the package structure (e.g., “/eu/asterics/component/…” etc). Optionally, if libraries are needed - native or not-, then they are included in the “/lib” folder. The Manifest is included in the “META-INF” folder as per the standard Java/OSGi practice. Finally, the AsTeRICS bundle descriptor is included directly in the root of the JAR file (i.e. “/”).")]),t._v(" "),a("h2",{attrs:{id:"component-lifecyle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#component-lifecyle"}},[t._v("#")]),t._v(" Component lifecyle")]),t._v(" "),a("p",[t._v("An ARE component implementation needs to realise the actual component with its lifecycle (i.e., ways to access its ports and properties, and methods realizing its lifecycle). This is illustrated in the following code:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("runtime")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Lifecycle support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pause")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("resume")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ------------------ Component support methods ------------------------- //")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeOutputPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getOutputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventListenerPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventListenerPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeEventTriggererPort")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getEventTriggererPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" eventPortID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimePropertyValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" newValue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" syncedValuesReceived "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("img",{attrs:{src:s(302),alt:""}})]),t._v(" "),a("p",[t._v("The lifecycle support methods are used to intercept AsTeRICS events concerning the component’s lifecycle. In principle, a component can be any of the following:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("READY,")])]),t._v(" "),a("li",[a("p",[t._v("ACTIVE,")])]),t._v(" "),a("li",[a("p",[t._v("SUSPENDED and")])]),t._v(" "),a("li",[a("p",[t._v("STOPPED")])])]),t._v(" "),a("p",[t._v("These states and their possible transitions are illustrated in the figure on the right:")]),t._v(" "),a("p",[t._v("The rest of the methods are used for supporting the component operations, namely accessing the input/output ports of the component, as well as getting/setting its supported properties.")]),t._v(" "),a("h2",{attrs:{id:"threading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#threading"}},[t._v("#")]),t._v(" Threading")]),t._v(" "),a("p",[t._v("For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"writing-plugins-using-swing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#writing-plugins-using-swing"}},[t._v("#")]),t._v(" Writing plugins using Swing")]),t._v(" "),a("p",[t._v("If a plugin provides a Swing GUI it should only use the asynchronous method")]),t._v(" "),a("p",[a("code",[t._v("SwingUtilities.invokeLater(…)")])]),t._v(" "),a("p",[t._v("(and not the synchronous one) to perform the GUI updates. This is to prevent a potential thread deadlock if an action was originally triggered by a Swing GUI event e.g. by a button click in the ARE GUI. For detailed information about the ARE threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"long-lasting-method-calls"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#long-lasting-method-calls"}},[t._v("#")]),t._v(" Long lasting method calls")]),t._v(" "),a("p",[t._v("If a method call performs a long lasting task and there is no need to await the termination of it, the task should be handed over to a worker thread (see 5.9) to not block ModelExecutor thread. For detailed information about the threading concept see 9.")]),t._v(" "),a("h2",{attrs:{id:"sensor-callbacks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sensor-callbacks"}},[t._v("#")]),t._v(" Sensor callbacks")]),t._v(" "),a("p",[t._v("In case you write a plugin that uses a separate thread to generate data (e.g. FrameGrabber, Timer,…) you should explicitly use the method")]),t._v(" "),a("p",[a("code",[t._v("AstericsModelExecutionThreadPool.instance.execute(…)")])]),t._v(" "),a("p",[t._v("This is to ensure that corresponding data will be delivered within the same task execution. For detailed information about the threading concept see 9. Below is an example of the FacetrackerLK plugin in the callback method for new arriving coordinates:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("newCoordinates_callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsModelExecutionThreadPool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Runnable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n opNoseX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opNoseY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point1_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n opChinY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point2_y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"contributing-a-developed-plugin-git-pull-request"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing-a-developed-plugin-git-pull-request"}},[t._v("#")]),t._v(" Contributing a developed plugin (git pull request)")]),t._v(" "),a("p",[t._v("The AsTeRICS platform is designed as an open and modular platform. The idea is to make it easy for others to develop assistive plugins any end-user in the world could benefit from. Hence, we would love to get your contribution back to the github repository to be able to ship the new plugin with future releases. For this purpose, please send a pull request.")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://help.github.com/articles/using-pull-requests/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://help.github.com/articles/using-pull-requests/"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/116.96af4987.js b/assets/js/117.320a7460.js similarity index 99% rename from assets/js/116.96af4987.js rename to assets/js/117.320a7460.js index 0a9da75c6a..b5200124fb 100644 --- a/assets/js/116.96af4987.js +++ b/assets/js/117.320a7460.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{429:function(t,s,a){t.exports=a.p+"assets/img/Resource-Handling-BuildPath.c215c1df.jpg"},988:function(t,s,a){"use strict";a.r(s);var e=a(2),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"resource-handling-resourceregistry"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-handling-resourceregistry"}},[t._v("#")]),t._v(" Resource Handling (ResourceRegistry)")]),t._v(" "),s("h2",{attrs:{id:"objective"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[t._v("#")]),t._v(" Objective")]),t._v(" "),s("p",[t._v("In this tutorial you will learn how to use the class ResourceRegistry, which is a central repository that must be used to compose resource URIs and fetch and store resource contents from within plugins and the whole ARE.")]),t._v(" "),s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("The idea is to generically implement the fetching of resources to enable the same approach for the whole AsTeRICS framework. This way all plugins, services and other classes will be able to also support several URI schemes (e.g. file, http, jar,…). Furthermore base URIs can be reconfigured depending on platform specific or usecase specific requirements (e.g. readonly plugin respository hosted on a webserver). Currently only one file based repository URI ("),s("code",[t._v("ARE baseURI")]),t._v(") is supported. Later maybe the repository URIs could also be an http-URL and the plugin resources directly fetched from there.")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("ARE baseURI")]),t._v(" is set to the location of the ARE.jar file by default, but can be set to another location by the method "),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L852",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("public void setAREBaseURI(URI areBaseURI)")]),s("OutboundLink")],1),t._v(" programmatically.")]),t._v(" "),s("h2",{attrs:{id:"main-benefits"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#main-benefits"}},[t._v("#")]),t._v(" Main benefits")]),t._v(" "),s("ul",[s("li",[t._v("Abstraction of ARE folder structure: So if folder structure changes models are not affected.")]),t._v(" "),s("li",[t._v("Centralized dealing with platform specific problems ("),s("code",[t._v("\\")]),t._v(", "),s("code",[t._v("/")]),t._v(", conversion between URI encoded path and file path,…)")]),t._v(" "),s("li",[t._v("Dealing with relative and absolute file paths.")]),t._v(" "),s("li",[t._v("By using URI syntax for describing the path of a resource, resources can be of different protocol types (file, http, …)")]),t._v(" "),s("li",[t._v("Many utility methods for checking resource existence and conversion between several types (File, String, URI,…)")]),t._v(" "),s("li",[t._v("Convinience methods for fetching resource contents or storing contents, ensuring proper encoding (UTF-8) and exception handling.")]),t._v(" "),s("li",[t._v("Centralized implementation of searching strategies for resources, e.g. Search in user home directory first and if not found search in ARE installation directory. (not supported yet)")]),t._v(" "),s("li",[t._v("Configurable base URIs depending on resource type (not supported yet)")])]),t._v(" "),s("h2",{attrs:{id:"resource-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-types"}},[t._v("#")]),t._v(" Resource types")]),t._v(" "),s("p",[t._v("As part of the abstraction, class ResourceRegistry provides several resource types ("),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L482",target:"_blank",rel:"noopener noreferrer"}},[t._v("RES_TYPE enum"),s("OutboundLink")],1),t._v("), which are then mapped to real folders (or maybe later to http-URLs depending on the supported ARE baseURI protocols).")]),t._v(" "),s("p",[t._v("As of AsTeRICS 3.0, these are:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("MODEL")]),t._v(": Mapped to "),s("code",[t._v("/models/")])]),t._v(" "),s("li",[s("strong",[t._v("DATA")]),t._v(": Four step approach to search for a data file in either "),s("code",[t._v("/models/")]),t._v(" or "),s("code",[t._v("/data/")]),t._v(" or a subfolder of it.")]),t._v(" "),s("li",[s("strong",[t._v("JAR")]),t._v(": Mapped to "),s("code",[t._v("/")])]),t._v(" "),s("li",[s("strong",[t._v("PROFILE")]),t._v(": Mapped to "),s("code",[t._v("/profile/")])]),t._v(" "),s("li",[s("strong",[t._v("STORAGE")]),t._v(": Mapped to "),s("code",[t._v("/storage/")])]),t._v(" "),s("li",[s("strong",[t._v("LICENSE")]),t._v(": Mapped to "),s("code",[t._v("/LICENSE/")])]),t._v(" "),s("li",[s("strong",[t._v("IMAGE")]),t._v(": Mapped to "),s("code",[t._v("/images/")])]),t._v(" "),s("li",[s("strong",[t._v("TMP")]),t._v(": Mapped to "),s("code",[t._v("/tmp/")])]),t._v(" "),s("li",[s("strong",[t._v("WEB_DOCUMENT_ROOT")]),t._v(": Mapped to "),s("code",[t._v("/web/")])]),t._v(" "),s("li",[s("strong",[t._v("ANY")]),t._v(": Mapped to "),s("code",[t._v("/")])])]),t._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("Java IDE ("),s("a",{attrs:{href:"http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/neon3",target:"_blank",rel:"noopener noreferrer"}},[t._v("Eclipse"),s("OutboundLink")],1),t._v(" recommended)")]),t._v(" "),s("li",[s("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java Development Kit 8"),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"preparation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#preparation"}},[t._v("#")]),t._v(" Preparation")]),t._v(" "),s("p",[t._v("This tutorial demonstrates how to use the API of class ResourceRegistry in general. The tutorial does not show how to create an "),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Plugin-Development",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS plugin"),s("OutboundLink")],1),t._v(" where the API would be used normally.")]),t._v(" "),s("ol",[s("li",[t._v("Start Eclipse")]),t._v(" "),s("li",[t._v("Create a new Java project ("),s("code",[t._v("File/New/Java Project")]),t._v(")")]),t._v(" "),s("li",[t._v("Add the following libraries to the build configuration ("),s("code",[t._v("Project/Properties/Java Build Path/Libraries")]),t._v(")")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("/asterics.ARE.jar")])]),t._v(" "),s("li",[s("code",[t._v("/../APE/lib/commons-io-2.4.jar")])]),t._v(" "),s("li",[s("code",[t._v("/../APE/lib/commons-codec-1.11.jar")])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(429),alt:"Build path dialog with external libraries"}})]),t._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[t._v("Create a main class "),s("code",[t._v("ResourceRegistryExamples")]),t._v(" and copy and paste the following template code into it")])]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("net"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URI")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("net"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RES_TYPE")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistryExamples")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Don't call these two lines if you are using the class ResourceRegistry from within the ARE (plugin).")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setOSGIMode(false) defines that we are using it as a library.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setOSGIMode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setAREBaseURI(URI ...) sets the location of the ARE.jar file, which will be set automatically when used within")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the ARE. If you are on Linux use the respective path of /bin/ARE")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setAREBaseURI")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"C:\\\\Program Files (x86)\\\\AsTeRICS\\\\ARE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toURI")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Define variables for our examples.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URI")]),t._v(" myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"example-1-getting-resource-uri"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-1-getting-resource-uri"}},[t._v("#")]),t._v(" Example 1 - Getting resource URI")]),t._v(" "),s("h3",{attrs:{id:"get-model-uri"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-model-uri"}},[t._v("#")]),t._v(" Get model URI")]),t._v(" "),s("p",[t._v("To get the URI of a model file normally located at "),s("code",[t._v("/models/")]),t._v(" or a subpath of it, use")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"CameraMouse.acs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("MODEL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"grids\\\\eyeX_Environment\\\\eyeX_Environment.acs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("MODEL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO Auto-generated catch block")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This returns a valid URI if one can be constructed. The method does not check for resource existence.")]),t._v(" "),s("h3",{attrs:{id:"get-uri-of-a-data-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-uri-of-a-data-file"}},[t._v("#")]),t._v(" Get URI of a data file")]),t._v(" "),s("p",[t._v("To get the URIs of files with resource type data, use")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pictures/slide7.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//slashes may be \\\\ or / and even mixed up. The paths may contain spaces")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pictures\\\\symbols//walk the dog.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//To indicate that a data file is in a plugin-specific subpath of the data folder, use the overridden getResource method ")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//and provide the componentTypeId")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"haarcascade_frontalface_alt.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"facetrackerLK"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If you provide an absolute URI/URL it is returned as is, withou resolving it against the ARE baseURI.")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://raw.githubusercontent.com/wiki/asterics/AsTeRICS/Fetching-resources-with-class-ResourceRegistry.md"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"example-2-getting-resource-content"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-2-getting-resource-content"}},[t._v("#")]),t._v(" Example 2 - Getting resource content")]),t._v(" "),s("p",[t._v("To get the contents of a resource as a String, use")]),t._v(" "),s("div",{staticClass:"language-Java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResourceContentAsString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"CameraMouse.acs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("MODEL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("contents"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResourceContentAsString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://raw.githubusercontent.com/wiki/asterics/AsTeRICS/Fetching-resources-with-class-ResourceRegistry.md"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ANY")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("contents"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO Auto-generated catch block")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("When reading the resource content, character encoding is guessed best effort using the class "),s("a",{attrs:{href:"https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/input/BOMInputStream.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("BOMInputStream"),s("OutboundLink")],1),t._v(", with or without "),s("code",[t._v("ByteOrderMark")])]),t._v(" "),s("h2",{attrs:{id:"example-3-storing-resource-content"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-3-storing-resource-content"}},[t._v("#")]),t._v(" Example 3 - Storing resource content")]),t._v(" "),s("p",[t._v("To store contents to a resource location, use")]),t._v(" "),s("div",{staticClass:"language-Java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"My new test data to save."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("storeResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("contents"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"saveddata/testFile.txt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The method automatically creates missing directories in the path (if supported by the used protocol, e.g. file://) and ensures proper "),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/v3.0/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L94",target:"_blank",rel:"noopener noreferrer"}},[t._v("UTF8 character encoding"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"example-4-getting-a-resource-list"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-4-getting-a-resource-list"}},[t._v("#")]),t._v(" Example 4 - Getting a resource list")]),t._v(" "),s("p",[t._v("To get a list of models or data files, use")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Returns the URIs of all model resources")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" modelList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getModelList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Returns the URIs of all data resources")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" dataList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getDataList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If the element's type must be of String, you can convert it")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" modelListAsStrings"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toStringList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("modelList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The parameter of "),s("code",[t._v("getModelList")]),t._v(" or "),s("code",[t._v("getDataList")]),t._v(" defines, if the paths should be relative or absolute.")]),t._v(" "),s("h2",{attrs:{id:"references"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L53",target:"_blank",rel:"noopener noreferrer"}},[t._v("Source code of class ResourceRegistry"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/test/java/eu/asterics/mw/services/TestResourceRegistry.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("Unit tests with usage examples"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{429:function(t,s,a){t.exports=a.p+"assets/img/Resource-Handling-BuildPath.c215c1df.jpg"},995:function(t,s,a){"use strict";a.r(s);var e=a(2),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"resource-handling-resourceregistry"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-handling-resourceregistry"}},[t._v("#")]),t._v(" Resource Handling (ResourceRegistry)")]),t._v(" "),s("h2",{attrs:{id:"objective"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[t._v("#")]),t._v(" Objective")]),t._v(" "),s("p",[t._v("In this tutorial you will learn how to use the class ResourceRegistry, which is a central repository that must be used to compose resource URIs and fetch and store resource contents from within plugins and the whole ARE.")]),t._v(" "),s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("The idea is to generically implement the fetching of resources to enable the same approach for the whole AsTeRICS framework. This way all plugins, services and other classes will be able to also support several URI schemes (e.g. file, http, jar,…). Furthermore base URIs can be reconfigured depending on platform specific or usecase specific requirements (e.g. readonly plugin respository hosted on a webserver). Currently only one file based repository URI ("),s("code",[t._v("ARE baseURI")]),t._v(") is supported. Later maybe the repository URIs could also be an http-URL and the plugin resources directly fetched from there.")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("ARE baseURI")]),t._v(" is set to the location of the ARE.jar file by default, but can be set to another location by the method "),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L852",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("public void setAREBaseURI(URI areBaseURI)")]),s("OutboundLink")],1),t._v(" programmatically.")]),t._v(" "),s("h2",{attrs:{id:"main-benefits"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#main-benefits"}},[t._v("#")]),t._v(" Main benefits")]),t._v(" "),s("ul",[s("li",[t._v("Abstraction of ARE folder structure: So if folder structure changes models are not affected.")]),t._v(" "),s("li",[t._v("Centralized dealing with platform specific problems ("),s("code",[t._v("\\")]),t._v(", "),s("code",[t._v("/")]),t._v(", conversion between URI encoded path and file path,…)")]),t._v(" "),s("li",[t._v("Dealing with relative and absolute file paths.")]),t._v(" "),s("li",[t._v("By using URI syntax for describing the path of a resource, resources can be of different protocol types (file, http, …)")]),t._v(" "),s("li",[t._v("Many utility methods for checking resource existence and conversion between several types (File, String, URI,…)")]),t._v(" "),s("li",[t._v("Convinience methods for fetching resource contents or storing contents, ensuring proper encoding (UTF-8) and exception handling.")]),t._v(" "),s("li",[t._v("Centralized implementation of searching strategies for resources, e.g. Search in user home directory first and if not found search in ARE installation directory. (not supported yet)")]),t._v(" "),s("li",[t._v("Configurable base URIs depending on resource type (not supported yet)")])]),t._v(" "),s("h2",{attrs:{id:"resource-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-types"}},[t._v("#")]),t._v(" Resource types")]),t._v(" "),s("p",[t._v("As part of the abstraction, class ResourceRegistry provides several resource types ("),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L482",target:"_blank",rel:"noopener noreferrer"}},[t._v("RES_TYPE enum"),s("OutboundLink")],1),t._v("), which are then mapped to real folders (or maybe later to http-URLs depending on the supported ARE baseURI protocols).")]),t._v(" "),s("p",[t._v("As of AsTeRICS 3.0, these are:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("MODEL")]),t._v(": Mapped to "),s("code",[t._v("/models/")])]),t._v(" "),s("li",[s("strong",[t._v("DATA")]),t._v(": Four step approach to search for a data file in either "),s("code",[t._v("/models/")]),t._v(" or "),s("code",[t._v("/data/")]),t._v(" or a subfolder of it.")]),t._v(" "),s("li",[s("strong",[t._v("JAR")]),t._v(": Mapped to "),s("code",[t._v("/")])]),t._v(" "),s("li",[s("strong",[t._v("PROFILE")]),t._v(": Mapped to "),s("code",[t._v("/profile/")])]),t._v(" "),s("li",[s("strong",[t._v("STORAGE")]),t._v(": Mapped to "),s("code",[t._v("/storage/")])]),t._v(" "),s("li",[s("strong",[t._v("LICENSE")]),t._v(": Mapped to "),s("code",[t._v("/LICENSE/")])]),t._v(" "),s("li",[s("strong",[t._v("IMAGE")]),t._v(": Mapped to "),s("code",[t._v("/images/")])]),t._v(" "),s("li",[s("strong",[t._v("TMP")]),t._v(": Mapped to "),s("code",[t._v("/tmp/")])]),t._v(" "),s("li",[s("strong",[t._v("WEB_DOCUMENT_ROOT")]),t._v(": Mapped to "),s("code",[t._v("/web/")])]),t._v(" "),s("li",[s("strong",[t._v("ANY")]),t._v(": Mapped to "),s("code",[t._v("/")])])]),t._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("Java IDE ("),s("a",{attrs:{href:"http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/neon3",target:"_blank",rel:"noopener noreferrer"}},[t._v("Eclipse"),s("OutboundLink")],1),t._v(" recommended)")]),t._v(" "),s("li",[s("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java Development Kit 8"),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"preparation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#preparation"}},[t._v("#")]),t._v(" Preparation")]),t._v(" "),s("p",[t._v("This tutorial demonstrates how to use the API of class ResourceRegistry in general. The tutorial does not show how to create an "),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Plugin-Development",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS plugin"),s("OutboundLink")],1),t._v(" where the API would be used normally.")]),t._v(" "),s("ol",[s("li",[t._v("Start Eclipse")]),t._v(" "),s("li",[t._v("Create a new Java project ("),s("code",[t._v("File/New/Java Project")]),t._v(")")]),t._v(" "),s("li",[t._v("Add the following libraries to the build configuration ("),s("code",[t._v("Project/Properties/Java Build Path/Libraries")]),t._v(")")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("/asterics.ARE.jar")])]),t._v(" "),s("li",[s("code",[t._v("/../APE/lib/commons-io-2.4.jar")])]),t._v(" "),s("li",[s("code",[t._v("/../APE/lib/commons-codec-1.11.jar")])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(429),alt:"Build path dialog with external libraries"}})]),t._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[t._v("Create a main class "),s("code",[t._v("ResourceRegistryExamples")]),t._v(" and copy and paste the following template code into it")])]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("net"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URI")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("net"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("eu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mw"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RES_TYPE")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistryExamples")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Don't call these two lines if you are using the class ResourceRegistry from within the ARE (plugin).")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setOSGIMode(false) defines that we are using it as a library.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setOSGIMode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setAREBaseURI(URI ...) sets the location of the ARE.jar file, which will be set automatically when used within")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the ARE. If you are on Linux use the respective path of /bin/ARE")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setAREBaseURI")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"C:\\\\Program Files (x86)\\\\AsTeRICS\\\\ARE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toURI")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Define variables for our examples.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URI")]),t._v(" myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"example-1-getting-resource-uri"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-1-getting-resource-uri"}},[t._v("#")]),t._v(" Example 1 - Getting resource URI")]),t._v(" "),s("h3",{attrs:{id:"get-model-uri"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-model-uri"}},[t._v("#")]),t._v(" Get model URI")]),t._v(" "),s("p",[t._v("To get the URI of a model file normally located at "),s("code",[t._v("/models/")]),t._v(" or a subpath of it, use")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"CameraMouse.acs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("MODEL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"grids\\\\eyeX_Environment\\\\eyeX_Environment.acs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("MODEL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO Auto-generated catch block")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This returns a valid URI if one can be constructed. The method does not check for resource existence.")]),t._v(" "),s("h3",{attrs:{id:"get-uri-of-a-data-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-uri-of-a-data-file"}},[t._v("#")]),t._v(" Get URI of a data file")]),t._v(" "),s("p",[t._v("To get the URIs of files with resource type data, use")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pictures/slide7.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//slashes may be \\\\ or / and even mixed up. The paths may contain spaces")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pictures\\\\symbols//walk the dog.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//To indicate that a data file is in a plugin-specific subpath of the data folder, use the overridden getResource method ")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//and provide the componentTypeId")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"haarcascade_frontalface_alt.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"facetrackerLK"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If you provide an absolute URI/URL it is returned as is, withou resolving it against the ARE baseURI.")]),t._v("\n myURI "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://raw.githubusercontent.com/wiki/asterics/AsTeRICS/Fetching-resources-with-class-ResourceRegistry.md"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myURI: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myURI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"example-2-getting-resource-content"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-2-getting-resource-content"}},[t._v("#")]),t._v(" Example 2 - Getting resource content")]),t._v(" "),s("p",[t._v("To get the contents of a resource as a String, use")]),t._v(" "),s("div",{staticClass:"language-Java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResourceContentAsString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"CameraMouse.acs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("MODEL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("contents"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getResourceContentAsString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://raw.githubusercontent.com/wiki/asterics/AsTeRICS/Fetching-resources-with-class-ResourceRegistry.md"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ANY")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("contents"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO Auto-generated catch block")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("When reading the resource content, character encoding is guessed best effort using the class "),s("a",{attrs:{href:"https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/input/BOMInputStream.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("BOMInputStream"),s("OutboundLink")],1),t._v(", with or without "),s("code",[t._v("ByteOrderMark")])]),t._v(" "),s("h2",{attrs:{id:"example-3-storing-resource-content"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-3-storing-resource-content"}},[t._v("#")]),t._v(" Example 3 - Storing resource content")]),t._v(" "),s("p",[t._v("To store contents to a resource location, use")]),t._v(" "),s("div",{staticClass:"language-Java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n contents "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"My new test data to save."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("storeResource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("contents"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"saveddata/testFile.txt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("RES_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DATA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URISyntaxException")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The method automatically creates missing directories in the path (if supported by the used protocol, e.g. file://) and ensures proper "),s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/v3.0/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L94",target:"_blank",rel:"noopener noreferrer"}},[t._v("UTF8 character encoding"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"example-4-getting-a-resource-list"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-4-getting-a-resource-list"}},[t._v("#")]),t._v(" Example 4 - Getting a resource list")]),t._v(" "),s("p",[t._v("To get a list of models or data files, use")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Returns the URIs of all model resources")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" modelList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getModelList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Returns the URIs of all data resources")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URI"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" dataList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getDataList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If the element's type must be of String, you can convert it")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" modelListAsStrings"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResourceRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toStringList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("modelList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The parameter of "),s("code",[t._v("getModelList")]),t._v(" or "),s("code",[t._v("getDataList")]),t._v(" defines, if the paths should be relative or absolute.")]),t._v(" "),s("h2",{attrs:{id:"references"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java#L53",target:"_blank",rel:"noopener noreferrer"}},[t._v("Source code of class ResourceRegistry"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/test/java/eu/asterics/mw/services/TestResourceRegistry.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("Unit tests with usage examples"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/117.29e82200.js b/assets/js/118.822a8772.js similarity index 80% rename from assets/js/117.29e82200.js rename to assets/js/118.822a8772.js index 16fe3d4e80..b7f127ff32 100644 --- a/assets/js/117.29e82200.js +++ b/assets/js/118.822a8772.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{1004:function(t,o,s){"use strict";s.r(o);var e=s(2),n=Object(e.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"colours-settings"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#colours-settings"}},[t._v("#")]),t._v(" Colours Settings")]),t._v(" "),o("p",[o("img",{attrs:{src:s(451),alt:"Screenshot: Options Dialog, Colours Settings",title:"Screenshot: Options Dialog, Colours Settings"}})]),t._v(" "),o("p",[t._v("Options Dialog, Colours Settings")]),t._v(" "),o("p",[t._v("Within the "),o("em",[t._v("Colours")]),t._v(" tab, the colours of the different parts of a component can be changed. The colour chooser not only allows changing the colour, also the transparency can be changed.")])])}),[],!1,null,null,null);o.default=n.exports},451:function(t,o,s){t.exports=s.p+"assets/img/colour_settings.b6a0614a.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{1006:function(t,o,s){"use strict";s.r(o);var e=s(2),n=Object(e.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"colours-settings"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#colours-settings"}},[t._v("#")]),t._v(" Colours Settings")]),t._v(" "),o("p",[o("img",{attrs:{src:s(450),alt:"Screenshot: Options Dialog, Colours Settings",title:"Screenshot: Options Dialog, Colours Settings"}})]),t._v(" "),o("p",[t._v("Options Dialog, Colours Settings")]),t._v(" "),o("p",[t._v("Within the "),o("em",[t._v("Colours")]),t._v(" tab, the colours of the different parts of a component can be changed. The colour chooser not only allows changing the colour, also the transparency can be changed.")])])}),[],!1,null,null,null);o.default=n.exports},450:function(t,o,s){t.exports=s.p+"assets/img/colour_settings.b6a0614a.png"}}]); \ No newline at end of file diff --git a/assets/js/118.f8c7e13f.js b/assets/js/119.a4b6ed27.js similarity index 88% rename from assets/js/118.f8c7e13f.js rename to assets/js/119.a4b6ed27.js index fee5cd7154..b0811527d1 100644 --- a/assets/js/118.f8c7e13f.js +++ b/assets/js/119.a4b6ed27.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{1003:function(e,t,o){"use strict";o.r(t);var n=o(2),l=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"component-collection-manager"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-collection-manager"}},[e._v("#")]),e._v(" Component Collection Manager")]),e._v(" "),t("p",[e._v("The Component Collection Manager (see Figure below) is a small tool in which downloaded component collections (the description of the available plugins within the AsTeRICS Runtime Environment) can be saved and administered. Within the component collection manager, the following functionalities are provided:")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Use Default")]),e._v(" sets the default ACS component collection as active component collection")]),e._v(" "),t("li",[t("em",[e._v("Set as Autostart")]),e._v(" sets the active component collection as autostart component collection, which will be loaded at ACS startup.")]),e._v(" "),t("li",[t("em",[e._v("Save Component Collection")]),e._v(" saves the active component collection (e.g. a downloaded component collection from the ARE) into the ACS folder.")]),e._v(" "),t("li",[e._v("The "),t("em",[e._v("Saved Component Collections")]),e._v(" list shows all saved component collections. A component collection can be selected and set active.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(450),alt:"Bundle Manager",title:"Bundle Manager"}})]),e._v(" "),t("p",[e._v("Component Collection Manager")])])}),[],!1,null,null,null);t.default=l.exports},450:function(e,t,o){e.exports=o.p+"assets/img/bundle-manager.a6a8eed1.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{1007:function(e,t,o){"use strict";o.r(t);var n=o(2),l=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"component-collection-manager"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-collection-manager"}},[e._v("#")]),e._v(" Component Collection Manager")]),e._v(" "),t("p",[e._v("The Component Collection Manager (see Figure below) is a small tool in which downloaded component collections (the description of the available plugins within the AsTeRICS Runtime Environment) can be saved and administered. Within the component collection manager, the following functionalities are provided:")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Use Default")]),e._v(" sets the default ACS component collection as active component collection")]),e._v(" "),t("li",[t("em",[e._v("Set as Autostart")]),e._v(" sets the active component collection as autostart component collection, which will be loaded at ACS startup.")]),e._v(" "),t("li",[t("em",[e._v("Save Component Collection")]),e._v(" saves the active component collection (e.g. a downloaded component collection from the ARE) into the ACS folder.")]),e._v(" "),t("li",[e._v("The "),t("em",[e._v("Saved Component Collections")]),e._v(" list shows all saved component collections. A component collection can be selected and set active.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(451),alt:"Bundle Manager",title:"Bundle Manager"}})]),e._v(" "),t("p",[e._v("Component Collection Manager")])])}),[],!1,null,null,null);t.default=l.exports},451:function(e,t,o){e.exports=o.p+"assets/img/bundle-manager.a6a8eed1.png"}}]); \ No newline at end of file diff --git a/assets/js/12.7015b996.js b/assets/js/12.13dfe35b.js similarity index 99% rename from assets/js/12.7015b996.js rename to assets/js/12.13dfe35b.js index 7d1dc55a4b..50a0e26978 100644 --- a/assets/js/12.7015b996.js +++ b/assets/js/12.13dfe35b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{303:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_c2213f881cbf5182.abc6a2f0.png"},304:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_ae369b509ff2c0e5.bc1cbc88.png"},305:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_dd4b70e6240040e3.6272921f.png"},306:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a82259165c76b9df.da0379b4.png"},307:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_3d4398abcb45cc73.1ff3242b.png"},308:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_fbbda5b6e8f42820.b9487507.png"},309:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a0117682e4ae2ecc.f3f88992.png"},310:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_4304f99776fb485f.9217fb55.png"},311:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_f35fad4db20b5c1.cc89c5a3.png"},312:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_2672e47f28834257.fa86415c.png"},949:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"plugin-introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-introduction"}},[e._v("#")]),e._v(" Plugin Introduction")]),e._v(" "),t("h2",{attrs:{id:"a-quick-guide-to-asterics-plugin-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#a-quick-guide-to-asterics-plugin-development"}},[e._v("#")]),e._v(" A Quick Guide to AsTeRICS Plugin Development")]),e._v(" "),t("p",[e._v("This section describes the AsTeRICS Plugin-Creation tool and the plugin-activation process. These tools make it easy to create new plugins and make them available in ACS and ARE. They can be started manually from their location in the "),t("strong",[e._v("AsTeRICS_runtime.zip")]),e._v(" package (folder: “ACS/tools”) – or they can be launched from the “Misc.” – Tab in the main menu of the ACS:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(303),alt:""}})]),e._v(" "),t("p",[e._v("The creation of a new AsTeRICS plugin for the runtime environment involves several steps:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("creating the folder structure to store the plugin files")])]),e._v(" "),t("li",[t("p",[e._v("creating the ANT build script file")])]),e._v(" "),t("li",[t("p",[e._v("creating the manifest file")])]),e._v(" "),t("li",[t("p",[e._v("creating the bundle-descriptor, which specifies the ports and properties of the plugin")])]),e._v(" "),t("li",[t("p",[e._v("creating the source code file of the JavaInstance")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("defining the ports and properties and implementing the get- and set-methods for input-, output-, eventListener- and evenTrigger ports")])]),e._v(" "),t("li",[t("p",[e._v("implementing the get- and set- methods for property values and the input ports receive handlers")])])])]),e._v(" "),t("li",[t("p",[e._v("creating the license files for the plugin and third-party libraries in the "),t("strong",[e._v("LICENSE")]),e._v(" subfolder")])])]),e._v(" "),t("p",[e._v("This process is similar for each plugin, and involves much work and sources of errors, especially for people who work with the AsTeRICS framework for the first time.")]),e._v(" "),t("p",[e._v("Usually, you look for a plugin with similar specifications, copy its folder structure and then rename and change the files as desired. But also this process needs some effort and errors/typos can be introduced very easily.")]),e._v(" "),t("p",[e._v("The purpose of the AsTeRICS Plugin Creation Tools is to make it easy to create new plugins, by providing the necessary folder structure, the bundle descriptor and a template for the JAVA source code.")]),e._v(" "),t("h2",{attrs:{id:"the-plugin-creation-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-plugin-creation-wizard"}},[e._v("#")]),e._v(" The Plugin Creation Wizard")]),e._v(" "),t("p",[e._v("The plugin Creation wizard allows definition of characteristics of a new plugin and creates the needed folders and files for the Eclipse build flow, including the JAVA source code skeleton and the plugin’s bundle descriptor.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(304),alt:""}})]),e._v(" "),t("p",[e._v("As can be seen in the above figure, desired input- and output ports, data types, properties and plugin-features are simply selected and added to list boxes on the screen.")]),e._v(" "),t("p",[e._v("Important Notes:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("the path to the target folder has to exist in the local file system, and must point to the ARE/components directory where all plugin source files are located, e.g.: “C:\\asterics\\bin\\components\\”.")])]),e._v(" "),t("li",[t("p",[e._v("The plugin name must be specified in CamelCase letters (capital first letter), e.g. “MyPlugin”. Type and Subcategory have to be specified - they define the location where the plugin will appear in the ACS Components menu.")])]),e._v(" "),t("li",[t("p",[e._v("It is possible to create a list of possible text-selections in a combo-box in the ACS property editor. The data type for this property must be integer, the property gets the number of the selected item. Text-captions for the combo-box entries must be separated with double slash, e.g: “Mode 1//Mode 2//Mode 3”.")])])]),e._v(" "),t("h2",{attrs:{id:"created-files-and-folders"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#created-files-and-folders"}},[e._v("#")]),e._v(" Created files and folders")]),e._v(" "),t("p",[e._v("After “Create Plugin!” has been pressed and the plugin creation was completed successfully, following sub-folders and files are begin created:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(305),alt:""}})]),e._v(" "),t("p",[e._v("The root folder contains the build script, which can be executed inside Eclipse to compile and build the plugin (.jar) file:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(306),alt:""}})]),e._v(" "),t("p",[e._v("The META-INF folder contains the manifest file")]),e._v(" "),t("p",[t("img",{attrs:{src:n(307),alt:""}})]),e._v(" "),t("p",[e._v("The “resources” folder contains the bundle descriptor (bundle_descriptor.xml):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(308),alt:""}})]),e._v(" "),t("p",[e._v("The source code folder "),t("code",[e._v("src/main/java/eu/asterics/component//")]),e._v(" contains a template for the plugin source code in JAVA, including the definitions of the selected ports and properties and the needed get- and set- methods for ports and property values. The code skeleton complies to the AsTeRICS coding guidelines and contains the AsTeRICS source file header (only a small portion is shown in the following screenshot).")]),e._v(" "),t("p",[t("img",{attrs:{src:n(309),alt:""}})]),e._v(" "),t("p",[e._v("After the Eclipse IDE has been opened, Eclipse must be pushed to refresh the folder structure by pushing F5. Furthermore, the path "),t("code",[e._v("src/main/java")]),e._v(" must be configured as source folder.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(310),alt:""}})]),e._v(" "),t("p",[e._v("The plugin code can be built using the provided build script (right-click build.xml -> RunAs -> Ant Build in the plugin’s folder)")]),e._v(" "),t("p",[t("img",{attrs:{src:n(311),alt:""}})]),e._v(" "),t("p",[e._v("To see the plugin in the ACS editor window and/or start it inside the runtime environment, the Plugin Activation Tool can be used (see section 3).")]),e._v(" "),t("h2",{attrs:{id:"plugin-activation-in-acs-and-are"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-activation-in-acs-and-are"}},[e._v("#")]),e._v(" Plugin Activation in ACS and ARE")]),e._v(" "),t("p",[e._v("To use a new AsTeRICS plugin which has been built using the Eclipse build flow and exists as executable .jar file/OSGI bundle, one step is necessary:")]),e._v(" "),t("ol",[t("li",[e._v("The Plugin has to be "),t("strong",[e._v("announced to the ACS")]),e._v(" – so that it gets visible in the graphical editor and can be used for the creation of deployment models. This is done by adding the bundle descriptor of the new plugin to a component-collection file (extension “.abd”) in the ACS-folder. These component collections contain all bundle-descriptors of components which can be used in the ACS. The new plugin section can be added either manually or can be downloaded from the running ARE via the ACS’ Component-Collection Manager (recommended, see 3.2.1). Using the Component Collection Manger, the downloaded collection can be stored as “default Component Collection” for the ACS, so that all components will be available when the ACS is started next time.")])]),e._v(" "),t("p",[e._v("Subsequently, the plugin can be selected in the “components” menu of the ACS, and the ARE will activate the plugin at startup.")]),e._v(" "),t("h2",{attrs:{id:"component-collection-management-in-the-acs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-collection-management-in-the-acs"}},[e._v("#")]),e._v(" Component-Collection Management in the ACS")]),e._v(" "),t("p",[e._v("The ACS provides a function for downloading the bundle descriptions of all active plugins directly from a running ARE and creating a component collection file from this information. (“System”- tab, Button “Download Component Collection”):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(312),alt:""}})]),e._v(" "),t("p",[e._v("The component collection will be stored as “.abd” – file in the ACS folder, subfolder “componentcollections”. The new component collection can be used right after download, but will not be available after an ACS restart.")]),e._v(" "),t("p",[e._v("Within the ACS Component-Collection Manager (in the “Miscellaneous” tab), component collections can be selected or set as default collection for the ACS startup. For details see the User Manual, ACS section.")]),e._v(" "),t("p",[e._v("Please note that the “loader.ini” – file has to be updated manually in the ARE’s “profile” subfolder, by addition of the new .jar filename. After restart of the ARE and connection to the ACS, the component collection can be downloaded.")]),e._v(" "),t("h2",{attrs:{id:"plugin-license-declaration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-license-declaration"}},[e._v("#")]),e._v(" Plugin License Declaration")]),e._v(" "),t("p",[e._v("Since AsTeRICS version 2.8 the licenses (including licenses of third-party libraries) of a plugin must be provided as .txt files in the LICENSE subfolder. The filenames must follow a defined naming convention, which is:")]),e._v(" "),t("p",[e._v("A contributor must add the respective license file for the component (either "),t("strong",[e._v("LICENSE_MITOrGPLv3WithException.txt")]),e._v(" or one of the two dual license options) to the component/LICENSE folder. Furthermore, for each thirdparty library used, the license file must be added with the following naming convention (Please use CamelCase notation for the library and license names):")]),e._v(" "),t("p",[t("strong",[e._v("THIRDPARTY_NameOfLibrary_LicenseNameInclVersionInfo.txt")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{303:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_c2213f881cbf5182.abc6a2f0.png"},304:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_ae369b509ff2c0e5.bc1cbc88.png"},305:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_dd4b70e6240040e3.6272921f.png"},306:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a82259165c76b9df.da0379b4.png"},307:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_3d4398abcb45cc73.1ff3242b.png"},308:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_fbbda5b6e8f42820.b9487507.png"},309:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a0117682e4ae2ecc.f3f88992.png"},310:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_4304f99776fb485f.9217fb55.png"},311:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_f35fad4db20b5c1.cc89c5a3.png"},312:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_2672e47f28834257.fa86415c.png"},951:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"plugin-introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-introduction"}},[e._v("#")]),e._v(" Plugin Introduction")]),e._v(" "),t("h2",{attrs:{id:"a-quick-guide-to-asterics-plugin-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#a-quick-guide-to-asterics-plugin-development"}},[e._v("#")]),e._v(" A Quick Guide to AsTeRICS Plugin Development")]),e._v(" "),t("p",[e._v("This section describes the AsTeRICS Plugin-Creation tool and the plugin-activation process. These tools make it easy to create new plugins and make them available in ACS and ARE. They can be started manually from their location in the "),t("strong",[e._v("AsTeRICS_runtime.zip")]),e._v(" package (folder: “ACS/tools”) – or they can be launched from the “Misc.” – Tab in the main menu of the ACS:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(303),alt:""}})]),e._v(" "),t("p",[e._v("The creation of a new AsTeRICS plugin for the runtime environment involves several steps:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("creating the folder structure to store the plugin files")])]),e._v(" "),t("li",[t("p",[e._v("creating the ANT build script file")])]),e._v(" "),t("li",[t("p",[e._v("creating the manifest file")])]),e._v(" "),t("li",[t("p",[e._v("creating the bundle-descriptor, which specifies the ports and properties of the plugin")])]),e._v(" "),t("li",[t("p",[e._v("creating the source code file of the JavaInstance")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("defining the ports and properties and implementing the get- and set-methods for input-, output-, eventListener- and evenTrigger ports")])]),e._v(" "),t("li",[t("p",[e._v("implementing the get- and set- methods for property values and the input ports receive handlers")])])])]),e._v(" "),t("li",[t("p",[e._v("creating the license files for the plugin and third-party libraries in the "),t("strong",[e._v("LICENSE")]),e._v(" subfolder")])])]),e._v(" "),t("p",[e._v("This process is similar for each plugin, and involves much work and sources of errors, especially for people who work with the AsTeRICS framework for the first time.")]),e._v(" "),t("p",[e._v("Usually, you look for a plugin with similar specifications, copy its folder structure and then rename and change the files as desired. But also this process needs some effort and errors/typos can be introduced very easily.")]),e._v(" "),t("p",[e._v("The purpose of the AsTeRICS Plugin Creation Tools is to make it easy to create new plugins, by providing the necessary folder structure, the bundle descriptor and a template for the JAVA source code.")]),e._v(" "),t("h2",{attrs:{id:"the-plugin-creation-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-plugin-creation-wizard"}},[e._v("#")]),e._v(" The Plugin Creation Wizard")]),e._v(" "),t("p",[e._v("The plugin Creation wizard allows definition of characteristics of a new plugin and creates the needed folders and files for the Eclipse build flow, including the JAVA source code skeleton and the plugin’s bundle descriptor.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(304),alt:""}})]),e._v(" "),t("p",[e._v("As can be seen in the above figure, desired input- and output ports, data types, properties and plugin-features are simply selected and added to list boxes on the screen.")]),e._v(" "),t("p",[e._v("Important Notes:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("the path to the target folder has to exist in the local file system, and must point to the ARE/components directory where all plugin source files are located, e.g.: “C:\\asterics\\bin\\components\\”.")])]),e._v(" "),t("li",[t("p",[e._v("The plugin name must be specified in CamelCase letters (capital first letter), e.g. “MyPlugin”. Type and Subcategory have to be specified - they define the location where the plugin will appear in the ACS Components menu.")])]),e._v(" "),t("li",[t("p",[e._v("It is possible to create a list of possible text-selections in a combo-box in the ACS property editor. The data type for this property must be integer, the property gets the number of the selected item. Text-captions for the combo-box entries must be separated with double slash, e.g: “Mode 1//Mode 2//Mode 3”.")])])]),e._v(" "),t("h2",{attrs:{id:"created-files-and-folders"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#created-files-and-folders"}},[e._v("#")]),e._v(" Created files and folders")]),e._v(" "),t("p",[e._v("After “Create Plugin!” has been pressed and the plugin creation was completed successfully, following sub-folders and files are begin created:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(305),alt:""}})]),e._v(" "),t("p",[e._v("The root folder contains the build script, which can be executed inside Eclipse to compile and build the plugin (.jar) file:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(306),alt:""}})]),e._v(" "),t("p",[e._v("The META-INF folder contains the manifest file")]),e._v(" "),t("p",[t("img",{attrs:{src:n(307),alt:""}})]),e._v(" "),t("p",[e._v("The “resources” folder contains the bundle descriptor (bundle_descriptor.xml):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(308),alt:""}})]),e._v(" "),t("p",[e._v("The source code folder "),t("code",[e._v("src/main/java/eu/asterics/component//")]),e._v(" contains a template for the plugin source code in JAVA, including the definitions of the selected ports and properties and the needed get- and set- methods for ports and property values. The code skeleton complies to the AsTeRICS coding guidelines and contains the AsTeRICS source file header (only a small portion is shown in the following screenshot).")]),e._v(" "),t("p",[t("img",{attrs:{src:n(309),alt:""}})]),e._v(" "),t("p",[e._v("After the Eclipse IDE has been opened, Eclipse must be pushed to refresh the folder structure by pushing F5. Furthermore, the path "),t("code",[e._v("src/main/java")]),e._v(" must be configured as source folder.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(310),alt:""}})]),e._v(" "),t("p",[e._v("The plugin code can be built using the provided build script (right-click build.xml -> RunAs -> Ant Build in the plugin’s folder)")]),e._v(" "),t("p",[t("img",{attrs:{src:n(311),alt:""}})]),e._v(" "),t("p",[e._v("To see the plugin in the ACS editor window and/or start it inside the runtime environment, the Plugin Activation Tool can be used (see section 3).")]),e._v(" "),t("h2",{attrs:{id:"plugin-activation-in-acs-and-are"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-activation-in-acs-and-are"}},[e._v("#")]),e._v(" Plugin Activation in ACS and ARE")]),e._v(" "),t("p",[e._v("To use a new AsTeRICS plugin which has been built using the Eclipse build flow and exists as executable .jar file/OSGI bundle, one step is necessary:")]),e._v(" "),t("ol",[t("li",[e._v("The Plugin has to be "),t("strong",[e._v("announced to the ACS")]),e._v(" – so that it gets visible in the graphical editor and can be used for the creation of deployment models. This is done by adding the bundle descriptor of the new plugin to a component-collection file (extension “.abd”) in the ACS-folder. These component collections contain all bundle-descriptors of components which can be used in the ACS. The new plugin section can be added either manually or can be downloaded from the running ARE via the ACS’ Component-Collection Manager (recommended, see 3.2.1). Using the Component Collection Manger, the downloaded collection can be stored as “default Component Collection” for the ACS, so that all components will be available when the ACS is started next time.")])]),e._v(" "),t("p",[e._v("Subsequently, the plugin can be selected in the “components” menu of the ACS, and the ARE will activate the plugin at startup.")]),e._v(" "),t("h2",{attrs:{id:"component-collection-management-in-the-acs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-collection-management-in-the-acs"}},[e._v("#")]),e._v(" Component-Collection Management in the ACS")]),e._v(" "),t("p",[e._v("The ACS provides a function for downloading the bundle descriptions of all active plugins directly from a running ARE and creating a component collection file from this information. (“System”- tab, Button “Download Component Collection”):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(312),alt:""}})]),e._v(" "),t("p",[e._v("The component collection will be stored as “.abd” – file in the ACS folder, subfolder “componentcollections”. The new component collection can be used right after download, but will not be available after an ACS restart.")]),e._v(" "),t("p",[e._v("Within the ACS Component-Collection Manager (in the “Miscellaneous” tab), component collections can be selected or set as default collection for the ACS startup. For details see the User Manual, ACS section.")]),e._v(" "),t("p",[e._v("Please note that the “loader.ini” – file has to be updated manually in the ARE’s “profile” subfolder, by addition of the new .jar filename. After restart of the ARE and connection to the ACS, the component collection can be downloaded.")]),e._v(" "),t("h2",{attrs:{id:"plugin-license-declaration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-license-declaration"}},[e._v("#")]),e._v(" Plugin License Declaration")]),e._v(" "),t("p",[e._v("Since AsTeRICS version 2.8 the licenses (including licenses of third-party libraries) of a plugin must be provided as .txt files in the LICENSE subfolder. The filenames must follow a defined naming convention, which is:")]),e._v(" "),t("p",[e._v("A contributor must add the respective license file for the component (either "),t("strong",[e._v("LICENSE_MITOrGPLv3WithException.txt")]),e._v(" or one of the two dual license options) to the component/LICENSE folder. Furthermore, for each thirdparty library used, the license file must be added with the following naming convention (Please use CamelCase notation for the library and license names):")]),e._v(" "),t("p",[t("strong",[e._v("THIRDPARTY_NameOfLibrary_LicenseNameInclVersionInfo.txt")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/119.d227c1f7.js b/assets/js/120.7552ba84.js similarity index 93% rename from assets/js/119.d227c1f7.js rename to assets/js/120.7552ba84.js index f4e771367b..fdd948797d 100644 --- a/assets/js/119.d227c1f7.js +++ b/assets/js/120.7552ba84.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{1005:function(t,e,n){"use strict";n.r(e);var o=n(2),s=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"component-context-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-context-menu"}},[this._v("#")]),this._v(" Component Context Menu")]),this._v(" "),t("p",[this._v("All editing functions, which require the usage of the mouse, can also be done with the keyboard, using the context menu of the component. The context menu appears using the right mouse key, the space key or the application key.")]),this._v(" "),t("p",[t("img",{attrs:{src:n(452),alt:"Screenshot: Component with Opened Context Menu",title:"Screenshot: Component with Opened Context Menu"}})]),this._v(" "),t("p",[this._v("A Component with the Opened Component Context Menu")])])}),[],!1,null,null,null);e.default=s.exports},452:function(t,e,n){t.exports=n.p+"assets/img/component_with_opened_context_menu.e5f75f1a.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{1008:function(t,e,n){"use strict";n.r(e);var o=n(2),s=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"component-context-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-context-menu"}},[this._v("#")]),this._v(" Component Context Menu")]),this._v(" "),t("p",[this._v("All editing functions, which require the usage of the mouse, can also be done with the keyboard, using the context menu of the component. The context menu appears using the right mouse key, the space key or the application key.")]),this._v(" "),t("p",[t("img",{attrs:{src:n(452),alt:"Screenshot: Component with Opened Context Menu",title:"Screenshot: Component with Opened Context Menu"}})]),this._v(" "),t("p",[this._v("A Component with the Opened Component Context Menu")])])}),[],!1,null,null,null);e.default=s.exports},452:function(t,e,n){t.exports=n.p+"assets/img/component_with_opened_context_menu.e5f75f1a.jpg"}}]); \ No newline at end of file diff --git a/assets/js/120.c8dc0f59.js b/assets/js/121.1a404417.js similarity index 80% rename from assets/js/120.c8dc0f59.js rename to assets/js/121.1a404417.js index 49d0531bd4..bebe336252 100644 --- a/assets/js/120.c8dc0f59.js +++ b/assets/js/121.1a404417.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{1008:function(t,s,e){"use strict";e.r(s);var i=e(2),a=Object(i.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"dialogs-settings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dialogs-settings"}},[t._v("#")]),t._v(" Dialogs Settings")]),t._v(" "),s("p",[s("img",{attrs:{src:e(456),alt:"Screenshot: Options Dialog, Dialogs Settings",title:"Screenshot: Options Dialog, Dialogs Settings"}})]),t._v(" "),s("p",[t._v("Options Dialog, Dialogs Settings")]),t._v(" "),s("p",[t._v("Within this options tab, dialogs can be activated or deactivated. In the ACS, several dialogs have the option "),s("em",[t._v("Show this dialog every time")]),t._v(" . If a dialog has been deactivated there, it can be reactivated in the options dialog.")])])}),[],!1,null,null,null);s.default=a.exports},456:function(t,s,e){t.exports=e.p+"assets/img/dialogs_settings.ec77262c.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{1013:function(t,s,e){"use strict";e.r(s);var i=e(2),a=Object(i.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"dialogs-settings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dialogs-settings"}},[t._v("#")]),t._v(" Dialogs Settings")]),t._v(" "),s("p",[s("img",{attrs:{src:e(459),alt:"Screenshot: Options Dialog, Dialogs Settings",title:"Screenshot: Options Dialog, Dialogs Settings"}})]),t._v(" "),s("p",[t._v("Options Dialog, Dialogs Settings")]),t._v(" "),s("p",[t._v("Within this options tab, dialogs can be activated or deactivated. In the ACS, several dialogs have the option "),s("em",[t._v("Show this dialog every time")]),t._v(" . If a dialog has been deactivated there, it can be reactivated in the options dialog.")])])}),[],!1,null,null,null);s.default=a.exports},459:function(t,s,e){t.exports=e.p+"assets/img/dialogs_settings.ec77262c.png"}}]); \ No newline at end of file diff --git a/assets/js/121.f83cb4e5.js b/assets/js/122.b8adca6e.js similarity index 96% rename from assets/js/121.f83cb4e5.js rename to assets/js/122.b8adca6e.js index 59a3879bcf..8cac04256d 100644 --- a/assets/js/121.f83cb4e5.js +++ b/assets/js/122.b8adca6e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{1011:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"events"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#events"}},[this._v("#")]),this._v(" Events")]),this._v(" "),e("p",[this._v("The AsTeRICS platform knows two concepts of connecting two components to each other. The first one is channels, where data is transported from one component to another. The second one is the events-concept. Events are single or continuous happenings, which should trigger an action at the receiver. After an event channel has been established between a trigger and a listener, the events have to be set in the events tab (which appears in the property area - by default on the right side of the ACS). In this event tab, there is a table with two columns: the left column lists the event listeners, the right column the event triggers. So, with the selection box on the right side (second column), the triggering event for the listener will be set. One component can send and receive events from several other components. The following figure shows the setting of events.")]),this._v(" "),e("p",[e("img",{attrs:{src:n(460),alt:"Screenshot: ACS with Active Events Tab",title:"Screenshot: ACS with Active Events Tab"}})]),this._v(" "),e("p",[this._v("ACS with Active Events Tab")])])}),[],!1,null,null,null);t.default=i.exports},460:function(e,t,n){e.exports=n.p+"assets/img/acs_with_active_events_tab.ae677a1b.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{1014:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"events"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#events"}},[this._v("#")]),this._v(" Events")]),this._v(" "),e("p",[this._v("The AsTeRICS platform knows two concepts of connecting two components to each other. The first one is channels, where data is transported from one component to another. The second one is the events-concept. Events are single or continuous happenings, which should trigger an action at the receiver. After an event channel has been established between a trigger and a listener, the events have to be set in the events tab (which appears in the property area - by default on the right side of the ACS). In this event tab, there is a table with two columns: the left column lists the event listeners, the right column the event triggers. So, with the selection box on the right side (second column), the triggering event for the listener will be set. One component can send and receive events from several other components. The following figure shows the setting of events.")]),this._v(" "),e("p",[e("img",{attrs:{src:n(460),alt:"Screenshot: ACS with Active Events Tab",title:"Screenshot: ACS with Active Events Tab"}})]),this._v(" "),e("p",[this._v("ACS with Active Events Tab")])])}),[],!1,null,null,null);t.default=i.exports},460:function(e,t,n){e.exports=n.p+"assets/img/acs_with_active_events_tab.ae677a1b.png"}}]); \ No newline at end of file diff --git a/assets/js/122.827c7d38.js b/assets/js/123.e8795cee.js similarity index 83% rename from assets/js/122.827c7d38.js rename to assets/js/123.e8795cee.js index 78e56b2669..87e6c3caad 100644 --- a/assets/js/122.827c7d38.js +++ b/assets/js/123.e8795cee.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{1013:function(t,e,n){"use strict";n.r(e);var o=n(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"external-tools-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#external-tools-settings"}},[t._v("#")]),t._v(" External Tools Settings")]),t._v(" "),e("p",[e("img",{attrs:{src:n(464),alt:"Screenshot: External Tools Settings",title:"Screenshot: External Tools Settings"}})]),t._v(" "),e("p",[t._v("Options Dialog, External Tools Settings")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Path to the Plugin Creation Wizard")]),t._v(" sets the path to the plugin creation wizard.")]),t._v(" "),e("li",[e("em",[t._v("Path to the Plugin Activation Wizard")]),t._v(" sets the path to the plugin activation wizard.")])]),t._v(" "),e("p",[t._v("More information about the external tools can be found at the section "),e("em",[t._v("External Tools")]),t._v(".")])])}),[],!1,null,null,null);e.default=s.exports},464:function(t,e,n){t.exports=n.p+"assets/img/external_tools_settings.ca6ac2eb.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{1016:function(t,e,n){"use strict";n.r(e);var o=n(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"external-tools-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#external-tools-settings"}},[t._v("#")]),t._v(" External Tools Settings")]),t._v(" "),e("p",[e("img",{attrs:{src:n(462),alt:"Screenshot: External Tools Settings",title:"Screenshot: External Tools Settings"}})]),t._v(" "),e("p",[t._v("Options Dialog, External Tools Settings")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Path to the Plugin Creation Wizard")]),t._v(" sets the path to the plugin creation wizard.")]),t._v(" "),e("li",[e("em",[t._v("Path to the Plugin Activation Wizard")]),t._v(" sets the path to the plugin activation wizard.")])]),t._v(" "),e("p",[t._v("More information about the external tools can be found at the section "),e("em",[t._v("External Tools")]),t._v(".")])])}),[],!1,null,null,null);e.default=s.exports},462:function(t,e,n){t.exports=n.p+"assets/img/external_tools_settings.ca6ac2eb.png"}}]); \ No newline at end of file diff --git a/assets/js/123.8f146c37.js b/assets/js/124.82807f87.js similarity index 82% rename from assets/js/123.8f146c37.js rename to assets/js/124.82807f87.js index 41abb43db8..7ecea55e5b 100644 --- a/assets/js/123.8f146c37.js +++ b/assets/js/124.82807f87.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{1017:function(e,t,s){"use strict";s.r(t);var n=s(2),i=Object(n.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"gui-designer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gui-designer"}},[this._v("#")]),this._v(" GUI Designer")]),this._v(" "),e("p",[this._v("The GUI Designer allows to arrange the GUI Elements of components with a graphical user interface. These GUI Elements will then be shown on the ARE GUI. All GUI elements will be drawn and deleted automatically, if a component with a GUI is added or deleted. Within the GUI Designer, the size and the position of the GUI Elements can be changed.")]),this._v(" "),e("p",[e("img",{attrs:{src:s(472),alt:"Screenshot: The GUI Designer of the ACS",title:"Screenshot: The GUI Designer of the ACS"}})]),this._v(" "),e("p",[this._v("The GUI Designer")])])}),[],!1,null,null,null);t.default=i.exports},472:function(e,t,s){e.exports=s.p+"assets/img/gui_designer.039c882e.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{1015:function(e,t,s){"use strict";s.r(t);var n=s(2),i=Object(n.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"gui-designer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gui-designer"}},[this._v("#")]),this._v(" GUI Designer")]),this._v(" "),e("p",[this._v("The GUI Designer allows to arrange the GUI Elements of components with a graphical user interface. These GUI Elements will then be shown on the ARE GUI. All GUI elements will be drawn and deleted automatically, if a component with a GUI is added or deleted. Within the GUI Designer, the size and the position of the GUI Elements can be changed.")]),this._v(" "),e("p",[e("img",{attrs:{src:s(461),alt:"Screenshot: The GUI Designer of the ACS",title:"Screenshot: The GUI Designer of the ACS"}})]),this._v(" "),e("p",[this._v("The GUI Designer")])])}),[],!1,null,null,null);t.default=i.exports},461:function(e,t,s){e.exports=s.p+"assets/img/gui_designer.039c882e.png"}}]); \ No newline at end of file diff --git a/assets/js/124.01f3c188.js b/assets/js/125.23e58105.js similarity index 91% rename from assets/js/124.01f3c188.js rename to assets/js/125.23e58105.js index c4926bd5b7..678cb0080f 100644 --- a/assets/js/124.01f3c188.js +++ b/assets/js/125.23e58105.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{1014:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"general-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-settings"}},[e._v("#")]),e._v(" General Settings")]),e._v(" "),t("p",[t("img",{attrs:{src:n(465),alt:"Screenshot: Options Dialog, General Settings",title:"Screenshot: Options Dialog, General Settings"}})]),e._v(" "),t("p",[e._v("Options Dialog, General Settings")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Reset Window Arrangement")]),e._v(" resets all layout settings to default values.")]),e._v(" "),t("li",[t("em",[e._v("Language")]),e._v(" gives the possibility to select the ACS language between English, German, Spanish and Polish. The properties of the components will not be affected by this, as they are dependent on the component description. After changing the language, a restart of the ACS is required for the changes to take effect.")]),e._v(" "),t("li",[t("em",[e._v("Connection Data")]),e._v(" is responsible for the connection of the ACS with the ARE. The Host contains the IP-address of the ARE, the Port its IP-port. Default port is 9090. If "),t("em",[e._v("Detect ARE automatically")]),e._v(" is selected, the host information will be ignored and the ACS tries to find the ARE in the network. If more then one ARE will be detected in the network, an ARE selection dialog will appear. "),t("em",[e._v("Connection Timeout")]),e._v(" sets time network timeout time (in milliseconds). If the ARE is not reacting after this time, the connection to the ARE will be closed.")]),e._v(" "),t("li",[t("em",[e._v("ARE Status Update")]),e._v(" enables or disables an automatic update of the ARE status. This status update works while the ACS is in run-mode. The Update Frequency sets the time between two status updates (in milliseconds).")]),e._v(" "),t("li",[t("em",[e._v("Automatic Backup Files")]),e._v(" creates a backup file during each "),t("em",[e._v("Save File")]),e._v(" process. The backup file gets the ending .backup.")])])])}),[],!1,null,null,null);t.default=i.exports},465:function(e,t,n){e.exports=n.p+"assets/img/general_settings.0c251b2d.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[125],{1017:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"general-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-settings"}},[e._v("#")]),e._v(" General Settings")]),e._v(" "),t("p",[t("img",{attrs:{src:n(463),alt:"Screenshot: Options Dialog, General Settings",title:"Screenshot: Options Dialog, General Settings"}})]),e._v(" "),t("p",[e._v("Options Dialog, General Settings")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Reset Window Arrangement")]),e._v(" resets all layout settings to default values.")]),e._v(" "),t("li",[t("em",[e._v("Language")]),e._v(" gives the possibility to select the ACS language between English, German, Spanish and Polish. The properties of the components will not be affected by this, as they are dependent on the component description. After changing the language, a restart of the ACS is required for the changes to take effect.")]),e._v(" "),t("li",[t("em",[e._v("Connection Data")]),e._v(" is responsible for the connection of the ACS with the ARE. The Host contains the IP-address of the ARE, the Port its IP-port. Default port is 9090. If "),t("em",[e._v("Detect ARE automatically")]),e._v(" is selected, the host information will be ignored and the ACS tries to find the ARE in the network. If more then one ARE will be detected in the network, an ARE selection dialog will appear. "),t("em",[e._v("Connection Timeout")]),e._v(" sets time network timeout time (in milliseconds). If the ARE is not reacting after this time, the connection to the ARE will be closed.")]),e._v(" "),t("li",[t("em",[e._v("ARE Status Update")]),e._v(" enables or disables an automatic update of the ARE status. This status update works while the ACS is in run-mode. The Update Frequency sets the time between two status updates (in milliseconds).")]),e._v(" "),t("li",[t("em",[e._v("Automatic Backup Files")]),e._v(" creates a backup file during each "),t("em",[e._v("Save File")]),e._v(" process. The backup file gets the ending .backup.")])])])}),[],!1,null,null,null);t.default=i.exports},463:function(e,t,n){e.exports=n.p+"assets/img/general_settings.0c251b2d.png"}}]); \ No newline at end of file diff --git a/assets/js/125.01903baf.js b/assets/js/126.4e28595d.js similarity index 97% rename from assets/js/125.01903baf.js rename to assets/js/126.4e28595d.js index c53face567..e44217bf3a 100644 --- a/assets/js/125.01903baf.js +++ b/assets/js/126.4e28595d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[125],{1016:function(t,A,e){"use strict";e.r(A);var a=e(2),o=Object(a.a)({},(function(){var t=this,A=t._self._c;return A("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[A("h1",{attrs:{id:"open-and-save-models"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#open-and-save-models"}},[t._v("#")]),t._v(" Open and Save Models")]),t._v(" "),A("p",[t._v("In the system tab, models can be saved on the local file system ("),A("em",[t._v("Save Model")]),t._v(", "),A("em",[t._v("Save Model as")]),t._v("), or loaded from the local file system ("),A("em",[t._v("Open Model")]),t._v("). "),A("em",[t._v("New Model")]),t._v(" cleans up the drawing field, preparing everything for a new model.")]),t._v(" "),A("p",[A("img",{attrs:{src:e(471),alt:"Screenshot: Local Operations Group in Tab System",title:"Screenshot: Local Operations Group in Tab System"}})]),t._v(" "),A("p",[t._v("Local Operations Group in Tab System")])])}),[],!1,null,null,null);A.default=o.exports},471:function(t,A){t.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABbAM0DASIAAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAAIDBAUGBwEI/8QAThAAAgEDAwEDCAUHBgsJAAAAAQIDBAURAAYSIRMxUQcUFSJVkpPRQWFzgbIjJCUyM3GxCEJ0obPTFiY0N0NFdZSlwdI1Y2WCkZW0wvH/xAAbAQACAwEBAQAAAAAAAAAAAAAAAQIDBAUGB//EAC8RAAEEAAQEBQMEAwAAAAAAAAEAAgMRBBIhMQUTQVEUYYGRoTJxsQbB0fAVIiT/2gAMAwEAAhEDEQA/APXfo62+z6T4K/LQ9HW32fSfBX5aStbfmz9f9PN/aNp1y+vVhvuoCkxK2ITzwGloxLAvKRewGQMZz3dR+7Td6vayJC8noxEmXkjPGqjGM9SR6v348NI3aaiivEUta9NlIZGUKjGXgF9bJBxx7+/pnH040ayxUsV/lWiNIOzhjWRXV+2CBPU4knHHu7hjOfpzrzP+axHjPD6Vmy9bq+19tPvrXRbvDM5ebXa/L8f3bzS1PU7VqZ1gp5rLNK/6qRtEzH9wGn/o62+z6T4K/LUVvlYZaShappquenjqWaQU0Mkki/kJQrARgsCGK4I7jjUPsXdFXV10thu9LcI6mNDJSVdTRSU4q4gQCSHUYkXkobAweSkYyVX1GUltgrn2AaKtvo62+z6T4K/LQ9HW32fSfBX5aV5fXoksyRRtJI4VFGSTqBJAslSodkX0dbfZ9J8Ffloejrb7PpPgr8tImvkEZcUFWQBnA4ZP3cs/dqqeVek3RuPZAotkV8FPUVUyrPLJIYz2GGDhTjIblxB7jjkO/WcYpj2kxnMR0G/zSJWujaXZbVx9HW32fSfBX5aHo62+z6T4K/LXm3eHkmOwNvUt/tt5vFZd0nRE8zpQQkhBJbIPJV9UjPXqQMdemh/yd7ruS626+1W5J7hJK9aHjFWGAQMuSEDfqrnuUdBqiHGyun5EjCDV72Pehr5Lnw4uR0/Ikjo1djUe9DXyWn+jrb7PpPgr8tD0dbfZ9J8FflpXl9eszqZ6a4eV+ot9whjqxE3CFZgCI180DkLnoPWJOfkNdjDwOmza/SCfZaZpmxZdNyB7rR/R1t9n0nwV+Wh6Otvs+k+Cvy1Ceg7L7Jovei+Wh6Dsvsmi96L5aozN7n++quynsFN+jrb7PpPgr8tD0dbfZ9J8FflrJbvWxWbytW2mtUUdG8tbBTzCIACSJ4QSrY6N1wfqIzrX+X16vxEDocuv1AH3VUMolB02JHskvR1t9n0nwV+Wh6Otvs+k+Cvy0ry+vWc+WevWCe00tR+UpZY6iR4W6ozKYgpI+nHJsfv/AHaMLh3YiURg7oxEzYIzIRstB9HW32fSfBX5aHo62+z6T4K/LVIvk1otm5PR021YpaZqfthPTmN3B5sGHZBM4UcT0JPrd3QnUvRW3btbTJU0lBb54XGVdHhIP9Ws4kjJoE36fyrix4F0FYPR1t9n0nwV+Wh6Otvs+k+Cvy1lflhS3WW1UtTRUcFJVBKiSGaHhzR0CFWDKBggnWl2Cqlq7Fb6udgZZqWORyBjLMoJ/rOtEkBZEyQHR1/CpjlDnuZWra+QnPo62+z6T4K/LQ9HW32fSfBX5aV5fXprE36WqOv+gi/FJrPr3V2iRtrfm7/by/2jac8tMbc35u320v8AaNpzy1MjVQBUff4YYLRd62JAtQ9JJyfvPRDjv/dqWeipPOoarsQJoVKo4JBAIxg+P36iNzt/i3dP6HL+A6m5W1mODw/1ZBd3sN7u/vev3Volf3KDSarF5fPlAsP9Arfx02p92xqtXZs7+sX9Brfx02tICrcVaOWmF5k4ilPeO3/+jadctRt+kVIYHc4VZST7j65XHCWcOmc3cD9wr8LrM0IrXIiTs1ikkIAJ4Y6Z7u8jwOkDOvN3WlrIy55N2coQE+JAfv6DroUEDCPLjEjnk/1Hw+4YH3acmHpr5gzFYxzcwcu0WRg1SZ0lykoJq2oqhVtSlVZFeRWKYB5Hq3QHp9P0amrVXR3G209fCkiR1EayIsi4YAjIyNU/cEPpO50m3YyeFQTLWEfzYFI5D/zEhfvPhq5qQqhVGABgAfRr336Ylxk2GLsQf9Ro3TXTck9ey5mOEbXgN36pblrFbpeqKzeXutrLlP2FJE47STszJx5USqPVAJPUga2Xlrzp5WF5eUu9n/vIf/jxa+h/p+Fs00kbti0j3IXmONyuihY9u4cD+VrY8pOyD/r3/hcn/ToHykbIHffP+Fyf9OvP+2xS3TfFDtaWWWKes5lZVjBVQqu3X1uvRP69afuzyU01n2rV3lLzLM9OqsIzAAGywHfy+vU/BcH5vK5j7uvW67KHi+K8vmZG1V+lX3ULdbzRXny3Wmtts/b0ktypuzk7Mx8uMKqfVIBHUEa9ActeWdnLx39ts/8AiUf8Dr1Dy1Xx+FsM7I27BoHtat4NK6WBz3blxP4SvLWQfyipzFVWAjvMVWP64da1y1kH8ooc6vb32dV/GHVPAgPHsvz/AAVZxg/8b/T8hTW6d6bKusYlpdyyUtZA5kp50tknJG6+KdQckHPeCdMth7qguctTU2p45KyFv0lQrF+3HcJog4B5H+v9U9QDrDr5c6azQrUVSyNGxChY1BOfWP0keGtus/kglimgvNq3JLSXKD1o3FMCD4qw5dVP0j/91m45wfAR34eVzZmbXqD5GhsfhT4XxHHSgGWMGN3Y6jz1Krnlw3bY7/aqNbLXNUmCOqWcGleAxkiMAEMB1yrfWMddbXtRv8V7T/QofwDXmzfdWN0yV11t9qgttVTU3Z3NHnUGrqDkL2Sd5PFSeRxkDB6g49F7QlSXadnkRso9BAynxBjXTnnZJhIYw0te28zTuCaPsenkp4aKRs0srtWuIogaGhXx1U1y02jb9KT/AGEf4pNKctNo2/SU/wBjH+J9YQFsJSVA35BvtpPxtpxy0yoT+Rb7WT8baX5asIUQUS6Qee2yqo+fDt4Xi5Yzx5KRnH36jZpN6M5KXCwhc9AbdKTj4+q1uvcd4sm/qeXt0bbdPQK9zhMQ5RdpKyrUhu/ihUch3cGZv5nWNr/KratrWlZNx1IqKypudyipYhUUtKWgp6p48855IozxUxjHLm2c4OGIWnVPVXJl3qe+5WH/ANtl/v8ASdFbL5JuGkul2rrfKKWCWFEpqVov2jRkklpGz+zHh3nUVTeUzbVTTUdVD569PW11NRU0opzxkNRCksUvfkRkSKvI4w2RjVns1zhutAK2CKaOJpJEXtVwWCOych1/VPHIP0gg9NNJSXLUbuCiqbhSxJSVcdNLFMJQ0kRdTgEYIBHiD3/Rp5y1Wd31lynvNq23a7jLapa9J6iauiiSSWOKHgCsYkVk5s0idWVgFDdM4IpngjnjMcgtp3Ckx7mODm7hOEtm5l7r7Qf7i/8Ae6Mbfug/69t/+4P/AHuq9Duau2rX3Cy3youe4jAaNqKpjpIxUzecvIixuIwkZKvEfXCoArLyHqs5F48qtgs1javvFLVW2sSsaie21tVSQTpKFV8GR5xB+zZXH5XqGGOvTXNHA+HtFCP5P8rR4uY9fgK17etMtvqKutrapautqioeRY+Cqij1UAJPTJY9/edTHLWdt5VrG9OtXRWu719Gtvp7lU1VMkJhpqaVpF7R2MgDcDE/IJzOOqhhki/BsjI104YWQsEcYoBZ3vc45nbpblrNPKF5Oa6+X+S8We5U1PJUhfOI6qNmHJVCgqV7uijIPhnWi8tUXdN0uVJvqkhrr7c7FZ3EC0csFFFJSVc7OQ8NTK6O0RP5NUGYuRfCs7HiuvD4mXDOzxGiqJoI525ZBYVVsfkmv9r3PSbjStsstwpQwjZhMFwwZTkD6nOrzuCk37edv1Nmmn23HFOoUuqTZGCD/wAtMa/yoWSi3Pdtuz0dW1fbKWSqeOGopJpJURVduMSTGVTxYEdoiZHdnplTePlN25teOZ69pHVJIYY2E9PDHNLIjSdmJJpEjVljXmebKMMoBZmC6hzTn5nW7uuu6syDJk6VXooDZ/kruVBumhvF6vFLLDQt2sUFJGw5yYwCxb6BknA7zj79a5ag9n7it26dt0d+tT86SrUlcsjFSGKspZGZThgRlWZTjIJGCZblqeIxEuJfnlNlVwwsgbkjFBLctVDym7QfddHStSViUtdRl+yaRC0bK/HkGA6/zVwR4fXq08tVbyk1V7prVSPaJrjTU5q1FxqbbSJU1dPT8GPOKJ1cOeYjBAR24s2Fz1EYpXwPEkZohSkjZK0seLBWbXHyKXq5RCK4XGzzRgggASrg9fD9+tToJPKBRwiJZNtMB9JWbVfvPlHse0rJYJ7pcnu9JckxHdfOaKHtACo5lGljZ2wwJEMbHocKMhdS9Zvqz0VC9ZXQVtNHDVVUFTyjVjTLTo8jzOFY4jKIrAjJPaxjAJwCaZ0zy+TUnyCcUYiYGMFALOa3yK3q6V4luN6tsUTv+VaCJzIEJ9YKG6Zx3E5x39dbdRQxUdFBSQAiKCNY0B64VRgfw1T/ACc+Ufb++pa+CztiegEbSx+dU1R6knLgwenlkQZKN6pYMMdVAIJuHLUpsRJiDmeb9B+wUY4mxNysFD1S3LTeNv0jN9jH/F9G5aQQ/n832SfxfVNKy1yi/Yt9rJ+M6FdV0tBRTVtdUw0tLBG0k00zhEjRRkszHoAB1JOu0P7FvtZPxtqq+XD/ADM70/2FWf2L6ZSAUtcKeyRVM1+uNZAlPU0sdE5nlQU7ozngMnoSzSBR165AA66gKDya0FrtdupLJuHcFsqLe9UYa6OaGacx1EvayRP20Toy8uOCV5DgvrfrZqF8grJrfLs+qppRQ7WqIqhZXjISeNpU8yVSQQ4RGkDHIYSU6nGGB1J3HdldHu808W7QL0l6jo49pCOnXtqQyKrTkMhnbELNP2iuEHDBHqtmKlRVpvm07JXVsr3G51kddcrabWJFqVikkwGftUCgDtgOTBlHTHQADU5Sx2zb1moqETQ0dFTrDR0/ayBRklY40ye9mJVQO8kgDqdY7T7nrLjfbDWxboF5v8c1dNUbcEcH6MqFpKjjTkRDtFIIKESMxcqWXAB00o9xXncG3jJcdz7fvMIv1hlEFDdY6qejdrlDlJFSmgMS4AAWQO4KtlumlaMq3zUBuS22y/1sNCl6mt96t4FXBLQzxiqplfknIo4ZWRgHXDoykjOOSgiw6yDdtS9j8sl53hHBUTparLa0rYoIjJI9JNNXLJxUHJKusUhwCeMbAAkjUjokApq47TjqaGa32zclyuF7W60stzuTVUBrIOGHTKhBFGFRgVjEYUhiSrF2LSh2HAtKjQ7hvcF3FU1W94RoPOpZGQRtyUxGErwVF49ngcFIAYZ1TqWWv2zSXmeuuUdkqLhcKSW93QKkgoTNEWdwzrxwrcIleRSqrxLDC40RN5VDU0NPWeUJaHbTXGohpt4E0I89CQxOsQdo/Nwe0eoTkseCKUjoxJMdE6Ku7bTtV5t13Et6rbj6Xta2isq1kh5MsRmUsOCBBJylkDYGAQBxGCNWWlqqSd54KaphmelkEM6pIGMT8VbiwH6rcWVsHrhge4jWBndu4bZtu0Utv3LY7JTztXVSXK618duiq5vPZgYz2tNMCMFWMYMb4bo3Q40/yZmRr/vxpez7Q7giL9mcrn0bQ5x9WmCkQrdXVdLQUU1bXVMNLSwRtJNNM4RI0UZLMx6AAdSTqubrtFFXlLjcN219BZpDCs9Gs1OtJUkuAgZ3jMi8mKLiOReWR9J6o+XD/MzvT/YVZ/Yvqj3yCsmt8uz6qmlFDtaoiqFleMhJ42lTzJVJBDhEaQMchhJTqcYYHQUAK82TYVDar2LhHeLtPTx1FVUQW6Yw+bQvUszzEcYw7ZZ2PruxGenQnLf/AAFsdus1ss1Fe7jaquCteot9ZHPEartOzZSoEiMkoEOU4sjYRQe9Qwgbjuyuj3eaeLdoF6S9R0ce0hHTr21IZFVpyGQztiFmn7RXCDhgj1WzBU+56y432w1sW6Beb/HNXTVG3BHB+jKhaSo405EQ7RSCChEjMXKllwAdLROitjgeK0Wunjud4acq0cHnda0UbzSOwRAeConJmZVAVRkkADJ0+1gdHuK87g28ZLjufb95hF+sMogobrHVT0btcocpIqU0BiXAACyB3BVst01v2pDVIhNqauoqmpqaamq6eaekcJUxxyBmhYqGCuB1UlSDg/QQdR1zhj3DQslo3LV2+SnqGjaqtkkMjI6Eq8bCRJEJByCGUkEfQRrMPPLhtzf29b/a6SSrkuF6S0tEEZlE5t9I1I7kZKRiRpEZgpx2qk4CnS9HNFtKyx2aTdP+DFqa71kdVe3SAN2qhWUF5kaFGlYuxZ1OSCBhmB0rRSsNd5LbTLRSQR7gvtHHPQtR3FopICa5GkklZpC8TcCXmlY9l2Y9bGOIAEqdnbYu1fc72QK2G+27zWVUkUwyROgV3RlGeUiLECwbqIo8Yxk0N9411Rb6GK973Xb9LJSVD26uMNMDuArO8cZAdSG5RLDIUhVGfzgFCB0EbZN1bkpp9oWWmv8AYLJSpbLZ5vT3K6R0zXJZI0D8I3pnaYg8kAjmjIbHIdRlWE6K1vZtC9HRy43dcdyQ8zEklWaZuxaNijoGgiTJDAhuXIgrjoc6ndZ1tC6R2PyS7gvMoqjHRXG+zt5sEMoC19USV5+rkYz63q+PTOqXRb7vx2dcJ6rf9lENFdo0e5wXehd6iBqcuYaaolpYqV5uYHRowMB1LqRyV3SVLedIp/l8v2SfxfSVhqlrrHQVqedcaimjlHnUXZzYZQfXTA4t16jAwc9NLJ/l8v2SfxfUkqQoR+Rb7WT8baXxpGh/YN9rJ+NtONBQEXGhjRtDQmi40MaNoaEIuNDGjaGhCLjQxo2hoQi40MaNpsarFzWi4frQmXnnwYDGPv0rQl8aGNN0uNve4PbkrqVqxByanEymRR0OSucjvH/rpFr3ZlWpZrvbwKVgtQTUpiEk4Afr6pyCOv06LQn2NDGmcVyhmr6enpzHNFUUzVCTpIGUgMoGMd4PLOc/Rp9otCLjQxo2hpoRcaGNG0NCEXGhjRtDQhFxoY0bQ0IRcaQQfn832SfxfTnTdP8AtCb7KP8Ai+hJKxRiNSqkkFmbr9ZJ/wCej67yPgvujQ5HwX3RpJrmhrvI+C+6NDkfBfdGhC5oa7yPgvujQ5HwX3RoQuaGu8j4L7o0OR8F90aELmhrvI+C+6NDkfBfdGhC5qJucN0S6xVtupqOoAgaJ1nqWixlgQRiN8931al+R8F90aHI+C+6NCFXIrTce1jpXSgjo4at6pKiNm7Ylixxw44U+uQW5HIz0HLoRbffkscNsjioIkpuEamGsli84jUEEFgnKE/qn1S30jP06s3I+C+6NDkfBfdGlSaru2bJWW1qVqmSJuyjqlIEryH8pOJFHJhlsKMEnrnx1Ydd5HwX3Rocj4L7o00lzQ13kfBfdGhyPgvujQhc0Nd5HwX3Rocj4L7o0IXNDXeR8F90aHI+C+6NCFzQ13kfBfdGhyPgvujQhc0QRgTNLk8mUKfDpn56U5HwX3Rocj4L7o0IX//Z"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{1020:function(t,A,e){"use strict";e.r(A);var a=e(2),o=Object(a.a)({},(function(){var t=this,A=t._self._c;return A("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[A("h1",{attrs:{id:"open-and-save-models"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#open-and-save-models"}},[t._v("#")]),t._v(" Open and Save Models")]),t._v(" "),A("p",[t._v("In the system tab, models can be saved on the local file system ("),A("em",[t._v("Save Model")]),t._v(", "),A("em",[t._v("Save Model as")]),t._v("), or loaded from the local file system ("),A("em",[t._v("Open Model")]),t._v("). "),A("em",[t._v("New Model")]),t._v(" cleans up the drawing field, preparing everything for a new model.")]),t._v(" "),A("p",[A("img",{attrs:{src:e(472),alt:"Screenshot: Local Operations Group in Tab System",title:"Screenshot: Local Operations Group in Tab System"}})]),t._v(" "),A("p",[t._v("Local Operations Group in Tab System")])])}),[],!1,null,null,null);A.default=o.exports},472:function(t,A){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/126.8620e80d.js b/assets/js/127.f65af515.js similarity index 94% rename from assets/js/126.8620e80d.js rename to assets/js/127.f65af515.js index a7cb635681..0549e66b1d 100644 --- a/assets/js/126.8620e80d.js +++ b/assets/js/127.f65af515.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{1018:function(e,t,a){"use strict";a.r(t);var n=a(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"miscellaneous"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous"}},[e._v("#")]),e._v(" Miscellaneous")]),e._v(" "),t("p",[e._v("Within the tab "),t("em",[e._v("Miscellaneous")]),e._v(" (Misc.), status reports and logging files can be requested from the connected ARE, options can be set, the "),t("em",[e._v("Component Collection Manager")]),e._v(" can be called and external tools can be launched. The three supported external tools are the "),t("em",[e._v("Plugin Creation Wizard")]),e._v(", the "),t("em",[e._v("Plugin Activation Wizard")]),e._v(" and the "),t("em",[e._v("Language Translation File Creator")]),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:a(280),alt:"Screenshot: The Miscellaneous Tab",title:"Screenshot: The Miscellaneous Tab"}})]),e._v(" "),t("p",[e._v("The Miscellaneous Tab")])])}),[],!1,null,null,null);t.default=s.exports},280:function(e,t,a){e.exports=a.p+"assets/img/miscellaneous_tab.50018162.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[127],{1021:function(e,t,a){"use strict";a.r(t);var n=a(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"miscellaneous"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous"}},[e._v("#")]),e._v(" Miscellaneous")]),e._v(" "),t("p",[e._v("Within the tab "),t("em",[e._v("Miscellaneous")]),e._v(" (Misc.), status reports and logging files can be requested from the connected ARE, options can be set, the "),t("em",[e._v("Component Collection Manager")]),e._v(" can be called and external tools can be launched. The three supported external tools are the "),t("em",[e._v("Plugin Creation Wizard")]),e._v(", the "),t("em",[e._v("Plugin Activation Wizard")]),e._v(" and the "),t("em",[e._v("Language Translation File Creator")]),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:a(280),alt:"Screenshot: The Miscellaneous Tab",title:"Screenshot: The Miscellaneous Tab"}})]),e._v(" "),t("p",[e._v("The Miscellaneous Tab")])])}),[],!1,null,null,null);t.default=s.exports},280:function(e,t,a){e.exports=a.p+"assets/img/miscellaneous_tab.50018162.png"}}]); \ No newline at end of file diff --git a/assets/js/127.7c65f848.js b/assets/js/128.11075ca7.js similarity index 82% rename from assets/js/127.7c65f848.js rename to assets/js/128.11075ca7.js index 2b75f40419..7d8a1a30a3 100644 --- a/assets/js/127.7c65f848.js +++ b/assets/js/128.11075ca7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[127],{1025:function(n,e,t){"use strict";t.r(e);var s=t(2),i=Object(s.a)({},(function(){var n=this,e=n._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":n.$parent.slotKey}},[e("h1",{attrs:{id:"running"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running"}},[n._v("#")]),n._v(" Running")]),n._v(" "),e("p",[n._v("After the "),e("em",[n._v("Start Model")]),n._v(" button has been pressed, the ACS is in the "),e("em",[n._v("running")]),n._v(" mode. Within this mode, the drawing area is disabled (indicated by a grey background) and the buttons in the components tab and the edit tab are disabled, so elements can only be selected or moved. The following figure shows a screenshot of the ACS in running mode.")]),n._v(" "),e("p",[e("img",{attrs:{src:t(475),alt:"Screenshot: The ACS in the Running Modus",title:"Screenshot: The ACS in the Running Modus"}})]),n._v(" "),e("p",[n._v("The ACS in the Running Modus")])])}),[],!1,null,null,null);e.default=i.exports},475:function(n,e,t){n.exports=t.p+"assets/img/running_modus.b1736e0d.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{1027:function(n,e,t){"use strict";t.r(e);var s=t(2),i=Object(s.a)({},(function(){var n=this,e=n._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":n.$parent.slotKey}},[e("h1",{attrs:{id:"running"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running"}},[n._v("#")]),n._v(" Running")]),n._v(" "),e("p",[n._v("After the "),e("em",[n._v("Start Model")]),n._v(" button has been pressed, the ACS is in the "),e("em",[n._v("running")]),n._v(" mode. Within this mode, the drawing area is disabled (indicated by a grey background) and the buttons in the components tab and the edit tab are disabled, so elements can only be selected or moved. The following figure shows a screenshot of the ACS in running mode.")]),n._v(" "),e("p",[e("img",{attrs:{src:t(473),alt:"Screenshot: The ACS in the Running Modus",title:"Screenshot: The ACS in the Running Modus"}})]),n._v(" "),e("p",[n._v("The ACS in the Running Modus")])])}),[],!1,null,null,null);e.default=i.exports},473:function(n,e,t){n.exports=t.p+"assets/img/running_modus.b1736e0d.png"}}]); \ No newline at end of file diff --git a/assets/js/128.d39b6a35.js b/assets/js/129.0d64ca2f.js similarity index 88% rename from assets/js/128.d39b6a35.js rename to assets/js/129.0d64ca2f.js index 93a9d38c38..51327f9ea7 100644 --- a/assets/js/128.d39b6a35.js +++ b/assets/js/129.0d64ca2f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{1037:function(e,t,n){"use strict";n.r(t);var s=n(2),o=Object(s.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"events"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#events"}},[this._v("#")]),this._v(" Events")]),this._v(" "),e("p",[this._v("The AsTeRICS platform knows two concepts of connecting two components to each other. The first one is channels, where data is transported from one component to another. The second one is the events-concept. Events are single or continuous happenings, which should trigger an action at the receiver. After connecting two components with an event channel, the event connections have to be set in the events tab (which appears in the property editor on the right side of the ACS, when an event channel is focussed). This event tab consists of a table with two columns: the left column lists the event listeners (at the component receiving the event), the right column lists the event triggers (coming from the component that sends the event). So, with the selection box on the right hand side (second column), one or several triggering events can be set for any listener. One component can send and receive events to and from several other components. The following figure shows the setting of events.")]),this._v(" "),e("p",[e("img",{attrs:{src:n(488),alt:"Screenshot: ACS with Active Events Tab",title:"Screenshot: ACS with Active Events Tab"}})]),this._v(" "),e("p",[this._v("ACS with Active Events Tab")])])}),[],!1,null,null,null);t.default=o.exports},488:function(e,t,n){e.exports=n.p+"assets/img/acs_with_active_events_tab.efea5701.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{1045:function(e,t,n){"use strict";n.r(t);var s=n(2),o=Object(s.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"events"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#events"}},[this._v("#")]),this._v(" Events")]),this._v(" "),e("p",[this._v("The AsTeRICS platform knows two concepts of connecting two components to each other. The first one is channels, where data is transported from one component to another. The second one is the events-concept. Events are single or continuous happenings, which should trigger an action at the receiver. After connecting two components with an event channel, the event connections have to be set in the events tab (which appears in the property editor on the right side of the ACS, when an event channel is focussed). This event tab consists of a table with two columns: the left column lists the event listeners (at the component receiving the event), the right column lists the event triggers (coming from the component that sends the event). So, with the selection box on the right hand side (second column), one or several triggering events can be set for any listener. One component can send and receive events to and from several other components. The following figure shows the setting of events.")]),this._v(" "),e("p",[e("img",{attrs:{src:n(497),alt:"Screenshot: ACS with Active Events Tab",title:"Screenshot: ACS with Active Events Tab"}})]),this._v(" "),e("p",[this._v("ACS with Active Events Tab")])])}),[],!1,null,null,null);t.default=o.exports},497:function(e,t,n){e.exports=n.p+"assets/img/acs_with_active_events_tab.efea5701.png"}}]); \ No newline at end of file diff --git a/assets/js/13.61edaffd.js b/assets/js/13.79f7da28.js similarity index 99% rename from assets/js/13.61edaffd.js rename to assets/js/13.79f7da28.js index 52d5c9055b..ae8b99e106 100644 --- a/assets/js/13.61edaffd.js +++ b/assets/js/13.79f7da28.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{303:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_c2213f881cbf5182.abc6a2f0.png"},304:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_ae369b509ff2c0e5.bc1cbc88.png"},305:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_dd4b70e6240040e3.6272921f.png"},306:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a82259165c76b9df.da0379b4.png"},307:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_3d4398abcb45cc73.1ff3242b.png"},308:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_fbbda5b6e8f42820.b9487507.png"},309:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a0117682e4ae2ecc.f3f88992.png"},310:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_4304f99776fb485f.9217fb55.png"},311:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_f35fad4db20b5c1.cc89c5a3.png"},312:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_2672e47f28834257.fa86415c.png"},987:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"plugin-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-development"}},[e._v("#")]),e._v(" Plugin Development")]),e._v(" "),t("h2",{attrs:{id:"a-quick-guide-to-asterics-plugin-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#a-quick-guide-to-asterics-plugin-development"}},[e._v("#")]),e._v(" A Quick Guide to AsTeRICS Plugin Development")]),e._v(" "),t("p",[e._v("This section describes the AsTeRICS Plugin-Creation tool and the plugin-activation process. These tools make it easy to create new plugins and make them available in ACS and ARE. They can be started manually from their location in the "),t("strong",[e._v("AsTeRICS_runtime.zip")]),e._v(" package (folder: “ACS/tools”) – or they can be launched from the “Misc.” – Tab in the main menu of the ACS:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(303),alt:""}})]),e._v(" "),t("p",[e._v("The creation of a new AsTeRICS plugin for the runtime environment involves several steps:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("creating the folder structure to store the plugin files")])]),e._v(" "),t("li",[t("p",[e._v("creating the ANT build script file")])]),e._v(" "),t("li",[t("p",[e._v("creating the manifest file")])]),e._v(" "),t("li",[t("p",[e._v("creating the bundle-descriptor, which specifies the ports and properties of the plugin")])]),e._v(" "),t("li",[t("p",[e._v("creating the source code file of the JavaInstance")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("defining the ports and properties and implementing the get- and set-methods for input-, output-, eventListener- and evenTrigger ports")])]),e._v(" "),t("li",[t("p",[e._v("implementing the get- and set- methods for property values and the input ports receive handlers")])])])]),e._v(" "),t("li",[t("p",[e._v("creating the license files for the plugin and third-party libraries in the "),t("strong",[e._v("LICENSE")]),e._v(" subfolder")])])]),e._v(" "),t("p",[e._v("This process is similar for each plugin, and involves much work and sources of errors, especially for people who work with the AsTeRICS framework for the first time.")]),e._v(" "),t("p",[e._v("Usually, you look for a plugin with similar specifications, copy its folder structure and then rename and change the files as desired. But also this process needs some effort and errors/typos can be introduced very easily.")]),e._v(" "),t("p",[e._v("The purpose of the AsTeRICS Plugin Creation Tools is to make it easy to create new plugins, by providing the necessary folder structure, the bundle descriptor and a template for the JAVA source code.")]),e._v(" "),t("h2",{attrs:{id:"the-plugin-creation-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-plugin-creation-wizard"}},[e._v("#")]),e._v(" The Plugin Creation Wizard")]),e._v(" "),t("p",[e._v("The plugin Creation wizard allows definition of characteristics of a new plugin and creates the needed folders and files for the Eclipse build flow, including the JAVA source code skeleton and the plugin’s bundle descriptor.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(304),alt:""}})]),e._v(" "),t("p",[e._v("As can be seen in the above figure, desired input- and output ports, data types, properties and plugin-features are simply selected and added to list boxes on the screen.")]),e._v(" "),t("p",[e._v("Important Notes:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("the path to the target folder has to exist in the local file system, and must point to the ARE/components directory where all plugin source files are located, e.g.: “C:\\asterics\\bin\\components\\”.")])]),e._v(" "),t("li",[t("p",[e._v("The plugin name must be specified in CamelCase letters (capital first letter), e.g. “MyPlugin”. Type and Subcategory have to be specified - they define the location where the plugin will appear in the ACS Components menu.")])]),e._v(" "),t("li",[t("p",[e._v("It is possible to create a list of possible text-selections in a combo-box in the ACS property editor. The data type for this property must be integer, the property gets the number of the selected item. Text-captions for the combo-box entries must be separated with double slash, e.g: “Mode 1//Mode 2//Mode 3”.")])])]),e._v(" "),t("h2",{attrs:{id:"created-files-and-folders"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#created-files-and-folders"}},[e._v("#")]),e._v(" Created files and folders")]),e._v(" "),t("p",[e._v("After “Create Plugin!” has been pressed and the plugin creation was completed successfully, following sub-folders and files are begin created:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(305),alt:""}})]),e._v(" "),t("p",[e._v("The root folder contains the build script, which can be executed inside Eclipse to compile and build the plugin (.jar) file:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(306),alt:""}})]),e._v(" "),t("p",[e._v("The META-INF folder contains the manifest file")]),e._v(" "),t("p",[t("img",{attrs:{src:n(307),alt:""}})]),e._v(" "),t("p",[e._v("The “resources” folder contains the bundle descriptor (bundle_descriptor.xml):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(308),alt:""}})]),e._v(" "),t("p",[e._v("The source code folder "),t("code",[e._v("src/main/java/eu/asterics/component//")]),e._v(" contains a template for the plugin source code in JAVA, including the definitions of the selected ports and properties and the needed get- and set- methods for ports and property values. The code skeleton complies to the AsTeRICS coding guidelines and contains the AsTeRICS source file header (only a small portion is shown in the following screenshot).")]),e._v(" "),t("p",[t("img",{attrs:{src:n(309),alt:""}})]),e._v(" "),t("p",[e._v("After the Eclipse IDE has been opened, Eclipse must be pushed to refresh the folder structure by pushing F5. Furthermore, the path "),t("code",[e._v("src/main/java")]),e._v(" must be configured as source folder.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(310),alt:""}})]),e._v(" "),t("p",[e._v("The plugin code can be built using the provided build script (right-click build.xml -> RunAs -> Ant Build in the plugin’s folder)")]),e._v(" "),t("p",[t("img",{attrs:{src:n(311),alt:""}})]),e._v(" "),t("p",[e._v("To see the plugin in the ACS editor window and/or start it inside the runtime environment, the Plugin Activation Tool can be used (see section 3).")]),e._v(" "),t("h2",{attrs:{id:"plugin-activation-in-acs-and-are"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-activation-in-acs-and-are"}},[e._v("#")]),e._v(" Plugin Activation in ACS and ARE")]),e._v(" "),t("p",[e._v("To use a new AsTeRICS plugin which has been built using the Eclipse build flow and exists as executable .jar file/OSGI bundle, one step is necessary:")]),e._v(" "),t("ol",[t("li",[e._v("The Plugin has to be "),t("strong",[e._v("announced to the ACS")]),e._v(" – so that it gets visible in the graphical editor and can be used for the creation of deployment models. This is done by adding the bundle descriptor of the new plugin to a component-collection file (extension “.abd”) in the ACS-folder. These component collections contain all bundle-descriptors of components which can be used in the ACS. The new plugin section can be added either manually or can be downloaded from the running ARE via the ACS’ Component-Collection Manager (recommended, see 3.2.1). Using the Component Collection Manger, the downloaded collection can be stored as “default Component Collection” for the ACS, so that all components will be available when the ACS is started next time.")])]),e._v(" "),t("p",[e._v("Subsequently, the plugin can be selected in the “components” menu of the ACS, and the ARE will activate the plugin at startup.")]),e._v(" "),t("h2",{attrs:{id:"component-collection-management-in-the-acs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-collection-management-in-the-acs"}},[e._v("#")]),e._v(" Component-Collection Management in the ACS")]),e._v(" "),t("p",[e._v("The ACS provides a function for downloading the bundle descriptions of all active plugins directly from a running ARE and creating a component collection file from this information. (“System”- tab, Button “Download Component Collection”):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(312),alt:""}})]),e._v(" "),t("p",[e._v("The component collection will be stored as “.abd” – file in the ACS folder, subfolder “componentcollections”. The new component collection can be used right after download, but will not be available after an ACS restart.")]),e._v(" "),t("p",[e._v("Within the ACS Component-Collection Manager (in the “Miscellaneous” tab), component collections can be selected or set as default collection for the ACS startup. For details see the User Manual, ACS section.")]),e._v(" "),t("p",[e._v("Please note that the “loader.ini” – file has to be updated manually in the ARE’s “profile” subfolder, by addition of the new .jar filename. After restart of the ARE and connection to the ACS, the component collection can be downloaded.")]),e._v(" "),t("h2",{attrs:{id:"plugin-license-declaration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-license-declaration"}},[e._v("#")]),e._v(" Plugin License Declaration")]),e._v(" "),t("p",[e._v("Since AsTeRICS version 2.8 the licenses (including licenses of third-party libraries) of a plugin must be provided as .txt files in the LICENSE subfolder. The filenames must follow a defined naming convention, which is:")]),e._v(" "),t("p",[e._v("A contributor must add the respective license file for the component (either "),t("strong",[e._v("LICENSE_MITOrGPLv3WithException.txt")]),e._v(" or one of the two dual license options) to the component/LICENSE folder. Furthermore, for each thirdparty library used, the license file must be added with the following naming convention (Please use CamelCase notation for the library and license names):")]),e._v(" "),t("p",[t("strong",[e._v("THIRDPARTY_NameOfLibrary_LicenseNameInclVersionInfo.txt")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{303:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_c2213f881cbf5182.abc6a2f0.png"},304:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_ae369b509ff2c0e5.bc1cbc88.png"},305:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_dd4b70e6240040e3.6272921f.png"},306:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a82259165c76b9df.da0379b4.png"},307:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_3d4398abcb45cc73.1ff3242b.png"},308:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_fbbda5b6e8f42820.b9487507.png"},309:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_a0117682e4ae2ecc.f3f88992.png"},310:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_4304f99776fb485f.9217fb55.png"},311:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_f35fad4db20b5c1.cc89c5a3.png"},312:function(e,t,n){e.exports=n.p+"assets/img/DeveloperManual_html_2672e47f28834257.fa86415c.png"},989:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"plugin-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-development"}},[e._v("#")]),e._v(" Plugin Development")]),e._v(" "),t("h2",{attrs:{id:"a-quick-guide-to-asterics-plugin-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#a-quick-guide-to-asterics-plugin-development"}},[e._v("#")]),e._v(" A Quick Guide to AsTeRICS Plugin Development")]),e._v(" "),t("p",[e._v("This section describes the AsTeRICS Plugin-Creation tool and the plugin-activation process. These tools make it easy to create new plugins and make them available in ACS and ARE. They can be started manually from their location in the "),t("strong",[e._v("AsTeRICS_runtime.zip")]),e._v(" package (folder: “ACS/tools”) – or they can be launched from the “Misc.” – Tab in the main menu of the ACS:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(303),alt:""}})]),e._v(" "),t("p",[e._v("The creation of a new AsTeRICS plugin for the runtime environment involves several steps:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("creating the folder structure to store the plugin files")])]),e._v(" "),t("li",[t("p",[e._v("creating the ANT build script file")])]),e._v(" "),t("li",[t("p",[e._v("creating the manifest file")])]),e._v(" "),t("li",[t("p",[e._v("creating the bundle-descriptor, which specifies the ports and properties of the plugin")])]),e._v(" "),t("li",[t("p",[e._v("creating the source code file of the JavaInstance")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("defining the ports and properties and implementing the get- and set-methods for input-, output-, eventListener- and evenTrigger ports")])]),e._v(" "),t("li",[t("p",[e._v("implementing the get- and set- methods for property values and the input ports receive handlers")])])])]),e._v(" "),t("li",[t("p",[e._v("creating the license files for the plugin and third-party libraries in the "),t("strong",[e._v("LICENSE")]),e._v(" subfolder")])])]),e._v(" "),t("p",[e._v("This process is similar for each plugin, and involves much work and sources of errors, especially for people who work with the AsTeRICS framework for the first time.")]),e._v(" "),t("p",[e._v("Usually, you look for a plugin with similar specifications, copy its folder structure and then rename and change the files as desired. But also this process needs some effort and errors/typos can be introduced very easily.")]),e._v(" "),t("p",[e._v("The purpose of the AsTeRICS Plugin Creation Tools is to make it easy to create new plugins, by providing the necessary folder structure, the bundle descriptor and a template for the JAVA source code.")]),e._v(" "),t("h2",{attrs:{id:"the-plugin-creation-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-plugin-creation-wizard"}},[e._v("#")]),e._v(" The Plugin Creation Wizard")]),e._v(" "),t("p",[e._v("The plugin Creation wizard allows definition of characteristics of a new plugin and creates the needed folders and files for the Eclipse build flow, including the JAVA source code skeleton and the plugin’s bundle descriptor.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(304),alt:""}})]),e._v(" "),t("p",[e._v("As can be seen in the above figure, desired input- and output ports, data types, properties and plugin-features are simply selected and added to list boxes on the screen.")]),e._v(" "),t("p",[e._v("Important Notes:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("the path to the target folder has to exist in the local file system, and must point to the ARE/components directory where all plugin source files are located, e.g.: “C:\\asterics\\bin\\components\\”.")])]),e._v(" "),t("li",[t("p",[e._v("The plugin name must be specified in CamelCase letters (capital first letter), e.g. “MyPlugin”. Type and Subcategory have to be specified - they define the location where the plugin will appear in the ACS Components menu.")])]),e._v(" "),t("li",[t("p",[e._v("It is possible to create a list of possible text-selections in a combo-box in the ACS property editor. The data type for this property must be integer, the property gets the number of the selected item. Text-captions for the combo-box entries must be separated with double slash, e.g: “Mode 1//Mode 2//Mode 3”.")])])]),e._v(" "),t("h2",{attrs:{id:"created-files-and-folders"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#created-files-and-folders"}},[e._v("#")]),e._v(" Created files and folders")]),e._v(" "),t("p",[e._v("After “Create Plugin!” has been pressed and the plugin creation was completed successfully, following sub-folders and files are begin created:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(305),alt:""}})]),e._v(" "),t("p",[e._v("The root folder contains the build script, which can be executed inside Eclipse to compile and build the plugin (.jar) file:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(306),alt:""}})]),e._v(" "),t("p",[e._v("The META-INF folder contains the manifest file")]),e._v(" "),t("p",[t("img",{attrs:{src:n(307),alt:""}})]),e._v(" "),t("p",[e._v("The “resources” folder contains the bundle descriptor (bundle_descriptor.xml):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(308),alt:""}})]),e._v(" "),t("p",[e._v("The source code folder "),t("code",[e._v("src/main/java/eu/asterics/component//")]),e._v(" contains a template for the plugin source code in JAVA, including the definitions of the selected ports and properties and the needed get- and set- methods for ports and property values. The code skeleton complies to the AsTeRICS coding guidelines and contains the AsTeRICS source file header (only a small portion is shown in the following screenshot).")]),e._v(" "),t("p",[t("img",{attrs:{src:n(309),alt:""}})]),e._v(" "),t("p",[e._v("After the Eclipse IDE has been opened, Eclipse must be pushed to refresh the folder structure by pushing F5. Furthermore, the path "),t("code",[e._v("src/main/java")]),e._v(" must be configured as source folder.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(310),alt:""}})]),e._v(" "),t("p",[e._v("The plugin code can be built using the provided build script (right-click build.xml -> RunAs -> Ant Build in the plugin’s folder)")]),e._v(" "),t("p",[t("img",{attrs:{src:n(311),alt:""}})]),e._v(" "),t("p",[e._v("To see the plugin in the ACS editor window and/or start it inside the runtime environment, the Plugin Activation Tool can be used (see section 3).")]),e._v(" "),t("h2",{attrs:{id:"plugin-activation-in-acs-and-are"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-activation-in-acs-and-are"}},[e._v("#")]),e._v(" Plugin Activation in ACS and ARE")]),e._v(" "),t("p",[e._v("To use a new AsTeRICS plugin which has been built using the Eclipse build flow and exists as executable .jar file/OSGI bundle, one step is necessary:")]),e._v(" "),t("ol",[t("li",[e._v("The Plugin has to be "),t("strong",[e._v("announced to the ACS")]),e._v(" – so that it gets visible in the graphical editor and can be used for the creation of deployment models. This is done by adding the bundle descriptor of the new plugin to a component-collection file (extension “.abd”) in the ACS-folder. These component collections contain all bundle-descriptors of components which can be used in the ACS. The new plugin section can be added either manually or can be downloaded from the running ARE via the ACS’ Component-Collection Manager (recommended, see 3.2.1). Using the Component Collection Manger, the downloaded collection can be stored as “default Component Collection” for the ACS, so that all components will be available when the ACS is started next time.")])]),e._v(" "),t("p",[e._v("Subsequently, the plugin can be selected in the “components” menu of the ACS, and the ARE will activate the plugin at startup.")]),e._v(" "),t("h2",{attrs:{id:"component-collection-management-in-the-acs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-collection-management-in-the-acs"}},[e._v("#")]),e._v(" Component-Collection Management in the ACS")]),e._v(" "),t("p",[e._v("The ACS provides a function for downloading the bundle descriptions of all active plugins directly from a running ARE and creating a component collection file from this information. (“System”- tab, Button “Download Component Collection”):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(312),alt:""}})]),e._v(" "),t("p",[e._v("The component collection will be stored as “.abd” – file in the ACS folder, subfolder “componentcollections”. The new component collection can be used right after download, but will not be available after an ACS restart.")]),e._v(" "),t("p",[e._v("Within the ACS Component-Collection Manager (in the “Miscellaneous” tab), component collections can be selected or set as default collection for the ACS startup. For details see the User Manual, ACS section.")]),e._v(" "),t("p",[e._v("Please note that the “loader.ini” – file has to be updated manually in the ARE’s “profile” subfolder, by addition of the new .jar filename. After restart of the ARE and connection to the ACS, the component collection can be downloaded.")]),e._v(" "),t("h2",{attrs:{id:"plugin-license-declaration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-license-declaration"}},[e._v("#")]),e._v(" Plugin License Declaration")]),e._v(" "),t("p",[e._v("Since AsTeRICS version 2.8 the licenses (including licenses of third-party libraries) of a plugin must be provided as .txt files in the LICENSE subfolder. The filenames must follow a defined naming convention, which is:")]),e._v(" "),t("p",[e._v("A contributor must add the respective license file for the component (either "),t("strong",[e._v("LICENSE_MITOrGPLv3WithException.txt")]),e._v(" or one of the two dual license options) to the component/LICENSE folder. Furthermore, for each thirdparty library used, the license file must be added with the following naming convention (Please use CamelCase notation for the library and license names):")]),e._v(" "),t("p",[t("strong",[e._v("THIRDPARTY_NameOfLibrary_LicenseNameInclVersionInfo.txt")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/129.ae14bf2f.js b/assets/js/130.95605c62.js similarity index 95% rename from assets/js/129.ae14bf2f.js rename to assets/js/130.95605c62.js index 1afc5f90ab..9100bbc76d 100644 --- a/assets/js/129.ae14bf2f.js +++ b/assets/js/130.95605c62.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{1039:function(e,t,n){"use strict";n.r(t);var s=n(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"gui-designer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gui-designer"}},[e._v("#")]),e._v(" GUI Designer")]),e._v(" "),t("p",[e._v("The GUI Designer allows to arrange the graphical user interfaces (GUI) of those components that have one. These GUI Elements will then be shown on the ARE GUI. GUI elements are drawn and deleted automatically when a component with a GUI is added to or deleted from the model. Within the GUI Designer the size and the position of the GUI Elements can be changed by drag and drop.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(495),alt:"Screenshot: The GUI Designer of the ACS",title:"Screenshot: The GUI Designer of the ACS"}})]),e._v(" "),t("p",[e._v("The GUI Designer")]),e._v(" "),t("p",[e._v("Keyboard users can enter keyboard mode by hitting the Enter key when GUI Designer is selected. Then the user can navigate the elements by using the arrow keys. Shift-arrow keys moves the selected element, Alt-arrow keys resizes the selected element.")])])}),[],!1,null,null,null);t.default=r.exports},495:function(e,t,n){e.exports=n.p+"assets/img/gui_designer.eb48eff2.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{1043:function(e,t,n){"use strict";n.r(t);var s=n(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"gui-designer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gui-designer"}},[e._v("#")]),e._v(" GUI Designer")]),e._v(" "),t("p",[e._v("The GUI Designer allows to arrange the graphical user interfaces (GUI) of those components that have one. These GUI Elements will then be shown on the ARE GUI. GUI elements are drawn and deleted automatically when a component with a GUI is added to or deleted from the model. Within the GUI Designer the size and the position of the GUI Elements can be changed by drag and drop.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(495),alt:"Screenshot: The GUI Designer of the ACS",title:"Screenshot: The GUI Designer of the ACS"}})]),e._v(" "),t("p",[e._v("The GUI Designer")]),e._v(" "),t("p",[e._v("Keyboard users can enter keyboard mode by hitting the Enter key when GUI Designer is selected. Then the user can navigate the elements by using the arrow keys. Shift-arrow keys moves the selected element, Alt-arrow keys resizes the selected element.")])])}),[],!1,null,null,null);t.default=r.exports},495:function(e,t,n){e.exports=n.p+"assets/img/gui_designer.eb48eff2.png"}}]); \ No newline at end of file diff --git a/assets/js/130.2bc047ad.js b/assets/js/131.b6d692c2.js similarity index 92% rename from assets/js/130.2bc047ad.js rename to assets/js/131.b6d692c2.js index d32d2e63ac..4d3afd8b74 100644 --- a/assets/js/130.2bc047ad.js +++ b/assets/js/131.b6d692c2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{1043:function(e,t,n){"use strict";n.r(t);var s=n(2),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"list-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-view"}},[e._v("#")]),e._v(" List View")]),e._v(" "),t("p",[e._v("The List View provides the same model as shown in the Model Designer, but as a list of elements. It is sorted by Sensors, Processors and Actuators. For each component it shows a list of Ports and for each port a list of connections, including a direct link to the connected element. It also contains buttons to connect channels. For example by pressing "),t("em",[e._v("Start new datachannel")]),e._v(", a new datachannel is started. The focus automatically jumps to the "),t("em",[e._v("Action Pending")]),e._v(" section at the top of the page, where the pending action is indicated and a "),t("em",[e._v("Cancel channel")]),e._v(" button enables the user to continue without completing the channel. However, if the user presses a "),t("em",[e._v("Connect datachannel here")]),e._v(" button at a matching input port, the connection is finalised and the channel now exists. This works in the same way for event channels.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(499),alt:"Screenshot: List View",title:"Screenshot: List View"}})]),e._v(" "),t("p",[e._v("List View")]),e._v(" "),t("p",[e._v("Keyboard users can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Then the user can navigate the elements by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Space")]),e._v(" activates port mode, so that the ports of the selected components can be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends port mode."),t("br"),e._v("\nWhen in port mode, the user can activate channel mode by pressing the "),t("em",[e._v("Space")]),e._v(" bar again. Now the channels connected to the selected port can be navigated using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends channel mode."),t("br"),e._v("\nThe buttons for connecting the channels and for jumping to connected elements can be reached by using the "),t("em",[e._v("Tab")]),e._v(" key")])])}),[],!1,null,null,null);t.default=a.exports},499:function(e,t,n){e.exports=n.p+"assets/img/list_view.ddd12587.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{1042:function(e,t,n){"use strict";n.r(t);var s=n(2),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"list-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-view"}},[e._v("#")]),e._v(" List View")]),e._v(" "),t("p",[e._v("The List View provides the same model as shown in the Model Designer, but as a list of elements. It is sorted by Sensors, Processors and Actuators. For each component it shows a list of Ports and for each port a list of connections, including a direct link to the connected element. It also contains buttons to connect channels. For example by pressing "),t("em",[e._v("Start new datachannel")]),e._v(", a new datachannel is started. The focus automatically jumps to the "),t("em",[e._v("Action Pending")]),e._v(" section at the top of the page, where the pending action is indicated and a "),t("em",[e._v("Cancel channel")]),e._v(" button enables the user to continue without completing the channel. However, if the user presses a "),t("em",[e._v("Connect datachannel here")]),e._v(" button at a matching input port, the connection is finalised and the channel now exists. This works in the same way for event channels.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(494),alt:"Screenshot: List View",title:"Screenshot: List View"}})]),e._v(" "),t("p",[e._v("List View")]),e._v(" "),t("p",[e._v("Keyboard users can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Then the user can navigate the elements by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Space")]),e._v(" activates port mode, so that the ports of the selected components can be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends port mode."),t("br"),e._v("\nWhen in port mode, the user can activate channel mode by pressing the "),t("em",[e._v("Space")]),e._v(" bar again. Now the channels connected to the selected port can be navigated using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends channel mode."),t("br"),e._v("\nThe buttons for connecting the channels and for jumping to connected elements can be reached by using the "),t("em",[e._v("Tab")]),e._v(" key")])])}),[],!1,null,null,null);t.default=a.exports},494:function(e,t,n){e.exports=n.p+"assets/img/list_view.ddd12587.png"}}]); \ No newline at end of file diff --git a/assets/js/131.208465bf.js b/assets/js/132.a02eb36e.js similarity index 93% rename from assets/js/131.208465bf.js rename to assets/js/132.a02eb36e.js index 638e05a21e..d63461211e 100644 --- a/assets/js/131.208465bf.js +++ b/assets/js/132.a02eb36e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{1040:function(t,e,s){"use strict";s.r(e);var a=s(2),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"miscellaneous"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous"}},[t._v("#")]),t._v(" Miscellaneous")]),t._v(" "),e("p",[t._v("The tab "),e("em",[t._v("Misc.")]),t._v(" (Miscellaneous) contains a button that leads to this help system and a button that gives information about the ACS. The other functions on this tab are not yet implemented.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(496),alt:"Screenshot: The Miscellaneous Tab",title:"Screenshot: The Miscellaneous Tab"}})]),t._v(" "),e("p",[t._v("The Miscellaneous Tab")])])}),[],!1,null,null,null);e.default=n.exports},496:function(t,e,s){t.exports=s.p+"assets/img/miscellaneous_tab.d09bda1c.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{1044:function(t,e,s){"use strict";s.r(e);var a=s(2),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"miscellaneous"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous"}},[t._v("#")]),t._v(" Miscellaneous")]),t._v(" "),e("p",[t._v("The tab "),e("em",[t._v("Misc.")]),t._v(" (Miscellaneous) contains a button that leads to this help system and a button that gives information about the ACS. The other functions on this tab are not yet implemented.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(496),alt:"Screenshot: The Miscellaneous Tab",title:"Screenshot: The Miscellaneous Tab"}})]),t._v(" "),e("p",[t._v("The Miscellaneous Tab")])])}),[],!1,null,null,null);e.default=n.exports},496:function(t,e,s){t.exports=s.p+"assets/img/miscellaneous_tab.d09bda1c.png"}}]); \ No newline at end of file diff --git a/assets/js/132.e206cfa8.js b/assets/js/133.d0aeff21.js similarity index 82% rename from assets/js/132.e206cfa8.js rename to assets/js/133.d0aeff21.js index 0f5f6a4b81..c90eb7c901 100644 --- a/assets/js/132.e206cfa8.js +++ b/assets/js/133.d0aeff21.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{1041:function(e,t,o){"use strict";o.r(t);var s=o(2),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"open-and-save-models"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#open-and-save-models"}},[e._v("#")]),e._v(" Open and Save Models")]),e._v(" "),t("p",[e._v("In the system tab, models can be saved to the local file system ("),t("em",[e._v("Save Model")]),e._v("), or loaded from the local file system ("),t("em",[e._v("Open Model")]),e._v("). "),t("em",[e._v("New Model")]),e._v(" adds a new tab with a new empty model. To close a model tab use "),t("em",[e._v("Close Model")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(497),alt:"Screenshot: Local Operations Group in Tab System",title:"Screenshot: Local Operations Group in Tab System"}})]),e._v(" "),t("p",[e._v("Local Operations Group in Tab System")])])}),[],!1,null,null,null);t.default=a.exports},497:function(e,t,o){e.exports=o.p+"assets/img/local_operations_group.b36f5cfe.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{1047:function(e,t,o){"use strict";o.r(t);var s=o(2),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"open-and-save-models"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#open-and-save-models"}},[e._v("#")]),e._v(" Open and Save Models")]),e._v(" "),t("p",[e._v("In the system tab, models can be saved to the local file system ("),t("em",[e._v("Save Model")]),e._v("), or loaded from the local file system ("),t("em",[e._v("Open Model")]),e._v("). "),t("em",[e._v("New Model")]),e._v(" adds a new tab with a new empty model. To close a model tab use "),t("em",[e._v("Close Model")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(499),alt:"Screenshot: Local Operations Group in Tab System",title:"Screenshot: Local Operations Group in Tab System"}})]),e._v(" "),t("p",[e._v("Local Operations Group in Tab System")])])}),[],!1,null,null,null);t.default=a.exports},499:function(e,t,o){e.exports=o.p+"assets/img/local_operations_group.b36f5cfe.png"}}]); \ No newline at end of file diff --git a/assets/js/133.e9fe5d66.js b/assets/js/134.ec233287.js similarity index 95% rename from assets/js/133.e9fe5d66.js rename to assets/js/134.ec233287.js index 83a775dec3..eeb2309f87 100644 --- a/assets/js/133.e9fe5d66.js +++ b/assets/js/134.ec233287.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{1042:function(e,t,r){"use strict";r.r(t);var i=r(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"acs-basic-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acs-basic-functions"}},[e._v("#")]),e._v(" ACS Basic Functions")]),e._v(" "),t("p",[e._v("The AsTeRICS Configuration Suite (ACS) is a web application, which can be run either locally (by simply opening index.html in a webbrowser) or inside a webserver (by entering the respective URL in the webbrowser). Note that the WebACS is currently optimised for usage with Mozilla Firefox 56 or later.")]),e._v(" "),t("p",[e._v("The figure below shows the WebACS after startup. The red numbers point out the most important areas:")]),e._v(" "),t("ol",[t("li",[e._v("Menu")]),e._v(" "),t("li",[e._v("Model Designer: graphical representation of current AsTeRICS model")]),e._v(" "),t("li",[e._v("GUI Designer: graphical editor for runtime user interface")]),e._v(" "),t("li",[e._v("List View: current AsTeRICS model as a list of elements and their interrelations")]),e._v(" "),t("li",[e._v("Property Editor: for adapting the properties of the selected element")])]),e._v(" "),t("p",[t("img",{attrs:{src:r(498),alt:"Screenshot: ACS after startup",title:"Screenshot: ACS after startup"}})]),e._v(" "),t("p",[e._v("ACS after Startup")])])}),[],!1,null,null,null);t.default=s.exports},498:function(e,t,r){e.exports=r.p+"assets/img/acs_after_startup.754041b6.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[134],{1046:function(e,t,r){"use strict";r.r(t);var i=r(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"acs-basic-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acs-basic-functions"}},[e._v("#")]),e._v(" ACS Basic Functions")]),e._v(" "),t("p",[e._v("The AsTeRICS Configuration Suite (ACS) is a web application, which can be run either locally (by simply opening index.html in a webbrowser) or inside a webserver (by entering the respective URL in the webbrowser). Note that the WebACS is currently optimised for usage with Mozilla Firefox 56 or later.")]),e._v(" "),t("p",[e._v("The figure below shows the WebACS after startup. The red numbers point out the most important areas:")]),e._v(" "),t("ol",[t("li",[e._v("Menu")]),e._v(" "),t("li",[e._v("Model Designer: graphical representation of current AsTeRICS model")]),e._v(" "),t("li",[e._v("GUI Designer: graphical editor for runtime user interface")]),e._v(" "),t("li",[e._v("List View: current AsTeRICS model as a list of elements and their interrelations")]),e._v(" "),t("li",[e._v("Property Editor: for adapting the properties of the selected element")])]),e._v(" "),t("p",[t("img",{attrs:{src:r(498),alt:"Screenshot: ACS after startup",title:"Screenshot: ACS after startup"}})]),e._v(" "),t("p",[e._v("ACS after Startup")])])}),[],!1,null,null,null);t.default=s.exports},498:function(e,t,r){e.exports=r.p+"assets/img/acs_after_startup.754041b6.png"}}]); \ No newline at end of file diff --git a/assets/js/134.f875591e.js b/assets/js/135.92f9215e.js similarity index 84% rename from assets/js/134.f875591e.js rename to assets/js/135.92f9215e.js index 393e54ce2d..a19dd67648 100644 --- a/assets/js/134.f875591e.js +++ b/assets/js/135.92f9215e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[134],{1045:function(t,e,o){"use strict";o.r(e);var s=o(2),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"setting-the-properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-the-properties"}},[this._v("#")]),this._v(" Setting the Properties")]),this._v(" "),t("p",[this._v("Each component has 0 to several properties, by means of which the behaviour of the component can be adapted or functions can be enabled. The usage of the properties and their effects can be found in the documentation of the components. The following figure shows the property editor editing the characteristics of the component “DigitalOut”.")]),this._v(" "),t("p",[t("img",{attrs:{src:o(501),alt:"Screenshot: The Property Tab showing a Component's Properties",title:"Screenshot: The Property Tab showing a Component's Properties"}})]),this._v(" "),t("p",[this._v("The Property Tab showing a Component’s Properties")])])}),[],!1,null,null,null);e.default=n.exports},501:function(t,e,o){t.exports=o.p+"assets/img/a_components_properties_in_property_tab.3a55cb01.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{1048:function(t,e,o){"use strict";o.r(e);var s=o(2),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"setting-the-properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-the-properties"}},[this._v("#")]),this._v(" Setting the Properties")]),this._v(" "),t("p",[this._v("Each component has 0 to several properties, by means of which the behaviour of the component can be adapted or functions can be enabled. The usage of the properties and their effects can be found in the documentation of the components. The following figure shows the property editor editing the characteristics of the component “DigitalOut”.")]),this._v(" "),t("p",[t("img",{attrs:{src:o(500),alt:"Screenshot: The Property Tab showing a Component's Properties",title:"Screenshot: The Property Tab showing a Component's Properties"}})]),this._v(" "),t("p",[this._v("The Property Tab showing a Component’s Properties")])])}),[],!1,null,null,null);e.default=n.exports},500:function(t,e,o){t.exports=o.p+"assets/img/a_components_properties_in_property_tab.3a55cb01.png"}}]); \ No newline at end of file diff --git a/assets/js/135.cab3a990.js b/assets/js/136.7f925979.js similarity index 93% rename from assets/js/135.cab3a990.js rename to assets/js/136.7f925979.js index bb20c94e9e..6f01d6b7c6 100644 --- a/assets/js/135.cab3a990.js +++ b/assets/js/136.7f925979.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{1044:function(e,t,o){"use strict";o.r(t);var n=o(2),i=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-edit-tab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-edit-tab"}},[e._v("#")]),e._v(" The Edit Tab")]),e._v(" "),t("p",[e._v("The edit tab is used for manipulating the components and their interconnections. The list below provides a detailed description of the available operations found on the Edit Tab as shown in the figure.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(500),alt:"Screenshot: The edit tab",title:"Screenshot: The edit tab"}})]),e._v(" "),t("p",[e._v("The Edit Tab")]),e._v(" "),t("p",[e._v("Description of the "),t("em",[e._v("Model Properties")]),e._v(" Group:")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Edit Model ID (not yet implemented)")]),e._v(" edits the unique model ID. This ID is generated automatically and is used by the ARE to store model based information belonging to the editing model.")]),e._v(" "),t("li",[t("em",[e._v("Show Model Description (not yet implemented)")]),e._v(" shows the model description dialog, allowing the user to edit the model description. The description is divided into three parts: "),t("em",[e._v("Short Description")]),e._v(", "),t("em",[e._v("Model Requirements")]),e._v(" and "),t("em",[e._v("Detailed Description")])])]),e._v(" "),t("p",[e._v("Description of the "),t("em",[e._v("Edit")]),e._v(" Group:")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Cut")]),e._v(" cuts out the selected elements and stores them to clipboard.")]),e._v(" "),t("li",[t("em",[e._v("Copy")]),e._v(" copies the selected elements to the clipboard.")]),e._v(" "),t("li",[t("em",[e._v("Paste")]),e._v(" copies the elements from the clipboard to the drawing field.")]),e._v(" "),t("li",[t("em",[e._v("Delete Selection")]),e._v(" deletes the selected elements. This can also be done with the delete-key.")]),e._v(" "),t("li",[t("em",[e._v("Undo")]),e._v(" the last editing action like move a component, add/delete a component or also the channel and event channel operations. Setting properties and events (things done in the property window) are excluded form undo.")]),e._v(" "),t("li",[t("em",[e._v("Redo")]),e._v(" the last editing action that has been undone with "),t("em",[e._v("Undo")]),e._v(". Setting properties and events (things done in the property window) are excluded form redo.")])]),e._v(" "),t("p",[e._v("After at least two components have been added to the deployment, they can be connected to each other. A connection always has to start at an output port (right hand side of a component) connecting to an input port (left side of a component). One output port can be connected to several input ports, but an input port can only receive data from one output port. Additionally the data types of the ports must match in order to be able to connect them (see the section on Channels).")])])}),[],!1,null,null,null);t.default=i.exports},500:function(e,t,o){e.exports=o.p+"assets/img/edit_tab.366308ad.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{1050:function(e,t,o){"use strict";o.r(t);var n=o(2),i=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-edit-tab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-edit-tab"}},[e._v("#")]),e._v(" The Edit Tab")]),e._v(" "),t("p",[e._v("The edit tab is used for manipulating the components and their interconnections. The list below provides a detailed description of the available operations found on the Edit Tab as shown in the figure.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(506),alt:"Screenshot: The edit tab",title:"Screenshot: The edit tab"}})]),e._v(" "),t("p",[e._v("The Edit Tab")]),e._v(" "),t("p",[e._v("Description of the "),t("em",[e._v("Model Properties")]),e._v(" Group:")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Edit Model ID (not yet implemented)")]),e._v(" edits the unique model ID. This ID is generated automatically and is used by the ARE to store model based information belonging to the editing model.")]),e._v(" "),t("li",[t("em",[e._v("Show Model Description (not yet implemented)")]),e._v(" shows the model description dialog, allowing the user to edit the model description. The description is divided into three parts: "),t("em",[e._v("Short Description")]),e._v(", "),t("em",[e._v("Model Requirements")]),e._v(" and "),t("em",[e._v("Detailed Description")])])]),e._v(" "),t("p",[e._v("Description of the "),t("em",[e._v("Edit")]),e._v(" Group:")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("Cut")]),e._v(" cuts out the selected elements and stores them to clipboard.")]),e._v(" "),t("li",[t("em",[e._v("Copy")]),e._v(" copies the selected elements to the clipboard.")]),e._v(" "),t("li",[t("em",[e._v("Paste")]),e._v(" copies the elements from the clipboard to the drawing field.")]),e._v(" "),t("li",[t("em",[e._v("Delete Selection")]),e._v(" deletes the selected elements. This can also be done with the delete-key.")]),e._v(" "),t("li",[t("em",[e._v("Undo")]),e._v(" the last editing action like move a component, add/delete a component or also the channel and event channel operations. Setting properties and events (things done in the property window) are excluded form undo.")]),e._v(" "),t("li",[t("em",[e._v("Redo")]),e._v(" the last editing action that has been undone with "),t("em",[e._v("Undo")]),e._v(". Setting properties and events (things done in the property window) are excluded form redo.")])]),e._v(" "),t("p",[e._v("After at least two components have been added to the deployment, they can be connected to each other. A connection always has to start at an output port (right hand side of a component) connecting to an input port (left side of a component). One output port can be connected to several input ports, but an input port can only receive data from one output port. Additionally the data types of the ports must match in order to be able to connect them (see the section on Channels).")])])}),[],!1,null,null,null);t.default=i.exports},506:function(e,t,o){e.exports=o.p+"assets/img/edit_tab.366308ad.png"}}]); \ No newline at end of file diff --git a/assets/js/136.6f1574bd.js b/assets/js/137.7e24122d.js similarity index 95% rename from assets/js/136.6f1574bd.js rename to assets/js/137.7e24122d.js index 96b2bef9fe..0bb4961cc4 100644 --- a/assets/js/136.6f1574bd.js +++ b/assets/js/137.7e24122d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{1061:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"arewindow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arewindow"}},[e._v("#")]),e._v(" AREWindow")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("This component allows moving the ARE window to desired locations on the screen and setting its state and modification options. Several default locations can be selected via incoming events (top, left, bottom, right or center of the screen). X- and Y- offset values can be defined - thus it becomes possible to set the ARE window e.g to a second screen (which is currently not supported in the ACS GUI designer).")]),e._v(" "),t("p",[t("img",{attrs:{src:o(608),alt:"Screenshot: AREWindow plugin",title:"Screenshot: AREWindow plugin"}})]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" The x offest value for positioning the ARE window")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" The y offest value for positioning the ARE window")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("moveToTop:")]),e._v(" moves the ARE window to the top of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToBottom:")]),e._v(" moves the ARE window to the bottom of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToLeft:")]),e._v(" moves the ARE window to the left side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToRight:")]),e._v(" moves the ARE window to the right side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToCenter:")]),e._v(" moves the ARE window to the center of the screen (x and y offsets will be applied).")]),e._v(" "),t("li",[t("strong",[e._v("minimize:")]),e._v(" minimizes the ARE window to the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("restore:")]),e._v(" restores the ARE window from the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("bringToFront:")]),e._v(" places the ARE window on top of other windows")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" default value for the x offset")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" default value for the y offset")]),e._v(" "),t("li",[t("strong",[e._v("autoSetPosition [boolean]:")]),e._v(" if selected, the ARE window position will be modified at startup of the model according to the xPos and yPos properties. Furthermore, incoming values at the xPos or yPos ports will automatically position the ARE window.")]),e._v(" "),t("li",[t("strong",[e._v("allowWindowModification [boolean]:")]),e._v(" If selected, the user can change the ARE window decoration and control panel by double- or right-clicking into the ARE window. These functions will be disabled when the property is not selected.")])])])}),[],!1,null,null,null);t.default=n.exports},608:function(e,t,o){e.exports=o.p+"assets/img/arewindow.e4d5dc4b.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{1067:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"arewindow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arewindow"}},[e._v("#")]),e._v(" AREWindow")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("This component allows moving the ARE window to desired locations on the screen and setting its state and modification options. Several default locations can be selected via incoming events (top, left, bottom, right or center of the screen). X- and Y- offset values can be defined - thus it becomes possible to set the ARE window e.g to a second screen (which is currently not supported in the ACS GUI designer).")]),e._v(" "),t("p",[t("img",{attrs:{src:o(595),alt:"Screenshot: AREWindow plugin",title:"Screenshot: AREWindow plugin"}})]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" The x offest value for positioning the ARE window")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" The y offest value for positioning the ARE window")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("moveToTop:")]),e._v(" moves the ARE window to the top of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToBottom:")]),e._v(" moves the ARE window to the bottom of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToLeft:")]),e._v(" moves the ARE window to the left side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToRight:")]),e._v(" moves the ARE window to the right side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToCenter:")]),e._v(" moves the ARE window to the center of the screen (x and y offsets will be applied).")]),e._v(" "),t("li",[t("strong",[e._v("minimize:")]),e._v(" minimizes the ARE window to the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("restore:")]),e._v(" restores the ARE window from the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("bringToFront:")]),e._v(" places the ARE window on top of other windows")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" default value for the x offset")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" default value for the y offset")]),e._v(" "),t("li",[t("strong",[e._v("autoSetPosition [boolean]:")]),e._v(" if selected, the ARE window position will be modified at startup of the model according to the xPos and yPos properties. Furthermore, incoming values at the xPos or yPos ports will automatically position the ARE window.")]),e._v(" "),t("li",[t("strong",[e._v("allowWindowModification [boolean]:")]),e._v(" If selected, the user can change the ARE window decoration and control panel by double- or right-clicking into the ARE window. These functions will be disabled when the property is not selected.")])])])}),[],!1,null,null,null);t.default=n.exports},595:function(e,t,o){e.exports=o.p+"assets/img/arewindow.e4d5dc4b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/137.f885db30.js b/assets/js/138.08be3747.js similarity index 95% rename from assets/js/137.f885db30.js rename to assets/js/138.08be3747.js index 1f3c57e4d5..6a0b8d1273 100644 --- a/assets/js/137.f885db30.js +++ b/assets/js/138.08be3747.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{1064:function(e,t,n){"use strict";n.r(t);var r=n(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"androidphonecontrol"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#androidphonecontrol"}},[e._v("#")]),e._v(" AndroidPhoneControl")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Phone Interface)")]),e._v(" "),t("p",[e._v("This component controls a mobile phone with Android operating system through the TCP/IP connection.\nCurrently this component is able to perform such action as: call a remote phone, drop a phone call, send and receive SMS message.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(612),alt:"Screenshot: AndroidPhoneControl plugin",title:"Screenshot: AndroidPhoneControl plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Android phone running AsTeRICSPhoneServer application.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("phoneID [string]:")]),e._v(" The phone number used for outgoing SMS and make phone calls.")]),e._v(" "),t("li",[t("strong",[e._v("SMSContent [string]:")]),e._v(" The SMS content which will be used for the send SMS action.")]),e._v(" "),t("li",[t("strong",[e._v("command [string]:")]),e._v(" String command that can be sent to this component from other plugins to trigger phone actions.\nCurrently supported commands are:\n"),t("ul",[t("li",[e._v("@PHONE: SMS:Phone_ID, “Message_content”")]),e._v(" "),t("li",[e._v("@PHONE: SMS")]),e._v(" "),t("li",[e._v("@PHONE: CALL: Phone_ID")]),e._v(" "),t("li",[e._v("@PHONE: CALL")]),e._v(" "),t("li",[e._v("@PHONE: ACCEPT")]),e._v(" "),t("li",[e._v("@PHONE: DROP")]),e._v(" "),t("li",[e._v("@PHONE: SET_ID: Phone_ID")]),e._v(" "),t("li",[e._v("@PHONE: SET_SMS: “Message_content”")])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("remotePhoneID [string]:")]),e._v(" This is a phone number of the caller or SMS sender.")]),e._v(" "),t("li",[t("strong",[e._v("receivedSMS [string]:")]),e._v(" This is the content of the incoming SMS.")]),e._v(" "),t("li",[t("strong",[e._v("errorNumber [integer]:")]),e._v(" The number of the error.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendSMS:")]),e._v(" Sends the SMS message.")]),e._v(" "),t("li",[t("strong",[e._v("makePhoneCall:")]),e._v(" Makes the phone call.")]),e._v(" "),t("li",[t("strong",[e._v("acceptPhoneCall:")]),e._v(" Accepts the incoming phone call.")]),e._v(" "),t("li",[t("strong",[e._v("dropPhoneCall:")]),e._v(" Drops the phone call.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("idleState:")]),e._v(" Phone is in the idle state.")]),e._v(" "),t("li",[t("strong",[e._v("ringState:")]),e._v(" Phone is in the ring state.")]),e._v(" "),t("li",[t("strong",[e._v("connectedState:")]),e._v(" Phone is connected with the remote phone.")]),e._v(" "),t("li",[t("strong",[e._v("newSMS:")]),e._v(" There is a new SMS.")]),e._v(" "),t("li",[t("strong",[e._v("error:")]),e._v(" An error occurred.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("connectionType [integer]:")]),e._v(" Defines connection type for the plugin: client or server.")]),e._v(" "),t("li",[t("strong",[e._v("IP [string]:")]),e._v(" IP of the remote server used in the client mode.")]),e._v(" "),t("li",[t("strong",[e._v("port [integer]:")]),e._v(" TCP/IP port of the service.")]),e._v(" "),t("li",[t("strong",[e._v("defaultPhoneID [string]:")]),e._v(" Default phone number for outgoing SMS and phone calls.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"Android_connection.htm"}},[e._v("Preparation of the connection with Android Phone.")])])])}),[],!1,null,null,null);t.default=o.exports},612:function(e,t,n){e.exports=n.p+"assets/img/androidphonecontrol.c66f2379.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[138],{1066:function(e,t,n){"use strict";n.r(t);var r=n(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"androidphonecontrol"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#androidphonecontrol"}},[e._v("#")]),e._v(" AndroidPhoneControl")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Phone Interface)")]),e._v(" "),t("p",[e._v("This component controls a mobile phone with Android operating system through the TCP/IP connection.\nCurrently this component is able to perform such action as: call a remote phone, drop a phone call, send and receive SMS message.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(594),alt:"Screenshot: AndroidPhoneControl plugin",title:"Screenshot: AndroidPhoneControl plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Android phone running AsTeRICSPhoneServer application.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("phoneID [string]:")]),e._v(" The phone number used for outgoing SMS and make phone calls.")]),e._v(" "),t("li",[t("strong",[e._v("SMSContent [string]:")]),e._v(" The SMS content which will be used for the send SMS action.")]),e._v(" "),t("li",[t("strong",[e._v("command [string]:")]),e._v(" String command that can be sent to this component from other plugins to trigger phone actions.\nCurrently supported commands are:\n"),t("ul",[t("li",[e._v("@PHONE: SMS:Phone_ID, “Message_content”")]),e._v(" "),t("li",[e._v("@PHONE: SMS")]),e._v(" "),t("li",[e._v("@PHONE: CALL: Phone_ID")]),e._v(" "),t("li",[e._v("@PHONE: CALL")]),e._v(" "),t("li",[e._v("@PHONE: ACCEPT")]),e._v(" "),t("li",[e._v("@PHONE: DROP")]),e._v(" "),t("li",[e._v("@PHONE: SET_ID: Phone_ID")]),e._v(" "),t("li",[e._v("@PHONE: SET_SMS: “Message_content”")])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("remotePhoneID [string]:")]),e._v(" This is a phone number of the caller or SMS sender.")]),e._v(" "),t("li",[t("strong",[e._v("receivedSMS [string]:")]),e._v(" This is the content of the incoming SMS.")]),e._v(" "),t("li",[t("strong",[e._v("errorNumber [integer]:")]),e._v(" The number of the error.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendSMS:")]),e._v(" Sends the SMS message.")]),e._v(" "),t("li",[t("strong",[e._v("makePhoneCall:")]),e._v(" Makes the phone call.")]),e._v(" "),t("li",[t("strong",[e._v("acceptPhoneCall:")]),e._v(" Accepts the incoming phone call.")]),e._v(" "),t("li",[t("strong",[e._v("dropPhoneCall:")]),e._v(" Drops the phone call.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("idleState:")]),e._v(" Phone is in the idle state.")]),e._v(" "),t("li",[t("strong",[e._v("ringState:")]),e._v(" Phone is in the ring state.")]),e._v(" "),t("li",[t("strong",[e._v("connectedState:")]),e._v(" Phone is connected with the remote phone.")]),e._v(" "),t("li",[t("strong",[e._v("newSMS:")]),e._v(" There is a new SMS.")]),e._v(" "),t("li",[t("strong",[e._v("error:")]),e._v(" An error occurred.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("connectionType [integer]:")]),e._v(" Defines connection type for the plugin: client or server.")]),e._v(" "),t("li",[t("strong",[e._v("IP [string]:")]),e._v(" IP of the remote server used in the client mode.")]),e._v(" "),t("li",[t("strong",[e._v("port [integer]:")]),e._v(" TCP/IP port of the service.")]),e._v(" "),t("li",[t("strong",[e._v("defaultPhoneID [string]:")]),e._v(" Default phone number for outgoing SMS and phone calls.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"Android_connection.htm"}},[e._v("Preparation of the connection with Android Phone.")])])])}),[],!1,null,null,null);t.default=o.exports},594:function(e,t,n){e.exports=n.p+"assets/img/androidphonecontrol.c66f2379.jpg"}}]); \ No newline at end of file diff --git a/assets/js/138.3bb8794d.js b/assets/js/139.48541e8d.js similarity index 92% rename from assets/js/138.3bb8794d.js rename to assets/js/139.48541e8d.js index d0991d03c7..49878e796a 100644 --- a/assets/js/138.3bb8794d.js +++ b/assets/js/139.48541e8d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[138],{1063:function(e,t,o){"use strict";o.r(t);var n=o(2),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"androidconnection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#androidconnection"}},[e._v("#")]),e._v(" AndroidConnection")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Phone Interface)")]),e._v(" "),t("p",[t("img",{attrs:{src:o(611),alt:"Android Server Application",title:"Android Server Application"}})]),e._v(" "),t("p",[e._v("This document describes how to prepare connection between the AndroidPhoneControl component and the AsTeRICSPhoneServer application:")]),e._v(" "),t("ol",[t("li",[e._v("The connection between the AndroidPhoneControl component and the AsTeRICSPhoneServer application is made via TCP/IP connection. One of these components should work as a server, second as the client. The server should have the public IP or it should be in the same network where the client is.")]),e._v(" "),t("li",[e._v("In the model, select the connection mode in the connetionType property of the AndroidPhoneControl component. If the component should work as a server, put into the port property, the port which server will be use for its service. If the component should work as a client, put into the IP property IP of the server and into the port property the server port.")]),e._v(" "),t("li",[e._v("Run the Android Server application on the Android phone. Select the connection mode from the Connection type property. If the application should work as a server put into the port number property the port which server will be use for its service. If the application should work as a client put into the Server IP property IP of the server and into the Port Number property the server port.")]),e._v(" "),t("li",[e._v("If the AndroidPhoneControl component is set to work as the server and Android Server application is set to work as client. First run the model, then, enable Android application using Enable server property. If Android Server application is set to work as a server and the AndroidPhoneControl component is set to work as a client first enable the Android application then run the model.")])])])}),[],!1,null,null,null);t.default=r.exports},611:function(e,t,o){e.exports=o.p+"assets/img/androidserverapp.95049001.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[139],{1068:function(e,t,o){"use strict";o.r(t);var n=o(2),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"androidconnection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#androidconnection"}},[e._v("#")]),e._v(" AndroidConnection")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Phone Interface)")]),e._v(" "),t("p",[t("img",{attrs:{src:o(596),alt:"Android Server Application",title:"Android Server Application"}})]),e._v(" "),t("p",[e._v("This document describes how to prepare connection between the AndroidPhoneControl component and the AsTeRICSPhoneServer application:")]),e._v(" "),t("ol",[t("li",[e._v("The connection between the AndroidPhoneControl component and the AsTeRICSPhoneServer application is made via TCP/IP connection. One of these components should work as a server, second as the client. The server should have the public IP or it should be in the same network where the client is.")]),e._v(" "),t("li",[e._v("In the model, select the connection mode in the connetionType property of the AndroidPhoneControl component. If the component should work as a server, put into the port property, the port which server will be use for its service. If the component should work as a client, put into the IP property IP of the server and into the port property the server port.")]),e._v(" "),t("li",[e._v("Run the Android Server application on the Android phone. Select the connection mode from the Connection type property. If the application should work as a server put into the port number property the port which server will be use for its service. If the application should work as a client put into the Server IP property IP of the server and into the Port Number property the server port.")]),e._v(" "),t("li",[e._v("If the AndroidPhoneControl component is set to work as the server and Android Server application is set to work as client. First run the model, then, enable Android application using Enable server property. If Android Server application is set to work as a server and the AndroidPhoneControl component is set to work as a client first enable the Android application then run the model.")])])])}),[],!1,null,null,null);t.default=r.exports},596:function(e,t,o){e.exports=o.p+"assets/img/androidserverapp.95049001.jpg"}}]); \ No newline at end of file diff --git a/assets/js/14.21d1b981.js b/assets/js/14.2ac1f202.js similarity index 87% rename from assets/js/14.21d1b981.js rename to assets/js/14.2ac1f202.js index 418be93e59..d31ea7d120 100644 --- a/assets/js/14.21d1b981.js +++ b/assets/js/14.2ac1f202.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{288:function(e,t,s){e.exports=s.p+"assets/img/quickstart11.c2ae8b7e.png"},408:function(e,t,s){e.exports=s.p+"assets/img/quickstart10.a588225d.png"},409:function(e,t,s){e.exports=s.p+"assets/img/quickstart12.c7981783.png"},410:function(e,t,s){e.exports=s.p+"assets/img/quickstart13.68c18f17.png"},411:function(e,t,s){e.exports=s.p+"assets/img/quickstart14.3781e998.png"},412:function(e,t,s){e.exports=s.p+"assets/img/quickstart15.2c0687da.png"},413:function(e,t,s){e.exports=s.p+"assets/img/quickstart16.4b39a603.png"},414:function(e,t,s){e.exports=s.p+"assets/img/quickstart17.a2ecc137.png"},415:function(e,t,s){e.exports=s.p+"assets/img/quickstart18.a949722d.png"},929:function(e,t,s){"use strict";s.r(t);var o=s(2),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"model-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-creation"}},[e._v("#")]),e._v(" Model Creation")]),e._v(" "),t("h2",{attrs:{id:"camera-mouse-simple"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#camera-mouse-simple"}},[e._v("#")]),e._v(" Camera Mouse Simple")]),e._v(" "),t("p",[e._v("A model is a collection of 1 to n components, where a component represents a plugin\nof the ARE. These components are connected via channels (for data connections) and\nevent channels (representing events). The following example will illustrate the\ncreation of a simple webcam mouse, using the position of the nose to control the\ncursor and opening the mouth to trigger a mouse click. This model requires a\nconnected and installed webcam.")]),e._v(" "),t("h3",{attrs:{id:"add-facetracking"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-facetracking"}},[e._v("#")]),e._v(" Add Facetracking")]),e._v(" "),t("p",[e._v("In a first step, start the ACS and the ARE using the ACS.exe and ARE.exe short cuts.\nIn the ACS window select the tab "),t("strong",[e._v("Components")]),e._v(", then "),t("strong",[e._v("Sensors")]),e._v(" and within the\nsensors the menu item "),t("strong",[e._v("Computer Vision")]),e._v(". There select the component\nFacetrackerLK. The component is now on the drawing area and, if the component is\nselected, properties can be set (or changed) in the rightmost part of the ACS window.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(408),alt:"ACS - A first example (1/8)"}})]),e._v(" "),t("h3",{attrs:{id:"add-mouse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-mouse"}},[e._v("#")]),e._v(" Add Mouse")]),e._v(" "),t("p",[e._v("The next needed component is the "),t("strong",[e._v("Mouse")]),e._v(", it can be found by selecting "),t("strong",[e._v("Actuators")]),e._v(" -\n"),t("strong",[e._v("Input Device Emulation")]),e._v(". After the insert, select the Mouse component and adapt\nthe properties. Deactivate absolutePosition and set the "),t("code",[e._v("xMax")]),e._v(" and "),t("code",[e._v("yMax")]),e._v(" to your\nscreen resolution.")]),e._v(" "),t("p",[e._v("In the next step, connect the noseX and the noseY outputs of the "),t("strong",[e._v("XFacetrackerLK")]),e._v("\nwith the mouseX and mouseY inputs of the Mouse. Finally, it should look like the\nscreenshot below.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(288),alt:"ACS - A first example (2/8)"}})]),e._v(" "),t("h3",{attrs:{id:"add-mouse-click"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-mouse-click"}},[e._v("#")]),e._v(" Add Mouse Click")]),e._v(" "),t("p",[e._v("The model now would be able to use the coordinates of the nose to control the\nmouse cursor, but the mouse click is still missing.\nFor the mouse clicking functionality, we first need the "),t("strong",[e._v("MathEvaluator")]),e._v(" ("),t("strong",[e._v("Processors")]),e._v(" -\n"),t("strong",[e._v("Basic Math")]),e._v(") plugin. We connect the noseY output of the "),t("strong",[e._v("XFacetrackerLK")]),e._v(" the with\nthe inA input of the "),t("strong",[e._v("MathEvaluator")]),e._v(" and likewise the chinY with inB. In the properties\nof the "),t("strong",[e._v("MathEvaluator")]),e._v(", we set the property expression to "),t("strong",[e._v("b-a")]),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:s(409),alt:"ACS - A first example (3/8)"}})]),e._v(" "),t("p",[e._v("We will "),t("strong",[e._v("Differentiate")]),e._v(" ("),t("strong",[e._v("Processors")]),e._v(" -> "),t("strong",[e._v("Basic Math")]),e._v(") the out value to react on a fast\nchange of the nose to chin distance.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(410),alt:"ACS - A first example (4/8)"}})]),e._v(" "),t("p",[e._v("This processed value will then be forwarded to a "),t("strong",[e._v("Threshold")]),e._v(" ("),t("strong",[e._v("Processors")]),e._v(" -> "),t("strong",[e._v("Basic\nMath")]),e._v(") component. Set the thresholdLow and thresholdHigh values to 30.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(411),alt:"ACS - A first example (5/8)"}})]),e._v(" "),t("p",[e._v("As a final step, connect the event trigger output of the "),t("strong",[e._v("Threshold")]),e._v(" with the event\nlistener input of the "),t("strong",[e._v("Mouse")]),e._v(" – the event triggers and listeners are at the bottom of the\ncomponents. After the connection has been made, set the leftClick to eventPosEdge\nin the property editor at the right. If everything was done right, it should look like the\nfollowing screenshot:")]),e._v(" "),t("p",[t("img",{attrs:{src:s(412),alt:"ACS - A first example (6/8)"}})]),e._v(" "),t("h3",{attrs:{id:"test-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#test-model"}},[e._v("#")]),e._v(" Test Model")]),e._v(" "),t("p",[e._v("Now, upload the model to the ARE and press the "),t("strong",[e._v("Start Model")]),e._v(" button. A window with\nthe camera screen will appear, marking with a green and yellow circle - the position\nof nose and chin. Press the "),t("strong",[e._v("Stop Model")]),e._v(" button or press F7 to stop the model and\nget the control of the mouse back. Below is a screenshot of the system, when\nrunning.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(413),alt:"ACS - A first example (7/8)"}})]),e._v(" "),t("p",[e._v("Congratulations, your first AsTeRICS model is running!")]),e._v(" "),t("h3",{attrs:{id:"reducing-tremor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reducing-tremor"}},[e._v("#")]),e._v(" Reducing Tremor")]),e._v(" "),t("p",[e._v("You might have noticed that the mouse pointer has a tremor, because the head is\nalways in movement to a certain extent. To reduce this tremor, an "),t("strong",[e._v("Averager")]),e._v("\n("),t("strong",[e._v("Processors")]),e._v(" -> "),t("strong",[e._v("Basic Math")]),e._v(") will be used to smoothen the X coordinates and\nanother "),t("strong",[e._v("Averager")]),e._v(" for the Y coordinates between the "),t("strong",[e._v("XFacetrackerLK")]),e._v(" and the\n"),t("strong",[e._v("Mouse")]),e._v(". The bufferSize in the properties will be set to 5.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(414),alt:"ACS - A first example (8/8)"}})]),e._v(" "),t("p",[e._v("That’s all, just upload the model and start it now.")]),e._v(" "),t("h3",{attrs:{id:"adjusting-the-webcam"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adjusting-the-webcam"}},[e._v("#")]),e._v(" Adjusting the Webcam")]),e._v(" "),t("p",[e._v("If you don’t like the position of the webcam after starting the model, you can set a\ndifferent start position. Select the "),t("strong",[e._v("GUI Designer")]),e._v(" tab above the drawing area and\nmove the webcam window to an area, which is comfortable to you. Also the size of\nthe window can be adjusted.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(415),alt:"GUI Designer"}})]),e._v(" "),t("p",[e._v("Upload and start the model to work with the changes.")]),e._v(" "),t("h2",{attrs:{id:"camera-mouse-advanced"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#camera-mouse-advanced"}},[e._v("#")]),e._v(" Camera Mouse Advanced")]),e._v(" "),t("p",[e._v("If your first model works, try this more "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/AsTeRICS_CameraMouseCreation_StepbyStep_Tutorial.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("advanced step-by-step tutorial"),t("OutboundLink")],1),e._v(" based on slides.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{288:function(e,t,s){e.exports=s.p+"assets/img/quickstart11.c2ae8b7e.png"},414:function(e,t,s){e.exports=s.p+"assets/img/quickstart10.a588225d.png"},415:function(e,t,s){e.exports=s.p+"assets/img/quickstart12.c7981783.png"},416:function(e,t,s){e.exports=s.p+"assets/img/quickstart13.68c18f17.png"},417:function(e,t,s){e.exports=s.p+"assets/img/quickstart14.3781e998.png"},418:function(e,t,s){e.exports=s.p+"assets/img/quickstart15.2c0687da.png"},419:function(e,t,s){e.exports=s.p+"assets/img/quickstart16.4b39a603.png"},420:function(e,t,s){e.exports=s.p+"assets/img/quickstart17.a2ecc137.png"},421:function(e,t,s){e.exports=s.p+"assets/img/quickstart18.a949722d.png"},933:function(e,t,s){"use strict";s.r(t);var o=s(2),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"model-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-creation"}},[e._v("#")]),e._v(" Model Creation")]),e._v(" "),t("h2",{attrs:{id:"camera-mouse-simple"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#camera-mouse-simple"}},[e._v("#")]),e._v(" Camera Mouse Simple")]),e._v(" "),t("p",[e._v("A model is a collection of 1 to n components, where a component represents a plugin\nof the ARE. These components are connected via channels (for data connections) and\nevent channels (representing events). The following example will illustrate the\ncreation of a simple webcam mouse, using the position of the nose to control the\ncursor and opening the mouth to trigger a mouse click. This model requires a\nconnected and installed webcam.")]),e._v(" "),t("h3",{attrs:{id:"add-facetracking"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-facetracking"}},[e._v("#")]),e._v(" Add Facetracking")]),e._v(" "),t("p",[e._v("In a first step, start the ACS and the ARE using the ACS.exe and ARE.exe short cuts.\nIn the ACS window select the tab "),t("strong",[e._v("Components")]),e._v(", then "),t("strong",[e._v("Sensors")]),e._v(" and within the\nsensors the menu item "),t("strong",[e._v("Computer Vision")]),e._v(". There select the component\nFacetrackerLK. The component is now on the drawing area and, if the component is\nselected, properties can be set (or changed) in the rightmost part of the ACS window.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(414),alt:"ACS - A first example (1/8)"}})]),e._v(" "),t("h3",{attrs:{id:"add-mouse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-mouse"}},[e._v("#")]),e._v(" Add Mouse")]),e._v(" "),t("p",[e._v("The next needed component is the "),t("strong",[e._v("Mouse")]),e._v(", it can be found by selecting "),t("strong",[e._v("Actuators")]),e._v(" -\n"),t("strong",[e._v("Input Device Emulation")]),e._v(". After the insert, select the Mouse component and adapt\nthe properties. Deactivate absolutePosition and set the "),t("code",[e._v("xMax")]),e._v(" and "),t("code",[e._v("yMax")]),e._v(" to your\nscreen resolution.")]),e._v(" "),t("p",[e._v("In the next step, connect the noseX and the noseY outputs of the "),t("strong",[e._v("XFacetrackerLK")]),e._v("\nwith the mouseX and mouseY inputs of the Mouse. Finally, it should look like the\nscreenshot below.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(288),alt:"ACS - A first example (2/8)"}})]),e._v(" "),t("h3",{attrs:{id:"add-mouse-click"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-mouse-click"}},[e._v("#")]),e._v(" Add Mouse Click")]),e._v(" "),t("p",[e._v("The model now would be able to use the coordinates of the nose to control the\nmouse cursor, but the mouse click is still missing.\nFor the mouse clicking functionality, we first need the "),t("strong",[e._v("MathEvaluator")]),e._v(" ("),t("strong",[e._v("Processors")]),e._v(" -\n"),t("strong",[e._v("Basic Math")]),e._v(") plugin. We connect the noseY output of the "),t("strong",[e._v("XFacetrackerLK")]),e._v(" the with\nthe inA input of the "),t("strong",[e._v("MathEvaluator")]),e._v(" and likewise the chinY with inB. In the properties\nof the "),t("strong",[e._v("MathEvaluator")]),e._v(", we set the property expression to "),t("strong",[e._v("b-a")]),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:s(415),alt:"ACS - A first example (3/8)"}})]),e._v(" "),t("p",[e._v("We will "),t("strong",[e._v("Differentiate")]),e._v(" ("),t("strong",[e._v("Processors")]),e._v(" -> "),t("strong",[e._v("Basic Math")]),e._v(") the out value to react on a fast\nchange of the nose to chin distance.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(416),alt:"ACS - A first example (4/8)"}})]),e._v(" "),t("p",[e._v("This processed value will then be forwarded to a "),t("strong",[e._v("Threshold")]),e._v(" ("),t("strong",[e._v("Processors")]),e._v(" -> "),t("strong",[e._v("Basic\nMath")]),e._v(") component. Set the thresholdLow and thresholdHigh values to 30.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(417),alt:"ACS - A first example (5/8)"}})]),e._v(" "),t("p",[e._v("As a final step, connect the event trigger output of the "),t("strong",[e._v("Threshold")]),e._v(" with the event\nlistener input of the "),t("strong",[e._v("Mouse")]),e._v(" – the event triggers and listeners are at the bottom of the\ncomponents. After the connection has been made, set the leftClick to eventPosEdge\nin the property editor at the right. If everything was done right, it should look like the\nfollowing screenshot:")]),e._v(" "),t("p",[t("img",{attrs:{src:s(418),alt:"ACS - A first example (6/8)"}})]),e._v(" "),t("h3",{attrs:{id:"test-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#test-model"}},[e._v("#")]),e._v(" Test Model")]),e._v(" "),t("p",[e._v("Now, upload the model to the ARE and press the "),t("strong",[e._v("Start Model")]),e._v(" button. A window with\nthe camera screen will appear, marking with a green and yellow circle - the position\nof nose and chin. Press the "),t("strong",[e._v("Stop Model")]),e._v(" button or press F7 to stop the model and\nget the control of the mouse back. Below is a screenshot of the system, when\nrunning.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(419),alt:"ACS - A first example (7/8)"}})]),e._v(" "),t("p",[e._v("Congratulations, your first AsTeRICS model is running!")]),e._v(" "),t("h3",{attrs:{id:"reducing-tremor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reducing-tremor"}},[e._v("#")]),e._v(" Reducing Tremor")]),e._v(" "),t("p",[e._v("You might have noticed that the mouse pointer has a tremor, because the head is\nalways in movement to a certain extent. To reduce this tremor, an "),t("strong",[e._v("Averager")]),e._v("\n("),t("strong",[e._v("Processors")]),e._v(" -> "),t("strong",[e._v("Basic Math")]),e._v(") will be used to smoothen the X coordinates and\nanother "),t("strong",[e._v("Averager")]),e._v(" for the Y coordinates between the "),t("strong",[e._v("XFacetrackerLK")]),e._v(" and the\n"),t("strong",[e._v("Mouse")]),e._v(". The bufferSize in the properties will be set to 5.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(420),alt:"ACS - A first example (8/8)"}})]),e._v(" "),t("p",[e._v("That’s all, just upload the model and start it now.")]),e._v(" "),t("h3",{attrs:{id:"adjusting-the-webcam"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adjusting-the-webcam"}},[e._v("#")]),e._v(" Adjusting the Webcam")]),e._v(" "),t("p",[e._v("If you don’t like the position of the webcam after starting the model, you can set a\ndifferent start position. Select the "),t("strong",[e._v("GUI Designer")]),e._v(" tab above the drawing area and\nmove the webcam window to an area, which is comfortable to you. Also the size of\nthe window can be adjusted.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(421),alt:"GUI Designer"}})]),e._v(" "),t("p",[e._v("Upload and start the model to work with the changes.")]),e._v(" "),t("h2",{attrs:{id:"camera-mouse-advanced"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#camera-mouse-advanced"}},[e._v("#")]),e._v(" Camera Mouse Advanced")]),e._v(" "),t("p",[e._v("If your first model works, try this more "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/AsTeRICS_CameraMouseCreation_StepbyStep_Tutorial.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("advanced step-by-step tutorial"),t("OutboundLink")],1),e._v(" based on slides.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/139.70b19a34.js b/assets/js/140.80ac082b.js similarity index 97% rename from assets/js/139.70b19a34.js rename to assets/js/140.80ac082b.js index bbcc45ff71..8c47185fe1 100644 --- a/assets/js/139.70b19a34.js +++ b/assets/js/140.80ac082b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[139],{1066:function(e,t,r){"use strict";r.r(t);var a=r(2),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"applicationlauncher"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applicationlauncher"}},[e._v("#")]),e._v(" ApplicationLauncher")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("The ApplicationLauncher component can be used to run an external executable application or to open a URL in the platform default browser. The command and arguments values can either be set as property or dynamically configured through the respective input ports. The launch of the application or the opening of the URL can also be triggered by an incoming event (launchNow). The property executeOnPlatform selects the platforms on which the configured application or URL will be launched.")]),e._v(" "),t("p",[e._v("Together with the Keyboard- or RemoteKeyboard components, the ApplicationLauncher plugin can perform complex automation tasks, for example open Skype, choose a contact and make a call.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(615),alt:"Screenshot: ApplicationLauncher plugin",title:"Screenshot: ApplicationLauncher plugin"}})]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename [string]:")]),e._v(" File name of executable file which shall be started without arguments. The application is started automatically, if onlyByEvent is false. See "),t("em",[e._v("Properties -> defaultApplication")]),e._v(" description for details.")]),e._v(" "),t("li",[t("strong",[e._v("arguments [string]:")]),e._v(" Sets the arguments of the command. The application is started automatically, if onlyByEvent is false. See "),t("em",[e._v("Properties -> arguments")]),e._v(" description for details.")]),e._v(" "),t("li",[t("strong",[e._v("stdIn [string]:")]),e._v(" Sends the incoming string to the standard input stream of the started process.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("stdOut [string]:")]),e._v(" The standard output stream of the started process.")]),e._v(" "),t("li",[t("strong",[e._v("stdErr [string]:")]),e._v(" The standard error stream of the started process.")]),e._v(" "),t("li",[t("strong",[e._v("exitValue [integer]:")]),e._v(" The exit value of the started process.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("launchNow:")]),e._v(" An incoming event on this port will start the (default or lastest received) application")]),e._v(" "),t("li",[t("strong",[e._v("closeNow:")]),e._v(" An incoming event on this port will close the current application")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("startedSuccessfully:")]),e._v(" The process started successfully.")]),e._v(" "),t("li",[t("strong",[e._v("startedWithError:")]),e._v(" The process started with error.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("executeOnPlatform [combobox (ALL, WINDOWS, LINUX, MACOSX)]:")]),e._v(" If != ALL, the application will only be launched if the ARE runs on the defined platform.")]),e._v(" "),t("li",[t("strong",[e._v("executionMode [combobox (START_APPLICATION, OPEN_URL)]:")]),e._v(" If START_APPLICATION, the command defined in defaultApplication will be launched with the given arguments. If OPEN_URL, the URL defined in arguments will be launched with the platform default browser. The platform-specific browser launch commands are configurable in the file areProperties. For general information about platform-specific launch commands, see "),t("a",{attrs:{href:"https://dwheeler.com/essays/open-files-urls.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("open files and URLs"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("strong",[e._v("defaultApplication [string]:")]),e._v(" Full path and filename of the default application"),t("br"),e._v("\nThe full path can be provided with quotes, but quotes are not mandatory. So "),t("em",[e._v("C:\\Program Files\\internet explorer\\iexplore.exe")]),e._v(" and "),t("em",[e._v("“C:\\Program Files\\internet explorer\\iexplore.exe”")]),e._v(" are equal and both working.")]),e._v(" "),t("li",[t("strong",[e._v("arguments [string]:")]),e._v(" the commandline arguments for the application (in mode START_APPLICATION) or the URL to open (in mode OPEN_URL)."),t("br"),e._v("\nFor Mode START_APPLICATION: Given arguments are split considering whitespaces and quotes. So e.g. the arguments property "),t("em",[e._v("xterm -e “sudo sh test.sh”")]),e._v(" will be split in 3 components "),t("em",[e._v("xterm")]),e._v(", "),t("em",[e._v("-e")]),e._v(" and "),t("em",[e._v("“sudo sh test.sh”")]),e._v(". However quotes are removed at runtime, so "),t("em",[e._v("sudo sh test.sh")]),e._v(" without quotes will be passed to the ProcessBuilder used at Java level to start the program."),t("br"),e._v("\nHint for Windows: for cmd.exe “&” is a special character and cannot be used in an argument. If the “&” is needed, mask it with an “^”, therefore using “^&” instead of “&” in the argument."),t("br"),e._v("\nFor Mode OPEN_URL: URLs can be passed as-is on any platform, no masking of “&” characters is needed.")]),e._v(" "),t("li",[t("strong",[e._v("workingDirectory [string]:")]),e._v(" the working directory for the application (. is used for home directory of the application)")]),e._v(" "),t("li",[e._v("**closeCmd [string]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Optional close cmd, e.g. if started cmd has forked processes (e.g. OSKA) use: taskkill.exe /IM “OSKA Keyboard.exe” /T")]),e._v(" "),t("li",[t("strong",[e._v("autoLaunch [boolean]:")]),e._v(" Defines if the default application is automatically launched at startup")]),e._v(" "),t("li",[t("strong",[e._v("autoClose [boolean]:")]),e._v(" Defines if the current application is closed when the model is stopped")]),e._v(" "),t("li",[t("strong",[e._v("onlyByEvent [boolean]:")]),e._v(" If this property is set to true, incoming application files names will not be started immediately (only the launchNow event will start the application)")])])])}),[],!1,null,null,null);t.default=o.exports},615:function(e,t,r){e.exports=r.p+"assets/img/applicationlauncher.9f17bcc1.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{1071:function(e,t,r){"use strict";r.r(t);var a=r(2),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"applicationlauncher"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applicationlauncher"}},[e._v("#")]),e._v(" ApplicationLauncher")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("The ApplicationLauncher component can be used to run an external executable application or to open a URL in the platform default browser. The command and arguments values can either be set as property or dynamically configured through the respective input ports. The launch of the application or the opening of the URL can also be triggered by an incoming event (launchNow). The property executeOnPlatform selects the platforms on which the configured application or URL will be launched.")]),e._v(" "),t("p",[e._v("Together with the Keyboard- or RemoteKeyboard components, the ApplicationLauncher plugin can perform complex automation tasks, for example open Skype, choose a contact and make a call.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(618),alt:"Screenshot: ApplicationLauncher plugin",title:"Screenshot: ApplicationLauncher plugin"}})]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename [string]:")]),e._v(" File name of executable file which shall be started without arguments. The application is started automatically, if onlyByEvent is false. See "),t("em",[e._v("Properties -> defaultApplication")]),e._v(" description for details.")]),e._v(" "),t("li",[t("strong",[e._v("arguments [string]:")]),e._v(" Sets the arguments of the command. The application is started automatically, if onlyByEvent is false. See "),t("em",[e._v("Properties -> arguments")]),e._v(" description for details.")]),e._v(" "),t("li",[t("strong",[e._v("stdIn [string]:")]),e._v(" Sends the incoming string to the standard input stream of the started process.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("stdOut [string]:")]),e._v(" The standard output stream of the started process.")]),e._v(" "),t("li",[t("strong",[e._v("stdErr [string]:")]),e._v(" The standard error stream of the started process.")]),e._v(" "),t("li",[t("strong",[e._v("exitValue [integer]:")]),e._v(" The exit value of the started process.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("launchNow:")]),e._v(" An incoming event on this port will start the (default or lastest received) application")]),e._v(" "),t("li",[t("strong",[e._v("closeNow:")]),e._v(" An incoming event on this port will close the current application")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("startedSuccessfully:")]),e._v(" The process started successfully.")]),e._v(" "),t("li",[t("strong",[e._v("startedWithError:")]),e._v(" The process started with error.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("executeOnPlatform [combobox (ALL, WINDOWS, LINUX, MACOSX)]:")]),e._v(" If != ALL, the application will only be launched if the ARE runs on the defined platform.")]),e._v(" "),t("li",[t("strong",[e._v("executionMode [combobox (START_APPLICATION, OPEN_URL)]:")]),e._v(" If START_APPLICATION, the command defined in defaultApplication will be launched with the given arguments. If OPEN_URL, the URL defined in arguments will be launched with the platform default browser. The platform-specific browser launch commands are configurable in the file areProperties. For general information about platform-specific launch commands, see "),t("a",{attrs:{href:"https://dwheeler.com/essays/open-files-urls.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("open files and URLs"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("strong",[e._v("defaultApplication [string]:")]),e._v(" Full path and filename of the default application"),t("br"),e._v("\nThe full path can be provided with quotes, but quotes are not mandatory. So "),t("em",[e._v("C:\\Program Files\\internet explorer\\iexplore.exe")]),e._v(" and "),t("em",[e._v("“C:\\Program Files\\internet explorer\\iexplore.exe”")]),e._v(" are equal and both working.")]),e._v(" "),t("li",[t("strong",[e._v("arguments [string]:")]),e._v(" the commandline arguments for the application (in mode START_APPLICATION) or the URL to open (in mode OPEN_URL)."),t("br"),e._v("\nFor Mode START_APPLICATION: Given arguments are split considering whitespaces and quotes. So e.g. the arguments property "),t("em",[e._v("xterm -e “sudo sh test.sh”")]),e._v(" will be split in 3 components "),t("em",[e._v("xterm")]),e._v(", "),t("em",[e._v("-e")]),e._v(" and "),t("em",[e._v("“sudo sh test.sh”")]),e._v(". However quotes are removed at runtime, so "),t("em",[e._v("sudo sh test.sh")]),e._v(" without quotes will be passed to the ProcessBuilder used at Java level to start the program."),t("br"),e._v("\nHint for Windows: for cmd.exe “&” is a special character and cannot be used in an argument. If the “&” is needed, mask it with an “^”, therefore using “^&” instead of “&” in the argument."),t("br"),e._v("\nFor Mode OPEN_URL: URLs can be passed as-is on any platform, no masking of “&” characters is needed.")]),e._v(" "),t("li",[t("strong",[e._v("workingDirectory [string]:")]),e._v(" the working directory for the application (. is used for home directory of the application)")]),e._v(" "),t("li",[e._v("**closeCmd [string]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Optional close cmd, e.g. if started cmd has forked processes (e.g. OSKA) use: taskkill.exe /IM “OSKA Keyboard.exe” /T")]),e._v(" "),t("li",[t("strong",[e._v("autoLaunch [boolean]:")]),e._v(" Defines if the default application is automatically launched at startup")]),e._v(" "),t("li",[t("strong",[e._v("autoClose [boolean]:")]),e._v(" Defines if the current application is closed when the model is stopped")]),e._v(" "),t("li",[t("strong",[e._v("onlyByEvent [boolean]:")]),e._v(" If this property is set to true, incoming application files names will not be started immediately (only the launchNow event will start the application)")])])])}),[],!1,null,null,null);t.default=o.exports},618:function(e,t,r){e.exports=r.p+"assets/img/applicationlauncher.9f17bcc1.jpg"}}]); \ No newline at end of file diff --git a/assets/js/140.ce97c19c.js b/assets/js/141.647911d1.js similarity index 95% rename from assets/js/140.ce97c19c.js rename to assets/js/141.647911d1.js index fa65f66c5a..13062eb51e 100644 --- a/assets/js/140.ce97c19c.js +++ b/assets/js/141.647911d1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{1067:function(e,a,t){"use strict";t.r(a);var r=t(2),i=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"bardisplay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bardisplay"}},[e._v("#")]),e._v(" BarDisplay")]),e._v(" "),a("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),a("p",[e._v("The Bar display generates a coloured bar graph to visualise a current signal value in the ARE environment (of course the LC - display or a computer monitor have to be connected to the platform). The Bar display features auto-scale of value range, display of a threshold value and selectable update rate and foreground / background colours.")]),e._v(" "),a("p",[a("img",{attrs:{src:t(616),alt:"Screenshot: BarDisplay plugin",title:"Screenshot: BarDisplay plugin"}})]),e._v(" "),a("h2",{attrs:{id:"requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),a("p",[e._v("Computer Monitor or LC-Display available for graphics output.")]),e._v(" "),a("h2",{attrs:{id:"input-port-description"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("input [double]:")]),e._v(" The input port for the signal to be displayed.")])]),e._v(" "),a("h2",{attrs:{id:"properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("displayBuffer [integer]:")]),e._v(" This number specifies how often an update of the bar graph is performed. For example if the display buffer is set to 10, ten values are accumulated and the average value is displayed after the tenth incoming value.")]),e._v(" "),a("li",[a("strong",[e._v("min [double]:")]),e._v(" The default minimum of the signal range at model start (this value is automatically updated as lower values come in).")]),e._v(" "),a("li",[a("strong",[e._v("max [double]:")]),e._v(" The default maximum of the signal range at model start (this value is automatically updated as higher values come in).")]),e._v(" "),a("li",[a("strong",[e._v("threshold [double]:")]),e._v(" This value will be displayed with a marker in the bar graph (if enabled).")]),e._v(" "),a("li",[a("strong",[e._v("displayThreshold [boolean]:")]),e._v(" This property enables (true) or disables (false) the threshold marker in the bar graph.")]),e._v(" "),a("li",[a("strong",[e._v("integerDisplay [boolean]:")]),e._v(" This property selects if double values are rounded to integral values before being displayed in the bar graph.")]),e._v(" "),a("li",[a("strong",[e._v("mode [integer]:")]),e._v(" Via this property the way how values which exceed the current min/max range of the bar graph component are handled: “clip to min and max” crops incoming values to the min/max range, “autoupdate min and max” scales the bar graph window and updates the min/max values to cover the incoming value.")]),e._v(" "),a("li",[a("strong",[e._v("gridColor [integer]:")]),e._v(" The colour of the bar graph grid and descriptions.")]),e._v(" "),a("li",[a("strong",[e._v("barColor [integer]:")]),e._v(" The colour of the bar display.")]),e._v(" "),a("li",[a("strong",[e._v("backgroundColour [integer]:")]),e._v(" The colour of the window background.")]),e._v(" "),a("li",[a("strong",[e._v("fontSize [integer]:")]),e._v(" The font size of the display’s caption.")]),e._v(" "),a("li",[a("strong",[e._v("caption [string]:")]),e._v(" The text of the display’s caption.")]),e._v(" "),a("li",[a("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);a.default=i.exports},616:function(e,a,t){e.exports=t.p+"assets/img/bardisplay.824890df.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{1074:function(e,a,t){"use strict";t.r(a);var r=t(2),i=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"bardisplay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bardisplay"}},[e._v("#")]),e._v(" BarDisplay")]),e._v(" "),a("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),a("p",[e._v("The Bar display generates a coloured bar graph to visualise a current signal value in the ARE environment (of course the LC - display or a computer monitor have to be connected to the platform). The Bar display features auto-scale of value range, display of a threshold value and selectable update rate and foreground / background colours.")]),e._v(" "),a("p",[a("img",{attrs:{src:t(622),alt:"Screenshot: BarDisplay plugin",title:"Screenshot: BarDisplay plugin"}})]),e._v(" "),a("h2",{attrs:{id:"requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),a("p",[e._v("Computer Monitor or LC-Display available for graphics output.")]),e._v(" "),a("h2",{attrs:{id:"input-port-description"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("input [double]:")]),e._v(" The input port for the signal to be displayed.")])]),e._v(" "),a("h2",{attrs:{id:"properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("displayBuffer [integer]:")]),e._v(" This number specifies how often an update of the bar graph is performed. For example if the display buffer is set to 10, ten values are accumulated and the average value is displayed after the tenth incoming value.")]),e._v(" "),a("li",[a("strong",[e._v("min [double]:")]),e._v(" The default minimum of the signal range at model start (this value is automatically updated as lower values come in).")]),e._v(" "),a("li",[a("strong",[e._v("max [double]:")]),e._v(" The default maximum of the signal range at model start (this value is automatically updated as higher values come in).")]),e._v(" "),a("li",[a("strong",[e._v("threshold [double]:")]),e._v(" This value will be displayed with a marker in the bar graph (if enabled).")]),e._v(" "),a("li",[a("strong",[e._v("displayThreshold [boolean]:")]),e._v(" This property enables (true) or disables (false) the threshold marker in the bar graph.")]),e._v(" "),a("li",[a("strong",[e._v("integerDisplay [boolean]:")]),e._v(" This property selects if double values are rounded to integral values before being displayed in the bar graph.")]),e._v(" "),a("li",[a("strong",[e._v("mode [integer]:")]),e._v(" Via this property the way how values which exceed the current min/max range of the bar graph component are handled: “clip to min and max” crops incoming values to the min/max range, “autoupdate min and max” scales the bar graph window and updates the min/max values to cover the incoming value.")]),e._v(" "),a("li",[a("strong",[e._v("gridColor [integer]:")]),e._v(" The colour of the bar graph grid and descriptions.")]),e._v(" "),a("li",[a("strong",[e._v("barColor [integer]:")]),e._v(" The colour of the bar display.")]),e._v(" "),a("li",[a("strong",[e._v("backgroundColour [integer]:")]),e._v(" The colour of the window background.")]),e._v(" "),a("li",[a("strong",[e._v("fontSize [integer]:")]),e._v(" The font size of the display’s caption.")]),e._v(" "),a("li",[a("strong",[e._v("caption [string]:")]),e._v(" The text of the display’s caption.")]),e._v(" "),a("li",[a("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);a.default=i.exports},622:function(e,a,t){e.exports=t.p+"assets/img/bardisplay.824890df.jpg"}}]); \ No newline at end of file diff --git a/assets/js/141.2f154cf7.js b/assets/js/142.b1e9ea63.js similarity index 95% rename from assets/js/141.2f154cf7.js rename to assets/js/142.b1e9ea63.js index 5e16ebcb55..1a1fcca8ed 100644 --- a/assets/js/141.2f154cf7.js +++ b/assets/js/142.b1e9ea63.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{1069:function(t,e,o){"use strict";o.r(e);var s=o(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"digitalout"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#digitalout"}},[t._v("#")]),t._v(" DigitalOut")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Generic Control Output)")]),t._v(" "),e("p",[t._v("The DigitalOut plugin operates the output ports of the GPIO CIM. The output ports 1-2 are relais outputs where loads can be connected via a galvanic isolation barrier. The output ports 3-5 are open-collector outputs, where a pull-up resistor can be activated or deactivated using the plugin’s properties. The plugin provides event listener ports which serve the activation or deactivation of an output channel, and a command port which accepts string parameters to set, clear and toggle particular output channels.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(619),alt:"Screenshot: DigitalOut plugin",title:"Screenshot: DigitalOut plugin"}})]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the GPIO CIM (CIM Id: 0x0801) to be connected to an USB port.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("action [string]:")]),t._v(" The plugin reacts to incoming action strings starting with “@GPIO:” and a command. Valid commands are “set”, “clear”, “toggle” and “press”. The command has to be followed by a comma and the port number, for example: “@GPIO:set,1” or “@GPIO:toggle,2”. The “press”-command toggles the given output port two times with a delay of 500 milliseconds. The following examples illustrate the available action strings:\n"),e("ul",[e("li",[e("em",[t._v("“@DIGITALOUT:set,1”:")]),t._v(" Pin 1 of the GPIO CIM will be set")]),t._v(" "),e("li",[t._v('_"@DIGITALOUT:clear,2":_Pin 2 of the GPIO CIM will be cleared')]),t._v(" "),e("li",[e("em",[t._v("“@DIGITALOUT:toggle,1”:")]),t._v(" Pin 1 of the GPIO CIM will be changed")]),t._v(" "),e("li",[e("em",[t._v("“@DIGITALOUT:press,4”:")]),t._v(" Pin 4 of the GPIO CIM will be cleared and after 500ms it will be set again")])])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setOutput1 to setOutput5:")]),t._v(" an incoming event on these ports will cause the corresponding output port on the CIM to go to the high level.")]),t._v(" "),e("li",[e("strong",[t._v("clearOutput1 to clearOutput5:")]),t._v(" an incoming event on these ports will cause the corresponding output port on the CIM to go to the low level.")]),t._v(" "),e("li",[t._v("**toggleOutput1 to toggleOutput5:**Toggles the state of the output port.")]),t._v(" "),e("li",[t._v("**pressOutput1 to pressOutput5:**Presses the output port: Clears the state and after 500ms sets the state to high.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("pullupStateOut3 to pullupStateOut5 [boolean]:")]),t._v(" These properties specify if the internal pullup resistor shall be activated on the respective open collector output channels.")]),t._v(" "),e("li",[e("strong",[t._v("uniqueId:")]),t._v(" unique number of the CIM - if more than one CIMs of the same type are used. The module flashes a LED for identification when the ID is selected. "),e("strong",[t._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);e.default=r.exports},619:function(t,e,o){t.exports=o.p+"assets/img/digitalout.1a89ad2e.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{1073:function(t,e,o){"use strict";o.r(e);var s=o(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"digitalout"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#digitalout"}},[t._v("#")]),t._v(" DigitalOut")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Generic Control Output)")]),t._v(" "),e("p",[t._v("The DigitalOut plugin operates the output ports of the GPIO CIM. The output ports 1-2 are relais outputs where loads can be connected via a galvanic isolation barrier. The output ports 3-5 are open-collector outputs, where a pull-up resistor can be activated or deactivated using the plugin’s properties. The plugin provides event listener ports which serve the activation or deactivation of an output channel, and a command port which accepts string parameters to set, clear and toggle particular output channels.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(621),alt:"Screenshot: DigitalOut plugin",title:"Screenshot: DigitalOut plugin"}})]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the GPIO CIM (CIM Id: 0x0801) to be connected to an USB port.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("action [string]:")]),t._v(" The plugin reacts to incoming action strings starting with “@GPIO:” and a command. Valid commands are “set”, “clear”, “toggle” and “press”. The command has to be followed by a comma and the port number, for example: “@GPIO:set,1” or “@GPIO:toggle,2”. The “press”-command toggles the given output port two times with a delay of 500 milliseconds. The following examples illustrate the available action strings:\n"),e("ul",[e("li",[e("em",[t._v("“@DIGITALOUT:set,1”:")]),t._v(" Pin 1 of the GPIO CIM will be set")]),t._v(" "),e("li",[t._v('_"@DIGITALOUT:clear,2":_Pin 2 of the GPIO CIM will be cleared')]),t._v(" "),e("li",[e("em",[t._v("“@DIGITALOUT:toggle,1”:")]),t._v(" Pin 1 of the GPIO CIM will be changed")]),t._v(" "),e("li",[e("em",[t._v("“@DIGITALOUT:press,4”:")]),t._v(" Pin 4 of the GPIO CIM will be cleared and after 500ms it will be set again")])])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setOutput1 to setOutput5:")]),t._v(" an incoming event on these ports will cause the corresponding output port on the CIM to go to the high level.")]),t._v(" "),e("li",[e("strong",[t._v("clearOutput1 to clearOutput5:")]),t._v(" an incoming event on these ports will cause the corresponding output port on the CIM to go to the low level.")]),t._v(" "),e("li",[t._v("**toggleOutput1 to toggleOutput5:**Toggles the state of the output port.")]),t._v(" "),e("li",[t._v("**pressOutput1 to pressOutput5:**Presses the output port: Clears the state and after 500ms sets the state to high.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("pullupStateOut3 to pullupStateOut5 [boolean]:")]),t._v(" These properties specify if the internal pullup resistor shall be activated on the respective open collector output channels.")]),t._v(" "),e("li",[e("strong",[t._v("uniqueId:")]),t._v(" unique number of the CIM - if more than one CIMs of the same type are used. The module flashes a LED for identification when the ID is selected. "),e("strong",[t._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);e.default=r.exports},621:function(t,e,o){t.exports=o.p+"assets/img/digitalout.1a89ad2e.jpg"}}]); \ No newline at end of file diff --git a/assets/js/142.e5418a38.js b/assets/js/143.3add4e3d.js similarity index 91% rename from assets/js/142.e5418a38.js rename to assets/js/143.3add4e3d.js index 5120402dcc..b1b5ad7e65 100644 --- a/assets/js/142.e5418a38.js +++ b/assets/js/143.3add4e3d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{1073:function(t,e,o){"use strict";o.r(e);var n=o(2),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"enobiodisplay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#enobiodisplay"}},[t._v("#")]),t._v(" EnobioDisplay")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("This component displays the electrophysiological signals recorded by the Enobio device, so a user can check that the signals are being received and are correctly calibrated. The 4 Enobio channels are plotted with three different colours. When the signal is plotted in red it means that the channel is not being calibrated due to the configuration of the Enobio component. If the signal is plotted in yellow then this signal is in process of calibration. If the signals are plotted in green it indicates that the signal is correctly calibrated.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(625),alt:"Screenshot: Enobio Display plugin",title:"Screenshot: Enobio Display plugin"}})]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This software component requires an Enobio receiver connected to the platform, the Enobio device switched on and the electrodes correctly placed on the user. In addition, the component expects an Enobio component connected to its inputs.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Channel1 to Channel4 [double]:")]),t._v(" Input ports for the corresponding output ports of the Enobio component.")]),t._v(" "),e("li",[e("strong",[t._v("Status [double]:")]),t._v(" Input port to be connected to the status output port of the Enobio component.")])])])}),[],!1,null,null,null);e.default=i.exports},625:function(t,e,o){t.exports=o.p+"assets/img/enobiodisplay.e7e383b2.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{1078:function(t,e,o){"use strict";o.r(e);var n=o(2),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"enobiodisplay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#enobiodisplay"}},[t._v("#")]),t._v(" EnobioDisplay")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("This component displays the electrophysiological signals recorded by the Enobio device, so a user can check that the signals are being received and are correctly calibrated. The 4 Enobio channels are plotted with three different colours. When the signal is plotted in red it means that the channel is not being calibrated due to the configuration of the Enobio component. If the signal is plotted in yellow then this signal is in process of calibration. If the signals are plotted in green it indicates that the signal is correctly calibrated.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(628),alt:"Screenshot: Enobio Display plugin",title:"Screenshot: Enobio Display plugin"}})]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This software component requires an Enobio receiver connected to the platform, the Enobio device switched on and the electrodes correctly placed on the user. In addition, the component expects an Enobio component connected to its inputs.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Channel1 to Channel4 [double]:")]),t._v(" Input ports for the corresponding output ports of the Enobio component.")]),t._v(" "),e("li",[e("strong",[t._v("Status [double]:")]),t._v(" Input port to be connected to the status output port of the Enobio component.")])])])}),[],!1,null,null,null);e.default=i.exports},628:function(t,e,o){t.exports=o.p+"assets/img/enobiodisplay.e7e383b2.jpg"}}]); \ No newline at end of file diff --git a/assets/js/143.345e2739.js b/assets/js/144.06621a80.js similarity index 97% rename from assets/js/143.345e2739.js rename to assets/js/144.06621a80.js index 7c092cc555..21f46591af 100644 --- a/assets/js/143.345e2739.js +++ b/assets/js/144.06621a80.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{1076:function(e,t,n){"use strict";n.r(t);var a=n(2),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"enocean"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enocean"}},[e._v("#")]),e._v(" EnOcean")]),e._v(" "),t("p",[e._v("Component Type: actuator (Subcategory: Home Control)")]),e._v(" "),t("p",[e._v("The EnOcean plugin enables the ARE to interface to EnOcean wireless sensors. This plugin utilizes the Priscilla java library for the EnOcean implementation, it is ©opyrighted by UAS FH Technikum Wien and released under the GNU General Public License (FSF v2). The EnOcean plugin provides an interface to the EnOcean sensors over an USB stick (EnOcean USB300) or an IP gateway. Interfacing to EnOcean devices is possible either by sending different data to actuators or receiving different types of values. This allows control of lightning, heat and ventilation devices and many more via the AsTeRICS platform.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(627),alt:"Screenshot: EnOcean plugin",title:"Screenshot: EnOcean plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("An EnOcean gateway (either USB or IP)")]),e._v(" "),t("li",[e._v("Basic knowledge on EnOcean device IDs")])]),e._v(" "),t("h2",{attrs:{id:"functional-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-description"}},[e._v("#")]),e._v(" Functional Description")]),e._v(" "),t("p",[e._v("By starting the model, the EnOcean plugin establishes a connection to the EnOcean gateway specified by the plugin properties (defined by gatewayIP and USB checkbox). The gatewayIP is either the IP adress of the gateway or the COM port name (e.g. COM1 or /dev/ttyUSB0). There are 3 different ways of sending data to EnOcean devices. The first one is done by the 6 input slider ports. Each of them has properties for the source device ID (range: 0-127) and a data type (binary, temperature, illumination, humidity, temperature set point and fan level). On every update of the input data, an EnOcean data frame is generated and sent. The second method is done over the event input ports. There are 3 properties to define. The device ID and the data type have equal possible values as with the slider input. The third property defines the value to be sent. The first method is the most flexible one, by sending a command string to the command input port. It expects a special formatted string and parses the dedicated keywords and format to an EnOcean command. The string can be assembled individually with other string formatting plugins. Receiving sensor data is done by combining event and output ports. There are 2 properties, one for the type of input data (the data type are the same as stated before) and one for the source device ID (this property is a hexadecimal string, containing the full 32bit ID, printed on the sensor). The event ports are triggered each time, an event with the defined type and device ID is received. If an event is raised, at the same time the corresponding data value is available at the output ports.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("command [string]:")]),e._v(' This port receives string commands for the EnOcean devices. The commands have to be in the format “@ENOCEAN:device_id#type#value”. An example for a valid command is"@ENOCEAN:25#binary#true". As a valid command is received by the input port, the value and data type is broadcasted to the devices with the given device ID offset (range: 0-127)')]),e._v(" "),t("li",[t("strong",[e._v("slider[1-6] [double]:")]),e._v(" Input port for a double value which is converted to an integer (or another type, depends on the datatype) and broadcasted to all EnOcean devices in range")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output[1-6]:")]),e._v(" The output value, from device with IDTrigger[1-6]")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("localIP [string]:")]),e._v(" The local IP address of the interface which can reach the IP gateway.")]),e._v(" "),t("li",[t("strong",[e._v("gatewayIP [string]:")]),e._v(" The destination IP address of the EnOcean gateway or the device name of the USB gateway (emulates a serial interface, e.g. COM1 or /dev/ttyUSB0)")]),e._v(" "),t("li",[t("strong",[e._v("USB [boolean]:")]),e._v(" If checked, then the connection will be established through a serial interface, otherwise through an IP gateway")]),e._v(" "),t("li",[t("strong",[e._v("id[1-6] [integer]:")]),e._v(" Source ID for input event[n]. The range is from 0 to 127.")]),e._v(" "),t("li",[t("strong",[e._v("sendType[1-6] [string]:")]),e._v(" Send type for input event[n]. Following data types are allowed global (for every datatype property, port and event):\n"),t("ul",[t("li",[t("em",[e._v("“binary”:")]),e._v(" e.g. used for switching light actuators on or off.")]),e._v(" "),t("li",[t("em",[e._v("“temperature”:")]),e._v(" e.g. used to transmit a temperature value.")]),e._v(" "),t("li",[t("em",[e._v("“illumination”:")]),e._v(" e.g. used to transmit illumination values.")]),e._v(" "),t("li",[t("em",[e._v("“humidity”:")]),e._v(" e.g. used to transmit humidity values.")]),e._v(" "),t("li",[t("em",[e._v("“setpoint”:")]),e._v(" e.g. used to send set point value (+10K or -5% humidity)")]),e._v(" "),t("li",[t("em",[e._v("“fan”:")]),e._v(" e.g. used to set or simulate a defined fan level")])])]),e._v(" "),t("li",[t("strong",[e._v("dataValue[1-6] [string]:")]),e._v(" The transmitted value for the input event [n] with the given id[n] and type (sendType[n])")]),e._v(" "),t("li",[t("strong",[e._v("IDSlider[1-6] [string]:")]),e._v(" Source ID for slider[n]. The range is from 0 to 127.")]),e._v(" "),t("li",[t("strong",[e._v("sendTypeSlider[1-6] [string]:")]),e._v(" The data type for sending slider[n] data with IDSLider[n]. The possible data types are stated above")]),e._v(" "),t("li",[t("strong",[e._v("IDTrigger[1-6] [string]:")]),e._v(" Source ID for event trigger[n]. This is a full id, as printed on the device as 6 character string(e.g. FFEFA01C)")]),e._v(" "),t("li",[t("strong",[e._v("TypeTrigger[1-6] [string]:")]),e._v(" The data type for the listening event[n]. If an incoming frame from the give ID (IDTrigger[n]) contains this data type, an event on event port [n] is raised. The possible data types are stated above")])]),e._v(" "),t("h2",{attrs:{id:"event-listener"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener"}},[e._v("#")]),e._v(" Event Listener")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("send[1-6]:")]),e._v(" Each time a event is triggered, the coresponding EnOcean frame which is specified in the plugin properties, is transmitted.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger"}},[e._v("#")]),e._v(" Event Trigger")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event_out_[1-6]:")]),e._v(" Each time a frame is received with the given parameters (from properties IDTrigger[n] and TypeTrigger[n]), this event is raised")])])])}),[],!1,null,null,null);t.default=i.exports},627:function(e,t,n){e.exports=n.p+"assets/img/enocean.b119bfe0.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{1082:function(e,t,n){"use strict";n.r(t);var a=n(2),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"enocean"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enocean"}},[e._v("#")]),e._v(" EnOcean")]),e._v(" "),t("p",[e._v("Component Type: actuator (Subcategory: Home Control)")]),e._v(" "),t("p",[e._v("The EnOcean plugin enables the ARE to interface to EnOcean wireless sensors. This plugin utilizes the Priscilla java library for the EnOcean implementation, it is ©opyrighted by UAS FH Technikum Wien and released under the GNU General Public License (FSF v2). The EnOcean plugin provides an interface to the EnOcean sensors over an USB stick (EnOcean USB300) or an IP gateway. Interfacing to EnOcean devices is possible either by sending different data to actuators or receiving different types of values. This allows control of lightning, heat and ventilation devices and many more via the AsTeRICS platform.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(631),alt:"Screenshot: EnOcean plugin",title:"Screenshot: EnOcean plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("An EnOcean gateway (either USB or IP)")]),e._v(" "),t("li",[e._v("Basic knowledge on EnOcean device IDs")])]),e._v(" "),t("h2",{attrs:{id:"functional-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-description"}},[e._v("#")]),e._v(" Functional Description")]),e._v(" "),t("p",[e._v("By starting the model, the EnOcean plugin establishes a connection to the EnOcean gateway specified by the plugin properties (defined by gatewayIP and USB checkbox). The gatewayIP is either the IP adress of the gateway or the COM port name (e.g. COM1 or /dev/ttyUSB0). There are 3 different ways of sending data to EnOcean devices. The first one is done by the 6 input slider ports. Each of them has properties for the source device ID (range: 0-127) and a data type (binary, temperature, illumination, humidity, temperature set point and fan level). On every update of the input data, an EnOcean data frame is generated and sent. The second method is done over the event input ports. There are 3 properties to define. The device ID and the data type have equal possible values as with the slider input. The third property defines the value to be sent. The first method is the most flexible one, by sending a command string to the command input port. It expects a special formatted string and parses the dedicated keywords and format to an EnOcean command. The string can be assembled individually with other string formatting plugins. Receiving sensor data is done by combining event and output ports. There are 2 properties, one for the type of input data (the data type are the same as stated before) and one for the source device ID (this property is a hexadecimal string, containing the full 32bit ID, printed on the sensor). The event ports are triggered each time, an event with the defined type and device ID is received. If an event is raised, at the same time the corresponding data value is available at the output ports.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("command [string]:")]),e._v(' This port receives string commands for the EnOcean devices. The commands have to be in the format “@ENOCEAN:device_id#type#value”. An example for a valid command is"@ENOCEAN:25#binary#true". As a valid command is received by the input port, the value and data type is broadcasted to the devices with the given device ID offset (range: 0-127)')]),e._v(" "),t("li",[t("strong",[e._v("slider[1-6] [double]:")]),e._v(" Input port for a double value which is converted to an integer (or another type, depends on the datatype) and broadcasted to all EnOcean devices in range")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output[1-6]:")]),e._v(" The output value, from device with IDTrigger[1-6]")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("localIP [string]:")]),e._v(" The local IP address of the interface which can reach the IP gateway.")]),e._v(" "),t("li",[t("strong",[e._v("gatewayIP [string]:")]),e._v(" The destination IP address of the EnOcean gateway or the device name of the USB gateway (emulates a serial interface, e.g. COM1 or /dev/ttyUSB0)")]),e._v(" "),t("li",[t("strong",[e._v("USB [boolean]:")]),e._v(" If checked, then the connection will be established through a serial interface, otherwise through an IP gateway")]),e._v(" "),t("li",[t("strong",[e._v("id[1-6] [integer]:")]),e._v(" Source ID for input event[n]. The range is from 0 to 127.")]),e._v(" "),t("li",[t("strong",[e._v("sendType[1-6] [string]:")]),e._v(" Send type for input event[n]. Following data types are allowed global (for every datatype property, port and event):\n"),t("ul",[t("li",[t("em",[e._v("“binary”:")]),e._v(" e.g. used for switching light actuators on or off.")]),e._v(" "),t("li",[t("em",[e._v("“temperature”:")]),e._v(" e.g. used to transmit a temperature value.")]),e._v(" "),t("li",[t("em",[e._v("“illumination”:")]),e._v(" e.g. used to transmit illumination values.")]),e._v(" "),t("li",[t("em",[e._v("“humidity”:")]),e._v(" e.g. used to transmit humidity values.")]),e._v(" "),t("li",[t("em",[e._v("“setpoint”:")]),e._v(" e.g. used to send set point value (+10K or -5% humidity)")]),e._v(" "),t("li",[t("em",[e._v("“fan”:")]),e._v(" e.g. used to set or simulate a defined fan level")])])]),e._v(" "),t("li",[t("strong",[e._v("dataValue[1-6] [string]:")]),e._v(" The transmitted value for the input event [n] with the given id[n] and type (sendType[n])")]),e._v(" "),t("li",[t("strong",[e._v("IDSlider[1-6] [string]:")]),e._v(" Source ID for slider[n]. The range is from 0 to 127.")]),e._v(" "),t("li",[t("strong",[e._v("sendTypeSlider[1-6] [string]:")]),e._v(" The data type for sending slider[n] data with IDSLider[n]. The possible data types are stated above")]),e._v(" "),t("li",[t("strong",[e._v("IDTrigger[1-6] [string]:")]),e._v(" Source ID for event trigger[n]. This is a full id, as printed on the device as 6 character string(e.g. FFEFA01C)")]),e._v(" "),t("li",[t("strong",[e._v("TypeTrigger[1-6] [string]:")]),e._v(" The data type for the listening event[n]. If an incoming frame from the give ID (IDTrigger[n]) contains this data type, an event on event port [n] is raised. The possible data types are stated above")])]),e._v(" "),t("h2",{attrs:{id:"event-listener"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener"}},[e._v("#")]),e._v(" Event Listener")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("send[1-6]:")]),e._v(" Each time a event is triggered, the coresponding EnOcean frame which is specified in the plugin properties, is transmitted.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger"}},[e._v("#")]),e._v(" Event Trigger")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event_out_[1-6]:")]),e._v(" Each time a frame is received with the given parameters (from properties IDTrigger[n] and TypeTrigger[n]), this event is raised")])])])}),[],!1,null,null,null);t.default=i.exports},631:function(e,t,n){e.exports=n.p+"assets/img/enocean.b119bfe0.png"}}]); \ No newline at end of file diff --git a/assets/js/144.16b098d7.js b/assets/js/145.a0757417.js similarity index 90% rename from assets/js/144.16b098d7.js rename to assets/js/145.a0757417.js index 3b57c6721a..1643086444 100644 --- a/assets/js/144.16b098d7.js +++ b/assets/js/145.a0757417.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{1074:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"eventvisualizer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventvisualizer"}},[e._v("#")]),e._v(" EventVisualizer")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("This plugin provides a graphical feedback for events. It can be used to monitor event activities and is mainly targeted for testing of configurations during setup time. The plugin offers a GUI (simple window with text output) where event names are displayed.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(626),alt:"Screenshot: EventVisualizer plugin",title:"Screenshot: EventVisualizer plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("No special hardware or software required.")]),e._v(" "),t("h2",{attrs:{id:"port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#port-description"}},[e._v("#")]),e._v(" Port Description")]),e._v(" "),t("p",[e._v("This plugin does not provide input or output ports.")]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event_in_1:")]),e._v(" incoming events will be displayed in the GUI.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=s.exports},626:function(e,t,i){e.exports=i.p+"assets/img/eventvisualizer.22b2dfa9.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[145],{1079:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"eventvisualizer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventvisualizer"}},[e._v("#")]),e._v(" EventVisualizer")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("This plugin provides a graphical feedback for events. It can be used to monitor event activities and is mainly targeted for testing of configurations during setup time. The plugin offers a GUI (simple window with text output) where event names are displayed.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(629),alt:"Screenshot: EventVisualizer plugin",title:"Screenshot: EventVisualizer plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("No special hardware or software required.")]),e._v(" "),t("h2",{attrs:{id:"port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#port-description"}},[e._v("#")]),e._v(" Port Description")]),e._v(" "),t("p",[e._v("This plugin does not provide input or output ports.")]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event_in_1:")]),e._v(" incoming events will be displayed in the GUI.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=s.exports},629:function(e,t,i){e.exports=i.p+"assets/img/eventvisualizer.22b2dfa9.jpg"}}]); \ No newline at end of file diff --git a/assets/js/145.58614a9d.js b/assets/js/146.d83fff02.js similarity index 98% rename from assets/js/145.58614a9d.js rename to assets/js/146.d83fff02.js index cf84e108cf..bb5e5b2d58 100644 --- a/assets/js/145.58614a9d.js +++ b/assets/js/146.d83fff02.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[145],{1077:function(t,e,r){"use strict";r.r(e);var a=r(2),A=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"fs20sender"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fs20sender"}},[t._v("#")]),t._v(" FS20Sender")]),t._v(" "),e("h2",{attrs:{id:"component-type-actuator-subcategory-home-control"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-home-control"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: Home Control)")]),t._v(" "),e("p",[t._v("With the FS20 Sender commands for the FS20 house automation system can be sent over the PCS device sold by ELV electronics. See "),e("a",{attrs:{href:"http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=29530&flv=1&bereich=&:marke=",target:"_blank",rel:"noopener noreferrer"}},[t._v("the ELV FS20 homepage"),e("OutboundLink")],1),t._v(" for details.")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The PCS sender must be attached to the system!")]),t._v(" "),e("p",[e("img",{attrs:{src:r(628),alt:"Picture of the PCS FS20 sender",title:"Picture of the PCS FS20 sender"}})]),t._v(" "),e("h2",{attrs:{id:"supported-oses"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-oses"}},[t._v("#")]),t._v(" Supported OSes")]),t._v(" "),e("ul",[e("li",[t._v("Windows ("),e("code",[t._v("x86")]),t._v(", "),e("code",[t._v("x64")]),t._v(")")]),t._v(" "),e("li",[t._v("Linux ("),e("code",[t._v("x86")]),t._v(", "),e("code",[t._v("x64")]),t._v(", "),e("code",[t._v("ARM")]),t._v(" - (Raspberry Pi))")]),t._v(" "),e("li",[t._v("macOS X ("),e("code",[t._v("x86")]),t._v(", "),e("code",[t._v("x64")]),t._v(")")])]),t._v(" "),e("h2",{attrs:{id:"notes-on-linux-platform"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#notes-on-linux-platform"}},[t._v("#")]),t._v(" Notes on Linux platform")]),t._v(" "),e("p",[t._v("If you installed AsTeRICS as package, all necessary permission already set.\nIf you built AsTeRICS on your own, please type following command on a terminal window:")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'ATTRS{idProduct}=="e015", ATTRS{idVendor}=="18ef", MODE="0660", GROUP="plugdev"\'')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /etc/udev/rules.d/50-asterics-fs20.rules\n")])])]),e("p",[t._v("One additional command is necessary if you work on ARM based platforms (RaspberryPi, BananaPi,…):")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-sf")]),t._v(" /lib/arm-linux-gnueabihf/libudev.so.1 /lib/arm-linux-gnueabihf/libudev.so.0\n")])])]),e("p",[t._v("Afterwards, unplug and plug in the FS20 device and restart AsTeRICS.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("houseCode [int]:")]),t._v(" The houseCode to which the command should be sent. Overrides the houseCode set in the properties")]),t._v(" "),e("li",[e("strong",[t._v("address [int]:")]),t._v(" The address of the target device. Overrides the houseCode set in the properties.")]),t._v(" "),e("li",[e("strong",[t._v("action [string]:")]),t._v(" Action input to send commands from other components which output a variable string, for example OSKA. The string format is as follows: @FS20:houseCode,address,command; e.g.@FS20:11111111,1234,18 to send the toggle command to the device with housecode 11111111 and address 1234. The delimiters ‘,’, ‘_’ and ’ ’ are allowed. For the indices of the commands see the table below.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("p",[t._v("See table below for a list of all commands that can be triggered")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Command")]),t._v(" "),e("th",[t._v("ID")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Off")]),t._v(" "),e("td",[t._v("0")])]),t._v(" "),e("tr",[e("td",[t._v("Level1")]),t._v(" "),e("td",[t._v("1")])]),t._v(" "),e("tr",[e("td",[t._v("Level2")]),t._v(" "),e("td",[t._v("2")])]),t._v(" "),e("tr",[e("td",[t._v("Level3")]),t._v(" "),e("td",[t._v("3")])]),t._v(" "),e("tr",[e("td",[t._v("Level4")]),t._v(" "),e("td",[t._v("4")])]),t._v(" "),e("tr",[e("td",[t._v("Level5")]),t._v(" "),e("td",[t._v("5")])]),t._v(" "),e("tr",[e("td",[t._v("Level6")]),t._v(" "),e("td",[t._v("6")])]),t._v(" "),e("tr",[e("td",[t._v("Level7")]),t._v(" "),e("td",[t._v("7")])]),t._v(" "),e("tr",[e("td",[t._v("Level8")]),t._v(" "),e("td",[t._v("8")])]),t._v(" "),e("tr",[e("td",[t._v("Level9")]),t._v(" "),e("td",[t._v("9")])]),t._v(" "),e("tr",[e("td",[t._v("Level10")]),t._v(" "),e("td",[t._v("10")])]),t._v(" "),e("tr",[e("td",[t._v("Level11")]),t._v(" "),e("td",[t._v("11")])]),t._v(" "),e("tr",[e("td",[t._v("Level12")]),t._v(" "),e("td",[t._v("12")])]),t._v(" "),e("tr",[e("td",[t._v("Level13")]),t._v(" "),e("td",[t._v("13")])]),t._v(" "),e("tr",[e("td",[t._v("Level14")]),t._v(" "),e("td",[t._v("14")])]),t._v(" "),e("tr",[e("td",[t._v("Level15")]),t._v(" "),e("td",[t._v("15")])]),t._v(" "),e("tr",[e("td",[t._v("Level16")]),t._v(" "),e("td",[t._v("16")])]),t._v(" "),e("tr",[e("td",[t._v("OnOldLevel")]),t._v(" "),e("td",[t._v("17")])]),t._v(" "),e("tr",[e("td",[t._v("Toggle")]),t._v(" "),e("td",[t._v("18")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up")]),t._v(" "),e("td",[t._v("19")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Down")]),t._v(" "),e("td",[t._v("20")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up and Down")]),t._v(" "),e("td",[t._v("21")])]),t._v(" "),e("tr",[e("td",[t._v("Program internal timer")]),t._v(" "),e("td",[t._v("22")])]),t._v(" "),e("tr",[e("td",[t._v("Off for timer then old brightness level")]),t._v(" "),e("td",[t._v("24")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then off")]),t._v(" "),e("td",[t._v("25")])]),t._v(" "),e("tr",[e("td",[t._v("On old brightness level for timer then off")]),t._v(" "),e("td",[t._v("26")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then old brightness level")]),t._v(" "),e("td",[t._v("30")])]),t._v(" "),e("tr",[e("td",[t._v("On for old level then previous state")]),t._v(" "),e("td",[t._v("31")])])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("houseCode [integer]:")]),t._v(" The default housecode for the component if there is no on the input port.")]),t._v(" "),e("li",[e("strong",[t._v("address [integer]:")]),t._v(" The default address for the component if there is no on the input port.")])])])}),[],!1,null,null,null);e.default=A.exports},628:function(t,e){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[146],{1084:function(t,e,r){"use strict";r.r(e);var a=r(2),A=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"fs20sender"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fs20sender"}},[t._v("#")]),t._v(" FS20Sender")]),t._v(" "),e("h2",{attrs:{id:"component-type-actuator-subcategory-home-control"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-home-control"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: Home Control)")]),t._v(" "),e("p",[t._v("With the FS20 Sender commands for the FS20 house automation system can be sent over the PCS device sold by ELV electronics. See "),e("a",{attrs:{href:"http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=29530&flv=1&bereich=&:marke=",target:"_blank",rel:"noopener noreferrer"}},[t._v("the ELV FS20 homepage"),e("OutboundLink")],1),t._v(" for details.")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The PCS sender must be attached to the system!")]),t._v(" "),e("p",[e("img",{attrs:{src:r(633),alt:"Picture of the PCS FS20 sender",title:"Picture of the PCS FS20 sender"}})]),t._v(" "),e("h2",{attrs:{id:"supported-oses"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-oses"}},[t._v("#")]),t._v(" Supported OSes")]),t._v(" "),e("ul",[e("li",[t._v("Windows ("),e("code",[t._v("x86")]),t._v(", "),e("code",[t._v("x64")]),t._v(")")]),t._v(" "),e("li",[t._v("Linux ("),e("code",[t._v("x86")]),t._v(", "),e("code",[t._v("x64")]),t._v(", "),e("code",[t._v("ARM")]),t._v(" - (Raspberry Pi))")]),t._v(" "),e("li",[t._v("macOS X ("),e("code",[t._v("x86")]),t._v(", "),e("code",[t._v("x64")]),t._v(")")])]),t._v(" "),e("h2",{attrs:{id:"notes-on-linux-platform"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#notes-on-linux-platform"}},[t._v("#")]),t._v(" Notes on Linux platform")]),t._v(" "),e("p",[t._v("If you installed AsTeRICS as package, all necessary permission already set.\nIf you built AsTeRICS on your own, please type following command on a terminal window:")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'ATTRS{idProduct}=="e015", ATTRS{idVendor}=="18ef", MODE="0660", GROUP="plugdev"\'')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /etc/udev/rules.d/50-asterics-fs20.rules\n")])])]),e("p",[t._v("One additional command is necessary if you work on ARM based platforms (RaspberryPi, BananaPi,…):")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-sf")]),t._v(" /lib/arm-linux-gnueabihf/libudev.so.1 /lib/arm-linux-gnueabihf/libudev.so.0\n")])])]),e("p",[t._v("Afterwards, unplug and plug in the FS20 device and restart AsTeRICS.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("houseCode [int]:")]),t._v(" The houseCode to which the command should be sent. Overrides the houseCode set in the properties")]),t._v(" "),e("li",[e("strong",[t._v("address [int]:")]),t._v(" The address of the target device. Overrides the houseCode set in the properties.")]),t._v(" "),e("li",[e("strong",[t._v("action [string]:")]),t._v(" Action input to send commands from other components which output a variable string, for example OSKA. The string format is as follows: @FS20:houseCode,address,command; e.g.@FS20:11111111,1234,18 to send the toggle command to the device with housecode 11111111 and address 1234. The delimiters ‘,’, ‘_’ and ’ ’ are allowed. For the indices of the commands see the table below.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("p",[t._v("See table below for a list of all commands that can be triggered")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Command")]),t._v(" "),e("th",[t._v("ID")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Off")]),t._v(" "),e("td",[t._v("0")])]),t._v(" "),e("tr",[e("td",[t._v("Level1")]),t._v(" "),e("td",[t._v("1")])]),t._v(" "),e("tr",[e("td",[t._v("Level2")]),t._v(" "),e("td",[t._v("2")])]),t._v(" "),e("tr",[e("td",[t._v("Level3")]),t._v(" "),e("td",[t._v("3")])]),t._v(" "),e("tr",[e("td",[t._v("Level4")]),t._v(" "),e("td",[t._v("4")])]),t._v(" "),e("tr",[e("td",[t._v("Level5")]),t._v(" "),e("td",[t._v("5")])]),t._v(" "),e("tr",[e("td",[t._v("Level6")]),t._v(" "),e("td",[t._v("6")])]),t._v(" "),e("tr",[e("td",[t._v("Level7")]),t._v(" "),e("td",[t._v("7")])]),t._v(" "),e("tr",[e("td",[t._v("Level8")]),t._v(" "),e("td",[t._v("8")])]),t._v(" "),e("tr",[e("td",[t._v("Level9")]),t._v(" "),e("td",[t._v("9")])]),t._v(" "),e("tr",[e("td",[t._v("Level10")]),t._v(" "),e("td",[t._v("10")])]),t._v(" "),e("tr",[e("td",[t._v("Level11")]),t._v(" "),e("td",[t._v("11")])]),t._v(" "),e("tr",[e("td",[t._v("Level12")]),t._v(" "),e("td",[t._v("12")])]),t._v(" "),e("tr",[e("td",[t._v("Level13")]),t._v(" "),e("td",[t._v("13")])]),t._v(" "),e("tr",[e("td",[t._v("Level14")]),t._v(" "),e("td",[t._v("14")])]),t._v(" "),e("tr",[e("td",[t._v("Level15")]),t._v(" "),e("td",[t._v("15")])]),t._v(" "),e("tr",[e("td",[t._v("Level16")]),t._v(" "),e("td",[t._v("16")])]),t._v(" "),e("tr",[e("td",[t._v("OnOldLevel")]),t._v(" "),e("td",[t._v("17")])]),t._v(" "),e("tr",[e("td",[t._v("Toggle")]),t._v(" "),e("td",[t._v("18")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up")]),t._v(" "),e("td",[t._v("19")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Down")]),t._v(" "),e("td",[t._v("20")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up and Down")]),t._v(" "),e("td",[t._v("21")])]),t._v(" "),e("tr",[e("td",[t._v("Program internal timer")]),t._v(" "),e("td",[t._v("22")])]),t._v(" "),e("tr",[e("td",[t._v("Off for timer then old brightness level")]),t._v(" "),e("td",[t._v("24")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then off")]),t._v(" "),e("td",[t._v("25")])]),t._v(" "),e("tr",[e("td",[t._v("On old brightness level for timer then off")]),t._v(" "),e("td",[t._v("26")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then old brightness level")]),t._v(" "),e("td",[t._v("30")])]),t._v(" "),e("tr",[e("td",[t._v("On for old level then previous state")]),t._v(" "),e("td",[t._v("31")])])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("houseCode [integer]:")]),t._v(" The default housecode for the component if there is no on the input port.")]),t._v(" "),e("li",[e("strong",[t._v("address [integer]:")]),t._v(" The default address for the component if there is no on the input port.")])])])}),[],!1,null,null,null);e.default=A.exports},633:function(t,e){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/146.89718b57.js b/assets/js/147.d276d0ea.js similarity index 89% rename from assets/js/146.89718b57.js rename to assets/js/147.d276d0ea.js index 6e3a45a756..e0c2f542f7 100644 --- a/assets/js/146.89718b57.js +++ b/assets/js/147.d276d0ea.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[146],{1078:function(t,e,r){"use strict";r.r(e);var i=r(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"filewriter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#filewriter"}},[t._v("#")]),t._v(" FileWriter")]),t._v(" "),e("h2",{attrs:{id:"component-type-actuator-subcategory-file-system"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-file-system"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This component writes the input values that are received in the input port to a text file, so these values can be analysed and processed off-line.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(629),alt:"Screenshot: File Writer plugin",title:"Screenshot: File Writer plugin"}})]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the values to be written to the text file.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FileName [string]:")]),t._v(" Defines the name for the file where the input values are written. A timestamp indicating year, month, day, hour, minute and second of when the file is created is appended to the file name in order to identify different recordings.")])])])}),[],!1,null,null,null);e.default=s.exports},629:function(t,e,r){t.exports=r.p+"assets/img/filewriter.747c3825.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[147],{1081:function(t,e,r){"use strict";r.r(e);var i=r(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"filewriter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#filewriter"}},[t._v("#")]),t._v(" FileWriter")]),t._v(" "),e("h2",{attrs:{id:"component-type-actuator-subcategory-file-system"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-file-system"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This component writes the input values that are received in the input port to a text file, so these values can be analysed and processed off-line.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(630),alt:"Screenshot: File Writer plugin",title:"Screenshot: File Writer plugin"}})]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the values to be written to the text file.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FileName [string]:")]),t._v(" Defines the name for the file where the input values are written. A timestamp indicating year, month, day, hour, minute and second of when the file is created is appended to the file name in order to identify different recordings.")])])])}),[],!1,null,null,null);e.default=s.exports},630:function(t,e,r){t.exports=r.p+"assets/img/filewriter.747c3825.jpg"}}]); \ No newline at end of file diff --git a/assets/js/147.30ccccd0.js b/assets/js/148.d3f5126d.js similarity index 98% rename from assets/js/147.30ccccd0.js rename to assets/js/148.d3f5126d.js index 6a976f0738..8d801c1504 100644 --- a/assets/js/147.30ccccd0.js +++ b/assets/js/148.d3f5126d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[147],{1080:function(e,t,s){"use strict";s.r(t);var r=s(2),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"gmailshortcuts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gmailshortcuts"}},[e._v("#")]),e._v(" GMailShortcuts")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-others"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-others"}},[e._v("#")]),e._v(" Component Type: Actuator (Subcategory: Others)")]),e._v(" "),t("p",[e._v("The GMailShortcuts component was developed to operate the e-mail client of GMail via Keystroke combinations (Shortcuts).The component emulates local keyboard inputs that are sent to the window currently having the focus. Please ensure that the GMail tab in your webbrowser has the input focus.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(632),alt:"Screenshot: GMailShortcuts plugin",title:"Screenshot: GMailShortcuts plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Works best with the Opera internet browser (http://www.opera.com/de) and the Gmail client (https://www.google.com/intl/en/mail/help/about.html)")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("KeyCode [string]:")]),e._v(" Input port for incoming strings which consists of alphanumeric characters. The keys are sequentially generated as local keystrokes as the string is received.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("**keyCodeString [string]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*If the KeyCode Input recieves a Character between A-Z or 1-9 it generates the corresbonding Keystroke for A-Z or 1-9.")]),e._v(" "),t("p",[e._v("To generate the required shortcuts for the Gmail client, the follwing strings are used:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Navigation")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("UP")]),e._v(" equals the Arrow up key")]),e._v(" "),t("li",[t("code",[e._v("DOWN")]),e._v(" equals the Arrow down key<")]),e._v(" "),t("li",[t("code",[e._v("LEFT")]),e._v(" equals the Arrow left key")]),e._v(" "),t("li",[t("code",[e._v("RIGHT")]),e._v(" equals the Arrow right key")]),e._v(" "),t("li",[t("code",[e._v("ESC")]),e._v(" equals the Escape key")]),e._v(" "),t("li",[t("code",[e._v("TAB")]),e._v(" equals the Tabulator key")]),e._v(" "),t("li",[t("code",[e._v("ENTER")]),e._v(" equals the Enter key")]),e._v(" "),t("li",[t("code",[e._v("BACKSPACE")]),e._v(" equals the Backspace key")])])]),e._v(" "),t("li",[t("strong",[e._v("Special Signs")]),e._v(" "),t("ul",[t("li",[t("code",[e._v(".")]),e._v(" equals the full stop key")]),e._v(" "),t("li",[t("code",[e._v("@")]),e._v(" equals the at sign key")]),e._v(" "),t("li",[t("code",[e._v(":")]),e._v(" equals the colon key")]),e._v(" "),t("li",[t("code",[e._v(";")]),e._v(" equals the semicolon key")]),e._v(" "),t("li",[t("code",[e._v(",")]),e._v(" equals the comma key")]),e._v(" "),t("li",[t("code",[e._v("!")]),e._v(" equals the exclemationmarl key")]),e._v(" "),t("li",[t("code",[e._v("?")]),e._v(" equals the questionmark key")]),e._v(" "),t("li",[t("code",[e._v("_")]),e._v(" equals the underscore key")])])]),e._v(" "),t("li",[t("strong",[e._v("GMail Key Combinations")]),e._v(" "),t("ul",[t("li",[e._v("SENDEN sends a written email if in a compose or replay window")]),e._v(" "),t("li",[e._v("CC if in a compose or reply window enters the CC area")]),e._v(" "),t("li",[e._v("NEW opens a email compose window")]),e._v(" "),t("li",[e._v("SEARCH sets the courser in the searchbar")]),e._v(" "),t("li",[e._v("INBOX swithces to the inbox window")]),e._v(" "),t("li",[e._v("REPLY enters the replay window when previously in an opened email")]),e._v(" "),t("li",[e._v("SELECT selects the email currentl marked blue")]),e._v(" "),t("li",[e._v("ENTER opens the currently marked email")]),e._v(" "),t("li",[e._v("SHIFT is the shift lock key (pressing once all chars a generated in capital letters pressing again undos the caption)")])])])])])])])}),[],!1,null,null,null);t.default=a.exports},632:function(e,t,s){e.exports=s.p+"assets/img/gmailshortcuts.23822e29.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[148],{1083:function(e,t,s){"use strict";s.r(t);var r=s(2),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"gmailshortcuts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gmailshortcuts"}},[e._v("#")]),e._v(" GMailShortcuts")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-others"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-others"}},[e._v("#")]),e._v(" Component Type: Actuator (Subcategory: Others)")]),e._v(" "),t("p",[e._v("The GMailShortcuts component was developed to operate the e-mail client of GMail via Keystroke combinations (Shortcuts).The component emulates local keyboard inputs that are sent to the window currently having the focus. Please ensure that the GMail tab in your webbrowser has the input focus.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(632),alt:"Screenshot: GMailShortcuts plugin",title:"Screenshot: GMailShortcuts plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Works best with the Opera internet browser (http://www.opera.com/de) and the Gmail client (https://www.google.com/intl/en/mail/help/about.html)")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("KeyCode [string]:")]),e._v(" Input port for incoming strings which consists of alphanumeric characters. The keys are sequentially generated as local keystrokes as the string is received.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("**keyCodeString [string]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*If the KeyCode Input recieves a Character between A-Z or 1-9 it generates the corresbonding Keystroke for A-Z or 1-9.")]),e._v(" "),t("p",[e._v("To generate the required shortcuts for the Gmail client, the follwing strings are used:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Navigation")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("UP")]),e._v(" equals the Arrow up key")]),e._v(" "),t("li",[t("code",[e._v("DOWN")]),e._v(" equals the Arrow down key<")]),e._v(" "),t("li",[t("code",[e._v("LEFT")]),e._v(" equals the Arrow left key")]),e._v(" "),t("li",[t("code",[e._v("RIGHT")]),e._v(" equals the Arrow right key")]),e._v(" "),t("li",[t("code",[e._v("ESC")]),e._v(" equals the Escape key")]),e._v(" "),t("li",[t("code",[e._v("TAB")]),e._v(" equals the Tabulator key")]),e._v(" "),t("li",[t("code",[e._v("ENTER")]),e._v(" equals the Enter key")]),e._v(" "),t("li",[t("code",[e._v("BACKSPACE")]),e._v(" equals the Backspace key")])])]),e._v(" "),t("li",[t("strong",[e._v("Special Signs")]),e._v(" "),t("ul",[t("li",[t("code",[e._v(".")]),e._v(" equals the full stop key")]),e._v(" "),t("li",[t("code",[e._v("@")]),e._v(" equals the at sign key")]),e._v(" "),t("li",[t("code",[e._v(":")]),e._v(" equals the colon key")]),e._v(" "),t("li",[t("code",[e._v(";")]),e._v(" equals the semicolon key")]),e._v(" "),t("li",[t("code",[e._v(",")]),e._v(" equals the comma key")]),e._v(" "),t("li",[t("code",[e._v("!")]),e._v(" equals the exclemationmarl key")]),e._v(" "),t("li",[t("code",[e._v("?")]),e._v(" equals the questionmark key")]),e._v(" "),t("li",[t("code",[e._v("_")]),e._v(" equals the underscore key")])])]),e._v(" "),t("li",[t("strong",[e._v("GMail Key Combinations")]),e._v(" "),t("ul",[t("li",[e._v("SENDEN sends a written email if in a compose or replay window")]),e._v(" "),t("li",[e._v("CC if in a compose or reply window enters the CC area")]),e._v(" "),t("li",[e._v("NEW opens a email compose window")]),e._v(" "),t("li",[e._v("SEARCH sets the courser in the searchbar")]),e._v(" "),t("li",[e._v("INBOX swithces to the inbox window")]),e._v(" "),t("li",[e._v("REPLY enters the replay window when previously in an opened email")]),e._v(" "),t("li",[e._v("SELECT selects the email currentl marked blue")]),e._v(" "),t("li",[e._v("ENTER opens the currently marked email")]),e._v(" "),t("li",[e._v("SHIFT is the shift lock key (pressing once all chars a generated in capital letters pressing again undos the caption)")])])])])])])])}),[],!1,null,null,null);t.default=a.exports},632:function(e,t,s){e.exports=s.p+"assets/img/gmailshortcuts.23822e29.jpg"}}]); \ No newline at end of file diff --git a/assets/js/148.35014274.js b/assets/js/149.068ccece.js similarity index 94% rename from assets/js/148.35014274.js rename to assets/js/149.068ccece.js index 77d50687c6..3200c7860c 100644 --- a/assets/js/148.35014274.js +++ b/assets/js/149.068ccece.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[148],{1081:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-actuator-subcategory-communication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-communication"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: Communication)")]),t._v(" "),e("p",[t._v("This component can perform send and receive SMS action through the GSM modem.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(633),alt:"Screenshot: GSMModem plugin",title:"Screenshot: GSMModem plugin"}})]),t._v(" "),e("p",[t._v("GSMModem plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("A GSM modem with SMS option connected to the platform.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("phoneID [string]:")]),t._v(" Phone number which will be used for the send SMS action.")]),t._v(" "),e("li",[e("strong",[t._v("SMSContent [string]:")]),t._v(" SMS content which will be used for the send SMS action.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("remotePhoneID [string]:")]),t._v(" This is a phone number of the SMS sender.")]),t._v(" "),e("li",[e("strong",[t._v("receivedSMS [string]:")]),t._v(" This is the content of the incoming SMS.")]),t._v(" "),e("li",[e("strong",[t._v("errorNumber [integer]:")]),t._v(" The number of the error.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sendSMS:")]),t._v(" Sends the SMS message.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("newSMS:")]),t._v(" There is a new message.")]),t._v(" "),e("li",[e("strong",[t._v("error:")]),t._v(" An error occurred.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("serialPort [string]:")]),t._v(" The modem COM port. If this parameter is empty, the component uses the port of the first modem found.")]),t._v(" "),e("li",[t._v("**pin [string]"),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("*The PIN code for the SIM card. If the PIN is not needed this property should be empty.")]),t._v(" "),e("li",[e("strong",[t._v("smsCenterID [string]:")]),t._v(" SMS Center ID. If the Center ID is not needed this property should be empty.")]),t._v(" "),e("li",[e("strong",[t._v("defaultPhoneID [string]:")]),t._v(" This is a default phone number, which will be used for the send SMS actions.")])])])}),[],!1,null,null,null);e.default=n.exports},633:function(t,e,r){t.exports=r.p+"assets/img/gsmmodem.5519c224.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[149],{1086:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-actuator-subcategory-communication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-communication"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: Communication)")]),t._v(" "),e("p",[t._v("This component can perform send and receive SMS action through the GSM modem.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(636),alt:"Screenshot: GSMModem plugin",title:"Screenshot: GSMModem plugin"}})]),t._v(" "),e("p",[t._v("GSMModem plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("A GSM modem with SMS option connected to the platform.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("phoneID [string]:")]),t._v(" Phone number which will be used for the send SMS action.")]),t._v(" "),e("li",[e("strong",[t._v("SMSContent [string]:")]),t._v(" SMS content which will be used for the send SMS action.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("remotePhoneID [string]:")]),t._v(" This is a phone number of the SMS sender.")]),t._v(" "),e("li",[e("strong",[t._v("receivedSMS [string]:")]),t._v(" This is the content of the incoming SMS.")]),t._v(" "),e("li",[e("strong",[t._v("errorNumber [integer]:")]),t._v(" The number of the error.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sendSMS:")]),t._v(" Sends the SMS message.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("newSMS:")]),t._v(" There is a new message.")]),t._v(" "),e("li",[e("strong",[t._v("error:")]),t._v(" An error occurred.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("serialPort [string]:")]),t._v(" The modem COM port. If this parameter is empty, the component uses the port of the first modem found.")]),t._v(" "),e("li",[t._v("**pin [string]"),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("*The PIN code for the SIM card. If the PIN is not needed this property should be empty.")]),t._v(" "),e("li",[e("strong",[t._v("smsCenterID [string]:")]),t._v(" SMS Center ID. If the Center ID is not needed this property should be empty.")]),t._v(" "),e("li",[e("strong",[t._v("defaultPhoneID [string]:")]),t._v(" This is a default phone number, which will be used for the send SMS actions.")])])])}),[],!1,null,null,null);e.default=n.exports},636:function(t,e,r){t.exports=r.p+"assets/img/gsmmodem.5519c224.jpg"}}]); \ No newline at end of file diff --git a/assets/js/15.4ebce68d.js b/assets/js/15.4ebce68d.js new file mode 100644 index 0000000000..782cb72691 --- /dev/null +++ b/assets/js/15.4ebce68d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{1e3:function(t,a,s){"use strict";s.r(a);var e=s(2),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"asterics-installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#asterics-installation"}},[t._v("#")]),t._v(" AsTeRICS Installation")]),t._v(" "),a("p",[t._v("If you are new to AsTeRICS, please read the "),a("a",{attrs:{href:"Overview"}},[t._v("Overview")]),t._v(" section first to know about important terms and programs.")]),t._v(" "),a("p",[t._v("The AsTeRICS provides installer for "),a("a",{attrs:{href:"#windows"}},[t._v("Windows")]),t._v(", "),a("a",{attrs:{href:"#linux"}},[t._v("Linux")]),t._v(" and "),a("a",{attrs:{href:"#mac-os-x"}},[t._v("Mac OSX")]),t._v(", but only on\nWindows the full AsTeRICS suite is supported. On the other platforms the installer\nonly contains the ARE.")]),t._v(" "),a("h2",{attrs:{id:"windows"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#windows"}},[t._v("#")]),t._v(" Windows")]),t._v(" "),a("p",[t._v("The installer for Windows ("),a("code",[t._v("Setup_AsTeRICS_x_y_z.exe")]),t._v(") contains the following programs:")]),t._v(" "),a("ul",[a("li",[t._v("ACS")]),t._v(" "),a("li",[t._v("WebACS")]),t._v(" "),a("li",[t._v("ARE")]),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/develop/at-solution/"}},[t._v("AsTeRICS Packaging Environment (APE)")])],1)]),t._v(" "),a("h3",{attrs:{id:"download"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download"}},[t._v("#")]),t._v(" Download")]),t._v(" "),a("p",[t._v("Please go to the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("download page"),a("OutboundLink")],1),t._v(" and download the installer.")]),t._v(" "),a("h3",{attrs:{id:"installation-steps"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps"}},[t._v("#")]),t._v(" Installation Steps")]),t._v(" "),a("ol",[a("li",[t._v("Start the setup file.")]),t._v(" "),a("li",[t._v("You should see the welcome window. It informs you which version of the software\nyou are installing. Click the button "),a("strong",[t._v("Next")]),t._v(".")])]),t._v(" "),a("p",[a("img",{attrs:{src:s(434),alt:"AsTeRICS Setup Wizard"}})]),t._v(" "),a("h4",{attrs:{id:"installation-path"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-path"}},[t._v("#")]),t._v(" Installation Path")]),t._v(" "),a("p",[a("img",{attrs:{src:s(435),alt:"Installation Path"}})]),t._v(" "),a("p",[t._v("In this dialogue window you can define the installation path that means you can\nchoose a folder, where Asterics should be installed. We suggest using the standard\ninstallation path. Then Click the button "),a("strong",[t._v("Next")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"select-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#select-components"}},[t._v("#")]),t._v(" Select Components")]),t._v(" "),a("p",[t._v("You can see the component selection window:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(436),alt:"Installation Java Runtime Environment"}})]),t._v(" "),a("p",[t._v("AsTeRICS needs the Java Runtime Environment ("),a("code",[t._v(">= Version 8")]),t._v("). If\nyou have already installed the Java Runtime Environment on your computer, please\ndeselect this option and install only AsTeRICS.")]),t._v(" "),a("p",[t._v("Then, click the button "),a("strong",[t._v("Next")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"start-menu-folder"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-menu-folder"}},[t._v("#")]),t._v(" Start Menu Folder")]),t._v(" "),a("p",[t._v("Define Start Menu folder entry\nIn the next dialogue window you can define the name of the start menu entry.You\ncan see the following window:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(437),alt:"Start Menu Entry"}})]),t._v(" "),a("p",[t._v("Then, click the button "),a("strong",[t._v("Next")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"installation-progress"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-progress"}},[t._v("#")]),t._v(" Installation Progress")]),t._v(" "),a("p",[t._v("In the next dialogue window you can see the progress of the installation. It can take a\nfew minutes until the process is finished:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(438),alt:"Installation Progress"}})]),t._v(" "),a("h4",{attrs:{id:"installation-finished"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-finished"}},[t._v("#")]),t._v(" Installation Finished")]),t._v(" "),a("p",[t._v("As soon as the installation is finisehd, you can see the following window:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(439),alt:"Installation Finish"}})]),t._v(" "),a("p",[t._v("Finally, click the button "),a("strong",[t._v("Finish")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"desktop-short-cuts"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#desktop-short-cuts"}},[t._v("#")]),t._v(" Desktop Short Cuts")]),t._v(" "),a("p",[t._v("On your desktop you will find the following links (short cuts):")]),t._v(" "),a("p",[a("img",{attrs:{src:s(440),alt:"ACS Startmenu Entry"}}),t._v(" "),a("img",{attrs:{src:s(441),alt:"ARE Startmenu Entry"}})]),t._v(" "),a("p",[t._v("These short cuts can be used to start ACS and ARE. Alternatively, you can start these\nprograms also from the Windows start menu, where additional liks to the Debug\nversion of the ARE (which displays debugging information in a console window) and\nthe AsTeRICS unistaller have been added:")]),t._v(" "),a("h3",{attrs:{id:"start-menu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-menu"}},[t._v("#")]),t._v(" Start Menu")]),t._v(" "),a("p",[t._v("Under Windows-start "),a("strong",[t._v("All Programs")]),t._v(" you will find the start folder "),a("strong",[t._v("AsTeRICS")]),t._v(" and\nthe start-files.")]),t._v(" "),a("p",[a("img",{attrs:{src:s(442),alt:"AsTeRICS Startmenu Folder"}})]),t._v(" "),a("h2",{attrs:{id:"mac-os-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mac-os-x"}},[t._v("#")]),t._v(" Mac OS X")]),t._v(" "),a("p",[t._v("The installer for Mac OS X ("),a("code",[t._v("asterics-are-javaembedded-x.y.dmg")]),t._v(") contains the following programs:")]),t._v(" "),a("ul",[a("li",[t._v("WebACS")]),t._v(" "),a("li",[t._v("ARE")])]),t._v(" "),a("p",[t._v("It was tested on Mac OS X 10.9.1 (Mavericks) and has Java embedded.")]),t._v(" "),a("h3",{attrs:{id:"download-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-2"}},[t._v("#")]),t._v(" Download")]),t._v(" "),a("p",[t._v("Please go to the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("download page"),a("OutboundLink")],1),t._v(" and download the installer.")]),t._v(" "),a("h3",{attrs:{id:"installation-steps-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-2"}},[t._v("#")]),t._v(" Installation Steps")]),t._v(" "),a("ol",[a("li",[t._v("Press the "),a("strong",[t._v("Control")]),t._v(" Key (otherwise you will get an error message).")]),t._v(" "),a("li",[t._v("Double-click onto the "),a("code",[t._v(".dmg")]),t._v(" file and follow the instructions.")])]),t._v(" "),a("h2",{attrs:{id:"linux"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#linux"}},[t._v("#")]),t._v(" Linux")]),t._v(" "),a("p",[t._v("The installer for Linux ("),a("code",[t._v("asterics-are-x.y.deb")]),t._v(") contains the following programs:")]),t._v(" "),a("ul",[a("li",[t._v("WebACS")]),t._v(" "),a("li",[t._v("ARE")])]),t._v(" "),a("p",[t._v("It is compatible with Ubuntu, Debian and ARM/Raspberry Pi.\nThe installer was tested on Debian 16.04 LTS and Raspberry Pi 3 with Raspbian Jessie.")]),t._v(" "),a("h3",{attrs:{id:"download-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-3"}},[t._v("#")]),t._v(" Download")]),t._v(" "),a("p",[t._v("Please go to the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("download page"),a("OutboundLink")],1),t._v(" and download the installer.")]),t._v(" "),a("h3",{attrs:{id:"installation-steps-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-3"}},[t._v("#")]),t._v(" Installation Steps")]),t._v(" "),a("h4",{attrs:{id:"install-java"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-java"}},[t._v("#")]),t._v(" Install Java")]),t._v(" "),a("p",[t._v("You need a "),a("strong",[t._v("Java Runtime Standard Edition 8")]),t._v(".")]),t._v(" "),a("p",[t._v("Choose one of the installation methods below:")]),t._v(" "),a("h5",{attrs:{id:"zulu-java"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#zulu-java"}},[t._v("#")]),t._v(" Zulu Java")]),t._v(" "),a("ol",[a("li",[t._v("Download the "),a("a",{attrs:{href:"https://www.azul.com/downloads/zulu-community/?version=java-8-lts&os=linux&package=jdk",target:"_blank",rel:"noopener noreferrer"}},[t._v("Zulu installer"),a("OutboundLink")],1),t._v(" for your your platform.")]),t._v(" "),a("li",[t._v("Install it")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" $"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("download_dir"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("/"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("zulu_package"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(".deb\n")])])]),a("p",[t._v("You can also add an "),a("a",{attrs:{href:"https://docs.azul.com/zulu/zuludocs/ZuluUserGuide/PrepareZuluPlatform/AttachAPTRepositoryUbuntuOrDebianSys.htm?tocpath=Zulu%20Installation%20Guide%7CPrepare%20the%20Zulu%20Installation%20Platform%7CAttach%20Azul%20Package%20Repositories%7C_____2",target:"_blank",rel:"noopener noreferrer"}},[t._v("APT repository"),a("OutboundLink")],1),t._v(" for it.")]),t._v(" "),a("h5",{attrs:{id:"openjdk"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#openjdk"}},[t._v("#")]),t._v(" OpenJDK")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openjdk-8-jre\n")])])]),a("h5",{attrs:{id:"oracle-java"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oracle-java"}},[t._v("#")]),t._v(" Oracle Java")]),t._v(" "),a("p",[t._v("Download "),a("a",{attrs:{href:"https://www.oracle.com/java/technologies/javase-jre8-downloads.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Oracle Java 8"),a("OutboundLink")],1),t._v(" and follow the instructions.")]),t._v(" "),a("h4",{attrs:{id:"install-asterics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-asterics"}},[t._v("#")]),t._v(" Install AsTeRICS")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libhidapi-libusb0 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" asterics-are-*.deb\n")])])]),a("p",[t._v("If you get an error message, that the dependencies had not been installed before,")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("dpkg: dependency problems prevent configuration of asterics-are:\n asterics-are depends on libhidapi-libusb0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" however:\n Package libhidapi-libusb0 is not installed.\n")])])]),a("p",[t._v("execute the following command to install the dependencies:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" --fix-broken "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports},434:function(t,a,s){t.exports=s.p+"assets/img/quickstart01.183b9214.png"},435:function(t,a,s){t.exports=s.p+"assets/img/quickstart02.3686057d.png"},436:function(t,a,s){t.exports=s.p+"assets/img/quickstart03.62d82759.png"},437:function(t,a,s){t.exports=s.p+"assets/img/quickstart04.cb41d5a3.png"},438:function(t,a,s){t.exports=s.p+"assets/img/quickstart05.80fdad04.png"},439:function(t,a,s){t.exports=s.p+"assets/img/quickstart06.3ceb45c3.png"},440:function(t,a,s){t.exports=s.p+"assets/img/quickstart07.4c3bb97f.png"},441:function(t,a){t.exports="data:image/png;base64,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"},442:function(t,a,s){t.exports=s.p+"assets/img/quickstart09.12c7bc90.png"}}]); \ No newline at end of file diff --git a/assets/js/15.f870262e.js b/assets/js/15.f870262e.js deleted file mode 100644 index 58596539d2..0000000000 --- a/assets/js/15.f870262e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{430:function(t,a,s){t.exports=s.p+"assets/img/quickstart01.183b9214.png"},431:function(t,a,s){t.exports=s.p+"assets/img/quickstart02.3686057d.png"},432:function(t,a,s){t.exports=s.p+"assets/img/quickstart03.62d82759.png"},433:function(t,a,s){t.exports=s.p+"assets/img/quickstart04.cb41d5a3.png"},434:function(t,a,s){t.exports=s.p+"assets/img/quickstart05.80fdad04.png"},435:function(t,a,s){t.exports=s.p+"assets/img/quickstart06.3ceb45c3.png"},436:function(t,a,s){t.exports=s.p+"assets/img/quickstart07.4c3bb97f.png"},437:function(t,a){t.exports="data:image/png;base64,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"},438:function(t,a,s){t.exports=s.p+"assets/img/quickstart09.12c7bc90.png"},995:function(t,a,s){"use strict";s.r(a);var e=s(2),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"asterics-installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#asterics-installation"}},[t._v("#")]),t._v(" AsTeRICS Installation")]),t._v(" "),a("p",[t._v("If you are new to AsTeRICS, please read the "),a("a",{attrs:{href:"Overview"}},[t._v("Overview")]),t._v(" section first to know about important terms and programs.")]),t._v(" "),a("p",[t._v("The AsTeRICS provides installer for "),a("a",{attrs:{href:"#windows"}},[t._v("Windows")]),t._v(", "),a("a",{attrs:{href:"#linux"}},[t._v("Linux")]),t._v(" and "),a("a",{attrs:{href:"#mac-os-x"}},[t._v("Mac OSX")]),t._v(", but only on\nWindows the full AsTeRICS suite is supported. On the other platforms the installer\nonly contains the ARE.")]),t._v(" "),a("h2",{attrs:{id:"windows"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#windows"}},[t._v("#")]),t._v(" Windows")]),t._v(" "),a("p",[t._v("The installer for Windows ("),a("code",[t._v("Setup_AsTeRICS_x_y_z.exe")]),t._v(") contains the following programs:")]),t._v(" "),a("ul",[a("li",[t._v("ACS")]),t._v(" "),a("li",[t._v("WebACS")]),t._v(" "),a("li",[t._v("ARE")]),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/develop/at-solution/"}},[t._v("AsTeRICS Packaging Environment (APE)")])],1)]),t._v(" "),a("h3",{attrs:{id:"download"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download"}},[t._v("#")]),t._v(" Download")]),t._v(" "),a("p",[t._v("Please go to the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("download page"),a("OutboundLink")],1),t._v(" and download the installer.")]),t._v(" "),a("h3",{attrs:{id:"installation-steps"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps"}},[t._v("#")]),t._v(" Installation Steps")]),t._v(" "),a("ol",[a("li",[t._v("Start the setup file.")]),t._v(" "),a("li",[t._v("You should see the welcome window. It informs you which version of the software\nyou are installing. Click the button "),a("strong",[t._v("Next")]),t._v(".")])]),t._v(" "),a("p",[a("img",{attrs:{src:s(430),alt:"AsTeRICS Setup Wizard"}})]),t._v(" "),a("h4",{attrs:{id:"installation-path"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-path"}},[t._v("#")]),t._v(" Installation Path")]),t._v(" "),a("p",[a("img",{attrs:{src:s(431),alt:"Installation Path"}})]),t._v(" "),a("p",[t._v("In this dialogue window you can define the installation path that means you can\nchoose a folder, where Asterics should be installed. We suggest using the standard\ninstallation path. Then Click the button "),a("strong",[t._v("Next")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"select-components"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#select-components"}},[t._v("#")]),t._v(" Select Components")]),t._v(" "),a("p",[t._v("You can see the component selection window:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(432),alt:"Installation Java Runtime Environment"}})]),t._v(" "),a("p",[t._v("AsTeRICS needs the Java Runtime Environment ("),a("code",[t._v(">= Version 8")]),t._v("). If\nyou have already installed the Java Runtime Environment on your computer, please\ndeselect this option and install only AsTeRICS.")]),t._v(" "),a("p",[t._v("Then, click the button "),a("strong",[t._v("Next")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"start-menu-folder"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-menu-folder"}},[t._v("#")]),t._v(" Start Menu Folder")]),t._v(" "),a("p",[t._v("Define Start Menu folder entry\nIn the next dialogue window you can define the name of the start menu entry.You\ncan see the following window:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(433),alt:"Start Menu Entry"}})]),t._v(" "),a("p",[t._v("Then, click the button "),a("strong",[t._v("Next")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"installation-progress"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-progress"}},[t._v("#")]),t._v(" Installation Progress")]),t._v(" "),a("p",[t._v("In the next dialogue window you can see the progress of the installation. It can take a\nfew minutes until the process is finished:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(434),alt:"Installation Progress"}})]),t._v(" "),a("h4",{attrs:{id:"installation-finished"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-finished"}},[t._v("#")]),t._v(" Installation Finished")]),t._v(" "),a("p",[t._v("As soon as the installation is finisehd, you can see the following window:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(435),alt:"Installation Finish"}})]),t._v(" "),a("p",[t._v("Finally, click the button "),a("strong",[t._v("Finish")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"desktop-short-cuts"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#desktop-short-cuts"}},[t._v("#")]),t._v(" Desktop Short Cuts")]),t._v(" "),a("p",[t._v("On your desktop you will find the following links (short cuts):")]),t._v(" "),a("p",[a("img",{attrs:{src:s(436),alt:"ACS Startmenu Entry"}}),t._v(" "),a("img",{attrs:{src:s(437),alt:"ARE Startmenu Entry"}})]),t._v(" "),a("p",[t._v("These short cuts can be used to start ACS and ARE. Alternatively, you can start these\nprograms also from the Windows start menu, where additional liks to the Debug\nversion of the ARE (which displays debugging information in a console window) and\nthe AsTeRICS unistaller have been added:")]),t._v(" "),a("h3",{attrs:{id:"start-menu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-menu"}},[t._v("#")]),t._v(" Start Menu")]),t._v(" "),a("p",[t._v("Under Windows-start "),a("strong",[t._v("All Programs")]),t._v(" you will find the start folder "),a("strong",[t._v("AsTeRICS")]),t._v(" and\nthe start-files.")]),t._v(" "),a("p",[a("img",{attrs:{src:s(438),alt:"AsTeRICS Startmenu Folder"}})]),t._v(" "),a("h2",{attrs:{id:"mac-os-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mac-os-x"}},[t._v("#")]),t._v(" Mac OS X")]),t._v(" "),a("p",[t._v("The installer for Mac OS X ("),a("code",[t._v("asterics-are-javaembedded-x.y.dmg")]),t._v(") contains the following programs:")]),t._v(" "),a("ul",[a("li",[t._v("WebACS")]),t._v(" "),a("li",[t._v("ARE")])]),t._v(" "),a("p",[t._v("It was tested on Mac OS X 10.9.1 (Mavericks) and has Java embedded.")]),t._v(" "),a("h3",{attrs:{id:"download-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-2"}},[t._v("#")]),t._v(" Download")]),t._v(" "),a("p",[t._v("Please go to the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("download page"),a("OutboundLink")],1),t._v(" and download the installer.")]),t._v(" "),a("h3",{attrs:{id:"installation-steps-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-2"}},[t._v("#")]),t._v(" Installation Steps")]),t._v(" "),a("ol",[a("li",[t._v("Press the "),a("strong",[t._v("Control")]),t._v(" Key (otherwise you will get an error message).")]),t._v(" "),a("li",[t._v("Double-click onto the "),a("code",[t._v(".dmg")]),t._v(" file and follow the instructions.")])]),t._v(" "),a("h2",{attrs:{id:"linux"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#linux"}},[t._v("#")]),t._v(" Linux")]),t._v(" "),a("p",[t._v("The installer for Linux ("),a("code",[t._v("asterics-are-x.y.deb")]),t._v(") contains the following programs:")]),t._v(" "),a("ul",[a("li",[t._v("WebACS")]),t._v(" "),a("li",[t._v("ARE")])]),t._v(" "),a("p",[t._v("It is compatible with Ubuntu, Debian and ARM/Raspberry Pi.\nThe installer was tested on Debian 16.04 LTS and Raspberry Pi 3 with Raspbian Jessie.")]),t._v(" "),a("h3",{attrs:{id:"download-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-3"}},[t._v("#")]),t._v(" Download")]),t._v(" "),a("p",[t._v("Please go to the "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("download page"),a("OutboundLink")],1),t._v(" and download the installer.")]),t._v(" "),a("h3",{attrs:{id:"installation-steps-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-3"}},[t._v("#")]),t._v(" Installation Steps")]),t._v(" "),a("h4",{attrs:{id:"install-java"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-java"}},[t._v("#")]),t._v(" Install Java")]),t._v(" "),a("p",[t._v("You need a "),a("strong",[t._v("Java Runtime Standard Edition 8")]),t._v(".")]),t._v(" "),a("p",[t._v("Choose one of the installation methods below:")]),t._v(" "),a("h5",{attrs:{id:"zulu-java"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#zulu-java"}},[t._v("#")]),t._v(" Zulu Java")]),t._v(" "),a("ol",[a("li",[t._v("Download the "),a("a",{attrs:{href:"https://www.azul.com/downloads/zulu-community/?version=java-8-lts&os=linux&package=jdk",target:"_blank",rel:"noopener noreferrer"}},[t._v("Zulu installer"),a("OutboundLink")],1),t._v(" for your your platform.")]),t._v(" "),a("li",[t._v("Install it")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" $"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("download_dir"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("/"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("zulu_package"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(".deb\n")])])]),a("p",[t._v("You can also add an "),a("a",{attrs:{href:"https://docs.azul.com/zulu/zuludocs/ZuluUserGuide/PrepareZuluPlatform/AttachAPTRepositoryUbuntuOrDebianSys.htm?tocpath=Zulu%20Installation%20Guide%7CPrepare%20the%20Zulu%20Installation%20Platform%7CAttach%20Azul%20Package%20Repositories%7C_____2",target:"_blank",rel:"noopener noreferrer"}},[t._v("APT repository"),a("OutboundLink")],1),t._v(" for it.")]),t._v(" "),a("h5",{attrs:{id:"openjdk"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#openjdk"}},[t._v("#")]),t._v(" OpenJDK")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openjdk-8-jre\n")])])]),a("h5",{attrs:{id:"oracle-java"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oracle-java"}},[t._v("#")]),t._v(" Oracle Java")]),t._v(" "),a("p",[t._v("Download "),a("a",{attrs:{href:"https://www.oracle.com/java/technologies/javase-jre8-downloads.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Oracle Java 8"),a("OutboundLink")],1),t._v(" and follow the instructions.")]),t._v(" "),a("h4",{attrs:{id:"install-asterics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-asterics"}},[t._v("#")]),t._v(" Install AsTeRICS")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libhidapi-libusb0 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" asterics-are-*.deb\n")])])]),a("p",[t._v("If you get an error message, that the dependencies had not been installed before,")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("dpkg: dependency problems prevent configuration of asterics-are:\n asterics-are depends on libhidapi-libusb0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" however:\n Package libhidapi-libusb0 is not installed.\n")])])]),a("p",[t._v("execute the following command to install the dependencies:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" --fix-broken "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/149.0a2710b8.js b/assets/js/150.279db484.js similarity index 92% rename from assets/js/149.0a2710b8.js rename to assets/js/150.279db484.js index c3f86e1835..b4fc824ee3 100644 --- a/assets/js/149.0a2710b8.js +++ b/assets/js/150.279db484.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[149],{1085:function(e,t,r){"use strict";r.r(t);var i=r(2),a=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"image-box"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#image-box"}},[e._v("#")]),e._v(" Image Box")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-graphical-user-interface"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-graphical-user-interface"}},[e._v("#")]),e._v(" Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("The Image Box is a GUI component which displays images loaded from image files.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(638),alt:"Screenshot: ImgeBox plugin",title:"Screenshot: ImageBox plugin"}})]),e._v(" "),t("p",[e._v("ImageBox plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [string]:")]),e._v(" The path of the image file, which will be displayed.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("clear:")]),e._v(" Removes the image from the component.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("clicked:")]),e._v(" The event is triggered when the user clicks on the component.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("caption [string]:")]),e._v(" Caption of the component.")]),e._v(" "),t("li",[t("strong",[e._v("default [string]:")]),e._v(" The path of the image file, which is displayed after start.")]),e._v(" "),t("li",[t("strong",[e._v("backgroundColor [integer]:")]),e._v(" Defines background color.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=a.exports},638:function(e,t,r){e.exports=r.p+"assets/img/imagebox.29b0dbbb.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[150],{1088:function(e,t,r){"use strict";r.r(t);var i=r(2),a=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"image-box"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#image-box"}},[e._v("#")]),e._v(" Image Box")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-graphical-user-interface"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-graphical-user-interface"}},[e._v("#")]),e._v(" Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("The Image Box is a GUI component which displays images loaded from image files.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(639),alt:"Screenshot: ImgeBox plugin",title:"Screenshot: ImageBox plugin"}})]),e._v(" "),t("p",[e._v("ImageBox plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [string]:")]),e._v(" The path of the image file, which will be displayed.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("clear:")]),e._v(" Removes the image from the component.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("clicked:")]),e._v(" The event is triggered when the user clicks on the component.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("caption [string]:")]),e._v(" Caption of the component.")]),e._v(" "),t("li",[t("strong",[e._v("default [string]:")]),e._v(" The path of the image file, which is displayed after start.")]),e._v(" "),t("li",[t("strong",[e._v("backgroundColor [integer]:")]),e._v(" Defines background color.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=a.exports},639:function(e,t,r){e.exports=r.p+"assets/img/imagebox.29b0dbbb.jpg"}}]); \ No newline at end of file diff --git a/assets/js/150.7303463a.js b/assets/js/151.8f52d8cb.js similarity index 96% rename from assets/js/150.7303463a.js rename to assets/js/151.8f52d8cb.js index f06fd178c2..28d599e149 100644 --- a/assets/js/150.7303463a.js +++ b/assets/js/151.8f52d8cb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[150],{1084:function(e,t,n){"use strict";n.r(t);var s=n(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"keyboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard"}},[e._v("#")]),e._v(" Keyboard")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-input-device-emulation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-input-device-emulation"}},[e._v("#")]),e._v(" Component Type: Actuator (Subcategory: Input Device Emulation)")]),e._v(" "),t("p",[e._v("The Keyboard component generates local keyboard input on the computer that the ARE is running on (per software emulation). The component supports key press/hold/release actions and sending key sequences and special keycodes. special or non-printable characters can be sent using curly braces and key identifier strings, e.g. {UP} {ENTER} {ALT} {DELETE} etc. - see description of the property keyCodeString. Multiple instances of the Keyboard component can be used to provide different key actions.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(637),alt:"Screenshot: Keyboard plugin",title:"Screenshot: Keyboard plugin"}})]),e._v(" "),t("p",[e._v("Keyboard plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("No special hardware or software required.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keyCodes [string]:")]),e._v(" An incoming string which consists of alphanumeric characters and special key codes. The keys are sequentially generated as local keystrokes as the string is received, and as the sendKeys and other input related events of the component are being triggered.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendKeys:")]),e._v(" An incoming event at this port generates all keycodes of the keycode string (sequentially).")]),e._v(" "),t("li",[t("strong",[e._v("pressKey:")]),e._v(" An incoming event at this port pressed (and releases) the key (first key + modifiers if there are multiple keys).")]),e._v(" "),t("li",[t("strong",[e._v("holdKey:")]),e._v(" An incoming event at this port holds the key (first key + modifiers if there are multiple keys). The key is pressed but not released. The holdKey listener can be used together with the releaseKey feature to create long key presses of single keys (e.g. of the cursor keys) to allow game control etc.")]),e._v(" "),t("li",[t("strong",[e._v("releaseKey:")]),e._v(" An incoming event at this port releases the key which was pressed using the hold event.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keyCodeString [string]:")]),e._v(" A string containing keys and keycodes. Please note that this string will be replaced by an incoming string at the keycodes input port. The keyCodeString can contain alphanumeric characters and special characters. Special characters are written in parentheses, for example {SHIFT}, {CTRL}, {ALT}, {BACKSPACE}, {ENTER} etc. Modifier keys like {SHIFT} or {ALT} are combined as they appear consecutively in the keystring, and are generated with the next printable character. For example, the keystrings “{SHIFT}” or “{CTRL}{ALT}{DEL}” are sent as single key values. For a description of the currently supported special key codes see the table below.")]),e._v(" "),t("li",[t("strong",[e._v("inputMethod [integer]:")]),e._v(" Declares whether to use sending window messages (Windows), system-wide SendInput API function (Windows) or JNativehook (cross-platform) as key injection method. (Please note that there are still problems with locales and special key translation…)")]),e._v(" "),t("li",[t("strong",[e._v("waitTime [integer]:")]),e._v(" Defines a number of milliseconds for a pause which shall occur when {WAIT} appears in the keycode string.")])]),e._v(" "),t("h2",{attrs:{id:"list-of-supported-special-key-code-identifiers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-of-supported-special-key-code-identifiers"}},[e._v("#")]),e._v(" List of supported special key code identifiers")]),e._v(" "),t("p",[e._v("The key codes must be surrounded with braces.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("{SHIFT}\n{CTRL}\n{ALT}, {LEFTALT}, {MENU}\n{ALTGR}, {RIGHTALT}\n{WINDOWS}\n{LWIN}\n{RWIN}\n{UP}, {UPARROW}\n{DOWN}, {DOWNARROW}\n{LEFT}, {LEFTARROW}\n{RIGHT}, {RIGHTARROW}\n{RETURN}\n{ENTER}\n{ESCAPE}\n{BACKSPACE}\n{TAB}\n{PRINT}, {PRINTSCREEN}\n{PAUSE}\n{INSERT}, {INS}\n{HOME}, {POS1}\n{END}\n{DEL}\n{DELETE}\n{PAGEUP}\n{PAGEDOWN}\n{F1}\n{F2}\n{F3}\n{F4}\n{F5}\n{F6}\n{F7}\n{F8}\n{F9}\n{F10}\n{F11}\n{F12}\n{WAIT}\n")])])])])}),[],!1,null,null,null);t.default=r.exports},637:function(e,t,n){e.exports=n.p+"assets/img/keyboard.7420e4ca.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[151],{1090:function(e,t,n){"use strict";n.r(t);var s=n(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"keyboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard"}},[e._v("#")]),e._v(" Keyboard")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-input-device-emulation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-input-device-emulation"}},[e._v("#")]),e._v(" Component Type: Actuator (Subcategory: Input Device Emulation)")]),e._v(" "),t("p",[e._v("The Keyboard component generates local keyboard input on the computer that the ARE is running on (per software emulation). The component supports key press/hold/release actions and sending key sequences and special keycodes. special or non-printable characters can be sent using curly braces and key identifier strings, e.g. {UP} {ENTER} {ALT} {DELETE} etc. - see description of the property keyCodeString. Multiple instances of the Keyboard component can be used to provide different key actions.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(641),alt:"Screenshot: Keyboard plugin",title:"Screenshot: Keyboard plugin"}})]),e._v(" "),t("p",[e._v("Keyboard plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("No special hardware or software required.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keyCodes [string]:")]),e._v(" An incoming string which consists of alphanumeric characters and special key codes. The keys are sequentially generated as local keystrokes as the string is received, and as the sendKeys and other input related events of the component are being triggered.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendKeys:")]),e._v(" An incoming event at this port generates all keycodes of the keycode string (sequentially).")]),e._v(" "),t("li",[t("strong",[e._v("pressKey:")]),e._v(" An incoming event at this port pressed (and releases) the key (first key + modifiers if there are multiple keys).")]),e._v(" "),t("li",[t("strong",[e._v("holdKey:")]),e._v(" An incoming event at this port holds the key (first key + modifiers if there are multiple keys). The key is pressed but not released. The holdKey listener can be used together with the releaseKey feature to create long key presses of single keys (e.g. of the cursor keys) to allow game control etc.")]),e._v(" "),t("li",[t("strong",[e._v("releaseKey:")]),e._v(" An incoming event at this port releases the key which was pressed using the hold event.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keyCodeString [string]:")]),e._v(" A string containing keys and keycodes. Please note that this string will be replaced by an incoming string at the keycodes input port. The keyCodeString can contain alphanumeric characters and special characters. Special characters are written in parentheses, for example {SHIFT}, {CTRL}, {ALT}, {BACKSPACE}, {ENTER} etc. Modifier keys like {SHIFT} or {ALT} are combined as they appear consecutively in the keystring, and are generated with the next printable character. For example, the keystrings “{SHIFT}” or “{CTRL}{ALT}{DEL}” are sent as single key values. For a description of the currently supported special key codes see the table below.")]),e._v(" "),t("li",[t("strong",[e._v("inputMethod [integer]:")]),e._v(" Declares whether to use sending window messages (Windows), system-wide SendInput API function (Windows) or JNativehook (cross-platform) as key injection method. (Please note that there are still problems with locales and special key translation…)")]),e._v(" "),t("li",[t("strong",[e._v("waitTime [integer]:")]),e._v(" Defines a number of milliseconds for a pause which shall occur when {WAIT} appears in the keycode string.")])]),e._v(" "),t("h2",{attrs:{id:"list-of-supported-special-key-code-identifiers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-of-supported-special-key-code-identifiers"}},[e._v("#")]),e._v(" List of supported special key code identifiers")]),e._v(" "),t("p",[e._v("The key codes must be surrounded with braces.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("{SHIFT}\n{CTRL}\n{ALT}, {LEFTALT}, {MENU}\n{ALTGR}, {RIGHTALT}\n{WINDOWS}\n{LWIN}\n{RWIN}\n{UP}, {UPARROW}\n{DOWN}, {DOWNARROW}\n{LEFT}, {LEFTARROW}\n{RIGHT}, {RIGHTARROW}\n{RETURN}\n{ENTER}\n{ESCAPE}\n{BACKSPACE}\n{TAB}\n{PRINT}, {PRINTSCREEN}\n{PAUSE}\n{INSERT}, {INS}\n{HOME}, {POS1}\n{END}\n{DEL}\n{DELETE}\n{PAGEUP}\n{PAGEDOWN}\n{F1}\n{F2}\n{F3}\n{F4}\n{F5}\n{F6}\n{F7}\n{F8}\n{F9}\n{F10}\n{F11}\n{F12}\n{WAIT}\n")])])])])}),[],!1,null,null,null);t.default=r.exports},641:function(e,t,n){e.exports=n.p+"assets/img/keyboard.7420e4ca.jpg"}}]); \ No newline at end of file diff --git a/assets/js/151.15cbfada.js b/assets/js/152.96d6bc22.js similarity index 98% rename from assets/js/151.15cbfada.js rename to assets/js/152.96d6bc22.js index dea39ef21e..866de67900 100644 --- a/assets/js/151.15cbfada.js +++ b/assets/js/152.96d6bc22.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[151],{1083:function(e,t,r){"use strict";r.r(t);var i=r(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"knx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#knx"}},[e._v("#")]),e._v(" KNX")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-home-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-home-control"}},[e._v("#")]),e._v(" Component Type: actuator (Subcategory: Home Control)")]),e._v(" "),t("p",[e._v("The KNX plugin enables the ARE to interface a KNX installation. This plugin utilizes the calimero java library ("),t("a",{attrs:{href:"http://calimero.sourceforge.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://calimero.sourceforge.net/"),t("OutboundLink")],1),e._v(") for the KNX implementation, it is ©opyrighted 2006-2008 by W. Kastner and released under the GNU General Public License (FSF v2 or later). The KNX plugin provides an interface to the KNX home automation bus via a KNXnet/IP router. KNX actuators with specific group addresses can be switched on or off, or a specific value can be sent to the KNX actuators. This allows control of lightning, heat and ventilation, blend control or other utilization of other home automation facilities via the AsTeRICS platform.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(636),alt:"Screenshot: KNX plugin",title:"Screenshot: KNX plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A KNX infrastructure")]),e._v(" "),t("li",[e._v("A little knowledge on KNX")])]),e._v(" "),t("h2",{attrs:{id:"functional-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-description"}},[e._v("#")]),e._v(" Functional Description")]),e._v(" "),t("p",[e._v("By starting the model, the KNX plugin establishes a connection to the KNX gateway specified by the plugin properties. Currently, this plugin supports only IP connection (due to the limitation of the underlaying calimero library, USB interfaces will be supported with Java8). The plugin has three different possibilities to interface KNX datapoints:")]),e._v(" "),t("ul",[t("li",[e._v("Transmitting: Input ports (slider): Intended for dimming actuators")]),e._v(" "),t("li",[e._v("Transmitting: Event Listeners: Used to send a defined value (with a given type) to a KNX group address.")]),e._v(" "),t("li",[e._v("Transmitting: Action string: The most flexible way to send something to KNX. The command structure is: "),t("em",[e._v("@KNX: group_address,datapoint_type,value")]),e._v(". It is possible to use either a space, a comma or a number sign as separation tokens. The datapoint type is described later.")]),e._v(" "),t("li",[e._v("Receiving: Event Triggers: An event trigger can be used to listen to a defined KNX group address. If there is ANYTHING happening on this dedicated group address, an event will be raised.")]),e._v(" "),t("li",[e._v("Receiving: Output ports: The received value of a KNX group address will be interpreted by the given data point type, parsed to a string and sent out to the output ports")])]),e._v(" "),t("h2",{attrs:{id:"knx-datapoint-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#knx-datapoint-types"}},[e._v("#")]),e._v(" KNX datapoint types")]),e._v(" "),t("p",[e._v("KNX itself doesn’t provide any possibilty to get information on how to interpret received data. This is the point where you need the datapoint types. There are a few main types and some sub types. For example: "),t("em",[e._v("1.001")]),e._v(" is the datapoint type for a simple switch actuator/sensor. The input values are varying on the different datapoint types. For the switch example, the valid values are "),t("em",[e._v("on")]),e._v(" and "),t("em",[e._v("off")]),e._v(". The full list of all datatypes is provided by the ARE. If you want to receive a full list, you have to place the plugin in your ACS model, connect to the ARE and upload the model (even without any functionality). Afterwards, the full list of all currently supported datapoint types is available. Every list entry contains following information:")]),e._v(" "),t("ul",[t("li",[e._v("Description")]),e._v(" "),t("li",[e._v("[Minimum,Maximum value]")]),e._v(" "),t("li",[e._v("(Datapoint ID)")])]),e._v(" "),t("p",[e._v("The example of the light switch:"),t("br"),e._v(" "),t("em",[e._v("Switch[off,on] (1.001)")]),e._v(" The literal name for this datapoint type is “Switch” and its ID is 1.001. Because this is a boolean value, off and on are the only valid values. For float values, these given values are representing the minimum and the maximum value.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("actionString [string]:")]),e._v(' This port receives string commands for the KNX component. The commands have to be in the format “@KNX: group_address,datapoint_type,value”. The delimiters ‘,’, ‘#’ and ’ ’ are allowed. An example for a valid command is"@KNX:1/1/1,1.001,on". As a valid command is received by the input port, the value is sent to the KNX group address. The group addresses comply to the setup of the KNX network which can be configured with the ETS software.')]),e._v(" "),t("li",[t("strong",[e._v("slider[1-6] [double]:")]),e._v(" Input port for a double value which is converted to a given datapoint (Property: DPTSlider[1-6]) and sent to the given KNX group address (Property: groupAddressSlider[1-6]")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("data [1-6] [string]:")]),e._v(" These output ports are sending received data from the group addresses (Property: groupAddressOutput[1-6]). The data interpretation is controlled by the DPT (datapoint type, property: DPTOutput[1-6])")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("localIP [string]:")]),e._v(" The local IP address of the interface which can reach the KNXnetIP.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("KNXNetIP [string]:")]),e._v(" The destination IP address of the KNX gateway.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("NAT [boolean]:")]),e._v(" Enable NAT")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddress[1-6] [string]:")]),e._v(" (Event Listener) Specifies KNX group addresses for the [n] Event Listener e.g. “1/1/1”.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("dataValue[1-6] [string]:")]),e._v(" (Event Listener) Date value, which should be sent (triggered by the input event). The possible values are determined by the used DPT property (see the chapter on datapoint types)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("DPTEvent[1-6] [string/dropdown]:")]),e._v(" (Event Listener) Specifies the DPT (datapoint type) of the dataValue[1-6] which is sent to the KNX group address, triggered by the input event.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddressSlider[1-6] [string]:")]),e._v(" (Input port) Specifies KNX group addresses for the Slider[n].")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("DPTSlider[1-6] [string/dropdown]:")]),e._v(" (Input port) Determines the datapoint type corresponding to the sliders [1-6].")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddressTrigger[1-6] [string]:")]),e._v(" (Event Trigger) Specifies KNX group addresses for the Event Trigger [n]. The event is triggered if ANY action is happening on the given group address. If you need additional data processing, please use the output ports and process the received data values.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddressOutput[1-6] [string]:")]),e._v(" (Output port) Specifies the KNX group adresses, which are sent to the output ports. If there is anything happening on the given group adresses, the corresponding data is sent to the output ports.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("DPTOutput[1-6] [string/dropdown]:")]),e._v(" (Output port) Determines the datapoint type for the output port. The received data interpretation is defined by the DPTOutput property.")])])]),e._v(" "),t("h2",{attrs:{id:"event-listener"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener"}},[e._v("#")]),e._v(" Event Listener")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("send[1-6]:")]),e._v(" Each time an event is triggered, the corresponding KNX command which is specified in the plugin properties (groupAddress[1-6],dataValue[1-6],DPTEvent[1-6]), is issued.")]),e._v(" "),t("li",[t("strong",[e._v("read[1-6]:")]),e._v(" Trigger a read command on the output port. The settings for the group address and the DPT are the same as for the output ports (groupAddressOutput[1-6], DPTOutput[1-6]).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger"}},[e._v("#")]),e._v(" Event Trigger")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event_out_[1-6]:")]),e._v(" When there is any activity on the given KNX group address, set by the properties (groupAddressTrigger[1-6]) an event is raised by this plugin.")])])])}),[],!1,null,null,null);t.default=s.exports},636:function(e,t,r){e.exports=r.p+"assets/img/knx.98c3039f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{1089:function(e,t,r){"use strict";r.r(t);var i=r(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"knx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#knx"}},[e._v("#")]),e._v(" KNX")]),e._v(" "),t("h2",{attrs:{id:"component-type-actuator-subcategory-home-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-home-control"}},[e._v("#")]),e._v(" Component Type: actuator (Subcategory: Home Control)")]),e._v(" "),t("p",[e._v("The KNX plugin enables the ARE to interface a KNX installation. This plugin utilizes the calimero java library ("),t("a",{attrs:{href:"http://calimero.sourceforge.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://calimero.sourceforge.net/"),t("OutboundLink")],1),e._v(") for the KNX implementation, it is ©opyrighted 2006-2008 by W. Kastner and released under the GNU General Public License (FSF v2 or later). The KNX plugin provides an interface to the KNX home automation bus via a KNXnet/IP router. KNX actuators with specific group addresses can be switched on or off, or a specific value can be sent to the KNX actuators. This allows control of lightning, heat and ventilation, blend control or other utilization of other home automation facilities via the AsTeRICS platform.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(640),alt:"Screenshot: KNX plugin",title:"Screenshot: KNX plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A KNX infrastructure")]),e._v(" "),t("li",[e._v("A little knowledge on KNX")])]),e._v(" "),t("h2",{attrs:{id:"functional-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-description"}},[e._v("#")]),e._v(" Functional Description")]),e._v(" "),t("p",[e._v("By starting the model, the KNX plugin establishes a connection to the KNX gateway specified by the plugin properties. Currently, this plugin supports only IP connection (due to the limitation of the underlaying calimero library, USB interfaces will be supported with Java8). The plugin has three different possibilities to interface KNX datapoints:")]),e._v(" "),t("ul",[t("li",[e._v("Transmitting: Input ports (slider): Intended for dimming actuators")]),e._v(" "),t("li",[e._v("Transmitting: Event Listeners: Used to send a defined value (with a given type) to a KNX group address.")]),e._v(" "),t("li",[e._v("Transmitting: Action string: The most flexible way to send something to KNX. The command structure is: "),t("em",[e._v("@KNX: group_address,datapoint_type,value")]),e._v(". It is possible to use either a space, a comma or a number sign as separation tokens. The datapoint type is described later.")]),e._v(" "),t("li",[e._v("Receiving: Event Triggers: An event trigger can be used to listen to a defined KNX group address. If there is ANYTHING happening on this dedicated group address, an event will be raised.")]),e._v(" "),t("li",[e._v("Receiving: Output ports: The received value of a KNX group address will be interpreted by the given data point type, parsed to a string and sent out to the output ports")])]),e._v(" "),t("h2",{attrs:{id:"knx-datapoint-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#knx-datapoint-types"}},[e._v("#")]),e._v(" KNX datapoint types")]),e._v(" "),t("p",[e._v("KNX itself doesn’t provide any possibilty to get information on how to interpret received data. This is the point where you need the datapoint types. There are a few main types and some sub types. For example: "),t("em",[e._v("1.001")]),e._v(" is the datapoint type for a simple switch actuator/sensor. The input values are varying on the different datapoint types. For the switch example, the valid values are "),t("em",[e._v("on")]),e._v(" and "),t("em",[e._v("off")]),e._v(". The full list of all datatypes is provided by the ARE. If you want to receive a full list, you have to place the plugin in your ACS model, connect to the ARE and upload the model (even without any functionality). Afterwards, the full list of all currently supported datapoint types is available. Every list entry contains following information:")]),e._v(" "),t("ul",[t("li",[e._v("Description")]),e._v(" "),t("li",[e._v("[Minimum,Maximum value]")]),e._v(" "),t("li",[e._v("(Datapoint ID)")])]),e._v(" "),t("p",[e._v("The example of the light switch:"),t("br"),e._v(" "),t("em",[e._v("Switch[off,on] (1.001)")]),e._v(" The literal name for this datapoint type is “Switch” and its ID is 1.001. Because this is a boolean value, off and on are the only valid values. For float values, these given values are representing the minimum and the maximum value.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("actionString [string]:")]),e._v(' This port receives string commands for the KNX component. The commands have to be in the format “@KNX: group_address,datapoint_type,value”. The delimiters ‘,’, ‘#’ and ’ ’ are allowed. An example for a valid command is"@KNX:1/1/1,1.001,on". As a valid command is received by the input port, the value is sent to the KNX group address. The group addresses comply to the setup of the KNX network which can be configured with the ETS software.')]),e._v(" "),t("li",[t("strong",[e._v("slider[1-6] [double]:")]),e._v(" Input port for a double value which is converted to a given datapoint (Property: DPTSlider[1-6]) and sent to the given KNX group address (Property: groupAddressSlider[1-6]")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("data [1-6] [string]:")]),e._v(" These output ports are sending received data from the group addresses (Property: groupAddressOutput[1-6]). The data interpretation is controlled by the DPT (datapoint type, property: DPTOutput[1-6])")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("localIP [string]:")]),e._v(" The local IP address of the interface which can reach the KNXnetIP.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("KNXNetIP [string]:")]),e._v(" The destination IP address of the KNX gateway.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("NAT [boolean]:")]),e._v(" Enable NAT")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddress[1-6] [string]:")]),e._v(" (Event Listener) Specifies KNX group addresses for the [n] Event Listener e.g. “1/1/1”.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("dataValue[1-6] [string]:")]),e._v(" (Event Listener) Date value, which should be sent (triggered by the input event). The possible values are determined by the used DPT property (see the chapter on datapoint types)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("DPTEvent[1-6] [string/dropdown]:")]),e._v(" (Event Listener) Specifies the DPT (datapoint type) of the dataValue[1-6] which is sent to the KNX group address, triggered by the input event.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddressSlider[1-6] [string]:")]),e._v(" (Input port) Specifies KNX group addresses for the Slider[n].")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("DPTSlider[1-6] [string/dropdown]:")]),e._v(" (Input port) Determines the datapoint type corresponding to the sliders [1-6].")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddressTrigger[1-6] [string]:")]),e._v(" (Event Trigger) Specifies KNX group addresses for the Event Trigger [n]. The event is triggered if ANY action is happening on the given group address. If you need additional data processing, please use the output ports and process the received data values.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("groupAddressOutput[1-6] [string]:")]),e._v(" (Output port) Specifies the KNX group adresses, which are sent to the output ports. If there is anything happening on the given group adresses, the corresponding data is sent to the output ports.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("DPTOutput[1-6] [string/dropdown]:")]),e._v(" (Output port) Determines the datapoint type for the output port. The received data interpretation is defined by the DPTOutput property.")])])]),e._v(" "),t("h2",{attrs:{id:"event-listener"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener"}},[e._v("#")]),e._v(" Event Listener")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("send[1-6]:")]),e._v(" Each time an event is triggered, the corresponding KNX command which is specified in the plugin properties (groupAddress[1-6],dataValue[1-6],DPTEvent[1-6]), is issued.")]),e._v(" "),t("li",[t("strong",[e._v("read[1-6]:")]),e._v(" Trigger a read command on the output port. The settings for the group address and the DPT are the same as for the output ports (groupAddressOutput[1-6], DPTOutput[1-6]).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger"}},[e._v("#")]),e._v(" Event Trigger")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event_out_[1-6]:")]),e._v(" When there is any activity on the given KNX group address, set by the properties (groupAddressTrigger[1-6]) an event is raised by this plugin.")])])])}),[],!1,null,null,null);t.default=s.exports},640:function(e,t,r){e.exports=r.p+"assets/img/knx.98c3039f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/152.c4fb7cfd.js b/assets/js/153.3360a9ca.js similarity index 92% rename from assets/js/152.c4fb7cfd.js rename to assets/js/153.3360a9ca.js index 0399c21714..eba45e92d3 100644 --- a/assets/js/152.c4fb7cfd.js +++ b/assets/js/153.3360a9ca.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{1088:function(e,t,i){"use strict";i.r(t);var n=i(2),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"linewriter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linewriter"}},[e._v("#")]),e._v(" LineWriter")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This component writes lines from an input port to a text file.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(642),alt:"Screenshot: LineWriter plugin",title:"Screenshot: LineWriter plugin"}})]),e._v(" "),t("p",[e._v("ButtonGrid plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("actLine (string):")]),e._v(" an incoming string is stored into the text file.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("fileName [string]:")]),e._v(" The full path and file name of the text file to be written. The path can be given as absolute path or relative to the ARE executable’s directory")]),e._v(" "),t("li",[t("strong",[e._v("addTimeToFileName [boolean]:")]),e._v(" If selected, a timestamp will be added to the filename, to avoid overwriting files")]),e._v(" "),t("li",[t("strong",[e._v("titleCaption [string]:")]),e._v(" if not empty, this string parameter will be used as first line in the file (e.g. to create table caption in a csv file)")]),e._v(" "),t("li",[t("strong",[e._v("timestamp [integer, combobox selection]:")]),e._v(" The type of timestamp which will be added befor each line (currently either “no timestamp” or “milliseconds” can be chosen).")]),e._v(" "),t("li",[t("strong",[e._v("lineEndMark [integer, combobox selection]:")]),e._v(" The type of line end marker which will be added to each line (currently either “systemDefault”, “newline” or “carriage-return + newline” can be chosen).")]),e._v(" "),t("li",[t("strong",[e._v("append [boolean]:")]),e._v(" if selected, the lines will be appended to an existing file.")])])])}),[],!1,null,null,null);t.default=r.exports},642:function(e,t,i){e.exports=i.p+"assets/img/linewriter.a62b3dc8.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[153],{1092:function(e,t,i){"use strict";i.r(t);var n=i(2),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"linewriter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linewriter"}},[e._v("#")]),e._v(" LineWriter")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This component writes lines from an input port to a text file.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(644),alt:"Screenshot: LineWriter plugin",title:"Screenshot: LineWriter plugin"}})]),e._v(" "),t("p",[e._v("ButtonGrid plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("actLine (string):")]),e._v(" an incoming string is stored into the text file.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("fileName [string]:")]),e._v(" The full path and file name of the text file to be written. The path can be given as absolute path or relative to the ARE executable’s directory")]),e._v(" "),t("li",[t("strong",[e._v("addTimeToFileName [boolean]:")]),e._v(" If selected, a timestamp will be added to the filename, to avoid overwriting files")]),e._v(" "),t("li",[t("strong",[e._v("titleCaption [string]:")]),e._v(" if not empty, this string parameter will be used as first line in the file (e.g. to create table caption in a csv file)")]),e._v(" "),t("li",[t("strong",[e._v("timestamp [integer, combobox selection]:")]),e._v(" The type of timestamp which will be added befor each line (currently either “no timestamp” or “milliseconds” can be chosen).")]),e._v(" "),t("li",[t("strong",[e._v("lineEndMark [integer, combobox selection]:")]),e._v(" The type of line end marker which will be added to each line (currently either “systemDefault”, “newline” or “carriage-return + newline” can be chosen).")]),e._v(" "),t("li",[t("strong",[e._v("append [boolean]:")]),e._v(" if selected, the lines will be appended to an existing file.")])])])}),[],!1,null,null,null);t.default=r.exports},644:function(e,t,i){e.exports=i.p+"assets/img/linewriter.a62b3dc8.jpg"}}]); \ No newline at end of file diff --git a/assets/js/153.04b27a2c.js b/assets/js/154.168f91e9.js similarity index 94% rename from assets/js/153.04b27a2c.js rename to assets/js/154.168f91e9.js index 343169e26f..848ca17d14 100644 --- a/assets/js/153.04b27a2c.js +++ b/assets/js/154.168f91e9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[153],{1087:function(e,t,i){"use strict";i.r(t);var a=i(2),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"mediaplayer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mediaplayer"}},[e._v("#")]),e._v(" MediaPlayer")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This component allows to play media files supported by the local system. The supported file type depends on the installed media CODEC, but generally all media formats supported by the VLC player should work. Please note that the VLC player (32 bit version) should be installed in the default location: C:/Program Files/VideoLan or C:/Program Files (x86)/VideoLan")]),e._v(" "),t("p",[t("img",{attrs:{src:i(641),alt:"Screenshot: MediaPlayer plugin",title:"Screenshot: MediaPlayer plugin"}})]),e._v(" "),t("p",[e._v("MediaPlayer plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename [string]:")]),e._v(" Input port for the mediafile name. The file must be present in the filesystem of the ARE. Sending to this port will change the media file.")]),e._v(" "),t("li",[t("strong",[e._v("position [double]:")]),e._v(" Position in the media file (0-100%) - Sending to this port will set the position in the media file.")]),e._v(" "),t("li",[t("strong",[e._v("rate [double]:")]),e._v(" The playback speed of the media file (0-500%) - Sending to this port will change the playback speed.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pos [double]:")]),e._v(" The current playback position in percent.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("play:")]),e._v(" Triggering this event will start (or resume) the mediafile playback.")]),e._v(" "),t("li",[t("strong",[e._v("pause:")]),e._v(" Triggering this event will pause the mediafile playback.")]),e._v(" "),t("li",[t("strong",[e._v("stop:")]),e._v(" Triggering this event will stop the mediafile playback.")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" Triggering this event will reset the mediafile playback to position 0.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename [string]:")]),e._v(" Initial mediafile name. The file must be present in the filesystem the ARE. This is a dynamic property: a synchronized ARE can suggest available files which are located in the data/videos and data/music subfolders of the ARE.")]),e._v(" "),t("li",[t("strong",[e._v("autoplay [boolean]:")]),e._v(" if selected, the file will play automatically.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")]),e._v(" "),t("li",[t("strong",[e._v("pathToVLC [string]:")]),e._v(" path to the VLC installation (32-bit version needed).")])])])}),[],!1,null,null,null);t.default=s.exports},641:function(e,t,i){e.exports=i.p+"assets/img/mediaplayer.356cc94f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{1093:function(e,t,i){"use strict";i.r(t);var a=i(2),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"mediaplayer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mediaplayer"}},[e._v("#")]),e._v(" MediaPlayer")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This component allows to play media files supported by the local system. The supported file type depends on the installed media CODEC, but generally all media formats supported by the VLC player should work. Please note that the VLC player (32 bit version) should be installed in the default location: C:/Program Files/VideoLan or C:/Program Files (x86)/VideoLan")]),e._v(" "),t("p",[t("img",{attrs:{src:i(645),alt:"Screenshot: MediaPlayer plugin",title:"Screenshot: MediaPlayer plugin"}})]),e._v(" "),t("p",[e._v("MediaPlayer plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename [string]:")]),e._v(" Input port for the mediafile name. The file must be present in the filesystem of the ARE. Sending to this port will change the media file.")]),e._v(" "),t("li",[t("strong",[e._v("position [double]:")]),e._v(" Position in the media file (0-100%) - Sending to this port will set the position in the media file.")]),e._v(" "),t("li",[t("strong",[e._v("rate [double]:")]),e._v(" The playback speed of the media file (0-500%) - Sending to this port will change the playback speed.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pos [double]:")]),e._v(" The current playback position in percent.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("play:")]),e._v(" Triggering this event will start (or resume) the mediafile playback.")]),e._v(" "),t("li",[t("strong",[e._v("pause:")]),e._v(" Triggering this event will pause the mediafile playback.")]),e._v(" "),t("li",[t("strong",[e._v("stop:")]),e._v(" Triggering this event will stop the mediafile playback.")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" Triggering this event will reset the mediafile playback to position 0.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename [string]:")]),e._v(" Initial mediafile name. The file must be present in the filesystem the ARE. This is a dynamic property: a synchronized ARE can suggest available files which are located in the data/videos and data/music subfolders of the ARE.")]),e._v(" "),t("li",[t("strong",[e._v("autoplay [boolean]:")]),e._v(" if selected, the file will play automatically.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")]),e._v(" "),t("li",[t("strong",[e._v("pathToVLC [string]:")]),e._v(" path to the VLC installation (32-bit version needed).")])])])}),[],!1,null,null,null);t.default=s.exports},645:function(e,t,i){e.exports=i.p+"assets/img/mediaplayer.356cc94f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/154.dead6755.js b/assets/js/155.3451ef23.js similarity index 91% rename from assets/js/154.dead6755.js rename to assets/js/155.3451ef23.js index 6049fde955..fcfb849a78 100644 --- a/assets/js/154.dead6755.js +++ b/assets/js/155.3451ef23.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{1091:function(e,t,s){"use strict";s.r(t);var i=s(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("The ModelSwitcher component allows to switch from the running model to another model which will be deployed and started. This makes it possible to build menus for different use-cases or switch from one use-case to another.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(646),alt:"Screenshot: ModelSwitcher plugin",title:"Screenshot: ModelSwitcher plugin"}})]),e._v(" "),t("p",[e._v("ModelSwitcher plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("modelName [string]:")]),e._v(" The name of the model (including extension, for example “CameraMouse_sensitive.acs”. The switch is performed as soon as the model name is received. The model must exist in the ARE/models folder of the runtime environment.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("switchModel:")]),e._v(" An incoming event on this port will switch to the default model.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("model[string]:")]),e._v(" A fixed model name can be give here. This model must exist in the ARE/models folder of the runtime environment. The model switch is performed when the switchModel event is received.")])])])}),[],!1,null,null,null);t.default=r.exports},646:function(e,t,s){e.exports=s.p+"assets/img/modelswitcher.9f5158c5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[155],{1095:function(e,t,s){"use strict";s.r(t);var i=s(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("The ModelSwitcher component allows to switch from the running model to another model which will be deployed and started. This makes it possible to build menus for different use-cases or switch from one use-case to another.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(648),alt:"Screenshot: ModelSwitcher plugin",title:"Screenshot: ModelSwitcher plugin"}})]),e._v(" "),t("p",[e._v("ModelSwitcher plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("modelName [string]:")]),e._v(" The name of the model (including extension, for example “CameraMouse_sensitive.acs”. The switch is performed as soon as the model name is received. The model must exist in the ARE/models folder of the runtime environment.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("switchModel:")]),e._v(" An incoming event on this port will switch to the default model.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("model[string]:")]),e._v(" A fixed model name can be give here. This model must exist in the ARE/models folder of the runtime environment. The model switch is performed when the switchModel event is received.")])])])}),[],!1,null,null,null);t.default=r.exports},648:function(e,t,s){e.exports=s.p+"assets/img/modelswitcher.9f5158c5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/155.41c7f767.js b/assets/js/156.04bb0947.js similarity index 97% rename from assets/js/155.41c7f767.js rename to assets/js/156.04bb0947.js index c25c504274..7fafadc037 100644 --- a/assets/js/155.41c7f767.js +++ b/assets/js/156.04bb0947.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[155],{1090:function(e,t,o){"use strict";o.r(t);var i=o(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"mouse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mouse"}},[e._v("#")]),e._v(" Mouse")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Input Device Emulation)")]),e._v(" "),t("p",[e._v("The Mouse component allows mouse cursor positioning and clicking on the computer the ARE is running on (by software emulation). The mouse x-position, y-position, press/release actions of three mouse buttons and mouse-wheel movements can be controlled via desired input values and event triggers.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(645),alt:"Screenshot: Mouse plugin",title:"Screenshot: Mouse plugin"}})]),e._v(" "),t("p",[e._v("Mouse plugin")]),e._v(" "),t("p",[e._v("**Please Note:**The mouse emulation on "),t("strong",[e._v("Windows 7")]),e._v(" does not always work as expected due to User Account Control (UAC) settings. Especially when you want to use the Windows 7 On-Screen-Keyboard dragging the keyboard does not work. To troubleshoot "),t("a",{attrs:{href:"http://windows.microsoft.com/en-au/windows/turn-user-account-control-on-off#1TC=windows-7",target:"_blank",rel:"noopener noreferrer"}},[e._v("turn off the User Account Control (UAC)"),t("OutboundLink")],1),e._v(" - change the level to “Never notify”")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mouseX [double]:")]),e._v(" The desired X-Position of the mouse. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("mouseY [double]:")]),e._v(" The desired Y-Position of the mouse. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("action [string]:")]),e._v(" Input port for a command string. This command string allows to modify the action of the next left mouse click - it can be set to trigger other types of mouse clicks. A command string may be composed of several items that are delimited by ‘,’ or ’ '. Following command strings are accepted:\n"),t("ul",[t("li",[t("em",[e._v("“@MOUSE:nextclick,right”:")]),e._v(" next left click event will create a right mouse button click.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,double”:")]),e._v(" next left click event will create a double click.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,middle”:")]),e._v(" next left click event will create a middle button click")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,drag”:")]),e._v(" next left click event will hold the left mouse button.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,release”:")]),e._v(" next left click event will release the left mouse button.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:action,enable”:")]),e._v(" enables all mouse actions.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:action,disable”:")]),e._v(" disables all mouse actions.")]),e._v(" "),t("li",[t("em",[e._v('"@MOUSE:action,toggle:')]),e._v(" enables / disables all mouse actions.")])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("outX [double]:")]),e._v(" the current absolute x-value of the mouse, updated every time the mouse position is updated.")]),e._v(" "),t("li",[t("strong",[e._v("outY [double]:")]),e._v(" the current absolute y-value of the mouse, updated every time the mouse position is updated.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("leftClick:")]),e._v(" An incoming event at this port creates a mouse button click. A left mouse button click will be generated, unless a valid “nextclick…” command has been received at the cmd input which changed the click type (see above).")]),e._v(" "),t("li",[t("strong",[e._v("middleClick:")]),e._v(" A click with the middle mouse button is generated.")]),e._v(" "),t("li",[t("strong",[e._v("rightClick:")]),e._v(" A click with the right mouse button is generated.")]),e._v(" "),t("li",[t("strong",[e._v("doubleClick:")]),e._v(" A double click with the left mouse button is generated.")]),e._v(" "),t("li",[t("strong",[e._v("dragPress:")]),e._v(" The left mouse button is pressed (but not released again).")]),e._v(" "),t("li",[t("strong",[e._v("dragRelease:")]),e._v(" The left mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("wheelUp:")]),e._v(" The mouse wheel is turned one position from the user.")]),e._v(" "),t("li",[t("strong",[e._v("wheelDown:")]),e._v(" The mouse wheel is turned one position to the user.")]),e._v(" "),t("li",[t("strong",[e._v("activate:")]),e._v(" enables all mouse actions.")]),e._v(" "),t("li",[t("strong",[e._v("deactivate:")]),e._v(" disables all mouse actions.")]),e._v(" "),t("li",[t("strong",[e._v("toggle:")]),e._v(" enables / disables all mouse actions.")]),e._v(" "),t("li",[t("strong",[e._v("absolutePosition:")]),e._v(" after this event is triggered the incoming values for mouseX and mouseY are interpreted as absolute movement information")]),e._v(" "),t("li",[t("strong",[e._v("relativePosition:")]),e._v(" after this event is triggered the incoming values for mouseX and mouseY are interpreted as relative movement information")]),e._v(" "),t("li",[t("strong",[e._v("nextClickRight")]),e._v(" next left click event will create a right mouse button click.")]),e._v(" "),t("li",[t("strong",[e._v("nextClickDouble")]),e._v(" next left click event will create a double click.")]),e._v(" "),t("li",[t("strong",[e._v("nextClickMiddle")]),e._v("next left click event will create a middle button click")]),e._v(" "),t("li",[t("strong",[e._v("nextClickDrag")]),e._v(" next left click event will hold the left mouse button.")]),e._v(" "),t("li",[t("strong",[e._v("nextClickRelease")]),e._v(" next left click event will release the left mouse button.")]),e._v(" "),t("li",[t("strong",[e._v("moveToLastStable:")]),e._v(" moves the cursor to last stable position (where no movement was made).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enableMouse [boolean]:")]),e._v(" The value of this property specifies if all mouse actions are bypassed (false) or enabled (true).")]),e._v(" "),t("li",[t("strong",[e._v("absolutePosition [boolean]:")]),e._v(" If this property value is set to false, incoming values at the mouseX and mouseY input ports are interpreted as relative movement information. The values are summed up (integrated) to calculate the absolute position. If the property value is set to true, the values of the input ports are treated as absolute x/y positions.")]),e._v(" "),t("li",[t("strong",[e._v("startCentered [boolean]:")]),e._v(" If true the mouse starts in the middle of the screen, if false starting the starting position is the current position.")]),e._v(" "),t("li",[t("strong",[e._v("xMin [integer]:")]),e._v(" The minimum value for the X-coordinate (the mouse will not move farther to the left).")]),e._v(" "),t("li",[t("strong",[e._v("xMax [integer]:")]),e._v(" The maximum value for the X-coordinate (the mouse will not move farther to the right). "),t("strong",[e._v("If the xMax property is set to 0, the horizontal screen resoltion will be assumed as maximum x-position for the mouse cursor.")])]),e._v(" "),t("li",[t("strong",[e._v("yMin [integer]:")]),e._v(" The minimum value for the Y-coordinate (the mouse will not move farther up).")]),e._v(" "),t("li",[t("strong",[e._v("yMax [integer]:")]),e._v(" The maximum value for the Y-coordinate (the mouse will not move farther down) "),t("strong",[e._v("If the yMax property is set to 0, the vertical screen resoltion will be assumed as maximum y-position for the mouse cursor.")])])])])}),[],!1,null,null,null);t.default=s.exports},645:function(e,t,o){e.exports=o.p+"assets/img/mouse.253fc282.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{1096:function(e,t,o){"use strict";o.r(t);var i=o(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"mouse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mouse"}},[e._v("#")]),e._v(" Mouse")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Input Device Emulation)")]),e._v(" "),t("p",[e._v("The Mouse component allows mouse cursor positioning and clicking on the computer the ARE is running on (by software emulation). The mouse x-position, y-position, press/release actions of three mouse buttons and mouse-wheel movements can be controlled via desired input values and event triggers.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(649),alt:"Screenshot: Mouse plugin",title:"Screenshot: Mouse plugin"}})]),e._v(" "),t("p",[e._v("Mouse plugin")]),e._v(" "),t("p",[e._v("**Please Note:**The mouse emulation on "),t("strong",[e._v("Windows 7")]),e._v(" does not always work as expected due to User Account Control (UAC) settings. Especially when you want to use the Windows 7 On-Screen-Keyboard dragging the keyboard does not work. To troubleshoot "),t("a",{attrs:{href:"http://windows.microsoft.com/en-au/windows/turn-user-account-control-on-off#1TC=windows-7",target:"_blank",rel:"noopener noreferrer"}},[e._v("turn off the User Account Control (UAC)"),t("OutboundLink")],1),e._v(" - change the level to “Never notify”")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mouseX [double]:")]),e._v(" The desired X-Position of the mouse. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("mouseY [double]:")]),e._v(" The desired Y-Position of the mouse. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("action [string]:")]),e._v(" Input port for a command string. This command string allows to modify the action of the next left mouse click - it can be set to trigger other types of mouse clicks. A command string may be composed of several items that are delimited by ‘,’ or ’ '. Following command strings are accepted:\n"),t("ul",[t("li",[t("em",[e._v("“@MOUSE:nextclick,right”:")]),e._v(" next left click event will create a right mouse button click.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,double”:")]),e._v(" next left click event will create a double click.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,middle”:")]),e._v(" next left click event will create a middle button click")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,drag”:")]),e._v(" next left click event will hold the left mouse button.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:nextclick,release”:")]),e._v(" next left click event will release the left mouse button.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:action,enable”:")]),e._v(" enables all mouse actions.")]),e._v(" "),t("li",[t("em",[e._v("“@MOUSE:action,disable”:")]),e._v(" disables all mouse actions.")]),e._v(" "),t("li",[t("em",[e._v('"@MOUSE:action,toggle:')]),e._v(" enables / disables all mouse actions.")])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("outX [double]:")]),e._v(" the current absolute x-value of the mouse, updated every time the mouse position is updated.")]),e._v(" "),t("li",[t("strong",[e._v("outY [double]:")]),e._v(" the current absolute y-value of the mouse, updated every time the mouse position is updated.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("leftClick:")]),e._v(" An incoming event at this port creates a mouse button click. A left mouse button click will be generated, unless a valid “nextclick…” command has been received at the cmd input which changed the click type (see above).")]),e._v(" "),t("li",[t("strong",[e._v("middleClick:")]),e._v(" A click with the middle mouse button is generated.")]),e._v(" "),t("li",[t("strong",[e._v("rightClick:")]),e._v(" A click with the right mouse button is generated.")]),e._v(" "),t("li",[t("strong",[e._v("doubleClick:")]),e._v(" A double click with the left mouse button is generated.")]),e._v(" "),t("li",[t("strong",[e._v("dragPress:")]),e._v(" The left mouse button is pressed (but not released again).")]),e._v(" "),t("li",[t("strong",[e._v("dragRelease:")]),e._v(" The left mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("wheelUp:")]),e._v(" The mouse wheel is turned one position from the user.")]),e._v(" "),t("li",[t("strong",[e._v("wheelDown:")]),e._v(" The mouse wheel is turned one position to the user.")]),e._v(" "),t("li",[t("strong",[e._v("activate:")]),e._v(" enables all mouse actions.")]),e._v(" "),t("li",[t("strong",[e._v("deactivate:")]),e._v(" disables all mouse actions.")]),e._v(" "),t("li",[t("strong",[e._v("toggle:")]),e._v(" enables / disables all mouse actions.")]),e._v(" "),t("li",[t("strong",[e._v("absolutePosition:")]),e._v(" after this event is triggered the incoming values for mouseX and mouseY are interpreted as absolute movement information")]),e._v(" "),t("li",[t("strong",[e._v("relativePosition:")]),e._v(" after this event is triggered the incoming values for mouseX and mouseY are interpreted as relative movement information")]),e._v(" "),t("li",[t("strong",[e._v("nextClickRight")]),e._v(" next left click event will create a right mouse button click.")]),e._v(" "),t("li",[t("strong",[e._v("nextClickDouble")]),e._v(" next left click event will create a double click.")]),e._v(" "),t("li",[t("strong",[e._v("nextClickMiddle")]),e._v("next left click event will create a middle button click")]),e._v(" "),t("li",[t("strong",[e._v("nextClickDrag")]),e._v(" next left click event will hold the left mouse button.")]),e._v(" "),t("li",[t("strong",[e._v("nextClickRelease")]),e._v(" next left click event will release the left mouse button.")]),e._v(" "),t("li",[t("strong",[e._v("moveToLastStable:")]),e._v(" moves the cursor to last stable position (where no movement was made).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enableMouse [boolean]:")]),e._v(" The value of this property specifies if all mouse actions are bypassed (false) or enabled (true).")]),e._v(" "),t("li",[t("strong",[e._v("absolutePosition [boolean]:")]),e._v(" If this property value is set to false, incoming values at the mouseX and mouseY input ports are interpreted as relative movement information. The values are summed up (integrated) to calculate the absolute position. If the property value is set to true, the values of the input ports are treated as absolute x/y positions.")]),e._v(" "),t("li",[t("strong",[e._v("startCentered [boolean]:")]),e._v(" If true the mouse starts in the middle of the screen, if false starting the starting position is the current position.")]),e._v(" "),t("li",[t("strong",[e._v("xMin [integer]:")]),e._v(" The minimum value for the X-coordinate (the mouse will not move farther to the left).")]),e._v(" "),t("li",[t("strong",[e._v("xMax [integer]:")]),e._v(" The maximum value for the X-coordinate (the mouse will not move farther to the right). "),t("strong",[e._v("If the xMax property is set to 0, the horizontal screen resoltion will be assumed as maximum x-position for the mouse cursor.")])]),e._v(" "),t("li",[t("strong",[e._v("yMin [integer]:")]),e._v(" The minimum value for the Y-coordinate (the mouse will not move farther up).")]),e._v(" "),t("li",[t("strong",[e._v("yMax [integer]:")]),e._v(" The maximum value for the Y-coordinate (the mouse will not move farther down) "),t("strong",[e._v("If the yMax property is set to 0, the vertical screen resoltion will be assumed as maximum y-position for the mouse cursor.")])])])])}),[],!1,null,null,null);t.default=s.exports},649:function(e,t,o){e.exports=o.p+"assets/img/mouse.253fc282.jpg"}}]); \ No newline at end of file diff --git a/assets/js/156.13a0a7bf.js b/assets/js/157.dfe1ff38.js similarity index 91% rename from assets/js/156.13a0a7bf.js rename to assets/js/157.dfe1ff38.js index 12a406b7f7..268fb5fff4 100644 --- a/assets/js/156.13a0a7bf.js +++ b/assets/js/157.dfe1ff38.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{1093:function(t,e,r){"use strict";r.r(e);var s=r(2),o=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Input Device Emulation)")]),t._v(" "),e("p",[t._v("The MousecursorIcon plugin can be used to modifiy the current default system mouse cursor icon. A number of icon file names can be given as properties and activated by corresponding event listener ports. Currently, only the default system cursor can be modified. The cursor is restored to the default arrow when the model is stopped.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(648),alt:"Screenshot: MousecursorIcon plugin",title:"Screenshot: MousecursorIcon plugin"}})]),t._v(" "),e("p",[t._v("MousecursorIcon plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("iconName [strig]:")]),t._v(" This input port accepts a filename, the plugin tries to load a cursor file with this name from the local plugin working directory.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setIcon1 - setIcon9:")]),t._v(" an incoming events sets the given cursor as new system cursor.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("iconName1 - iconName9 [string]:")]),t._v(" 9 slots for cursor file names.")])])])}),[],!1,null,null,null);e.default=o.exports},648:function(t,e,r){t.exports=r.p+"assets/img/mousecursoricon.8633b482.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[157],{1097:function(t,e,r){"use strict";r.r(e);var s=r(2),o=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Input Device Emulation)")]),t._v(" "),e("p",[t._v("The MousecursorIcon plugin can be used to modifiy the current default system mouse cursor icon. A number of icon file names can be given as properties and activated by corresponding event listener ports. Currently, only the default system cursor can be modified. The cursor is restored to the default arrow when the model is stopped.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(650),alt:"Screenshot: MousecursorIcon plugin",title:"Screenshot: MousecursorIcon plugin"}})]),t._v(" "),e("p",[t._v("MousecursorIcon plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("iconName [strig]:")]),t._v(" This input port accepts a filename, the plugin tries to load a cursor file with this name from the local plugin working directory.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setIcon1 - setIcon9:")]),t._v(" an incoming events sets the given cursor as new system cursor.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("iconName1 - iconName9 [string]:")]),t._v(" 9 slots for cursor file names.")])])])}),[],!1,null,null,null);e.default=o.exports},650:function(t,e,r){t.exports=r.p+"assets/img/mousecursoricon.8633b482.jpg"}}]); \ No newline at end of file diff --git a/assets/js/157.3b7d2f99.js b/assets/js/158.2847af25.js similarity index 95% rename from assets/js/157.3b7d2f99.js rename to assets/js/158.2847af25.js index f3cd5ebac8..6c9066679d 100644 --- a/assets/js/157.3b7d2f99.js +++ b/assets/js/158.2847af25.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[157],{1092:function(t,e,r){"use strict";r.r(e);var o=r(2),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"net-connection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#net-connection"}},[t._v("#")]),t._v(" Net Connection")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Communication)")]),t._v(" "),e("p",[t._v("This component provides interface to pass the data through the network. It allows to pass data to the another NetConnection component or to the application which uses the NetConnection Native ASAPI library.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(647),alt:"Screenshot: NetConnection plugin",title:"Screenshot: NetConnection plugin"}})]),t._v(" "),e("p",[t._v("NetConnection plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("integerInputPort1…integerInputPort5 [integer]:")]),t._v(" The integer values which are passed to these ports are sent to the remote receiver.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("doubleInputPort1…doubleInputPort5 [double]:")]),t._v(" The double values which are passed to these ports are sent to the remote receiver.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("stringInputPort1…stringInputPort5 [string]:")]),t._v(" The text values which are passed to these ports are sent to the remote receiver.")])])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("integerOutputPort1…integerOutputPort5 [integer]:")]),t._v(" The output ports for the integer values received from the remote sender.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("doubleOutputPort1…doubleOutputPort5 [double]:")]),t._v(" The output ports for the double values received from the remote sender.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("stringOutputPort1…stringOutputPort5 [string]:")]),t._v(" The output ports for the text values received from the remote sender.")])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputEvent1…inputEvent10:")]),t._v(" The events which are sent to the remote receiver.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputEvent1…outputEvent10:")]),t._v(" The events received from the remote sender.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("connectionType [integer]:")]),t._v(" Describes connection mode: client or server.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("IP [string]:")]),t._v(" The IP address of the remote server.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("port [integer]:")]),t._v(" Port used in IP/TCP connection.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("multisession [boolean]:")]),t._v(" If the plugin is set to work as the server and this property is set, the plugin can connect to more than one client.")])])])])}),[],!1,null,null,null);e.default=n.exports},647:function(t,e,r){t.exports=r.p+"assets/img/netconnection.4b305846.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[158],{1100:function(t,e,r){"use strict";r.r(e);var o=r(2),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"net-connection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#net-connection"}},[t._v("#")]),t._v(" Net Connection")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Communication)")]),t._v(" "),e("p",[t._v("This component provides interface to pass the data through the network. It allows to pass data to the another NetConnection component or to the application which uses the NetConnection Native ASAPI library.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(654),alt:"Screenshot: NetConnection plugin",title:"Screenshot: NetConnection plugin"}})]),t._v(" "),e("p",[t._v("NetConnection plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("integerInputPort1…integerInputPort5 [integer]:")]),t._v(" The integer values which are passed to these ports are sent to the remote receiver.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("doubleInputPort1…doubleInputPort5 [double]:")]),t._v(" The double values which are passed to these ports are sent to the remote receiver.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("stringInputPort1…stringInputPort5 [string]:")]),t._v(" The text values which are passed to these ports are sent to the remote receiver.")])])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("integerOutputPort1…integerOutputPort5 [integer]:")]),t._v(" The output ports for the integer values received from the remote sender.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("doubleOutputPort1…doubleOutputPort5 [double]:")]),t._v(" The output ports for the double values received from the remote sender.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("stringOutputPort1…stringOutputPort5 [string]:")]),t._v(" The output ports for the text values received from the remote sender.")])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputEvent1…inputEvent10:")]),t._v(" The events which are sent to the remote receiver.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputEvent1…outputEvent10:")]),t._v(" The events received from the remote sender.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("connectionType [integer]:")]),t._v(" Describes connection mode: client or server.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("IP [string]:")]),t._v(" The IP address of the remote server.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("port [integer]:")]),t._v(" Port used in IP/TCP connection.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("multisession [boolean]:")]),t._v(" If the plugin is set to work as the server and this property is set, the plugin can connect to more than one client.")])])])])}),[],!1,null,null,null);e.default=n.exports},654:function(t,e,r){t.exports=r.p+"assets/img/netconnection.4b305846.jpg"}}]); \ No newline at end of file diff --git a/assets/js/158.bf146dae.js b/assets/js/159.274c6050.js similarity index 94% rename from assets/js/158.bf146dae.js rename to assets/js/159.274c6050.js index 104af32701..36cbf872ac 100644 --- a/assets/js/158.bf146dae.js +++ b/assets/js/159.274c6050.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[158],{1094:function(e,t,s){"use strict";s.r(t);var r=s(2),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"osc-out-client"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#osc-out-client"}},[e._v("#")]),e._v(" Osc Out Client")]),e._v(" "),t("p",[e._v("Component Type: actuator (Subcategory: Communication)")]),e._v(" "),t("p",[e._v("The OscOutClient plugin enables the ARE to broadcast messages using the OpenSoundControl (OSC) protocol. This plugin utilizes the NetUtil java library (http://www.sciss.de/netutil/) for the OSC implementation, it is ©opyrighted 2004-2011 by Hanns Holger Rutz and released under the GNU Lesser General Public License.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(649),alt:"Screenshot: OscServer plugin",title:"Screenshot: OscServer plugin"}})]),e._v(" "),t("p",[e._v("OscOutClient plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("Nothing, works sand-alone within ARE")]),e._v(" "),t("li",[e._v("Check your firewall configuration and network settings to ensure that OSC messages are not blocked.")])]),e._v(" "),t("h2",{attrs:{id:"functional-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-description"}},[e._v("#")]),e._v(" Functional Description")]),e._v(" "),t("p",[e._v("The OscOutClient collects data form the inputs CH1-4 and assamble it to one OSC message with 4 arguments. The address for the OSC channel is set by the property AddressCh1. Furthermore the plugin has a StringIN input port. If the plugin receives a string it broadcast one OSC message with one string argument. The address for the string OSC channel is set by the property AddressStringCh.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CH[1-4] [double]:")]),e._v(" Input port for the data, eg. a oszilloscope or any other double value.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Port [integer]:")]),e._v(" This value specifies the OscOutClient port.")]),e._v(" "),t("li",[t("strong",[e._v("PeerAddress [string]:")]),e._v(" Specifies the IP where the OSC server is listening.")]),e._v(" "),t("li",[t("strong",[e._v("AddressCH1 [string]:")]),e._v(" This value specifies the OSC data output address e.g. “/path/to/receiver/accxyz”.")]),e._v(" "),t("li",[t("strong",[e._v("AddressStringCh [string]:")]),e._v(" This value specifies the OSC string output address.")])]),e._v(" "),t("h2",{attrs:{id:"referred-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#referred-plugins"}},[e._v("#")]),e._v(" Referred Plugins")]),e._v(" "),t("ul",[t("li",[e._v("OscServer")]),e._v(" "),t("li",[e._v("OpenVibe")]),e._v(" "),t("li",[e._v("OscGestureFollower")])])])}),[],!1,null,null,null);t.default=i.exports},649:function(e,t,s){e.exports=s.p+"assets/img/oscoutclient.dae373d7.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[159],{1098:function(e,t,s){"use strict";s.r(t);var r=s(2),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"osc-out-client"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#osc-out-client"}},[e._v("#")]),e._v(" Osc Out Client")]),e._v(" "),t("p",[e._v("Component Type: actuator (Subcategory: Communication)")]),e._v(" "),t("p",[e._v("The OscOutClient plugin enables the ARE to broadcast messages using the OpenSoundControl (OSC) protocol. This plugin utilizes the NetUtil java library (http://www.sciss.de/netutil/) for the OSC implementation, it is ©opyrighted 2004-2011 by Hanns Holger Rutz and released under the GNU Lesser General Public License.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(651),alt:"Screenshot: OscServer plugin",title:"Screenshot: OscServer plugin"}})]),e._v(" "),t("p",[e._v("OscOutClient plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("Nothing, works sand-alone within ARE")]),e._v(" "),t("li",[e._v("Check your firewall configuration and network settings to ensure that OSC messages are not blocked.")])]),e._v(" "),t("h2",{attrs:{id:"functional-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-description"}},[e._v("#")]),e._v(" Functional Description")]),e._v(" "),t("p",[e._v("The OscOutClient collects data form the inputs CH1-4 and assamble it to one OSC message with 4 arguments. The address for the OSC channel is set by the property AddressCh1. Furthermore the plugin has a StringIN input port. If the plugin receives a string it broadcast one OSC message with one string argument. The address for the string OSC channel is set by the property AddressStringCh.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CH[1-4] [double]:")]),e._v(" Input port for the data, eg. a oszilloscope or any other double value.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Port [integer]:")]),e._v(" This value specifies the OscOutClient port.")]),e._v(" "),t("li",[t("strong",[e._v("PeerAddress [string]:")]),e._v(" Specifies the IP where the OSC server is listening.")]),e._v(" "),t("li",[t("strong",[e._v("AddressCH1 [string]:")]),e._v(" This value specifies the OSC data output address e.g. “/path/to/receiver/accxyz”.")]),e._v(" "),t("li",[t("strong",[e._v("AddressStringCh [string]:")]),e._v(" This value specifies the OSC string output address.")])]),e._v(" "),t("h2",{attrs:{id:"referred-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#referred-plugins"}},[e._v("#")]),e._v(" Referred Plugins")]),e._v(" "),t("ul",[t("li",[e._v("OscServer")]),e._v(" "),t("li",[e._v("OpenVibe")]),e._v(" "),t("li",[e._v("OscGestureFollower")])])])}),[],!1,null,null,null);t.default=i.exports},651:function(e,t,s){e.exports=s.p+"assets/img/oscoutclient.dae373d7.jpg"}}]); \ No newline at end of file diff --git a/assets/js/16.bf0424b2.js b/assets/js/16.96121025.js similarity index 95% rename from assets/js/16.bf0424b2.js rename to assets/js/16.96121025.js index e0e9a494a3..8ac063ea95 100644 --- a/assets/js/16.bf0424b2.js +++ b/assets/js/16.96121025.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{1048:function(e,t,i){"use strict";i.r(t);var a=i(2),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"navigation-and-basic-functionality"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#navigation-and-basic-functionality"}},[e._v("#")]),e._v(" Navigation and basic functionality")]),e._v(" "),t("p",[e._v("This chapter is about general appearance, navigation and basic functionality of the different views in AsTeRICS Grid:")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#welcome-view"}},[e._v("Welcome view")]),e._v(": intial view shown at first usage")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#main---view"}},[e._v("Main view")]),e._v(": starting view showing the recently used grid and navigation")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#edit-view---editing-on"}},[e._v("Edit view")]),e._v(": view that allows modification of a grid")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("Manage grids view")]),e._v(": show all grids, create new ones, create a backup")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-dictionaries---view"}},[e._v("Manage dictionaries view")]),e._v(": show, edit and create new dictionaries")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#change-user---view"}},[e._v("Change user view")]),e._v(": switch users or login an existing one")],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"welcome-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#welcome-view"}},[e._v("#")]),e._v(" Welcome view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=5ffLB4a9APc&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=2&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("First Start"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("AsTeRICS Grid initially starts with a welcome view giving the choice between:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Use AsTeRICS Grid without registration:")]),e._v(" choose this option in order to create a local default user and directly start using AsTeRICS Grid.")]),e._v(" "),t("li",[t("strong",[e._v("Register now:")]),e._v(" choose this option in order to sign up for an online user, which makes it possible to synchronize the grids across devices.")])]),e._v(" "),t("p",[e._v("See "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#User"}},[e._v("Terms")]),e._v(" for more information about offline/online users.")],1),e._v(" "),t("h2",{attrs:{id:"main-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#main-view"}},[e._v("#")]),e._v(" “Main” - view")]),e._v(" "),t("p",[t("strong",[e._v("Videos on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=OU4sI2UcNUo&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=3&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Demo configuration"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=CK8Lv2bVr-g&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=4&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fullscreen and lock mode"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("Once taken a decision in the welcome view AsTeRICS Grid subsequently starts in the “main view” which looks like Figure 1 (desktop view on the left, mobile view on the right):")]),e._v(" "),t("p",[t("img",{attrs:{src:i(502),alt:"main view"}}),e._v(" "),t("em",[e._v("Fig. 1: “Main” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The elements have this functionality:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the left navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Main")]),e._v(": navigate to the main view (currently shown)")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("Manage grids")])],1),e._v(": show all grids of the current user, add new ones or backup them to a file, manage the global grid")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-dictionaries---view"}},[e._v("Manage Dictionaries")])],1),e._v(": show all saved dictionaries, edit them or add new empty ones or import existing dictionaries")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#change-user---view"}},[e._v("Change User")])],1),e._v(": switch between saved users or log in an existing online user")]),e._v(" "),t("li",[t("strong",[e._v("Add online user")]),e._v(": register a new online user (synchronized across devices), see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/06_users.html"}},[e._v("Users")])],1),e._v(" "),t("li",[t("strong",[e._v("Add offline users")]),e._v(": add a new offline user (only for this device)")]),e._v(" "),t("li",[t("strong",[e._v("Settings")]),e._v(": select between general settings like application language and user settings like grid content language, voice or colors")]),e._v(" "),t("li",[t("strong",[e._v("About AsTeRICS Grid")]),e._v(": Show general information, links, contact address")]),e._v(" "),t("li",[t("strong",[e._v("Help")]),e._v(": find the AsTeRICS Grid user manuel, the ARASAAC tutorial or video tutorials")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html##edit-view---editing-on"}},[e._v("Editing on")])],1),e._v(": edit the layout of the grid, add new elements, actions for grid elements")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html"}},[e._v("Input options")])],1),e._v(": Options about how to select grid elements (e.g. click, hover, scanning)")]),e._v(" "),t("li",[t("strong",[e._v("Fullscreen")]),e._v(": hide the sidebar and the bar on the top, only showing the current grid")]),e._v(" "),t("li",[t("strong",[e._v("Lock")]),e._v(": lock the screen in order to prevent unintended input or changes beside using and navigating the grid")]),e._v(" "),t("li",[t("strong",[e._v("Grid")]),e._v(": demo grid consisting of some grid elements which are navigating to other grids if selected (possible for those which show the grey symbol in the upper right corner)")])]),e._v(" "),t("h2",{attrs:{id:"edit-view-editing-on"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#edit-view-editing-on"}},[e._v("#")]),e._v(" Edit view - “Editing on”")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=KWwWgCgidXM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=13&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Add and edit elements"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("Clicking on Button “Editing on” (Fig. 1, number 11) opens the edit view where a grid can be adapted, see Figure 2:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(503),alt:"edit view"}}),e._v(" "),t("em",[e._v("Fig.2: “Editing on” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the edit view:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Open or close the navigation sidebar")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Editing off")]),e._v(": navigate back to main view")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Undo")]),e._v(": reverts the last action")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Redo")]),e._v(": redoes the last action after reverting it")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("More")]),e._v(": opens a menu with additional actions, e.g adding new elements")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Right click on a grid element")]),e._v(": opens a menu for editing / deleting / etc. the element (open it with long tap on a mobile device/touchscreen)")]),e._v(" "),t("p",[t("strong",[e._v("Reposition grid element / Edit area")]),e._v(": Grid elements can be repositioned by dragging them (drag & drop). On the right bottom corner it’s possible to resize a grid element.")])])]),e._v(" "),t("p",[e._v("See page "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html"}},[e._v("Edit grid appearance and layout")]),e._v(" for more details about editing a grid.")],1),e._v(" "),t("h2",{attrs:{id:"manage-grids-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manage-grids-view"}},[e._v("#")]),e._v(" “Manage grids” - view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=HQTgvv1Dnn0&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=15&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Manage grids"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The manage grids view provides an overview about the current grids of a user, see Figure 3:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(504),alt:"manage grids view"}}),e._v(" "),t("em",[e._v("Fig.3: “Manage grids” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the manage grids view:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Name of grid")]),e._v(": type name of the grid and confirm by clicking on the tick")]),e._v(" "),t("li",[t("strong",[e._v("New grid")]),e._v(": add a new, empty grid")]),e._v(" "),t("li",[t("strong",[e._v("more")]),e._v(": shows menu with additional actions, e.g. backup the grids to file or restore backups from file")]),e._v(" "),t("li",[t("strong",[e._v("Show")]),e._v(": open this grid in main view")]),e._v(" "),t("li",[t("strong",[e._v("Edit")]),e._v(": open this grid in edit view")]),e._v(" "),t("li",[t("strong",[e._v("Clone")]),e._v(": duplicate this grid, creating a copy of it with a different name")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": delete this grid")]),e._v(" "),t("li",[t("strong",[e._v("Export")]),e._v(": saves and downloads this specific grid to a "),t("code",[e._v(".grd")]),e._v(" file creating a backup of it (saves only this single grid, see “More” menu (Number 4) to backup all grids)")]),e._v(" "),t("li",[t("strong",[e._v("Save as PDF")]),e._v(": saves and downloades the grid as PDF")]),e._v(" "),t("li",[t("strong",[e._v("Grids to show")]),e._v(": select which grids shall be shown in the grid list")]),e._v(" "),t("li",[t("strong",[e._v("Sort grids by")]),e._v(": select how the grids in the grid list shall be sorted")])]),e._v(" "),t("h3",{attrs:{id:"more-button-additional-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#more-button-additional-options"}},[e._v("#")]),e._v(" “more” button - Additional options")]),e._v(" "),t("p",[e._v("Clicking on Button “more” (Fig. 3, number 4) opens menu with additional options:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(505),alt:"manage grids more menu"}})]),e._v(" "),t("p",[t("em",[e._v("Fig.3.1: “Manage grids” - view - “more” button")])]),e._v(" "),t("p",[e._v("These are the possible options:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("New Grid")]),e._v(": creates a new and empty grid, same as Fig. 3, number 3")]),e._v(" "),t("li",[t("strong",[e._v("Save backup to file")]),e._v(": creates and downloads a "),t("code",[e._v(".grd")]),e._v(" file containing a backup of all current grids, dictionaries and input configuration. In this case, a file called "),t("code",[e._v("asterics-grid-backup.grd")]),e._v(" is downloaded that can be renamed to more easily identify the contents of the copy")]),e._v(" "),t("li",[t("strong",[e._v("Save custom data to file")]),e._v(": creates and downloads a backup copy as well, but data can be customized with the following options:\n"),t("ol",[t("li",[e._v("Select grid: export a specific (group of) grid(s) or all available grids")]),e._v(" "),t("li",[e._v("Export languages: select wheter to export all the languages in which the communicator is translated or only one of them (current content language)")]),e._v(" "),t("li",[e._v("Export dictionaries: can be activated / deactivated")]),e._v(" "),t("li",[e._v("Export user settings and input configuration: can be activated / deactivated (preserves specific adjustments like color settings, content language or input settings (scanning or direct slection))")]),e._v(" "),t("li",[e._v("Export global grid: can be activated / deactivated")])])]),e._v(" "),t("li",[t("strong",[e._v("Save grids to PDF")]),e._v(": creates and downloads a "),t("code",[e._v(".pdf")]),e._v(" file of one or all grids, which can be used for later printing")]),e._v(" "),t("li",[t("strong",[e._v("Restore backup from file")]),e._v(": deletes the existing configuration and replaces it with data from a "),t("code",[e._v(".grd")]),e._v(" file")]),e._v(" "),t("li",[t("strong",[e._v("Import custom data from file")]),e._v(": imports data from a "),t("code",[e._v(".grd")]),e._v(" file as well, but data can be customized. You can choose if you want to import dictionaries, of you want to import user settings and input configuration and if oyu want to delet existing data before importing.")]),e._v(" "),t("li",[t("strong",[e._v("Reset to default configuration")]),e._v(": deletes all current grids and replaces them with the default demo configuration")])]),e._v(" "),t("p",[t("strong",[e._v("Info about Open Board Format (OBF)")]),e._v(": OBF is an open format for exchanging grids across different AAC tools and is specified on the "),t("a",{attrs:{href:"https://www.openboardformat.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("official website"),t("OutboundLink")],1),e._v(". AsTeRICS Grid supports importing OBF files ("),t("code",[e._v(".obf")]),e._v(" and "),t("code",[e._v(".obz")]),e._v(") using the options "),t("em",[e._v("Restore backup from file")]),e._v(" or "),t("em",[e._v("Import custom data from file")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Tpez_-4ILRA&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=26&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Complex grids and OBF"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("h3",{attrs:{id:"global-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#global-grid"}},[e._v("#")]),e._v(" Global grid")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=bbmMODbqbhk&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=25&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Global Grid"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("A global grid is a grid that is visible on every grid page. It may contain general elements that make sense within every grid like e.g. a “Home” grid element that navigates to the start page. A global grid could also contain some kind of core vocabulary that should be visible any time. The global grid of the main page of figure 1 contains the following elements:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(506),alt:"global grid"}})]),e._v(" "),t("p",[t("em",[e._v("Fig.3.2: Global Grid")])]),e._v(" "),t("p",[e._v("All the elements shown here are elements contained within the global grid. They are visible on every grid page.\nWhile editing the global grid it’s possible to define its height by opening "),t("em",[e._v("More -> Change grid dimensions")]),e._v(" and setting the value for "),t("em",[e._v("height of first global grid row")]),e._v(".")]),e._v(" "),t("p",[e._v("The global grid can be activated/deactivated and edited in the “Manage Grids” view at the bottom or by "),t("em",[e._v("More -> Edit global grid")]),e._v(" while editing any other grid:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(507),alt:"de/activate global grid"}})]),e._v(" "),t("p",[t("em",[e._v("Fig.3.3: “Manage grids” - view - Global Grid")])]),e._v(" "),t("h3",{attrs:{id:"home-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#home-grid"}},[e._v("#")]),e._v(" Home grid")]),e._v(" "),t("p",[e._v("At the bottom of “Manage grids” it’s possible to define a "),t("code",[e._v("Home grid")]),e._v(". This grid is automatically opened at startup of AsTeRICS Grid. If no home grid is defined, the last opened grid is opened.")]),e._v(" "),t("p",[t("code",[e._v("Navigate to home grid after selecting an element")]),e._v(" can be selected in order to automatically navigate to home grid after any element (which doesn’t navigate to an other grid) is selected. This can speed up the construction of sentences in more complex communicator interfaces.")]),e._v(" "),t("p",[e._v("It’s possible to define an action that navigates to the home grid, see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html#navigate-to-other-grid"}},[e._v("action “Navigate to other grid”")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"manage-dictionaries-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manage-dictionaries-view"}},[e._v("#")]),e._v(" “Manage Dictionaries” - view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=DS9om8MDEDY&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=19&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Manage dictionaries"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("In the manage dictionaries view currently saved dictionaries that are used for filling prediction elements (see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#grid-element"}},[e._v("Terms")]),e._v(") can be shown and adapted (Figure 4):")],1),e._v(" "),t("p",[t("img",{attrs:{src:i(508),alt:"manage dictionaries view"}}),e._v(" "),t("em",[e._v("Fig. 4: “Manage dictionaries” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the manage dictionaries view:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Import dictionary")]),e._v(": imports a dictionary from online dictionaries or from a "),t("code",[e._v(".json")]),e._v(" file")]),e._v(" "),t("li",[t("strong",[e._v("New empty dictionary")]),e._v(": add a new, empty dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Edit")]),e._v(": show, edit and add new words to the dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Clone")]),e._v(": create a copy of the dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": removes the dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Save")]),e._v(": saves the dictionary as "),t("code",[e._v(".json")]),e._v(" file")]),e._v(" "),t("li",[t("strong",[e._v("Edit dictionary name")]),e._v(": change the name of a dictionary")])]),e._v(" "),t("p",[e._v("For more information about using dictionaries see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/07_dictionaries.html"}},[e._v("Dictionaries")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"change-user-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-user-view"}},[e._v("#")]),e._v(" “Change User” - view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=CoRUQJJnYaY&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=16&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Offline and online users"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("In the “Change User” - view it’s possible to switch between users or login an existing one (Figure 5):")]),e._v(" "),t("p",[t("img",{attrs:{src:i(509),alt:"change user view"}}),e._v(" "),t("em",[e._v("Fig. 5: “Change user” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the change users view:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Active offline user")]),e._v(": the currently active user is recognizable by a black user symbol and the word “active” next to the username. The active user is the user whose grids and configuration are currently used and shown in all other views.")]),e._v(" "),t("li",[t("strong",[e._v("Inactive online user")]),e._v(": The little cloud symbol indicates an online user (see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#user"}},[e._v("Terms")]),e._v(") and the gray user symbol that he is currently inactive, meaning that the user’s grids are currently not used.")],1),e._v(" "),t("li",[t("strong",[e._v("Inactive offline user")]),e._v(": The gray user symbol without a cloud indicates an inactive offline user (see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#user"}},[e._v("Terms")]),e._v(")")],1),e._v(" "),t("li",[t("strong",[e._v("Open")]),e._v(": sets the user “active” and opens the main view, showing the user’s grid(s). Sets all other users inactive, there is always only one active user.")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": deletes the user and all of his grids and configuration. Use with caution, this action cannot be undone. This option is only available for offline users.")]),e._v(" "),t("li",[t("strong",[e._v("Logout")]),e._v(": deletes the user and all of his grids and configuration, but only on the current device. Data in the cloud and on other devices that are logged in with the same user will not be deleted. This option is only available for online users.")]),e._v(" "),t("li",[t("strong",[e._v("Login with other user")]),e._v(": put in username and password of an existing online user in order to add it to the current device. In order to create a new online or offline user, follow one of the links below.")]),e._v(" "),t("li",[t("strong",[e._v("Remember checkbox")]),e._v(": if checked, the newly logged in online user will be saved to the device and listed in the list of users in the current user view. If unchecked the user will only be opened temporarily and no user data will be saved on the device (recommended for logging in on foreign devices).")])]),e._v(" "),t("p",[e._v("For information about offline or online users and how to add them see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/06_users.html"}},[e._v("Users")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"search-function"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#search-function"}},[e._v("#")]),e._v(" Search function")]),e._v(" "),t("p",[e._v("These are the possibilities to open the dialog for searching for grid elements in the current configuration:")]),e._v(" "),t("ol",[t("li",[e._v("Click the button "),t("code",[e._v("Search")]),e._v(" in the top bar in the Main View")]),e._v(" "),t("li",[e._v("Press "),t("code",[e._v("Ctrl + F")]),e._v(" on the keyboard in one of these views: “Main”, “Manage Grids” or “Edit grid”")]),e._v(" "),t("li",[e._v("Click on "),t("code",[e._v("More -> Search")]),e._v(" in the top bar of “Edit grid” view")]),e._v(" "),t("li",[e._v("Grid element action "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html#navigate-to-other-grid"}},[e._v("navigate to other grid")]),e._v(" with navigation type "),t("code",[e._v("Open search dialog")]),e._v(" (e.g. to be added to "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#global-grid"}},[e._v("global grid")]),e._v(" in order to be able to open the search dialog in fullscreen mode).")],1)]),e._v(" "),t("p",[t("img",{attrs:{src:i(510),alt:"change user view"}}),e._v(" "),t("em",[e._v("Fig. 6: Search dialog and search results")])]),e._v(" "),t("p",[e._v("Figure 6 shows the search dialog:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("search term")]),e._v(": text input field for the search term")]),e._v(" "),t("li",[t("strong",[e._v("result image")]),e._v(": directly navigates to the selected element and highlights it. Keyboard shortcut for first search result: "),t("code",[e._v("[Enter]")])]),e._v(" "),t("li",[t("strong",[e._v("result path")]),e._v(": navigates to the selected element step-by-step by highlighting the path beginning from the home grid. Keyboard shortcut for first search result: "),t("code",[e._v("[Ctrl + Enter]")])])]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=n.exports},502:function(e,t,i){e.exports=i.p+"assets/img/main_en.0dfdaa0e.jpg"},503:function(e,t,i){e.exports=i.p+"assets/img/edit_en.c2cbce4a.jpg"},504:function(e,t,i){e.exports=i.p+"assets/img/manage_grids_en.7487da8f.jpg"},505:function(e,t,i){e.exports=i.p+"assets/img/manage_grids_more_en.6f493d95.jpg"},506:function(e,t,i){e.exports=i.p+"assets/img/global_grid_empty_en.27f7b39a.JPG"},507:function(e,t,i){e.exports=i.p+"assets/img/global_grid_en.7962d28c.JPG"},508:function(e,t,i){e.exports=i.p+"assets/img/manage_dict_en.9115ef99.jpg"},509:function(e,t,i){e.exports=i.p+"assets/img/login_en.ea0b3060.jpg"},510:function(e,t,i){e.exports=i.p+"assets/img/search-dialog.cdc09620.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{1052:function(e,t,i){"use strict";i.r(t);var a=i(2),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"navigation-and-basic-functionality"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#navigation-and-basic-functionality"}},[e._v("#")]),e._v(" Navigation and basic functionality")]),e._v(" "),t("p",[e._v("This chapter is about general appearance, navigation and basic functionality of the different views in AsTeRICS Grid:")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#welcome-view"}},[e._v("Welcome view")]),e._v(": intial view shown at first usage")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#main---view"}},[e._v("Main view")]),e._v(": starting view showing the recently used grid and navigation")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#edit-view---editing-on"}},[e._v("Edit view")]),e._v(": view that allows modification of a grid")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("Manage grids view")]),e._v(": show all grids, create new ones, create a backup")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-dictionaries---view"}},[e._v("Manage dictionaries view")]),e._v(": show, edit and create new dictionaries")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#change-user---view"}},[e._v("Change user view")]),e._v(": switch users or login an existing one")],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"welcome-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#welcome-view"}},[e._v("#")]),e._v(" Welcome view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=5ffLB4a9APc&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=2&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("First Start"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("AsTeRICS Grid initially starts with a welcome view giving the choice between:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Use AsTeRICS Grid without registration:")]),e._v(" choose this option in order to create a local default user and directly start using AsTeRICS Grid.")]),e._v(" "),t("li",[t("strong",[e._v("Register now:")]),e._v(" choose this option in order to sign up for an online user, which makes it possible to synchronize the grids across devices.")])]),e._v(" "),t("p",[e._v("See "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#User"}},[e._v("Terms")]),e._v(" for more information about offline/online users.")],1),e._v(" "),t("h2",{attrs:{id:"main-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#main-view"}},[e._v("#")]),e._v(" “Main” - view")]),e._v(" "),t("p",[t("strong",[e._v("Videos on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=OU4sI2UcNUo&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=3&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Demo configuration"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=CK8Lv2bVr-g&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=4&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fullscreen and lock mode"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("Once taken a decision in the welcome view AsTeRICS Grid subsequently starts in the “main view” which looks like Figure 1 (desktop view on the left, mobile view on the right):")]),e._v(" "),t("p",[t("img",{attrs:{src:i(507),alt:"main view"}}),e._v(" "),t("em",[e._v("Fig. 1: “Main” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The elements have this functionality:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the left navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Main")]),e._v(": navigate to the main view (currently shown)")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("Manage grids")])],1),e._v(": show all grids of the current user, add new ones or backup them to a file, manage the global grid")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-dictionaries---view"}},[e._v("Manage Dictionaries")])],1),e._v(": show all saved dictionaries, edit them or add new empty ones or import existing dictionaries")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#change-user---view"}},[e._v("Change User")])],1),e._v(": switch between saved users or log in an existing online user")]),e._v(" "),t("li",[t("strong",[e._v("Add online user")]),e._v(": register a new online user (synchronized across devices), see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/06_users.html"}},[e._v("Users")])],1),e._v(" "),t("li",[t("strong",[e._v("Add offline users")]),e._v(": add a new offline user (only for this device)")]),e._v(" "),t("li",[t("strong",[e._v("Settings")]),e._v(": select between general settings like application language and user settings like grid content language, voice or colors")]),e._v(" "),t("li",[t("strong",[e._v("About AsTeRICS Grid")]),e._v(": Show general information, links, contact address")]),e._v(" "),t("li",[t("strong",[e._v("Help")]),e._v(": find the AsTeRICS Grid user manuel, the ARASAAC tutorial or video tutorials")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html##edit-view---editing-on"}},[e._v("Editing on")])],1),e._v(": edit the layout of the grid, add new elements, actions for grid elements")]),e._v(" "),t("li",[t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html"}},[e._v("Input options")])],1),e._v(": Options about how to select grid elements (e.g. click, hover, scanning)")]),e._v(" "),t("li",[t("strong",[e._v("Fullscreen")]),e._v(": hide the sidebar and the bar on the top, only showing the current grid")]),e._v(" "),t("li",[t("strong",[e._v("Lock")]),e._v(": lock the screen in order to prevent unintended input or changes beside using and navigating the grid")]),e._v(" "),t("li",[t("strong",[e._v("Grid")]),e._v(": demo grid consisting of some grid elements which are navigating to other grids if selected (possible for those which show the grey symbol in the upper right corner)")])]),e._v(" "),t("h2",{attrs:{id:"edit-view-editing-on"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#edit-view-editing-on"}},[e._v("#")]),e._v(" Edit view - “Editing on”")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=KWwWgCgidXM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=13&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Add and edit elements"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("Clicking on Button “Editing on” (Fig. 1, number 11) opens the edit view where a grid can be adapted, see Figure 2:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(508),alt:"edit view"}}),e._v(" "),t("em",[e._v("Fig.2: “Editing on” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the edit view:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Open or close the navigation sidebar")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Editing off")]),e._v(": navigate back to main view")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Undo")]),e._v(": reverts the last action")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Redo")]),e._v(": redoes the last action after reverting it")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("More")]),e._v(": opens a menu with additional actions, e.g adding new elements")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Right click on a grid element")]),e._v(": opens a menu for editing / deleting / etc. the element (open it with long tap on a mobile device/touchscreen)")]),e._v(" "),t("p",[t("strong",[e._v("Reposition grid element / Edit area")]),e._v(": Grid elements can be repositioned by dragging them (drag & drop). On the right bottom corner it’s possible to resize a grid element.")])])]),e._v(" "),t("p",[e._v("See page "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html"}},[e._v("Edit grid appearance and layout")]),e._v(" for more details about editing a grid.")],1),e._v(" "),t("h2",{attrs:{id:"manage-grids-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manage-grids-view"}},[e._v("#")]),e._v(" “Manage grids” - view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=HQTgvv1Dnn0&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=15&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Manage grids"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The manage grids view provides an overview about the current grids of a user, see Figure 3:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(509),alt:"manage grids view"}}),e._v(" "),t("em",[e._v("Fig.3: “Manage grids” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the manage grids view:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Name of grid")]),e._v(": type name of the grid and confirm by clicking on the tick")]),e._v(" "),t("li",[t("strong",[e._v("New grid")]),e._v(": add a new, empty grid")]),e._v(" "),t("li",[t("strong",[e._v("more")]),e._v(": shows menu with additional actions, e.g. backup the grids to file or restore backups from file")]),e._v(" "),t("li",[t("strong",[e._v("Show")]),e._v(": open this grid in main view")]),e._v(" "),t("li",[t("strong",[e._v("Edit")]),e._v(": open this grid in edit view")]),e._v(" "),t("li",[t("strong",[e._v("Clone")]),e._v(": duplicate this grid, creating a copy of it with a different name")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": delete this grid")]),e._v(" "),t("li",[t("strong",[e._v("Export")]),e._v(": saves and downloads this specific grid to a "),t("code",[e._v(".grd")]),e._v(" file creating a backup of it (saves only this single grid, see “More” menu (Number 4) to backup all grids)")]),e._v(" "),t("li",[t("strong",[e._v("Save as PDF")]),e._v(": saves and downloades the grid as PDF")]),e._v(" "),t("li",[t("strong",[e._v("Grids to show")]),e._v(": select which grids shall be shown in the grid list")]),e._v(" "),t("li",[t("strong",[e._v("Sort grids by")]),e._v(": select how the grids in the grid list shall be sorted")])]),e._v(" "),t("h3",{attrs:{id:"more-button-additional-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#more-button-additional-options"}},[e._v("#")]),e._v(" “more” button - Additional options")]),e._v(" "),t("p",[e._v("Clicking on Button “more” (Fig. 3, number 4) opens menu with additional options:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(510),alt:"manage grids more menu"}})]),e._v(" "),t("p",[t("em",[e._v("Fig.3.1: “Manage grids” - view - “more” button")])]),e._v(" "),t("p",[e._v("These are the possible options:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("New Grid")]),e._v(": creates a new and empty grid, same as Fig. 3, number 3")]),e._v(" "),t("li",[t("strong",[e._v("Save backup to file")]),e._v(": creates and downloads a "),t("code",[e._v(".grd")]),e._v(" file containing a backup of all current grids, dictionaries and input configuration. In this case, a file called "),t("code",[e._v("asterics-grid-backup.grd")]),e._v(" is downloaded that can be renamed to more easily identify the contents of the copy")]),e._v(" "),t("li",[t("strong",[e._v("Save custom data to file")]),e._v(": creates and downloads a backup copy as well, but data can be customized with the following options:\n"),t("ol",[t("li",[e._v("Select grid: export a specific (group of) grid(s) or all available grids")]),e._v(" "),t("li",[e._v("Export languages: select wheter to export all the languages in which the communicator is translated or only one of them (current content language)")]),e._v(" "),t("li",[e._v("Export dictionaries: can be activated / deactivated")]),e._v(" "),t("li",[e._v("Export user settings and input configuration: can be activated / deactivated (preserves specific adjustments like color settings, content language or input settings (scanning or direct slection))")]),e._v(" "),t("li",[e._v("Export global grid: can be activated / deactivated")])])]),e._v(" "),t("li",[t("strong",[e._v("Save grids to PDF")]),e._v(": creates and downloads a "),t("code",[e._v(".pdf")]),e._v(" file of one or all grids, which can be used for later printing")]),e._v(" "),t("li",[t("strong",[e._v("Restore backup from file")]),e._v(": deletes the existing configuration and replaces it with data from a "),t("code",[e._v(".grd")]),e._v(" file")]),e._v(" "),t("li",[t("strong",[e._v("Import custom data from file")]),e._v(": imports data from a "),t("code",[e._v(".grd")]),e._v(" file as well, but data can be customized. You can choose if you want to import dictionaries, of you want to import user settings and input configuration and if oyu want to delet existing data before importing.")]),e._v(" "),t("li",[t("strong",[e._v("Reset to default configuration")]),e._v(": deletes all current grids and replaces them with the default demo configuration")])]),e._v(" "),t("p",[t("strong",[e._v("Info about Open Board Format (OBF)")]),e._v(": OBF is an open format for exchanging grids across different AAC tools and is specified on the "),t("a",{attrs:{href:"https://www.openboardformat.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("official website"),t("OutboundLink")],1),e._v(". AsTeRICS Grid supports importing OBF files ("),t("code",[e._v(".obf")]),e._v(" and "),t("code",[e._v(".obz")]),e._v(") using the options "),t("em",[e._v("Restore backup from file")]),e._v(" or "),t("em",[e._v("Import custom data from file")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Tpez_-4ILRA&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=26&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Complex grids and OBF"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("h3",{attrs:{id:"global-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#global-grid"}},[e._v("#")]),e._v(" Global grid")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=bbmMODbqbhk&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=25&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Global Grid"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("A global grid is a grid that is visible on every grid page. It may contain general elements that make sense within every grid like e.g. a “Home” grid element that navigates to the start page. A global grid could also contain some kind of core vocabulary that should be visible any time. The global grid of the main page of figure 1 contains the following elements:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(511),alt:"global grid"}})]),e._v(" "),t("p",[t("em",[e._v("Fig.3.2: Global Grid")])]),e._v(" "),t("p",[e._v("All the elements shown here are elements contained within the global grid. They are visible on every grid page.\nWhile editing the global grid it’s possible to define its height by opening "),t("em",[e._v("More -> Change grid dimensions")]),e._v(" and setting the value for "),t("em",[e._v("height of first global grid row")]),e._v(".")]),e._v(" "),t("p",[e._v("The global grid can be activated/deactivated and edited in the “Manage Grids” view at the bottom or by "),t("em",[e._v("More -> Edit global grid")]),e._v(" while editing any other grid:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(512),alt:"de/activate global grid"}})]),e._v(" "),t("p",[t("em",[e._v("Fig.3.3: “Manage grids” - view - Global Grid")])]),e._v(" "),t("h3",{attrs:{id:"home-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#home-grid"}},[e._v("#")]),e._v(" Home grid")]),e._v(" "),t("p",[e._v("At the bottom of “Manage grids” it’s possible to define a "),t("code",[e._v("Home grid")]),e._v(". This grid is automatically opened at startup of AsTeRICS Grid. If no home grid is defined, the last opened grid is opened.")]),e._v(" "),t("p",[t("code",[e._v("Navigate to home grid after selecting an element")]),e._v(" can be selected in order to automatically navigate to home grid after any element (which doesn’t navigate to an other grid) is selected. This can speed up the construction of sentences in more complex communicator interfaces.")]),e._v(" "),t("p",[e._v("It’s possible to define an action that navigates to the home grid, see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html#navigate-to-other-grid"}},[e._v("action “Navigate to other grid”")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"manage-dictionaries-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manage-dictionaries-view"}},[e._v("#")]),e._v(" “Manage Dictionaries” - view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=DS9om8MDEDY&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=19&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Manage dictionaries"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("In the manage dictionaries view currently saved dictionaries that are used for filling prediction elements (see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#grid-element"}},[e._v("Terms")]),e._v(") can be shown and adapted (Figure 4):")],1),e._v(" "),t("p",[t("img",{attrs:{src:i(513),alt:"manage dictionaries view"}}),e._v(" "),t("em",[e._v("Fig. 4: “Manage dictionaries” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the manage dictionaries view:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Import dictionary")]),e._v(": imports a dictionary from online dictionaries or from a "),t("code",[e._v(".json")]),e._v(" file")]),e._v(" "),t("li",[t("strong",[e._v("New empty dictionary")]),e._v(": add a new, empty dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Edit")]),e._v(": show, edit and add new words to the dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Clone")]),e._v(": create a copy of the dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": removes the dictionary")]),e._v(" "),t("li",[t("strong",[e._v("Save")]),e._v(": saves the dictionary as "),t("code",[e._v(".json")]),e._v(" file")]),e._v(" "),t("li",[t("strong",[e._v("Edit dictionary name")]),e._v(": change the name of a dictionary")])]),e._v(" "),t("p",[e._v("For more information about using dictionaries see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/07_dictionaries.html"}},[e._v("Dictionaries")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"change-user-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-user-view"}},[e._v("#")]),e._v(" “Change User” - view")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=CoRUQJJnYaY&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=16&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Offline and online users"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("In the “Change User” - view it’s possible to switch between users or login an existing one (Figure 5):")]),e._v(" "),t("p",[t("img",{attrs:{src:i(514),alt:"change user view"}}),e._v(" "),t("em",[e._v("Fig. 5: “Change user” - view (desktop view on the left, mobile view on the right)")])]),e._v(" "),t("p",[e._v("The following elements are available in the change users view:")]),e._v(" "),t("ol",[t("li",[e._v("Open or close the navigation sidebar")]),e._v(" "),t("li",[t("strong",[e._v("Active offline user")]),e._v(": the currently active user is recognizable by a black user symbol and the word “active” next to the username. The active user is the user whose grids and configuration are currently used and shown in all other views.")]),e._v(" "),t("li",[t("strong",[e._v("Inactive online user")]),e._v(": The little cloud symbol indicates an online user (see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#user"}},[e._v("Terms")]),e._v(") and the gray user symbol that he is currently inactive, meaning that the user’s grids are currently not used.")],1),e._v(" "),t("li",[t("strong",[e._v("Inactive offline user")]),e._v(": The gray user symbol without a cloud indicates an inactive offline user (see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#user"}},[e._v("Terms")]),e._v(")")],1),e._v(" "),t("li",[t("strong",[e._v("Open")]),e._v(": sets the user “active” and opens the main view, showing the user’s grid(s). Sets all other users inactive, there is always only one active user.")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": deletes the user and all of his grids and configuration. Use with caution, this action cannot be undone. This option is only available for offline users.")]),e._v(" "),t("li",[t("strong",[e._v("Logout")]),e._v(": deletes the user and all of his grids and configuration, but only on the current device. Data in the cloud and on other devices that are logged in with the same user will not be deleted. This option is only available for online users.")]),e._v(" "),t("li",[t("strong",[e._v("Login with other user")]),e._v(": put in username and password of an existing online user in order to add it to the current device. In order to create a new online or offline user, follow one of the links below.")]),e._v(" "),t("li",[t("strong",[e._v("Remember checkbox")]),e._v(": if checked, the newly logged in online user will be saved to the device and listed in the list of users in the current user view. If unchecked the user will only be opened temporarily and no user data will be saved on the device (recommended for logging in on foreign devices).")])]),e._v(" "),t("p",[e._v("For information about offline or online users and how to add them see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/06_users.html"}},[e._v("Users")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"search-function"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#search-function"}},[e._v("#")]),e._v(" Search function")]),e._v(" "),t("p",[e._v("These are the possibilities to open the dialog for searching for grid elements in the current configuration:")]),e._v(" "),t("ol",[t("li",[e._v("Click the button "),t("code",[e._v("Search")]),e._v(" in the top bar in the Main View")]),e._v(" "),t("li",[e._v("Press "),t("code",[e._v("Ctrl + F")]),e._v(" on the keyboard in one of these views: “Main”, “Manage Grids” or “Edit grid”")]),e._v(" "),t("li",[e._v("Click on "),t("code",[e._v("More -> Search")]),e._v(" in the top bar of “Edit grid” view")]),e._v(" "),t("li",[e._v("Grid element action "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html#navigate-to-other-grid"}},[e._v("navigate to other grid")]),e._v(" with navigation type "),t("code",[e._v("Open search dialog")]),e._v(" (e.g. to be added to "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#global-grid"}},[e._v("global grid")]),e._v(" in order to be able to open the search dialog in fullscreen mode).")],1)]),e._v(" "),t("p",[t("img",{attrs:{src:i(515),alt:"change user view"}}),e._v(" "),t("em",[e._v("Fig. 6: Search dialog and search results")])]),e._v(" "),t("p",[e._v("Figure 6 shows the search dialog:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("search term")]),e._v(": text input field for the search term")]),e._v(" "),t("li",[t("strong",[e._v("result image")]),e._v(": directly navigates to the selected element and highlights it. Keyboard shortcut for first search result: "),t("code",[e._v("[Enter]")])]),e._v(" "),t("li",[t("strong",[e._v("result path")]),e._v(": navigates to the selected element step-by-step by highlighting the path beginning from the home grid. Keyboard shortcut for first search result: "),t("code",[e._v("[Ctrl + Enter]")])])]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=n.exports},507:function(e,t,i){e.exports=i.p+"assets/img/main_en.0dfdaa0e.jpg"},508:function(e,t,i){e.exports=i.p+"assets/img/edit_en.c2cbce4a.jpg"},509:function(e,t,i){e.exports=i.p+"assets/img/manage_grids_en.7487da8f.jpg"},510:function(e,t,i){e.exports=i.p+"assets/img/manage_grids_more_en.6f493d95.jpg"},511:function(e,t,i){e.exports=i.p+"assets/img/global_grid_empty_en.27f7b39a.JPG"},512:function(e,t,i){e.exports=i.p+"assets/img/global_grid_en.7962d28c.JPG"},513:function(e,t,i){e.exports=i.p+"assets/img/manage_dict_en.9115ef99.jpg"},514:function(e,t,i){e.exports=i.p+"assets/img/login_en.ea0b3060.jpg"},515:function(e,t,i){e.exports=i.p+"assets/img/search-dialog.cdc09620.png"}}]); \ No newline at end of file diff --git a/assets/js/159.5b1234de.js b/assets/js/160.935099b4.js similarity index 94% rename from assets/js/159.5b1234de.js rename to assets/js/160.935099b4.js index d4b08b0a34..8c1e975a05 100644 --- a/assets/js/159.5b1234de.js +++ b/assets/js/160.935099b4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[159],{1096:function(e,o,i){"use strict";i.r(o);var s=i(2),t=Object(s.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"oscilloscope"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#oscilloscope"}},[e._v("#")]),e._v(" Oscilloscope")]),e._v(" "),o("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),o("p",[e._v("The Oscilloscope provides graphical output of one or two signal values. It is a very basic implementation but useful to visualize sensor values, changes in values and value history. The trace colours and update speed can be configured via component parameters.")]),e._v(" "),o("p",[o("img",{attrs:{src:i(652),alt:"Screenshot: Oscilloscope plugin",title:"Screenshot: Oscilloscope plugin"}})]),e._v(" "),o("p",[e._v("Oscilloscope plugin")]),e._v(" "),o("h2",{attrs:{id:"input-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),o("ul",[o("li",[o("strong",[e._v("in [double]:")]),e._v(" The input signal for the oscilloscope.")])]),e._v(" "),o("h2",{attrs:{id:"properties"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),o("ul",[o("li",[o("strong",[e._v("displayBuffer [integer]:")]),e._v(" This property value specifies how often the oscilloscope window is drawn. For example if the display buffer size is 0, the oscilloscope traces are redrawn at every incoming value. If the display buffer size is set to 10, 10 values are stored in a buffer and drawn at once as the tenth value is received. This significantly reduces the computational resources spent for drawing the oscilloscope, which is useful especially at high update rates.")]),e._v(" "),o("li",[o("strong",[e._v("drawingMode [integer]:")]),e._v(" Declares whether the y axis is adapting to mininum and maximum values automatically or to stay in preset bounds.")]),e._v(" "),o("li",[o("strong",[e._v("displayMode [integer]:")]),e._v(" Affects the time when oscilloscope is redrawn. Can be set to the values “redraw on incoming samples” or “redraw periodically”.")]),e._v(" "),o("li",[o("strong",[e._v("drawInterval [integer]:")]),e._v(" Redraw interval in milliseconds (if periodic drawing is used).")]),e._v(" "),o("li",[o("strong",[e._v("min [integer]:")]),e._v(" Preset minimum value for y axis of oscilloscope.")]),e._v(" "),o("li",[o("strong",[e._v("max [integer]:")]),e._v(" Preset maximum value for y axis of oscilloscope.")]),e._v(" "),o("li",[o("strong",[e._v("gridColor [integer]:")]),e._v(" The colour of the value-grid.")]),e._v(" "),o("li",[o("strong",[e._v("channelColor [integer]:")]),e._v(" The colour of the signal trace for the channel.")]),e._v(" "),o("li",[o("strong",[e._v("backgroundColor [integer]:")]),e._v(" The colour of the background of the oscilloscope window.")]),e._v(" "),o("li",[o("strong",[e._v("fontSize [integer]:")]),e._v(" The size of the oscilloscope’s caption.")]),e._v(" "),o("li",[o("strong",[e._v("caption [string]:")]),e._v(" The caption to be displayed on the oscilloscope.")]),e._v(" "),o("li",[o("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);o.default=t.exports},652:function(e,o,i){e.exports=i.p+"assets/img/oscilloscope.1a3665f5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[160],{1101:function(e,o,i){"use strict";i.r(o);var s=i(2),t=Object(s.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"oscilloscope"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#oscilloscope"}},[e._v("#")]),e._v(" Oscilloscope")]),e._v(" "),o("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),o("p",[e._v("The Oscilloscope provides graphical output of one or two signal values. It is a very basic implementation but useful to visualize sensor values, changes in values and value history. The trace colours and update speed can be configured via component parameters.")]),e._v(" "),o("p",[o("img",{attrs:{src:i(655),alt:"Screenshot: Oscilloscope plugin",title:"Screenshot: Oscilloscope plugin"}})]),e._v(" "),o("p",[e._v("Oscilloscope plugin")]),e._v(" "),o("h2",{attrs:{id:"input-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),o("ul",[o("li",[o("strong",[e._v("in [double]:")]),e._v(" The input signal for the oscilloscope.")])]),e._v(" "),o("h2",{attrs:{id:"properties"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),o("ul",[o("li",[o("strong",[e._v("displayBuffer [integer]:")]),e._v(" This property value specifies how often the oscilloscope window is drawn. For example if the display buffer size is 0, the oscilloscope traces are redrawn at every incoming value. If the display buffer size is set to 10, 10 values are stored in a buffer and drawn at once as the tenth value is received. This significantly reduces the computational resources spent for drawing the oscilloscope, which is useful especially at high update rates.")]),e._v(" "),o("li",[o("strong",[e._v("drawingMode [integer]:")]),e._v(" Declares whether the y axis is adapting to mininum and maximum values automatically or to stay in preset bounds.")]),e._v(" "),o("li",[o("strong",[e._v("displayMode [integer]:")]),e._v(" Affects the time when oscilloscope is redrawn. Can be set to the values “redraw on incoming samples” or “redraw periodically”.")]),e._v(" "),o("li",[o("strong",[e._v("drawInterval [integer]:")]),e._v(" Redraw interval in milliseconds (if periodic drawing is used).")]),e._v(" "),o("li",[o("strong",[e._v("min [integer]:")]),e._v(" Preset minimum value for y axis of oscilloscope.")]),e._v(" "),o("li",[o("strong",[e._v("max [integer]:")]),e._v(" Preset maximum value for y axis of oscilloscope.")]),e._v(" "),o("li",[o("strong",[e._v("gridColor [integer]:")]),e._v(" The colour of the value-grid.")]),e._v(" "),o("li",[o("strong",[e._v("channelColor [integer]:")]),e._v(" The colour of the signal trace for the channel.")]),e._v(" "),o("li",[o("strong",[e._v("backgroundColor [integer]:")]),e._v(" The colour of the background of the oscilloscope window.")]),e._v(" "),o("li",[o("strong",[e._v("fontSize [integer]:")]),e._v(" The size of the oscilloscope’s caption.")]),e._v(" "),o("li",[o("strong",[e._v("caption [string]:")]),e._v(" The caption to be displayed on the oscilloscope.")]),e._v(" "),o("li",[o("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);o.default=t.exports},655:function(e,o,i){e.exports=i.p+"assets/img/oscilloscope.1a3665f5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/160.e765fb94.js b/assets/js/161.8afd852a.js similarity index 95% rename from assets/js/160.e765fb94.js rename to assets/js/161.8afd852a.js index ee999e453b..bb0bff4e40 100644 --- a/assets/js/160.e765fb94.js +++ b/assets/js/161.8afd852a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[160],{1098:function(e,t,n){"use strict";n.r(t);var o=n(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"phone-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#phone-control"}},[e._v("#")]),e._v(" Phone Control")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Phone Interface)")]),e._v(" "),t("p",[e._v("This component controls a mobile phone with Windows Mobile operating system (v. 5.0 and above) through a Bluetooth connection. Currently supported functions are: Calling a phone number and accepting an incoming call, sending and receiving SMS messages. These functions can either be triggered by incoming events or by sending string commands to the phone plugin.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(654),alt:"Screenshot: PhoneControl plugin",title:"Screenshot: PhoneControl plugin"}})]),e._v(" "),t("p",[e._v("PhoneControl plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A Phone running Windows Mobile, a Bluetooth dongle or Bluetooth HW support, Microsoft Bluetooth stack active. AsTeRICS Phone server application running on the mobile phone.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("phoneID [string]:")]),e._v(" This is the phone number which will be used for actions like: send SMS, make phone call.")]),e._v(" "),t("li",[t("strong",[e._v("SMSContent [string]:")]),e._v(" This is the SMS content which will be used for sending SMS action.")]),e._v(" "),t("li",[t("strong",[e._v("command [string]:")]),e._v(" String command that can be sent to this component from other plugins to trigger phone actions. Currently supported commands are:\n"),t("ul",[t("li",[e._v("@PHONE: SMS:Phone_ID, “Message_content”")]),e._v(" "),t("li",[e._v("@PHONE: CALL: Phone_ID")]),e._v(" "),t("li",[e._v("@PHONE: ACCEPT")]),e._v(" "),t("li",[e._v("@PHONE: DROP")])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("remotePhoneID [string]:")]),e._v(" This is a phone number of the caller or SMS sender.")]),e._v(" "),t("li",[t("strong",[e._v("receivedSMS [string]:")]),e._v(" This is the content of the incoming SMS.")]),e._v(" "),t("li",[t("strong",[e._v("errorNumber [integer]:")]),e._v(" The number of the error.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendSMS:")]),e._v(" Sends SMS.")]),e._v(" "),t("li",[t("strong",[e._v("makePhoneCall:")]),e._v(" Makes the phone call.")]),e._v(" "),t("li",[t("strong",[e._v("acceptPhoneCall:")]),e._v(" Accepts the incoming phone call.")]),e._v(" "),t("li",[t("strong",[e._v("dropPhoneCall:")]),e._v(" Drops the phone call.")]),e._v(" "),t("li",[t("strong",[e._v("reconnect:")]),e._v(" Reconnects the phone.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("idleState:")]),e._v(" Phone is in the idle state.")]),e._v(" "),t("li",[t("strong",[e._v("ringState:")]),e._v(" Phone is in the ring state.")]),e._v(" "),t("li",[t("strong",[e._v("connectedState:")]),e._v(" Phone is connected with the remote phone.")]),e._v(" "),t("li",[t("strong",[e._v("newSMS:")]),e._v(" There is a new SMS.")]),e._v(" "),t("li",[t("strong",[e._v("error:")]),e._v(" The error occurs.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("defaultPhoneID [string]:")]),e._v(" This is a default phone number, which will be used for send SMS and make phone call actions.")]),e._v(" "),t("li",[t("strong",[e._v("bluetoothPhoneName [string]:")]),e._v(" This is a Bluetooth name of the phone which the component will connect.")]),e._v(" "),t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This is a Bluetooth port number.")])])])}),[],!1,null,null,null);t.default=r.exports},654:function(e,t,n){e.exports=n.p+"assets/img/phonecontrol.738f8590.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[161],{1102:function(e,t,n){"use strict";n.r(t);var o=n(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"phone-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#phone-control"}},[e._v("#")]),e._v(" Phone Control")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Phone Interface)")]),e._v(" "),t("p",[e._v("This component controls a mobile phone with Windows Mobile operating system (v. 5.0 and above) through a Bluetooth connection. Currently supported functions are: Calling a phone number and accepting an incoming call, sending and receiving SMS messages. These functions can either be triggered by incoming events or by sending string commands to the phone plugin.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(656),alt:"Screenshot: PhoneControl plugin",title:"Screenshot: PhoneControl plugin"}})]),e._v(" "),t("p",[e._v("PhoneControl plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A Phone running Windows Mobile, a Bluetooth dongle or Bluetooth HW support, Microsoft Bluetooth stack active. AsTeRICS Phone server application running on the mobile phone.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("phoneID [string]:")]),e._v(" This is the phone number which will be used for actions like: send SMS, make phone call.")]),e._v(" "),t("li",[t("strong",[e._v("SMSContent [string]:")]),e._v(" This is the SMS content which will be used for sending SMS action.")]),e._v(" "),t("li",[t("strong",[e._v("command [string]:")]),e._v(" String command that can be sent to this component from other plugins to trigger phone actions. Currently supported commands are:\n"),t("ul",[t("li",[e._v("@PHONE: SMS:Phone_ID, “Message_content”")]),e._v(" "),t("li",[e._v("@PHONE: CALL: Phone_ID")]),e._v(" "),t("li",[e._v("@PHONE: ACCEPT")]),e._v(" "),t("li",[e._v("@PHONE: DROP")])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("remotePhoneID [string]:")]),e._v(" This is a phone number of the caller or SMS sender.")]),e._v(" "),t("li",[t("strong",[e._v("receivedSMS [string]:")]),e._v(" This is the content of the incoming SMS.")]),e._v(" "),t("li",[t("strong",[e._v("errorNumber [integer]:")]),e._v(" The number of the error.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendSMS:")]),e._v(" Sends SMS.")]),e._v(" "),t("li",[t("strong",[e._v("makePhoneCall:")]),e._v(" Makes the phone call.")]),e._v(" "),t("li",[t("strong",[e._v("acceptPhoneCall:")]),e._v(" Accepts the incoming phone call.")]),e._v(" "),t("li",[t("strong",[e._v("dropPhoneCall:")]),e._v(" Drops the phone call.")]),e._v(" "),t("li",[t("strong",[e._v("reconnect:")]),e._v(" Reconnects the phone.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("idleState:")]),e._v(" Phone is in the idle state.")]),e._v(" "),t("li",[t("strong",[e._v("ringState:")]),e._v(" Phone is in the ring state.")]),e._v(" "),t("li",[t("strong",[e._v("connectedState:")]),e._v(" Phone is connected with the remote phone.")]),e._v(" "),t("li",[t("strong",[e._v("newSMS:")]),e._v(" There is a new SMS.")]),e._v(" "),t("li",[t("strong",[e._v("error:")]),e._v(" The error occurs.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("defaultPhoneID [string]:")]),e._v(" This is a default phone number, which will be used for send SMS and make phone call actions.")]),e._v(" "),t("li",[t("strong",[e._v("bluetoothPhoneName [string]:")]),e._v(" This is a Bluetooth name of the phone which the component will connect.")]),e._v(" "),t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This is a Bluetooth port number.")])])])}),[],!1,null,null,null);t.default=r.exports},656:function(e,t,n){e.exports=n.p+"assets/img/phonecontrol.738f8590.jpg"}}]); \ No newline at end of file diff --git a/assets/js/161.591f4878.js b/assets/js/162.25b30b75.js similarity index 91% rename from assets/js/161.591f4878.js rename to assets/js/162.25b30b75.js index 8fbfb2b1b0..96b40262ae 100644 --- a/assets/js/161.591f4878.js +++ b/assets/js/162.25b30b75.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[161],{1097:function(t,e,i){"use strict";i.r(e);var n=i(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"picotts-text-to-speech"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#picotts-text-to-speech"}},[t._v("#")]),t._v(" PicoTTS (text-to-speech)")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),t._v(" "),e("p",[t._v("The PicoTTS component creates speech output of given input text.")]),t._v(" "),e("p",[t._v("This component uses the picoTTS binary to create a temporary wavefile, which is played after creation.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(653),alt:"Screenshot: picoTTS plugin",title:"Screenshot: picoTTS plugin"}})]),t._v(" "),e("p",[t._v("picoTTS plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[e("strong",[t._v("Linux environment only!")]),e("br"),t._v("\nPlease install the pico2wave binary with following command (on Debian/Ubuntu based platforms):"),e("br"),t._v(" "),e("em",[t._v("“sudo apt install libttspico-utils”")]),e("br"),t._v("\nIf this plugin is not working (no speech output), please ensure, that the "),e("em",[t._v("aplay")]),t._v(" command is available.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" The text sentence, which will be converted into speech.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("language [choice]:")]),t._v(" Defines the output language. Available by picoTTS: English (UK/US), German, Italian, Spanish, French")])])])}),[],!1,null,null,null);e.default=s.exports},653:function(t,e,i){t.exports=i.p+"assets/img/picotts.5a9c73c4.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[162],{1103:function(t,e,i){"use strict";i.r(e);var n=i(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"picotts-text-to-speech"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#picotts-text-to-speech"}},[t._v("#")]),t._v(" PicoTTS (text-to-speech)")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),t._v(" "),e("p",[t._v("The PicoTTS component creates speech output of given input text.")]),t._v(" "),e("p",[t._v("This component uses the picoTTS binary to create a temporary wavefile, which is played after creation.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(657),alt:"Screenshot: picoTTS plugin",title:"Screenshot: picoTTS plugin"}})]),t._v(" "),e("p",[t._v("picoTTS plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[e("strong",[t._v("Linux environment only!")]),e("br"),t._v("\nPlease install the pico2wave binary with following command (on Debian/Ubuntu based platforms):"),e("br"),t._v(" "),e("em",[t._v("“sudo apt install libttspico-utils”")]),e("br"),t._v("\nIf this plugin is not working (no speech output), please ensure, that the "),e("em",[t._v("aplay")]),t._v(" command is available.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" The text sentence, which will be converted into speech.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("language [choice]:")]),t._v(" Defines the output language. Available by picoTTS: English (UK/US), German, Italian, Spanish, French")])])])}),[],!1,null,null,null);e.default=s.exports},657:function(t,e,i){t.exports=i.p+"assets/img/picotts.5a9c73c4.png"}}]); \ No newline at end of file diff --git a/assets/js/162.4458da60.js b/assets/js/163.7a778e0a.js similarity index 93% rename from assets/js/162.4458da60.js rename to assets/js/163.7a778e0a.js index 524d22f6db..6a91f3a51e 100644 --- a/assets/js/162.4458da60.js +++ b/assets/js/163.7a778e0a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[162],{1100:function(t,e,o){"use strict";o.r(e);var r=o(2),a=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"platform-digital-out"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#platform-digital-out"}},[t._v("#")]),t._v(" Platform Digital Out")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Personal Platform)")]),t._v(" "),e("p",[t._v("The PlatformDigitalOut plugin operates the output ports of the AsTeRICS Personal Platform. The output ports 1-2 are open-collector outputs with a deactivated pull-up resistor.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(656),alt:"Screenshot: PlatformDigitalOut plugin",title:"Screenshot: PlatformDigitalOut plugin"}})]),t._v(" "),e("p",[t._v("PlatformDigitalOut plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the Core CIM (CIM Id: 0x0602) of the AsTeRICS Personal Platform.")]),t._v(" "),e("p",[t._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),t._v(" "),e("p",[t._v("The AsteRICS Personal Platform")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("command [string]:")]),t._v(" The plugin reacts to incoming action strings starting with “@GPIO:” and a command. Valid commands are “set”, “clear”, “toggle” and “press”. The command has to be followed by a comma and the port number, for example: “@GPIO:set,1” or “@GPIO:toggle,2”. The following examples illustrate the available action strings:\n"),e("ul",[e("li",[t._v('_"@DIGITALOUT:set,1":_Output port 1 of the Personal Platform will be set (5 Volt)')]),t._v(" "),e("li",[t._v('_"@DIGITALOUT:clear,2":_Output port 2 of the Personal Platform will be cleared (0 Volt)')]),t._v(" "),e("li",[t._v('_"@DIGITALOUT:toggle,1":_Output port 1 of the Personal Platform will be changed')])])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setOutput1 to setOutput2:")]),t._v(" an incoming event on these ports will cause the corresponding output port to go to the high level.")]),t._v(" "),e("li",[e("strong",[t._v("clearOutput1 to clearOutput2:")]),t._v(" an incoming event on these ports will cause the corresponding output port to go to the low level.")])])])}),[],!1,null,null,null);e.default=a.exports},656:function(t,e,o){t.exports=o.p+"assets/img/platformdigitalout.eb94b6a5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[163],{1104:function(t,e,o){"use strict";o.r(e);var r=o(2),a=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"platform-digital-out"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#platform-digital-out"}},[t._v("#")]),t._v(" Platform Digital Out")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Personal Platform)")]),t._v(" "),e("p",[t._v("The PlatformDigitalOut plugin operates the output ports of the AsTeRICS Personal Platform. The output ports 1-2 are open-collector outputs with a deactivated pull-up resistor.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(658),alt:"Screenshot: PlatformDigitalOut plugin",title:"Screenshot: PlatformDigitalOut plugin"}})]),t._v(" "),e("p",[t._v("PlatformDigitalOut plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the Core CIM (CIM Id: 0x0602) of the AsTeRICS Personal Platform.")]),t._v(" "),e("p",[t._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),t._v(" "),e("p",[t._v("The AsteRICS Personal Platform")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("command [string]:")]),t._v(" The plugin reacts to incoming action strings starting with “@GPIO:” and a command. Valid commands are “set”, “clear”, “toggle” and “press”. The command has to be followed by a comma and the port number, for example: “@GPIO:set,1” or “@GPIO:toggle,2”. The following examples illustrate the available action strings:\n"),e("ul",[e("li",[t._v('_"@DIGITALOUT:set,1":_Output port 1 of the Personal Platform will be set (5 Volt)')]),t._v(" "),e("li",[t._v('_"@DIGITALOUT:clear,2":_Output port 2 of the Personal Platform will be cleared (0 Volt)')]),t._v(" "),e("li",[t._v('_"@DIGITALOUT:toggle,1":_Output port 1 of the Personal Platform will be changed')])])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setOutput1 to setOutput2:")]),t._v(" an incoming event on these ports will cause the corresponding output port to go to the high level.")]),t._v(" "),e("li",[e("strong",[t._v("clearOutput1 to clearOutput2:")]),t._v(" an incoming event on these ports will cause the corresponding output port to go to the low level.")])])])}),[],!1,null,null,null);e.default=a.exports},658:function(t,e,o){t.exports=o.p+"assets/img/platformdigitalout.eb94b6a5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/163.016df633.js b/assets/js/164.eee4465b.js similarity index 89% rename from assets/js/163.016df633.js rename to assets/js/164.eee4465b.js index 579b7f6bcf..e1e80e9130 100644 --- a/assets/js/163.016df633.js +++ b/assets/js/164.eee4465b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[163],{1099:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"platform-lcd"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#platform-lcd"}},[t._v("#")]),t._v(" Platform LCD")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Personal Platform)")]),t._v(" "),e("p",[t._v("The PlatformLCD component handles interaction with the display and the input buttons of the AsTeRICS Personal Platform. The component allows other components to send messages to the display.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(655),alt:"Screenshot: PlatformLCD plugin",title:"Screenshot: PlatformLCD plugin"}})]),t._v(" "),e("p",[t._v("PlatformLCD plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the Core CIM (CIM Id: 0x0601) of the AsTeRICS Personal Platform.")]),t._v(" "),e("p",[t._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),t._v(" "),e("p",[t._v("The AsteRICS Personal Platform")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" The Input of the port will be displayed on the Core CIM’s display")])])])}),[],!1,null,null,null);e.default=s.exports},655:function(t,e,r){t.exports=r.p+"assets/img/platformlcd.86b9e06e.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[164],{1105:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"platform-lcd"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#platform-lcd"}},[t._v("#")]),t._v(" Platform LCD")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Personal Platform)")]),t._v(" "),e("p",[t._v("The PlatformLCD component handles interaction with the display and the input buttons of the AsTeRICS Personal Platform. The component allows other components to send messages to the display.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(659),alt:"Screenshot: PlatformLCD plugin",title:"Screenshot: PlatformLCD plugin"}})]),t._v(" "),e("p",[t._v("PlatformLCD plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the Core CIM (CIM Id: 0x0601) of the AsTeRICS Personal Platform.")]),t._v(" "),e("p",[t._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),t._v(" "),e("p",[t._v("The AsteRICS Personal Platform")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" The Input of the port will be displayed on the Core CIM’s display")])])])}),[],!1,null,null,null);e.default=s.exports},659:function(t,e,r){t.exports=r.p+"assets/img/platformlcd.86b9e06e.jpg"}}]); \ No newline at end of file diff --git a/assets/js/164.ad0b4a6f.js b/assets/js/165.f3d8f3f0.js similarity index 95% rename from assets/js/164.ad0b4a6f.js rename to assets/js/165.f3d8f3f0.js index 734869e97b..da725e2fad 100644 --- a/assets/js/164.ad0b4a6f.js +++ b/assets/js/165.f3d8f3f0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[164],{1106:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"remotewindow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#remotewindow"}},[e._v("#")]),e._v(" RemoteWindow")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("This component allows moving or setting the state of a specific window (which is active and can be identified via the window title) to desired locations on the screen. Several default locations can be selected via incoming events (top, left, bottom, right or center of the screen). X- and Y- offset values can be defined - thus it becomes possible to move the remote window e.g to a second screen.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(664),alt:"Screenshot: RemoteWindow plugin",title:"Screenshot: RemoteWindow plugin"}})]),e._v(" "),t("p",[e._v("RemoteWindow plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" The x offest value for positioning the window")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" The y offest value for positioning the window")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("moveToTop:")]),e._v(" moves the window to the top of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToBottom:")]),e._v(" moves the window to the bottom of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToLeft:")]),e._v(" moves the window to the left side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToRight:")]),e._v(" moves the window to the right side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToCenter:")]),e._v(" moves the window to the center of the screen (x and y offsets will be applied).")]),e._v(" "),t("li",[t("strong",[e._v("minimize:")]),e._v(" minimizes the window to the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("restore:")]),e._v(" restores the window from the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("bringToFront:")]),e._v(" places the window on top of other windows")]),e._v(" "),t("li",[t("strong",[e._v("moveNow:")]),e._v(" moves the window to the selected xPos and yPos positions")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("windowName [string]:")]),e._v(" the window title / name")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer, combobox selection]:")]),e._v(" the search mode for finding the window. If “exact match” is selected, the window title must be exactly the same as the given name. If “contains text” is selected, the any window title which contains the given text will be found. Note that both modes are case-sensitive !")]),e._v(" "),t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" default value for the x offset")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" default value for the y offset")]),e._v(" "),t("li",[t("strong",[e._v("autoSetPosition [boolean]:")]),e._v(" if selected, the position of the window will be set to xPos/yPos at startup")])])])}),[],!1,null,null,null);t.default=n.exports},664:function(e,t,o){e.exports=o.p+"assets/img/remotewindow.4f4d5172.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[165],{1111:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"remotewindow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#remotewindow"}},[e._v("#")]),e._v(" RemoteWindow")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("This component allows moving or setting the state of a specific window (which is active and can be identified via the window title) to desired locations on the screen. Several default locations can be selected via incoming events (top, left, bottom, right or center of the screen). X- and Y- offset values can be defined - thus it becomes possible to move the remote window e.g to a second screen.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(667),alt:"Screenshot: RemoteWindow plugin",title:"Screenshot: RemoteWindow plugin"}})]),e._v(" "),t("p",[e._v("RemoteWindow plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" The x offest value for positioning the window")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" The y offest value for positioning the window")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("moveToTop:")]),e._v(" moves the window to the top of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToBottom:")]),e._v(" moves the window to the bottom of the screen (y offset will be applied). The x position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToLeft:")]),e._v(" moves the window to the left side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToRight:")]),e._v(" moves the window to the right side of the screen (x offset will be applied). The y position will not be changed.")]),e._v(" "),t("li",[t("strong",[e._v("moveToCenter:")]),e._v(" moves the window to the center of the screen (x and y offsets will be applied).")]),e._v(" "),t("li",[t("strong",[e._v("minimize:")]),e._v(" minimizes the window to the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("restore:")]),e._v(" restores the window from the taskbar")]),e._v(" "),t("li",[t("strong",[e._v("bringToFront:")]),e._v(" places the window on top of other windows")]),e._v(" "),t("li",[t("strong",[e._v("moveNow:")]),e._v(" moves the window to the selected xPos and yPos positions")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("windowName [string]:")]),e._v(" the window title / name")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer, combobox selection]:")]),e._v(" the search mode for finding the window. If “exact match” is selected, the window title must be exactly the same as the given name. If “contains text” is selected, the any window title which contains the given text will be found. Note that both modes are case-sensitive !")]),e._v(" "),t("li",[t("strong",[e._v("xPos [integer]:")]),e._v(" default value for the x offset")]),e._v(" "),t("li",[t("strong",[e._v("yPos [integer]:")]),e._v(" default value for the y offset")]),e._v(" "),t("li",[t("strong",[e._v("autoSetPosition [boolean]:")]),e._v(" if selected, the position of the window will be set to xPos/yPos at startup")])])])}),[],!1,null,null,null);t.default=n.exports},667:function(e,t,o){e.exports=o.p+"assets/img/remotewindow.4f4d5172.jpg"}}]); \ No newline at end of file diff --git a/assets/js/165.ffcc7760.js b/assets/js/166.2beada29.js similarity index 93% rename from assets/js/165.ffcc7760.js rename to assets/js/166.2beada29.js index 57b28e6a14..35ae14efde 100644 --- a/assets/js/165.ffcc7760.js +++ b/assets/js/166.2beada29.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[165],{1107:function(t,e,i){"use strict";i.r(e);var r=i(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ssvep-file-writer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssvep-file-writer"}},[t._v("#")]),t._v(" SSVEP File Writer")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Brain Computer Interface)")]),t._v(" "),e("p",[t._v("This plugin writes to a text file the 4 EEG channels along with a software trigger received through the event listener ports. This file is lately analyzed by the "),e("a",{attrs:{href:"../processors/ProtocolSSVEPTrain.htm"}},[t._v("ProtocolSSVEPTrain")]),t._v(" plugin to obtain the optimus frequencies to be used on the SSVEP detection.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(665),alt:"Screenshot: SSVEPFileWriter plugin",title:"Screenshot: SSVEPFileWriter plugin"}})]),t._v(" "),e("p",[t._v("SSVEPFileWriter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("filename [string]:")]),t._v(" Name of the file to be saved.")]),t._v(" "),e("li",[e("strong",[t._v("channel1 to channel4 [integer]:")]),t._v(" Input EEG signal from channels 1 to 4.")]),t._v(" "),e("li",[e("strong",[t._v("StimulationFrequency [integer]:")]),t._v(" If a stimulation frequency value is received before the StarStimulation Event the stimulation freqeuncy is appended to the name of the output file to be saved.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartTrial:")]),t._v(" An incoming event at this port starts the file writer process.")]),t._v(" "),e("li",[e("strong",[t._v("StopTrial:")]),t._v(" An incoming event at this port stops the file writer process.")]),t._v(" "),e("li",[e("strong",[t._v("StartStimulation:")]),t._v(" An incoming event at this port sets the trigger channel to the corresponding stimulation frequency value in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("StopStimulation:")]),t._v(" An incoming event at this port sets the trigger channel to zeros.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("DefaultFileName [string]:")]),t._v(" The default file name.")])])])}),[],!1,null,null,null);e.default=n.exports},665:function(t,e,i){t.exports=i.p+"assets/img/ssvepfilewriter.8aaaba2b.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[166],{1113:function(t,e,i){"use strict";i.r(e);var r=i(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ssvep-file-writer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssvep-file-writer"}},[t._v("#")]),t._v(" SSVEP File Writer")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Brain Computer Interface)")]),t._v(" "),e("p",[t._v("This plugin writes to a text file the 4 EEG channels along with a software trigger received through the event listener ports. This file is lately analyzed by the "),e("a",{attrs:{href:"../processors/ProtocolSSVEPTrain.htm"}},[t._v("ProtocolSSVEPTrain")]),t._v(" plugin to obtain the optimus frequencies to be used on the SSVEP detection.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(669),alt:"Screenshot: SSVEPFileWriter plugin",title:"Screenshot: SSVEPFileWriter plugin"}})]),t._v(" "),e("p",[t._v("SSVEPFileWriter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("filename [string]:")]),t._v(" Name of the file to be saved.")]),t._v(" "),e("li",[e("strong",[t._v("channel1 to channel4 [integer]:")]),t._v(" Input EEG signal from channels 1 to 4.")]),t._v(" "),e("li",[e("strong",[t._v("StimulationFrequency [integer]:")]),t._v(" If a stimulation frequency value is received before the StarStimulation Event the stimulation freqeuncy is appended to the name of the output file to be saved.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartTrial:")]),t._v(" An incoming event at this port starts the file writer process.")]),t._v(" "),e("li",[e("strong",[t._v("StopTrial:")]),t._v(" An incoming event at this port stops the file writer process.")]),t._v(" "),e("li",[e("strong",[t._v("StartStimulation:")]),t._v(" An incoming event at this port sets the trigger channel to the corresponding stimulation frequency value in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("StopStimulation:")]),t._v(" An incoming event at this port sets the trigger channel to zeros.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("DefaultFileName [string]:")]),t._v(" The default file name.")])])])}),[],!1,null,null,null);e.default=n.exports},669:function(t,e,i){t.exports=i.p+"assets/img/ssvepfilewriter.8aaaba2b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/166.0a403e7d.js b/assets/js/167.85370959.js similarity index 94% rename from assets/js/166.0a403e7d.js rename to assets/js/167.85370959.js index 8f8207e04e..01c1cefc75 100644 --- a/assets/js/166.0a403e7d.js +++ b/assets/js/167.85370959.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[166],{1109:function(t,e,i){"use strict";i.r(e);var r=i(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ssvep-stimulator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssvep-stimulator"}},[t._v("#")]),t._v(" SSVEP Stimulator")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Brain Computer Interface)")]),t._v(" "),e("p",[t._v("This plug-in allows the user to interact with the SW-generated flickering surfaces (panels) for SSVEP stimulation. The stimulation frequency of the panels can be modified before the stimulation is started.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(667),alt:"Screenshot: SSVEPStimulator application",title:"Screenshot: SSVEPStimulator application"}})]),t._v(" "),e("p",[t._v("SSVEPStimulator application")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("A recent version of DirectX has to be installed.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("frequency [integer]:")]),t._v(" the stimulation frequency the SW-generated panel in Hertz. The value ranges from 1 to 20 Hertz.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("startStim:")]),t._v(" starts the stimulation of the SW-generated flickering panels when receiving an event.")]),t._v(" "),e("li",[e("strong",[t._v("stopStim:")]),t._v(" stops the stimulation of the SW-generated flickering panels when receiving an event.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("stimPeriodFinished:")]),t._v(" an event is emitted through this port when the stimulation period of N miliseconds has finished.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("onBitmapFile [string]:")]),t._v(" filename of a bitmap file which is used in the on-phase of the stimulation. The file is expected in the data/SSVEPStimulator subfolder of the ARE. The filename is given without extenstion (e.g. “arrow_up” for the file “ARE/data/SSVEPStimulator/arrow_up.bmp”)")]),t._v(" "),e("li",[e("strong",[t._v("offBitmapFile [string]:")]),t._v(" filename of a bitmap file which is used in the off-phase of the stimulation. (same filname format as above)")]),t._v(" "),e("li",[e("strong",[t._v("xPosition [integer]:")]),t._v(" x-position of the flickering surface on the desktop/screen.")]),t._v(" "),e("li",[e("strong",[t._v("yPosition [integer]:")]),t._v(" y-position of the flickering surface on the desktop/screen.")]),t._v(" "),e("li",[e("strong",[t._v("frequency [integer]:")]),t._v(" default stimulation frequency of in Hertz. This property ranges from 1 to 20 Hertz.")]),t._v(" "),e("li",[e("strong",[t._v("msec [integer]:")]),t._v(" duration in miliseconds of the stimulation started by the startStimPeriod event.")])])])}),[],!1,null,null,null);e.default=s.exports},667:function(t,e,i){t.exports=i.p+"assets/img/ssvepstimulator.3255d351.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[167],{1112:function(t,e,i){"use strict";i.r(e);var r=i(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ssvep-stimulator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssvep-stimulator"}},[t._v("#")]),t._v(" SSVEP Stimulator")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Brain Computer Interface)")]),t._v(" "),e("p",[t._v("This plug-in allows the user to interact with the SW-generated flickering surfaces (panels) for SSVEP stimulation. The stimulation frequency of the panels can be modified before the stimulation is started.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(668),alt:"Screenshot: SSVEPStimulator application",title:"Screenshot: SSVEPStimulator application"}})]),t._v(" "),e("p",[t._v("SSVEPStimulator application")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("A recent version of DirectX has to be installed.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("frequency [integer]:")]),t._v(" the stimulation frequency the SW-generated panel in Hertz. The value ranges from 1 to 20 Hertz.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("startStim:")]),t._v(" starts the stimulation of the SW-generated flickering panels when receiving an event.")]),t._v(" "),e("li",[e("strong",[t._v("stopStim:")]),t._v(" stops the stimulation of the SW-generated flickering panels when receiving an event.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("stimPeriodFinished:")]),t._v(" an event is emitted through this port when the stimulation period of N miliseconds has finished.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("onBitmapFile [string]:")]),t._v(" filename of a bitmap file which is used in the on-phase of the stimulation. The file is expected in the data/SSVEPStimulator subfolder of the ARE. The filename is given without extenstion (e.g. “arrow_up” for the file “ARE/data/SSVEPStimulator/arrow_up.bmp”)")]),t._v(" "),e("li",[e("strong",[t._v("offBitmapFile [string]:")]),t._v(" filename of a bitmap file which is used in the off-phase of the stimulation. (same filname format as above)")]),t._v(" "),e("li",[e("strong",[t._v("xPosition [integer]:")]),t._v(" x-position of the flickering surface on the desktop/screen.")]),t._v(" "),e("li",[e("strong",[t._v("yPosition [integer]:")]),t._v(" y-position of the flickering surface on the desktop/screen.")]),t._v(" "),e("li",[e("strong",[t._v("frequency [integer]:")]),t._v(" default stimulation frequency of in Hertz. This property ranges from 1 to 20 Hertz.")]),t._v(" "),e("li",[e("strong",[t._v("msec [integer]:")]),t._v(" duration in miliseconds of the stimulation started by the startStimPeriod event.")])])])}),[],!1,null,null,null);e.default=s.exports},668:function(t,e,i){t.exports=i.p+"assets/img/ssvepstimulator.3255d351.jpg"}}]); \ No newline at end of file diff --git a/assets/js/167.c385f56f.js b/assets/js/168.12e714da.js similarity index 92% rename from assets/js/167.c385f56f.js rename to assets/js/168.12e714da.js index d5bd534aef..1812fd2ac0 100644 --- a/assets/js/167.c385f56f.js +++ b/assets/js/168.12e714da.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[167],{1110:function(e,t,s){"use strict";s.r(t);var a=s(2),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"serialsender"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#serialsender"}},[e._v("#")]),e._v(" SerialSender")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Generic Control Output)")]),e._v(" "),t("p",[e._v("The Serialsender can be used to send structured data to Serial devices. It has 16 data slots. Whenever a send event occurs the plugin sends every slot which is active to the device, beginning with slot0")]),e._v(" "),t("p",[t("img",{attrs:{src:s(668),alt:"Screenshot: SerialSender plugin",title:"Screenshot: SerialSender plugin"}})]),e._v(" "),t("p",[e._v("SerialSender plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("slot0 - slot15 [int]:")]),e._v(" Input data for each slot. The lower 8 Bit of the input will be sent when the slot is set Active and a send event occurs")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [string]:")]),e._v(" Defines the COM Port of the target serial device. e.g. COM0")]),e._v(" "),t("li",[t("strong",[e._v("BaudRate [integer]:")]),e._v(" Defines the Baudrate for the communication. It must match the baudrate of the target device")]),e._v(" "),t("li",[e._v("**Slot[0-15] [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the default value of a slot. This value will be overridden if there is data available at the corresponding input slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Active [boolean]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Activate a Slot. Whenever a send event occurs the SerialSender will iterate over all Slots beginning with slot 0 and send the data of every Active Slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Delay [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the delay the plugin should wait before sending data to a slot.")])])])}),[],!1,null,null,null);t.default=i.exports},668:function(e,t,s){e.exports=s.p+"assets/img/serialsender.58f95c8a.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[168],{1115:function(e,t,s){"use strict";s.r(t);var a=s(2),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"serialsender"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#serialsender"}},[e._v("#")]),e._v(" SerialSender")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Generic Control Output)")]),e._v(" "),t("p",[e._v("The Serialsender can be used to send structured data to Serial devices. It has 16 data slots. Whenever a send event occurs the plugin sends every slot which is active to the device, beginning with slot0")]),e._v(" "),t("p",[t("img",{attrs:{src:s(671),alt:"Screenshot: SerialSender plugin",title:"Screenshot: SerialSender plugin"}})]),e._v(" "),t("p",[e._v("SerialSender plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("slot0 - slot15 [int]:")]),e._v(" Input data for each slot. The lower 8 Bit of the input will be sent when the slot is set Active and a send event occurs")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [string]:")]),e._v(" Defines the COM Port of the target serial device. e.g. COM0")]),e._v(" "),t("li",[t("strong",[e._v("BaudRate [integer]:")]),e._v(" Defines the Baudrate for the communication. It must match the baudrate of the target device")]),e._v(" "),t("li",[e._v("**Slot[0-15] [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the default value of a slot. This value will be overridden if there is data available at the corresponding input slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Active [boolean]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Activate a Slot. Whenever a send event occurs the SerialSender will iterate over all Slots beginning with slot 0 and send the data of every Active Slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Delay [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the delay the plugin should wait before sending data to a slot.")])])])}),[],!1,null,null,null);t.default=i.exports},671:function(e,t,s){e.exports=s.p+"assets/img/serialsender.58f95c8a.png"}}]); \ No newline at end of file diff --git a/assets/js/168.48daccda.js b/assets/js/169.97c585ce.js similarity index 95% rename from assets/js/168.48daccda.js rename to assets/js/169.97c585ce.js index 4a7da11393..58412a3cc5 100644 --- a/assets/js/168.48daccda.js +++ b/assets/js/169.97c585ce.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[168],{1108:function(t,e,o){"use strict";o.r(e);var i=o(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"skywatchermount"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#skywatchermount"}},[t._v("#")]),t._v(" SkyWatcherMount")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Others)")]),t._v(" "),e("p",[t._v("The SkyWatcher plugin can be used to control telescope mounts using the Nexstar 5 protocol, e.g. Skywatcher AllView, Skywatcher Merlin via Synscan hand control.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(666),alt:"Screenshot: SkyWatcherMount plugin",title:"Screenshot: SkyWatcherMount plugin"}})]),t._v(" "),e("p",[t._v("SkyWatcherMount plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("A Nexstar5 compatible telescope mount connected to the target computer via a serial connection")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("speed [integer]:")]),t._v(" defines the movement speed of the mount (range: 0-9)")]),t._v(" "),e("li",[e("strong",[t._v("panPosition [integer]:")]),t._v(" defines the target position in steps for the pan axis for the goto command")]),t._v(" "),e("li",[e("strong",[t._v("tiltPosition [integer]:")]),t._v(" defines the target position in steps for the tilt axis for the goto command")]),t._v(" "),e("li",[e("strong",[t._v("endPointLeft [integer]:")]),t._v(" defines the maximum position the pan axis can move to the left")]),t._v(" "),e("li",[e("strong",[t._v("endPointRight [integer]:")]),t._v(" defines the maximum position the pan axis can move to the right")]),t._v(" "),e("li",[e("strong",[t._v("endPointUp [integer]:")]),t._v(" defines the maximum position the tilt axis can move up")]),t._v(" "),e("li",[e("strong",[t._v("endPointDown [integer]:")]),t._v(" defines the maximum position the tilt axis can move down")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("posX [integer]:")]),t._v(" the actual position of the pan axis in steps")]),t._v(" "),e("li",[e("strong",[t._v("posY [integer]:")]),t._v(" the actual position of the tilt axis in steps")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("goLeft:")]),t._v(" moves the mount endless to the left")]),t._v(" "),e("li",[e("strong",[t._v("goRight:")]),t._v(" moves the mount endless to the right")]),t._v(" "),e("li",[e("strong",[t._v("goUp:")]),t._v(" moves the mount endless upwards")]),t._v(" "),e("li",[e("strong",[t._v("goDown:")]),t._v(" moves the mount endless downwards")]),t._v(" "),e("li",[e("strong",[t._v("stopPan:")]),t._v(" stops the movement of the pan axis")]),t._v(" "),e("li",[e("strong",[t._v("stopTilt:")]),t._v(" stops the movement of the tilt axis")]),t._v(" "),e("li",[e("strong",[t._v("stop:")]),t._v(" stops the movement of the pan and tilt axis")]),t._v(" "),e("li",[e("strong",[t._v("goToPanPosition:")]),t._v(" move the pan axis to the step position specified by the panPosition input port")]),t._v(" "),e("li",[e("strong",[t._v("goToTiltPosition:")]),t._v(" move the tilt axis to the step position specified by the tiltPosition input port")]),t._v(" "),e("li",[e("strong",[t._v("triggerOn:")]),t._v(" if the mount has a shutter for a digital camera, the shutter is set to 1")]),t._v(" "),e("li",[e("strong",[t._v("triggerOff:")]),t._v(" if the mount has a shutter for a digital camera, the shutter is set to 0")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("SerialPort [string]:")]),t._v(" The serial port of the mount, e.g. COM1")]),t._v(" "),e("li",[e("strong",[t._v("EndPointsActive [boolean]:")]),t._v(" defines if the movement boundaries set by the endpoints are active or not.")])])])}),[],!1,null,null,null);e.default=s.exports},666:function(t,e,o){t.exports=o.p+"assets/img/skywatcher.b394a10b.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[169],{1114:function(t,e,o){"use strict";o.r(e);var i=o(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"skywatchermount"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#skywatchermount"}},[t._v("#")]),t._v(" SkyWatcherMount")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Others)")]),t._v(" "),e("p",[t._v("The SkyWatcher plugin can be used to control telescope mounts using the Nexstar 5 protocol, e.g. Skywatcher AllView, Skywatcher Merlin via Synscan hand control.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(670),alt:"Screenshot: SkyWatcherMount plugin",title:"Screenshot: SkyWatcherMount plugin"}})]),t._v(" "),e("p",[t._v("SkyWatcherMount plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("A Nexstar5 compatible telescope mount connected to the target computer via a serial connection")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("speed [integer]:")]),t._v(" defines the movement speed of the mount (range: 0-9)")]),t._v(" "),e("li",[e("strong",[t._v("panPosition [integer]:")]),t._v(" defines the target position in steps for the pan axis for the goto command")]),t._v(" "),e("li",[e("strong",[t._v("tiltPosition [integer]:")]),t._v(" defines the target position in steps for the tilt axis for the goto command")]),t._v(" "),e("li",[e("strong",[t._v("endPointLeft [integer]:")]),t._v(" defines the maximum position the pan axis can move to the left")]),t._v(" "),e("li",[e("strong",[t._v("endPointRight [integer]:")]),t._v(" defines the maximum position the pan axis can move to the right")]),t._v(" "),e("li",[e("strong",[t._v("endPointUp [integer]:")]),t._v(" defines the maximum position the tilt axis can move up")]),t._v(" "),e("li",[e("strong",[t._v("endPointDown [integer]:")]),t._v(" defines the maximum position the tilt axis can move down")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("posX [integer]:")]),t._v(" the actual position of the pan axis in steps")]),t._v(" "),e("li",[e("strong",[t._v("posY [integer]:")]),t._v(" the actual position of the tilt axis in steps")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("goLeft:")]),t._v(" moves the mount endless to the left")]),t._v(" "),e("li",[e("strong",[t._v("goRight:")]),t._v(" moves the mount endless to the right")]),t._v(" "),e("li",[e("strong",[t._v("goUp:")]),t._v(" moves the mount endless upwards")]),t._v(" "),e("li",[e("strong",[t._v("goDown:")]),t._v(" moves the mount endless downwards")]),t._v(" "),e("li",[e("strong",[t._v("stopPan:")]),t._v(" stops the movement of the pan axis")]),t._v(" "),e("li",[e("strong",[t._v("stopTilt:")]),t._v(" stops the movement of the tilt axis")]),t._v(" "),e("li",[e("strong",[t._v("stop:")]),t._v(" stops the movement of the pan and tilt axis")]),t._v(" "),e("li",[e("strong",[t._v("goToPanPosition:")]),t._v(" move the pan axis to the step position specified by the panPosition input port")]),t._v(" "),e("li",[e("strong",[t._v("goToTiltPosition:")]),t._v(" move the tilt axis to the step position specified by the tiltPosition input port")]),t._v(" "),e("li",[e("strong",[t._v("triggerOn:")]),t._v(" if the mount has a shutter for a digital camera, the shutter is set to 1")]),t._v(" "),e("li",[e("strong",[t._v("triggerOff:")]),t._v(" if the mount has a shutter for a digital camera, the shutter is set to 0")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("SerialPort [string]:")]),t._v(" The serial port of the mount, e.g. COM1")]),t._v(" "),e("li",[e("strong",[t._v("EndPointsActive [boolean]:")]),t._v(" defines if the movement boundaries set by the endpoints are active or not.")])])])}),[],!1,null,null,null);e.default=s.exports},670:function(t,e,o){t.exports=o.p+"assets/img/skywatcher.b394a10b.png"}}]); \ No newline at end of file diff --git a/assets/js/17.d1fa5bad.js b/assets/js/17.94313f94.js similarity index 91% rename from assets/js/17.d1fa5bad.js rename to assets/js/17.94313f94.js index 24cd478e64..70ea525a85 100644 --- a/assets/js/17.d1fa5bad.js +++ b/assets/js/17.94313f94.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{281:function(t,e,s){},282:function(t,e,s){"use strict";var a={name:"Linker",props:{to:{type:[String,Boolean],default:!1},tab:{type:Boolean,default:!1}},computed:{external(){return null!==/^https?\:\/\//.exec(this.to)}}},i=s(2),r=Object(i.a)(a,(function(){var t=this,e=t._self._c;return e("div",[t.external?e("a",{staticStyle:{display:"block"},attrs:{tabindex:t.tab?0:-1,href:t.to,rel:t.tab?"noopener":"",target:t.tab?"_blank":""}},[t._t("default")],2):t.to?e("router-link",{staticStyle:{display:"block"},attrs:{to:t.to}},[t._t("default")],2):t._t("default")],2)}),[],!1,null,"5a1af088",null);e.a=r.exports},316:function(t,e,s){"use strict";s(281)},333:function(t,e,s){"use strict";var a={name:"Figure",props:{src:{type:String,required:!0},zoom:{type:Boolean,default:!0},alt:{type:String,default:""},scale:{type:Number,default:1}},computed:{source(){return this.src.startsWith("/")?this.$withBase(this.src):this.src}}},i=(s(316),s(2)),r=Object(i.a)(a,(function(){var t=this._self._c;return t("div",{staticClass:"container",class:{"no-zoom":!this.zoom}},[t("img",{style:{transform:`scale(${this.scale})`},attrs:{src:this.source,alt:this.alt}})])}),[],!1,null,"3d11415a",null);e.a=r.exports},354:function(t,e,s){},355:function(t,e,s){},871:function(t,e,s){"use strict";s(354)},872:function(t,e,s){"use strict";s(355)},915:function(t,e,s){"use strict";s.r(e);var a=s(333),i=s(282),r={name:"Partner",components:{Figure:a.a,Linker:i.a},props:{media:{type:String,default:""},alt:{type:String,default:""},href:{type:String,default:""},scale:{type:String,default:"1"}},computed:{isYoutube(){const t=[/https:\/\/.*youtube\.com.*v=(.*?)(&.*)?$/,/https?:\/\/.*youtu\.be\/(.*?)(\?.*)?$/].find(t=>t.exec(this.media));return!(!this.media||!t)&&this.media.replace(t,(t,e)=>e)}}},n=(s(871),s(872),s(2)),u=Object(n.a)(r,(function(){var t=this._self._c;return t("li",[this.media&&!this.isYoutube?t("Linker",{staticClass:"partner",attrs:{to:this.href}},[t("Figure",{attrs:{src:this.media,zoom:!1,alt:this.alt,scale:Number(this.scale)}})],1):this._e()],1)}),[],!1,null,"493e9e4b",null);e.default=u.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{281:function(t,e,s){},282:function(t,e,s){"use strict";var a={name:"Linker",props:{to:{type:[String,Boolean],default:!1},tab:{type:Boolean,default:!1}},computed:{external(){return null!==/^https?\:\/\//.exec(this.to)}}},i=s(2),r=Object(i.a)(a,(function(){var t=this,e=t._self._c;return e("div",[t.external?e("a",{staticStyle:{display:"block"},attrs:{tabindex:t.tab?0:-1,href:t.to,rel:t.tab?"noopener":"",target:t.tab?"_blank":""}},[t._t("default")],2):t.to?e("router-link",{staticStyle:{display:"block"},attrs:{to:t.to}},[t._t("default")],2):t._t("default")],2)}),[],!1,null,"5a1af088",null);e.a=r.exports},316:function(t,e,s){"use strict";s(281)},333:function(t,e,s){"use strict";var a={name:"Figure",props:{src:{type:String,required:!0},zoom:{type:Boolean,default:!0},alt:{type:String,default:""},scale:{type:Number,default:1}},computed:{source(){return this.src.startsWith("/")?this.$withBase(this.src):this.src}}},i=(s(316),s(2)),r=Object(i.a)(a,(function(){var t=this._self._c;return t("div",{staticClass:"container",class:{"no-zoom":!this.zoom}},[t("img",{style:{transform:`scale(${this.scale})`},attrs:{src:this.source,alt:this.alt}})])}),[],!1,null,"3d11415a",null);e.a=r.exports},354:function(t,e,s){},355:function(t,e,s){},874:function(t,e,s){"use strict";s(354)},875:function(t,e,s){"use strict";s(355)},918:function(t,e,s){"use strict";s.r(e);var a=s(333),i=s(282),r={name:"Partner",components:{Figure:a.a,Linker:i.a},props:{media:{type:String,default:""},alt:{type:String,default:""},href:{type:String,default:""},scale:{type:String,default:"1"}},computed:{isYoutube(){const t=[/https:\/\/.*youtube\.com.*v=(.*?)(&.*)?$/,/https?:\/\/.*youtu\.be\/(.*?)(\?.*)?$/].find(t=>t.exec(this.media));return!(!this.media||!t)&&this.media.replace(t,(t,e)=>e)}}},n=(s(874),s(875),s(2)),u=Object(n.a)(r,(function(){var t=this._self._c;return t("li",[this.media&&!this.isYoutube?t("Linker",{staticClass:"partner",attrs:{to:this.href}},[t("Figure",{attrs:{src:this.media,zoom:!1,alt:this.alt,scale:Number(this.scale)}})],1):this._e()],1)}),[],!1,null,"493e9e4b",null);e.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/169.bd04dba7.js b/assets/js/170.092da6b9.js similarity index 91% rename from assets/js/169.bd04dba7.js rename to assets/js/170.092da6b9.js index f84e2ac6dc..caa253f8c6 100644 --- a/assets/js/169.bd04dba7.js +++ b/assets/js/170.092da6b9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[169],{1111:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("The Synthetic Voice component uses the SAPI 5 technology to generate synthetic voice.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(669),alt:"Screenshot: SyntheticVoice plugin",title:"Screenshot: SyntheticVoice plugin"}})]),e._v(" "),t("p",[e._v("SyntheticVoice plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The appropriate voice should be installed on the platform.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [string]:")]),e._v(" The text sentence, which will be converted into speech.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("volume [integer]:")]),e._v(" Defines the volume of the voice. The volume property values should be in range from 0 to 100.")]),e._v(" "),t("li",[t("strong",[e._v("speed [integer]:")]),e._v(" Defines the speed of the voice. The speed property values should be in range from -10 to 10.")]),e._v(" "),t("li",[t("strong",[e._v("voice [string]:")]),e._v(" Specifies the voice used for the speech synthesis.")]),e._v(" "),t("li",[t("strong",[e._v("xmlTags [boolean]:")]),e._v(" Defines if the XML tags in the input text will be suported.")])])])}),[],!1,null,null,null);t.default=s.exports},669:function(e,t,i){e.exports=i.p+"assets/img/syntheticvoice.87548358.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[170],{1117:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("The Synthetic Voice component uses the SAPI 5 technology to generate synthetic voice.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(675),alt:"Screenshot: SyntheticVoice plugin",title:"Screenshot: SyntheticVoice plugin"}})]),e._v(" "),t("p",[e._v("SyntheticVoice plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The appropriate voice should be installed on the platform.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [string]:")]),e._v(" The text sentence, which will be converted into speech.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("volume [integer]:")]),e._v(" Defines the volume of the voice. The volume property values should be in range from 0 to 100.")]),e._v(" "),t("li",[t("strong",[e._v("speed [integer]:")]),e._v(" Defines the speed of the voice. The speed property values should be in range from -10 to 10.")]),e._v(" "),t("li",[t("strong",[e._v("voice [string]:")]),e._v(" Specifies the voice used for the speech synthesis.")]),e._v(" "),t("li",[t("strong",[e._v("xmlTags [boolean]:")]),e._v(" Defines if the XML tags in the input text will be suported.")])])])}),[],!1,null,null,null);t.default=s.exports},675:function(e,t,i){e.exports=i.p+"assets/img/syntheticvoice.87548358.jpg"}}]); \ No newline at end of file diff --git a/assets/js/170.998ddd26.js b/assets/js/171.af758d19.js similarity index 94% rename from assets/js/170.998ddd26.js rename to assets/js/171.af758d19.js index 91cd588662..826da560a9 100644 --- a/assets/js/170.998ddd26.js +++ b/assets/js/171.af758d19.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[170],{1113:function(t,e,r){"use strict";r.r(e);var n=r(2),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"textarea"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#textarea"}},[t._v("#")]),t._v(" TextArea")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("The TextArea is a GUI component which displays (optionally user-editable) text information. It features multiple rows and a scrollbar, and event for appending string text, deleting characters or sending the text content")]),t._v(" "),e("p",[e("img",{attrs:{src:r(673),alt:"Screenshot: TextArea plugin",title:"Screenshot: TextArea plugin"}})]),t._v(" "),e("p",[t._v("TextArea plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setText [string]:")]),t._v(" The text which will be displayed. It replaces the prior content of the Text Area.")]),t._v(" "),e("li",[e("strong",[t._v("appendText [string]:")]),t._v(" This string input will be appended to te current content of the Text Area.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("text [string]:")]),t._v(" The current content of the text area. Sent on incoming events at the “send” or “sendAndClear” event listener ports")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delete:")]),t._v(" Removes the last charater from the text area content.")]),t._v(" "),e("li",[e("strong",[t._v("clear:")]),t._v(" Clears the text area content.")]),t._v(" "),e("li",[e("strong",[t._v("send:")]),t._v(" Sends the text area content to te output port.")]),t._v(" "),e("li",[e("strong",[t._v("sendAndClear:")]),t._v(" Sends the text area content to te output port and clears the text area.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clicked:")]),t._v(" The event is trigger when the user click on the component.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("caption [string]:")]),t._v(" Caption of the component.")]),t._v(" "),e("li",[e("strong",[t._v("default [string]:")]),t._v(" Default content of the text area.")]),t._v(" "),e("li",[e("strong",[t._v("editable [bolean]:")]),t._v(" Defines if the text area can be edited by the user.")]),t._v(" "),e("li",[e("strong",[t._v("fontSize [integer]:")]),t._v(" The font size in pixels.")]),t._v(" "),e("li",[e("strong",[t._v("textColor [integer]:")]),t._v(" Defines color of the text.")]),t._v(" "),e("li",[e("strong",[t._v("backgroundColor [integer]:")]),t._v(" Defines background color.")]),t._v(" "),e("li",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);e.default=i.exports},673:function(t,e,r){t.exports=r.p+"assets/img/textarea.b8330bde.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{1118:function(t,e,r){"use strict";r.r(e);var n=r(2),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"textarea"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#textarea"}},[t._v("#")]),t._v(" TextArea")]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("The TextArea is a GUI component which displays (optionally user-editable) text information. It features multiple rows and a scrollbar, and event for appending string text, deleting characters or sending the text content")]),t._v(" "),e("p",[e("img",{attrs:{src:r(676),alt:"Screenshot: TextArea plugin",title:"Screenshot: TextArea plugin"}})]),t._v(" "),e("p",[t._v("TextArea plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setText [string]:")]),t._v(" The text which will be displayed. It replaces the prior content of the Text Area.")]),t._v(" "),e("li",[e("strong",[t._v("appendText [string]:")]),t._v(" This string input will be appended to te current content of the Text Area.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("text [string]:")]),t._v(" The current content of the text area. Sent on incoming events at the “send” or “sendAndClear” event listener ports")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delete:")]),t._v(" Removes the last charater from the text area content.")]),t._v(" "),e("li",[e("strong",[t._v("clear:")]),t._v(" Clears the text area content.")]),t._v(" "),e("li",[e("strong",[t._v("send:")]),t._v(" Sends the text area content to te output port.")]),t._v(" "),e("li",[e("strong",[t._v("sendAndClear:")]),t._v(" Sends the text area content to te output port and clears the text area.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clicked:")]),t._v(" The event is trigger when the user click on the component.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("caption [string]:")]),t._v(" Caption of the component.")]),t._v(" "),e("li",[e("strong",[t._v("default [string]:")]),t._v(" Default content of the text area.")]),t._v(" "),e("li",[e("strong",[t._v("editable [bolean]:")]),t._v(" Defines if the text area can be edited by the user.")]),t._v(" "),e("li",[e("strong",[t._v("fontSize [integer]:")]),t._v(" The font size in pixels.")]),t._v(" "),e("li",[e("strong",[t._v("textColor [integer]:")]),t._v(" Defines color of the text.")]),t._v(" "),e("li",[e("strong",[t._v("backgroundColor [integer]:")]),t._v(" Defines background color.")]),t._v(" "),e("li",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);e.default=i.exports},676:function(t,e,r){t.exports=r.p+"assets/img/textarea.b8330bde.jpg"}}]); \ No newline at end of file diff --git a/assets/js/171.75dc56ea.js b/assets/js/172.04d1372c.js similarity index 93% rename from assets/js/171.75dc56ea.js rename to assets/js/172.04d1372c.js index e958ba6606..7f48daea86 100644 --- a/assets/js/171.75dc56ea.js +++ b/assets/js/172.04d1372c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{1114:function(t,e,r){"use strict";r.r(e);var i=r(2),n=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h3",{attrs:{id:"component-type-actuator-subcategory-graphical-user-interface"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-graphical-user-interface"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("The Text Display is the GUI component, which displays the text information.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(674),alt:"Screenshot: TextDisplay plugin",title:"Screenshot: TextDisplay plugin"}})]),t._v(" "),e("p",[t._v("TextDisplay plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" The text which will be displayed. "),e("strong",[t._v("This input port supports synchronization")])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clear:")]),t._v(" Removes the text from the component.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clicked:")]),t._v(" The event is trigger when the user click on the component.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("caption [string]:")]),t._v(" Caption of the component.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("default [string]:")]),t._v(" The text, which is in the box after start.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("textPosition [integer]:")]),t._v(" Position of the text in the component: left, center or right.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("textColor [integer]:")]),t._v(" Defines color of the text.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("backgroundColor [integer]:")]),t._v(" Defines background color.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])])}),[],!1,null,null,null);e.default=n.exports},674:function(t,e,r){t.exports=r.p+"assets/img/textdisplay.08959461.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[172],{1119:function(t,e,r){"use strict";r.r(e);var i=r(2),n=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h3",{attrs:{id:"component-type-actuator-subcategory-graphical-user-interface"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-actuator-subcategory-graphical-user-interface"}},[t._v("#")]),t._v(" Component Type: Actuator (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("The Text Display is the GUI component, which displays the text information.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(677),alt:"Screenshot: TextDisplay plugin",title:"Screenshot: TextDisplay plugin"}})]),t._v(" "),e("p",[t._v("TextDisplay plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" The text which will be displayed. "),e("strong",[t._v("This input port supports synchronization")])])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clear:")]),t._v(" Removes the text from the component.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clicked:")]),t._v(" The event is trigger when the user click on the component.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("caption [string]:")]),t._v(" Caption of the component.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("default [string]:")]),t._v(" The text, which is in the box after start.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("textPosition [integer]:")]),t._v(" Position of the text in the component: left, center or right.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("textColor [integer]:")]),t._v(" Defines color of the text.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("backgroundColor [integer]:")]),t._v(" Defines background color.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])])}),[],!1,null,null,null);e.default=n.exports},677:function(t,e,r){t.exports=r.p+"assets/img/textdisplay.08959461.jpg"}}]); \ No newline at end of file diff --git a/assets/js/172.e12d68e8.js b/assets/js/173.9e0554bf.js similarity index 91% rename from assets/js/172.e12d68e8.js rename to assets/js/173.9e0554bf.js index fc946ad8bf..996ec0f3b1 100644 --- a/assets/js/172.e12d68e8.js +++ b/assets/js/173.9e0554bf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[172],{1116:function(e,t,r){"use strict";r.r(t);var n=r(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tonegenerator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tonegenerator"}},[e._v("#")]),e._v(" ToneGenerator")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("This plugin generates a stereo sound. The frequency of the tone for the left and right channel can be set individually.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(677),alt:"Screenshot: ToneGenerator plugin",title:"Screenshot: ToneGenerator plugin"}})]),e._v(" "),t("p",[e._v("ToneGenerator plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an audio output device to percept the sound")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("frequencyLeft[double]:")]),e._v(" specifies the frequency of the tone on the left channel")]),e._v(" "),t("li",[t("strong",[e._v("frequencyRight[double]:")]),e._v(" specifies the frequency of the tone on the right channel")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sampleRate[integer]:")]),e._v(" sets the sampleRate of the tonegenerator")])]),e._v(" "),t("h2",{attrs:{id:"eventlistener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventlistener-description"}},[e._v("#")]),e._v(" Eventlistener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" starts the playback of the tones")]),e._v(" "),t("li",[t("strong",[e._v("stop:")]),e._v(" stops the playback of the tones")])])])}),[],!1,null,null,null);t.default=s.exports},677:function(e,t,r){e.exports=r.p+"assets/img/tonegenerator.0a8e2909.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[173],{1121:function(e,t,r){"use strict";r.r(t);var n=r(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tonegenerator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tonegenerator"}},[e._v("#")]),e._v(" ToneGenerator")]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("This plugin generates a stereo sound. The frequency of the tone for the left and right channel can be set individually.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(680),alt:"Screenshot: ToneGenerator plugin",title:"Screenshot: ToneGenerator plugin"}})]),e._v(" "),t("p",[e._v("ToneGenerator plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an audio output device to percept the sound")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("frequencyLeft[double]:")]),e._v(" specifies the frequency of the tone on the left channel")]),e._v(" "),t("li",[t("strong",[e._v("frequencyRight[double]:")]),e._v(" specifies the frequency of the tone on the right channel")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sampleRate[integer]:")]),e._v(" sets the sampleRate of the tonegenerator")])]),e._v(" "),t("h2",{attrs:{id:"eventlistener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventlistener-description"}},[e._v("#")]),e._v(" Eventlistener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" starts the playback of the tones")]),e._v(" "),t("li",[t("strong",[e._v("stop:")]),e._v(" stops the playback of the tones")])])])}),[],!1,null,null,null);t.default=s.exports},680:function(e,t,r){e.exports=r.p+"assets/img/tonegenerator.0a8e2909.png"}}]); \ No newline at end of file diff --git a/assets/js/173.d2ed0261.js b/assets/js/174.be32a9f8.js similarity index 92% rename from assets/js/173.d2ed0261.js rename to assets/js/174.be32a9f8.js index 643fbf6251..8b9d73766e 100644 --- a/assets/js/173.d2ed0261.js +++ b/assets/js/174.be32a9f8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[173],{1117:function(e,t,i){"use strict";i.r(t);var r=i(2),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("This plugin plays a wave file specified in the properties on the platforms sound output.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(678),alt:"Screenshot: WavefilePlayer plugin",title:"Screenshot: WavefilePlayer plugin"}})]),e._v(" "),t("p",[e._v("WavefilePlayer plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("wavefileName[string]:")]),e._v(" this port will change the property filename to the string on the input. Thus it is possible to have other plugins change the file to be played.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Start:")]),e._v(" An incoming event at this port initiates the playback of the wave file indicated in the property "),t("em",[e._v("filename")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Stop:")]),e._v(" An incoming event at this port stops the playback of the wave file indicated in the property "),t("em",[e._v("filename")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("VolumeUp:")]),e._v(" An incoming event increases the volume of the current playback.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeDown:")]),e._v(" An incoming event decreases the volume of the current playback.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename[string]:")]),e._v(" The value of this property specifies the file name of the wave file to be played. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);t.default=n.exports},678:function(e,t,i){e.exports=i.p+"assets/img/wavefileplayer.19bad6a5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[174],{1123:function(e,t,i){"use strict";i.r(t);var r=i(2),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("This plugin plays a wave file specified in the properties on the platforms sound output.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(682),alt:"Screenshot: WavefilePlayer plugin",title:"Screenshot: WavefilePlayer plugin"}})]),e._v(" "),t("p",[e._v("WavefilePlayer plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("wavefileName[string]:")]),e._v(" this port will change the property filename to the string on the input. Thus it is possible to have other plugins change the file to be played.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Start:")]),e._v(" An incoming event at this port initiates the playback of the wave file indicated in the property "),t("em",[e._v("filename")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Stop:")]),e._v(" An incoming event at this port stops the playback of the wave file indicated in the property "),t("em",[e._v("filename")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("VolumeUp:")]),e._v(" An incoming event increases the volume of the current playback.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeDown:")]),e._v(" An incoming event decreases the volume of the current playback.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("filename[string]:")]),e._v(" The value of this property specifies the file name of the wave file to be played. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);t.default=n.exports},682:function(e,t,i){e.exports=i.p+"assets/img/wavefileplayer.19bad6a5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/174.4346c45b.js b/assets/js/175.191f3c12.js similarity index 91% rename from assets/js/174.4346c45b.js rename to assets/js/175.191f3c12.js index c02eda000d..b46ab0c769 100644 --- a/assets/js/174.4346c45b.js +++ b/assets/js/175.191f3c12.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[174],{1120:function(t,e,i){"use strict";i.r(e);var r=i(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This plugin writes incoming strings into an .csv file.")]),t._v(" "),e("p",[t._v("The data gets live recorded, so it can be viewed simultaneously in an oscilloscope.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(682),alt:"Screenshot: WriteCSV plugin",title:"Screenshot: WriteCSV plugin"}})]),t._v(" "),e("p",[t._v("WriteCSV")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartWriting:")]),t._v(" Creates a new file to save the data.")]),t._v(" "),e("li",[e("strong",[t._v("StopWriting:")]),t._v(" Stops a saving process.")])]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Input[string]:")]),t._v(" The string contains the data. Example of one string: “data1;data2;data3”. To get data values and separators into this string, the StringExpander plugin can be used. After each string, a line separator (newline) is appended.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FileName[string]:")]),t._v(" Specifies the name of the file (without extension), in which the data will be recorded. Current date and time information are added to the filename.")]),t._v(" "),e("li",[e("strong",[t._v("FilePath[string]:")]),t._v(" Defines the Path were the File shoud be saved (relative from the ARE folder). If not existing, the path will be created.")])])])}),[],!1,null,null,null);e.default=s.exports},682:function(t,e,i){t.exports=i.p+"assets/img/writecsv.b915e031.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[175],{1122:function(t,e,i){"use strict";i.r(e);var r=i(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Actuator (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This plugin writes incoming strings into an .csv file.")]),t._v(" "),e("p",[t._v("The data gets live recorded, so it can be viewed simultaneously in an oscilloscope.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(681),alt:"Screenshot: WriteCSV plugin",title:"Screenshot: WriteCSV plugin"}})]),t._v(" "),e("p",[t._v("WriteCSV")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartWriting:")]),t._v(" Creates a new file to save the data.")]),t._v(" "),e("li",[e("strong",[t._v("StopWriting:")]),t._v(" Stops a saving process.")])]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Input[string]:")]),t._v(" The string contains the data. Example of one string: “data1;data2;data3”. To get data values and separators into this string, the StringExpander plugin can be used. After each string, a line separator (newline) is appended.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FileName[string]:")]),t._v(" Specifies the name of the file (without extension), in which the data will be recorded. Current date and time information are added to the filename.")]),t._v(" "),e("li",[e("strong",[t._v("FilePath[string]:")]),t._v(" Defines the Path were the File shoud be saved (relative from the ARE folder). If not existing, the path will be created.")])])])}),[],!1,null,null,null);e.default=s.exports},681:function(t,e,i){t.exports=i.p+"assets/img/writecsv.b915e031.png"}}]); \ No newline at end of file diff --git a/assets/js/175.cf2c80cf.js b/assets/js/176.8b536af5.js similarity index 93% rename from assets/js/175.cf2c80cf.js rename to assets/js/176.8b536af5.js index c09aca8d87..a727447f95 100644 --- a/assets/js/175.cf2c80cf.js +++ b/assets/js/176.8b536af5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[175],{1118:function(e,t,i){"use strict";i.r(t);var s=i(2),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This plugin writes the incoming data into an .edf file (http://www.edfplus.info/specs/edf.html)")]),e._v(" "),t("p",[e._v("The data gets live recorded, so it can be viewed simulaneously in the EDF-Browser ( http://www.teuniz.net/edfbrowser/ )")]),e._v(" "),t("p",[t("img",{attrs:{src:i(679),alt:"Screenshot: WriteEDF plugin",title:"Screenshot: WriteEDF plugin"}})]),e._v(" "),t("p",[e._v("WriteEDF")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CH1 - CH8[double]:")]),e._v(" these ports get the data, which will be recorded.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("PatientID[string]:")]),e._v(" specifies the name of the subject. Maximum number of characters: 80")]),e._v(" "),t("li",[t("strong",[e._v("FileName[string]:")]),e._v(" specifies the name of the file (without extension ), in which the data will be recorded")]),e._v(" "),t("li",[t("strong",[e._v("reSampling[boolean]:")]),e._v(" If this box is checked, the incoming data will be resampled with the chosen frequency of the properties samplingRateCH1 - CH8. This could be neccessary, if the incoming data frequency is not known")]),e._v(" "),t("li",[t("strong",[e._v("SamplingRateCH1 - CH8[integer]:")]),e._v(" specifies the frequency of the incoming data. Values smaller than 1 will deactivate the corresponding channel")]),e._v(" "),t("li",[t("strong",[e._v("PhysicalMinimum CH1 - CH8 [integer]:")]),e._v(" specifies the minimum values of the incoming data")]),e._v(" "),t("li",[t("strong",[e._v("PhysicalMaximum CH1 - CH8 [integer]:")]),e._v(" specifies the maximum values of the incoming data")]),e._v(" "),t("li",[t("strong",[e._v("DigitalMinimum CH1 - CH8 [integer]:")]),e._v(" specifies the minimum values of the stored data")]),e._v(" "),t("li",[t("strong",[e._v("DigitalMaximum CH1 - CH8 [integer]:")]),e._v(" specifies the maximum values of the stored data")])])])}),[],!1,null,null,null);t.default=n.exports},679:function(e,t,i){e.exports=i.p+"assets/img/writeedf.ebcf5ca6.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[176],{1124:function(e,t,i){"use strict";i.r(t);var s=i(2),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Actuator (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This plugin writes the incoming data into an .edf file (http://www.edfplus.info/specs/edf.html)")]),e._v(" "),t("p",[e._v("The data gets live recorded, so it can be viewed simulaneously in the EDF-Browser ( http://www.teuniz.net/edfbrowser/ )")]),e._v(" "),t("p",[t("img",{attrs:{src:i(683),alt:"Screenshot: WriteEDF plugin",title:"Screenshot: WriteEDF plugin"}})]),e._v(" "),t("p",[e._v("WriteEDF")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CH1 - CH8[double]:")]),e._v(" these ports get the data, which will be recorded.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("PatientID[string]:")]),e._v(" specifies the name of the subject. Maximum number of characters: 80")]),e._v(" "),t("li",[t("strong",[e._v("FileName[string]:")]),e._v(" specifies the name of the file (without extension ), in which the data will be recorded")]),e._v(" "),t("li",[t("strong",[e._v("reSampling[boolean]:")]),e._v(" If this box is checked, the incoming data will be resampled with the chosen frequency of the properties samplingRateCH1 - CH8. This could be neccessary, if the incoming data frequency is not known")]),e._v(" "),t("li",[t("strong",[e._v("SamplingRateCH1 - CH8[integer]:")]),e._v(" specifies the frequency of the incoming data. Values smaller than 1 will deactivate the corresponding channel")]),e._v(" "),t("li",[t("strong",[e._v("PhysicalMinimum CH1 - CH8 [integer]:")]),e._v(" specifies the minimum values of the incoming data")]),e._v(" "),t("li",[t("strong",[e._v("PhysicalMaximum CH1 - CH8 [integer]:")]),e._v(" specifies the maximum values of the incoming data")]),e._v(" "),t("li",[t("strong",[e._v("DigitalMinimum CH1 - CH8 [integer]:")]),e._v(" specifies the minimum values of the stored data")]),e._v(" "),t("li",[t("strong",[e._v("DigitalMaximum CH1 - CH8 [integer]:")]),e._v(" specifies the maximum values of the stored data")])])])}),[],!1,null,null,null);t.default=n.exports},683:function(e,t,i){e.exports=i.p+"assets/img/writeedf.ebcf5ca6.png"}}]); \ No newline at end of file diff --git a/assets/js/176.833f04df.js b/assets/js/177.eb177e5d.js similarity index 97% rename from assets/js/176.833f04df.js rename to assets/js/177.eb177e5d.js index 7de34f7d22..f3c14cb92b 100644 --- a/assets/js/176.833f04df.js +++ b/assets/js/177.eb177e5d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[176],{1121:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"acousticscannning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acousticscannning"}},[e._v("#")]),e._v(" AcousticScannning")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("The purpose of this component is to provide a stepwise, voice assisted selection of a large number of options. Examples for use cases are the selection of individual letters for text composition or selection of spoken phrases (eg. for environmental control via the amazon echo device). The component uses the MaryTTS text-to-speech library which supports multiple languages and voices. Currently, the component is in beta stage and only one english female voice and one german male voice are included.")]),e._v(" "),t("p",[e._v("The component provides up to 6 selectionSets. A selectionSet contains a number of individal items, seperated by commas (e.g. a number of letters for spelling words). When a selectionSet is started (by an incoming event), every selection item is spoken with an adjustable pause between the items. If an event is received at the “selection” event listener port during the presentation or pause time of a particular item, this item is added to the “preview string” output port. When the preview string contains the finalized word/phrase/sentence, it can be sent to the “selection” output port.")]),e._v(" "),t("p",[e._v("Additional functionalities can be given to the selection items via commands strings which are added to a selection item (seperated by the #-character). Supported command strings allow the deletion of the last character, the speaking of the currently composed text and other functions which are described below, thereby increasing the flexibility of the plugin. For more information see the demo model (ACS/models/componentTests/processors/AcousticScanning_test.acs)")]),e._v(" "),t("p",[t("img",{attrs:{src:n(683),alt:"Screenshot: AcousticScanning plugin",title:"Screenshot: AcousticScanning plugin"}})]),e._v(" "),t("p",[e._v("AcousticScanning plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("loadSetFile [string]:")]),e._v(" Path/name of a file which contains alternative selectionSets (which override the default selectionSets defined in the properties “selectionSet1”-“selectionSet6”. The selectionSets are provided as individual lines, terminated with a newline character. (This functionality is currently not supported.)")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("selectionPreview [string]:")]),e._v(" Output of preview string. This output port shows the current word/phrase/sentence which is composed or spelled using the stepwise scanning process.")]),e._v(" "),t("li",[t("strong",[e._v("selection [string]:")]),e._v(" The finalized word/phrase/sentence is sent to this output port when an item containing the #commit command string has been selected.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("selectionSet1-selectionSet6:")]),e._v(" an incoming event starts the acoustic scanning process of the given selection set.")]),e._v(" "),t("li",[t("strong",[e._v("select:")]),e._v(" selects the currently spoken item and adds the item text to the preview string (or executes the command associated with the selected item)")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event1-event10:")]),e._v(" These events are triggerd if the currently selected item contains the command string “event1”, “event2”, etc.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("language [string]:")]),e._v(" The languge of the text-to-speech engine (currently only “en” and “de” are supported).")]),e._v(" "),t("li",[t("strong",[e._v("voice [string]:")]),e._v(" The voice for the given language (currently this property is ignored, there is only one german and one english voice which are selected automatically due to the value of the language property).")]),e._v(" "),t("li",[t("strong",[e._v("selectionSet1 [string]:")]),e._v(" The items of selectionSet1, separated by commas.")]),e._v(" "),t("li",[t("strong",[e._v("selectionSet2-selectionSet6 [string]:")]),e._v(" The items of selection sets 2-6. In the following a list of all currently supported command strings is given:\n"),t("ul",[t("li",[t("em",[e._v("#del:")]),e._v(" deletes one charater from the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#clear:")]),e._v(" clear the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#space:")]),e._v(" adds a space key to the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#enter:")]),e._v(" adds the text {ENTER} to the preview string (this generates an enter key when sent to the keyboard actuator plugin).")]),e._v(" "),t("li",[t("em",[e._v("#speak:")]),e._v(" speaks the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#commit:")]),e._v(" sends the preview string to the output port “selection” and clears the preview string. This can be used to write the composed word/phrase to a keybaord actuator etc.")]),e._v(" "),t("li",[t("em",[e._v("#event1:")]),e._v(" sends an event via event trigger port “event1”.")]),e._v(" "),t("li",[t("em",[e._v("#event2:")]),e._v(" sends an event via event trigger port “event2”.")]),e._v(" "),t("li",[t("em",[e._v("#event3 - #event10:")]),e._v(" sends an events via event trigger ports event2 - 10.")]),e._v(" "),t("li",[t("em",[e._v("other text which follows a hash character will be spoken when the item is selected")])])])]),e._v(" "),t("li",[t("em",[e._v("An example of a valid selection set:")]),e._v(" “a,b,c,d,e,f,g” for the first 7 letters of the alphabet.")]),e._v(" "),t("li",[t("em",[e._v("Another example including command strings:")]),e._v(" “backspace#del,start music#event1”.")]),e._v(" "),t("li",[t("em",[e._v("Note")]),e._v(" that the selectionSet is specified without the double quotation marks and without spaces after the commas.")])])])}),[],!1,null,null,null);t.default=s.exports},683:function(e,t,n){e.exports=n.p+"assets/img/acousticscanning.edcc95ce.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[177],{1126:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"acousticscannning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acousticscannning"}},[e._v("#")]),e._v(" AcousticScannning")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("The purpose of this component is to provide a stepwise, voice assisted selection of a large number of options. Examples for use cases are the selection of individual letters for text composition or selection of spoken phrases (eg. for environmental control via the amazon echo device). The component uses the MaryTTS text-to-speech library which supports multiple languages and voices. Currently, the component is in beta stage and only one english female voice and one german male voice are included.")]),e._v(" "),t("p",[e._v("The component provides up to 6 selectionSets. A selectionSet contains a number of individal items, seperated by commas (e.g. a number of letters for spelling words). When a selectionSet is started (by an incoming event), every selection item is spoken with an adjustable pause between the items. If an event is received at the “selection” event listener port during the presentation or pause time of a particular item, this item is added to the “preview string” output port. When the preview string contains the finalized word/phrase/sentence, it can be sent to the “selection” output port.")]),e._v(" "),t("p",[e._v("Additional functionalities can be given to the selection items via commands strings which are added to a selection item (seperated by the #-character). Supported command strings allow the deletion of the last character, the speaking of the currently composed text and other functions which are described below, thereby increasing the flexibility of the plugin. For more information see the demo model (ACS/models/componentTests/processors/AcousticScanning_test.acs)")]),e._v(" "),t("p",[t("img",{attrs:{src:n(686),alt:"Screenshot: AcousticScanning plugin",title:"Screenshot: AcousticScanning plugin"}})]),e._v(" "),t("p",[e._v("AcousticScanning plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("loadSetFile [string]:")]),e._v(" Path/name of a file which contains alternative selectionSets (which override the default selectionSets defined in the properties “selectionSet1”-“selectionSet6”. The selectionSets are provided as individual lines, terminated with a newline character. (This functionality is currently not supported.)")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("selectionPreview [string]:")]),e._v(" Output of preview string. This output port shows the current word/phrase/sentence which is composed or spelled using the stepwise scanning process.")]),e._v(" "),t("li",[t("strong",[e._v("selection [string]:")]),e._v(" The finalized word/phrase/sentence is sent to this output port when an item containing the #commit command string has been selected.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("selectionSet1-selectionSet6:")]),e._v(" an incoming event starts the acoustic scanning process of the given selection set.")]),e._v(" "),t("li",[t("strong",[e._v("select:")]),e._v(" selects the currently spoken item and adds the item text to the preview string (or executes the command associated with the selected item)")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("event1-event10:")]),e._v(" These events are triggerd if the currently selected item contains the command string “event1”, “event2”, etc.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("language [string]:")]),e._v(" The languge of the text-to-speech engine (currently only “en” and “de” are supported).")]),e._v(" "),t("li",[t("strong",[e._v("voice [string]:")]),e._v(" The voice for the given language (currently this property is ignored, there is only one german and one english voice which are selected automatically due to the value of the language property).")]),e._v(" "),t("li",[t("strong",[e._v("selectionSet1 [string]:")]),e._v(" The items of selectionSet1, separated by commas.")]),e._v(" "),t("li",[t("strong",[e._v("selectionSet2-selectionSet6 [string]:")]),e._v(" The items of selection sets 2-6. In the following a list of all currently supported command strings is given:\n"),t("ul",[t("li",[t("em",[e._v("#del:")]),e._v(" deletes one charater from the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#clear:")]),e._v(" clear the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#space:")]),e._v(" adds a space key to the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#enter:")]),e._v(" adds the text {ENTER} to the preview string (this generates an enter key when sent to the keyboard actuator plugin).")]),e._v(" "),t("li",[t("em",[e._v("#speak:")]),e._v(" speaks the preview string.")]),e._v(" "),t("li",[t("em",[e._v("#commit:")]),e._v(" sends the preview string to the output port “selection” and clears the preview string. This can be used to write the composed word/phrase to a keybaord actuator etc.")]),e._v(" "),t("li",[t("em",[e._v("#event1:")]),e._v(" sends an event via event trigger port “event1”.")]),e._v(" "),t("li",[t("em",[e._v("#event2:")]),e._v(" sends an event via event trigger port “event2”.")]),e._v(" "),t("li",[t("em",[e._v("#event3 - #event10:")]),e._v(" sends an events via event trigger ports event2 - 10.")]),e._v(" "),t("li",[t("em",[e._v("other text which follows a hash character will be spoken when the item is selected")])])])]),e._v(" "),t("li",[t("em",[e._v("An example of a valid selection set:")]),e._v(" “a,b,c,d,e,f,g” for the first 7 letters of the alphabet.")]),e._v(" "),t("li",[t("em",[e._v("Another example including command strings:")]),e._v(" “backspace#del,start music#event1”.")]),e._v(" "),t("li",[t("em",[e._v("Note")]),e._v(" that the selectionSet is specified without the double quotation marks and without spaces after the commas.")])])])}),[],!1,null,null,null);t.default=s.exports},686:function(e,t,n){e.exports=n.p+"assets/img/acousticscanning.edcc95ce.jpg"}}]); \ No newline at end of file diff --git a/assets/js/177.0728fcdc.js b/assets/js/178.87887f38.js similarity index 89% rename from assets/js/177.0728fcdc.js rename to assets/js/178.87887f38.js index b9a654826d..9d23f53e66 100644 --- a/assets/js/177.0728fcdc.js +++ b/assets/js/178.87887f38.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[177],{1122:function(t,i,e){"use strict";e.r(i);var r=e(2),s=Object(r.a)({},(function(){var t=this,i=t._self._c;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h1",{attrs:{id:"amplifier"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#amplifier"}},[t._v("#")]),t._v(" Amplifier")]),t._v(" "),i("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),i("p",[t._v("This component takes an input and multiplies it with a gain factor set in the properties. It can be used to amplify or reduce signal values or to invert them.")]),t._v(" "),i("p",[i("img",{attrs:{src:e(684),alt:"Screenshot: Amplifier plugin",title:"Screenshot: Amplifier plugin"}})]),t._v(" "),i("p",[t._v("Amplifier plugin")]),t._v(" "),i("h2",{attrs:{id:"input-port-description"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),i("ul",[i("li",[i("strong",[t._v("sigIn [double]:")]),t._v(" The input value to be amplified.")])]),t._v(" "),i("h2",{attrs:{id:"output-port-description"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),i("ul",[i("li",[i("strong",[t._v("sigOut [double]:")]),t._v(" The amplified output value.")])]),t._v(" "),i("h2",{attrs:{id:"properties"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),i("ul",[i("li",[i("strong",[t._v("factor [double]:")]),t._v(" The gain factor that inputs are multiplied with.")])])])}),[],!1,null,null,null);i.default=s.exports},684:function(t,i,e){t.exports=e.p+"assets/img/amplifier.244b30ab.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[178],{1128:function(t,i,e){"use strict";e.r(i);var r=e(2),s=Object(r.a)({},(function(){var t=this,i=t._self._c;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h1",{attrs:{id:"amplifier"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#amplifier"}},[t._v("#")]),t._v(" Amplifier")]),t._v(" "),i("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),i("p",[t._v("This component takes an input and multiplies it with a gain factor set in the properties. It can be used to amplify or reduce signal values or to invert them.")]),t._v(" "),i("p",[i("img",{attrs:{src:e(692),alt:"Screenshot: Amplifier plugin",title:"Screenshot: Amplifier plugin"}})]),t._v(" "),i("p",[t._v("Amplifier plugin")]),t._v(" "),i("h2",{attrs:{id:"input-port-description"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),i("ul",[i("li",[i("strong",[t._v("sigIn [double]:")]),t._v(" The input value to be amplified.")])]),t._v(" "),i("h2",{attrs:{id:"output-port-description"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),i("ul",[i("li",[i("strong",[t._v("sigOut [double]:")]),t._v(" The amplified output value.")])]),t._v(" "),i("h2",{attrs:{id:"properties"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),i("ul",[i("li",[i("strong",[t._v("factor [double]:")]),t._v(" The gain factor that inputs are multiplied with.")])])])}),[],!1,null,null,null);i.default=s.exports},692:function(t,i,e){t.exports=e.p+"assets/img/amplifier.244b30ab.jpg"}}]); \ No newline at end of file diff --git a/assets/js/178.281e6422.js b/assets/js/179.49901c4d.js similarity index 97% rename from assets/js/178.281e6422.js rename to assets/js/179.49901c4d.js index f43476016f..03fd9ca968 100644 --- a/assets/js/178.281e6422.js +++ b/assets/js/179.49901c4d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[178],{1126:function(e,t,r){"use strict";r.r(t);var s=r(2),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"audio-selector"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#audio-selector"}},[e._v("#")]),e._v(" Audio Selector")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("This plug-in manages the audio tracks present in the data/music folder and different external request working as an interface with the wavefileplayer plug-in")]),e._v(" "),t("p",[t("img",{attrs:{src:r(693),alt:"Screenshot: AudioSelector plugin",title:"Screenshot: AudioSelector plugin"}})]),e._v(" "),t("p",[e._v("AudioSelector plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("To work along with wavefileplayer plug-in.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("TrackName [string]:")]),e._v(" of the Track to be played. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("StartStop:")]),e._v(" Togle between play stop state request.")]),e._v(" "),t("li",[t("strong",[e._v("NextTrack:")]),e._v(" Play next track request.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeUp:")]),e._v(" Put the volume up request.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeDown:")]),e._v(" Put the volume down request.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Play:")]),e._v(" Play Track Request.")]),e._v(" "),t("li",[t("strong",[e._v("Pause:")]),e._v(" Stop Track Requests.")]),e._v(" "),t("li",[e._v("VolumeUp: Volume Up request.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeDown:")]),e._v(" Volume Down Request.")])])])}),[],!1,null,null,null);t.default=o.exports},693:function(e,t,r){e.exports=r.p+"assets/img/audioselector.7fa0cbca.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[179],{1129:function(e,t,r){"use strict";r.r(t);var s=r(2),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"audio-selector"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#audio-selector"}},[e._v("#")]),e._v(" Audio Selector")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("This plug-in manages the audio tracks present in the data/music folder and different external request working as an interface with the wavefileplayer plug-in")]),e._v(" "),t("p",[t("img",{attrs:{src:r(693),alt:"Screenshot: AudioSelector plugin",title:"Screenshot: AudioSelector plugin"}})]),e._v(" "),t("p",[e._v("AudioSelector plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("To work along with wavefileplayer plug-in.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("TrackName [string]:")]),e._v(" of the Track to be played. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("StartStop:")]),e._v(" Togle between play stop state request.")]),e._v(" "),t("li",[t("strong",[e._v("NextTrack:")]),e._v(" Play next track request.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeUp:")]),e._v(" Put the volume up request.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeDown:")]),e._v(" Put the volume down request.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Play:")]),e._v(" Play Track Request.")]),e._v(" "),t("li",[t("strong",[e._v("Pause:")]),e._v(" Stop Track Requests.")]),e._v(" "),t("li",[e._v("VolumeUp: Volume Up request.")]),e._v(" "),t("li",[t("strong",[e._v("VolumeDown:")]),e._v(" Volume Down Request.")])])])}),[],!1,null,null,null);t.default=o.exports},693:function(e,t,r){e.exports=r.p+"assets/img/audioselector.7fa0cbca.jpg"}}]); \ No newline at end of file diff --git a/assets/js/18.a99daac7.js b/assets/js/18.aa4f9de0.js similarity index 97% rename from assets/js/18.a99daac7.js rename to assets/js/18.aa4f9de0.js index 94a7bc8026..fe91851c38 100644 --- a/assets/js/18.a99daac7.js +++ b/assets/js/18.aa4f9de0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{1054:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"input-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-options"}},[e._v("#")]),e._v(" Input Options")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Y0itTyz-D5Y&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=5&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Overview input options"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("This chapter is about how grid elements can be selected with different input modalities.")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("p",[e._v("Clicking on Button “Input Options” in "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#main---view"}},[e._v("Main view")]),e._v(" opens a menu with the following entries:")],1),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Mouse/Touch input:")]),e._v(" options for input types like normal mouse click, tap or hovering")]),e._v(" "),t("li",[t("strong",[e._v("Scanning:")]),e._v(" Input method for 1-2 input events, subsequently select groups of elements until one element is chosen")]),e._v(" "),t("li",[t("strong",[e._v("Direction input:")]),e._v(" Input method for 2-5 input events, 1-4 input events for navigating in different directions, 1 input event for selecting an element")]),e._v(" "),t("li",[t("strong",[e._v("Huffman input:")]),e._v(" 2-9 input events, assigns a code to each grid element which consists of an ordered sequence of the available input events")]),e._v(" "),t("li",[t("strong",[e._v("Sequential input:")]),e._v(" 2 input events, one for navigating to the next element one for selecting the current element")])]),e._v(" "),t("h2",{attrs:{id:"introduction-to-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-to-input-events"}},[e._v("#")]),e._v(" Introduction to input events")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=ZsBsifa2kwc&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=6&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input actions and input events"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("An input event in general is any kind of defined, single user interaction. AsTeRICS Grid currently supports the following input event types:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Keypress, Mouseclick, Tap:")]),e._v(" event of pressing a key on the keyboard, click on the mouse or tap on the screen, also can be an external button press using additional external hardware")]),e._v(" "),t("li",[t("strong",[e._v("Microphone input:")]),e._v(" event from microphone input, e.g. reaching a threshold of microphone input volume at a specific frequency.")]),e._v(" "),t("li",[t("strong",[e._v("AsTeRICS ARE event:")]),e._v(" any event that is generated by a running model within the AsTeRICS Framework. This type of event is very flexible and can be e.g. eye movement, head movement or a signal of an EMG muscle activity sensor.")])]),e._v(" "),t("p",[e._v("These types of input events can be used in all input methods except "),t("em",[e._v("Mouse/Touch input")]),e._v(" where the input events are mouse movements and click/tap events.")]),e._v(" "),t("h3",{attrs:{id:"keypress-mouseclick-tap-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keypress-mouseclick-tap-input-events"}},[e._v("#")]),e._v(" “Keypress, Mouseclick, Tap” input events")]),e._v(" "),t("p",[e._v("Figure 1 shows the configuration possibilities of a “keypress, mouseclick, tap” event (f.e. choose Scanning as Input option and enable Scanning):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(548),alt:"input event keypress options"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 1: Configuration of a “keypress, mouseclick, tap” input event")])]),e._v(" "),t("p",[e._v("These are the shown elements and options:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Dropdown")]),e._v(": allows to choose between "),t("em",[e._v("Keypress, Mouseclick, Tap")]),e._v(", "),t("em",[e._v("Microphone input")]),e._v(" or "),t("em",[e._v("AsTeRICS ARE")]),e._v(" event (or "),t("em",[e._v("not defined")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("Record action")]),e._v(": click in order to start action record mode. A subsequent keypress on the keyboard, mouse click or tap on the screen will be recorded and defines which user action is used for the event.")]),e._v(" "),t("li",[t("strong",[e._v("Current action")]),e._v(": prints the currently recorded/used (e.g. "),t("code",[e._v("Space")]),e._v(").")]),e._v(" "),t("li",[t("strong",[e._v("More")]),e._v(": an accordion of additional options that can be opened/closed by a click")]),e._v(" "),t("li",[t("strong",[e._v("Timeout")]),e._v(": minimum pause in milliseconds between two subsequent actions (if faster, the second action is ignored). Mandatory if different "),t("em",[e._v("Repetitions")]),e._v(" are set for the same key in order to wait for possible upcoming repetitions before performing the action.")]),e._v(" "),t("li",[t("strong",[e._v("Repetitions")]),e._v(": the number of times the key has to be pressed in order to perform the action")]),e._v(" "),t("li",[t("strong",[e._v("Hold duration")]),e._v(": time in milliseconds how long a key has to be pressed in order to perform the action")])]),e._v(" "),t("p",[e._v("Note that it’s not possible to set both "),t("em",[e._v("Repetitions")]),e._v(" greater 1 and "),t("em",[e._v("Hold duration")]),e._v(" greater 0 at the same time.")]),e._v(" "),t("h4",{attrs:{id:"usage-examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage-examples"}},[e._v("#")]),e._v(" Usage examples")]),e._v(" "),t("p",[e._v("Here are some examples for the properties "),t("em",[e._v("Timeout")]),e._v(", "),t("em",[e._v("Repetitions")]),e._v(" and "),t("em",[e._v("Hold duration")]),e._v(" that could be useful in real use cases:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Different actions with same key (e.g. Space), distinction by hold duration:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Action 1")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=0")]),e._v(" "),t("li",[t("strong",[e._v("Action 2")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=400")]),e._v(" "),t("li",[e._v("Pressing the key once performs action 1, Pressing and holding the key for 400ms performs action 2")]),e._v(" "),t("li",[e._v("This is the default configuration for input method "),t("em",[e._v("Scanning")]),e._v(" where this configuration can be tested")])])]),e._v(" "),t("li",[t("strong",[e._v("Different actions with same key (e.g. Space), distinction by repetition:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Action 1")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=0")]),e._v(" "),t("li",[t("strong",[e._v("Action 2")]),e._v(": Timeout=300, Repetitions=2, Hold Duration=0")]),e._v(" "),t("li",[e._v("Pressing the key once and waiting 300ms performs action 1, pressing the key twice (with less than 300ms pause) performs action 2")])])]),e._v(" "),t("li",[t("strong",[e._v("Filter unintended keypresses")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("all actions")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=300")]),e._v(" "),t("li",[e._v("any unintended keypresses are ignored and actions are only performed if a key is pressed longer than 300ms")])])])]),e._v(" "),t("h3",{attrs:{id:"microphone-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#microphone-input-events"}},[e._v("#")]),e._v(" Microphone input events")]),e._v(" "),t("p",[e._v("Figure 2 shows the configuration possibilities of a microphone input event:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(549),alt:"input event keypress options"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 2: Configuration of a microphone input event")])]),e._v(" "),t("p",[e._v("These are the shown elements and options:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Start/stop recording")]),e._v(": starts or stops recording from microphone. At the first time the browser will ask for permission to access the microphone. It’s required to see the live volume and frequency values below.")]),e._v(" "),t("li",[t("strong",[e._v("Volume threshold high")]),e._v(": the volume threshold for triggering a microphone event. If the volume level rises above this threshold, the microphone event is triggered.")]),e._v(" "),t("li",[t("strong",[e._v("Volume current value")]),e._v(": the current volume level recorded from microphone.")]),e._v(" "),t("li",[t("strong",[e._v("Volume threshold low")]),e._v(": after triggering a microphone event, the volume has to drop below this lower threshold before another microphone event will be triggered.")]),e._v(" "),t("li",[t("strong",[e._v("Frequency threshold high")]),e._v(": a microphone event is only triggered, if the frequency with the maximum volume is between "),t("em",[e._v("threshold low")]),e._v(" and "),t("em",[e._v("threshold high")]),e._v(". In this way it’s to some extent possible to distinguish between different sounds for triggering different actions.")]),e._v(" "),t("li",[t("strong",[e._v("Frequency current value")]),e._v(": the frequency of the current microphone input, where the volume is highest. Playing a 440 Hz note on a guitar will result in a value similar to 440 Hz.")]),e._v(" "),t("li",[t("strong",[e._v("Frequency threshold low")]),e._v(": see "),t("em",[e._v("Frequency threshold high")]),e._v(" above.")])]),e._v(" "),t("h3",{attrs:{id:"asterics-are-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-are-input-events"}},[e._v("#")]),e._v(" AsTeRICS ARE input events")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=P8s7Ylr1USM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=20&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS input events"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("AsTeRICS ARE input events are triggered by external events of a running "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#asterics-model"}},[e._v("model")]),e._v(" within the "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#asterics-framework"}},[e._v("AsTeRICS Framework")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:n(550),alt:"input event asterics are options"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 3: Configuration of an AsTeRICS ARE input event")])]),e._v(" "),t("p",[e._v("Figure 3 shows the configuration of an AsTeRICS ARE input event (AsTeRICS ARE Event is selected as select element in Figure 1, (1)):")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Dropdown")]),e._v(": allows to choose between "),t("em",[e._v("Keypress")]),e._v(" or "),t("em",[e._v("AsTeRICS ARE")]),e._v(" event (or not defined). Here, the AsTeRICS ARE event is selected.")]),e._v(" "),t("li",[t("strong",[e._v("Record ARE event")]),e._v(": start recording of AsTeRICS ARE events. Subsequently trigger the desired event in ARE in order to be recorded.")]),e._v(" "),t("li",[t("strong",[e._v("ARE URL")]),e._v(": the URL of the running AsTeRICS instance. If AsTeRICS ARE is running on the same computer this field can be empty.")]),e._v(" "),t("li",[t("strong",[e._v("List of events")]),e._v(": list of recorded ARE events. Any of these events triggers the currently configured action.")]),e._v(" "),t("li",[t("strong",[e._v("Recycle bin symbols")]),e._v(": a click on the recycle bin symbol next to a recorded event deletes it")])]),e._v(" "),t("h4",{attrs:{id:"example-of-using-an-asterics-are-event"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-of-using-an-asterics-are-event"}},[e._v("#")]),e._v(" Example of using an AsTeRICS ARE event")]),e._v(" "),t("p",[e._v("Follow these steps in order to set up an AsTeRICS Grid input method while using AsTeRICS ARE event for input:")]),e._v(" "),t("ol",[t("li",[e._v("Open the settings modal for the desired input method in AsTeRICS Grid")]),e._v(" "),t("li",[e._v("Start AsTeRICS ARE")]),e._v(" "),t("li",[e._v("Select "),t("em",[e._v("AsTeRICS ARE event")]),e._v(" for the desired input action in AsTeRICS Grid")]),e._v(" "),t("li",[e._v("Click on “Record ARE event” to start recording")]),e._v(" "),t("li",[e._v("Do any action in AsTeRICS ARE that tiggers an event, e.g. clicking on a button")]),e._v(" "),t("li",[e._v("The recorded event should be shown in AsTeRICS Grid")]),e._v(" "),t("li",[e._v("Save and close the input options in AsTeRICS Grid by clicking “OK”")]),e._v(" "),t("li",[e._v("Redo the same action in AsTeRICS ARE as before - it should trigger the configured input action in AsTeRICS Grid")])]),e._v(" "),t("h2",{attrs:{id:"input-options-modals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-options-modals"}},[e._v("#")]),e._v(" Input options modals")]),e._v(" "),t("p",[e._v("Each input option dialog opened by “"),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#main---view"}},[e._v("Main view")]),e._v(" - Input options” has about the same structure, see Figure 4 (can be seen as shown below when input option (here: Scanning) is enabled):")],1),e._v(" "),t("p",[t("img",{attrs:{src:n(551),alt:"general structure of an input option dialog"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 4: General structure of an input option dialog, when input option is enabled")])]),e._v(" "),t("p",[e._v("These are the basic elements of an input option dialog as in figure 4:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Enable checkbox")]),e._v(": Generally enable or disable this input method. The subsequent sections are only visible if the input method is enabled.")]),e._v(" "),t("li",[t("strong",[e._v("Input section")]),e._v(": configure input actions like described in section "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("Introduction to input events")])],1),e._v(" "),t("li",[t("strong",[e._v("Advanced settings")]),e._v(": configure advanced settings for this input method")]),e._v(" "),t("li",[t("strong",[e._v("Test configuration")]),e._v(": opens a 10x10 test grid where the current input configuration can be tested")]),e._v(" "),t("li",[t("strong",[e._v("Cancel")]),e._v(": close the dialog discarding changes")]),e._v(" "),t("li",[t("strong",[e._v("OK")]),e._v(": close the dialog saving and applying changes")])]),e._v(" "),t("h3",{attrs:{id:"mouse-touch-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mouse-touch-input"}},[e._v("#")]),e._v(" Mouse/Touch input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=umxrgE0sUjw&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=7&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mouse and touch input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[t("em",[e._v("Mouse/Touch input")]),e._v(" has the following options:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select with mouse click (or tap)")]),e._v(": if checked, elements can be selected by a simple mouse click or tap on a touchscreen")]),e._v(" "),t("li",[t("strong",[e._v("Select with double click (or tap)")]),e._v(": if checked, elements can be selected by a double mouse click or tap on a touchscreen")]),e._v(" "),t("li",[t("strong",[e._v("Enable hovering")]),e._v(": enables hovering where elements are selected by moving the mouse on the element (=hovering) and waiting for some time. Hovering also works on touchscreens where the finger is held on an element for some time.\n"),t("ul",[t("li",[t("strong",[e._v("Hover time")]),e._v(": time in milliseconds to wait until a hovered element is selected. The value "),t("code",[e._v("0")]),e._v(" means that the hovered element is never selected.")]),e._v(" "),t("li",[t("strong",[e._v("Hide cursor")]),e._v(": if checked the cursor is hidden and not visible while hovering above elements. This can be useful e.g. for eye-tracking where the cursor may be distracting.")]),e._v(" "),t("li",[t("strong",[e._v("Read out active element")]),e._v(": if checked the label of the hovered element is directly read out if the active element has changed")]),e._v(" "),t("li",[t("strong",[e._v("Disable hover pane")]),e._v(": Normally (without activating this option) it is possible to continue hovering after navigation to another grid without lifting the finger (on a touchscreen). Technically this function is implented by a global invisible hover pane., normally for hovering a global invisible hover pane is inserted. However this hover pane can cause problems in combination with a software controlled mouse cursor (emulated software mouse), because click actions may not reach the actual elements. In this case it might be useful / necessary to activate the function "),t("em",[e._v("Disable hover pane")]),e._v(".")])])])]),e._v(" "),t("h4",{attrs:{id:"advanced-setting-directly-select-element"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-setting-directly-select-element"}},[e._v("#")]),e._v(" Advanced setting “directly select element”")]),e._v(" "),t("p",[e._v("In Advanced Settings there is the additional option “"),t("em",[e._v("Directly select element on pressing mouse button (not waiting for complete click)")]),e._v("”. If it is enabled, the element is selected when pressing the mouse button, not when releasing the mouse button (which is default). For Touchscreens it’s similar: an element is selected directly at touching the screen, not after lifting the finger again (which is default). This can make sense for:")]),e._v(" "),t("ul",[t("li",[e._v("facilitating operation for people which can’t reliably “tap” (quickly put finger on and lifting the finger afterwards) on the touchscreen.")]),e._v(" "),t("li",[e._v("when using AsTeRICS Grid with an eyetracker and an additional button for clicking / selecting. Since the mouse controlled via an eyetracker always moves a little bit, in default mode it can happen that instead of selecting an element, the image of an element is dragged. This can be prevented if the selection of the element is done directly at pressing the mouse button.")])]),e._v(" "),t("h3",{attrs:{id:"scanning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#scanning"}},[e._v("#")]),e._v(" Scanning")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=L7OF1lKZbLs&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=8&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method scanning"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The input method "),t("em",[e._v("Scanning")]),e._v(" is suited to be used with 1-2 input events. It works as follows:")]),e._v(" "),t("ol",[t("li",[e._v("Available elements are divided into groups")]),e._v(" "),t("li",[e._v("One group is highlighted")]),e._v(" "),t("li",[e._v("Group containing the desired element is selected")]),e._v(" "),t("li",[e._v("Remaining elements are again divided into groups")]),e._v(" "),t("li",[e._v("Steps 3 and 4 are repeated until the single desired element is selected")])]),e._v(" "),t("h4",{attrs:{id:"input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(" for "),t("em",[e._v("Scanning")]),e._v(":")],1),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select element")]),e._v(": The select element selects the current group or element, it can be chosen by clicking on "),t("em",[e._v("Record key")]),e._v(" and afterwards clicking on the desired key.")]),e._v(" "),t("li",[t("strong",[e._v("Next scanning group")]),e._v(": Here, the key for moveing the focus to the next group or element can be chosen. This input event is optional and can be omitted if timed scanning is activated (see Advanced settings). As above, the desired key shall be tapped after clicking on "),t("em",[e._v("Record key")]),e._v(".")])]),e._v(" "),t("h4",{attrs:{id:"advanced-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the advanced settings for "),t("em",[e._v("Scanning")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Vertical scanning")]),e._v(": determines the orientation element groups are build:\n"),t("ul",[t("li",[t("strong",[e._v("vertical")]),e._v(" (checked): groups are built vertical, moving left to right "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{attrs:{src:n(552),alt:"vertical scanning",width:"130"}})])]),e._v(" "),t("li",[t("strong",[e._v("horizontal")]),e._v(" (unchecked): groups are built horizontal, moving top to bottom "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{staticStyle:{"margin-left":"2em"},attrs:{src:n(553),alt:"horizontal scanning",width:"130"}})])])])]),e._v(" "),t("li",[t("strong",[e._v("Binary scanning")]),e._v(": defines if scanning groups are rows/columns or one half of existing elements:\n"),t("ul",[t("li",[t("strong",[e._v("binary")]),e._v(" (checked): groups are built by separating remaining elements in two halves each scanning step "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{attrs:{src:n(554),alt:"binary scanning",width:"130"}})])]),e._v(" "),t("li",[t("strong",[e._v("non-binary")]),e._v(" (unchecked): groups are built row/column by row/column "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{staticStyle:{"margin-left":"2em"},attrs:{src:n(555),alt:"non-binary scanning",width:"130"}})])])])]),e._v(" "),t("li",[t("strong",[e._v("Start manually by user input event")]),e._v(": if checked, scanning will only start after a user input event, e.g. pressing a key / button.")]),e._v(" "),t("li",[t("strong",[e._v("Scanning rounds until going back")]),e._v(": the number of times the current scanning elements are iterated, until scanning goes back one step. For row/column scanning a value of "),t("code",[e._v("3")]),e._v(" means that after selecting a row, the selected row is iterated 3 times and if no element is selected, scanning restarts for selecting a different row. If "),t("em",[e._v("start manually by user event")]),e._v(" is checked, this number also defines the number of iterations on the top level until scanning is stopped.")]),e._v(" "),t("li",[t("strong",[e._v("Automatic (timed) scanning")]),e._v(": if checked the active scanning group is automatically changed after a specific time, making it possible to use scanning just with a single input event\n"),t("ul",[t("li",[t("strong",[e._v("Scanning time")]),e._v(": time to wait before highlighting the next scanning group (in milliseconds)")]),e._v(" "),t("li",[t("strong",[e._v("Time factor first element")]),e._v(": the time to keep the first scanning group (e.g. first row/column) highlighted is “Scanning Time” multiplied with this factor. Increasing the time for the first group often improves usability.")])])])]),e._v(" "),t("h3",{attrs:{id:"direction-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#direction-input"}},[e._v("#")]),e._v(" Direction Input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Ui27d_ZlFz8&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=9&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method direction input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The input method "),t("em",[e._v("Direction Input")]),e._v(" is suited to be used with 2-5 "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(". It gives the possibility to simply navigate through elements in up to 4 directions.")],1),e._v(" "),t("h4",{attrs:{id:"input-events-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events-2"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible input events for "),t("em",[e._v("Direction Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select element")]),e._v(": selects the currently highlighted element")]),e._v(" "),t("li",[t("strong",[e._v("Go right")]),e._v(": navigate to the right")]),e._v(" "),t("li",[t("strong",[e._v("Go left")]),e._v(": navigate to the left")]),e._v(" "),t("li",[t("strong",[e._v("Go down")]),e._v(": navigate down")]),e._v(" "),t("li",[t("strong",[e._v("Go up")]),e._v(": navigate up")])]),e._v(" "),t("p",[e._v("The desired keys for each input event can be selected by clicking first on "),t("em",[e._v("Record key")]),e._v(" and consecutively clicking on the desired key.")]),e._v(" "),t("h4",{attrs:{id:"advanced-settings-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings-2"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the Advanced settings for "),t("em",[e._v("Direction Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Wrap around")]),e._v(": if checked navigation continues at the opposite border, so e.g. moving left on the most left element sets the focus to the most right element")]),e._v(" "),t("li",[t("strong",[e._v("Go to start position after select")]),e._v(": if checked the focused element is set to the first element after an element was selected respective")])]),e._v(" "),t("h3",{attrs:{id:"huffman-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#huffman-input"}},[e._v("#")]),e._v(" Huffman Input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=2EEmOdOQk98&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=10&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method huffman input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The input method "),t("em",[e._v("huffman input")]),e._v(" is suited to be used with 2-9 "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(". It assigns an unique code of input event sequences to each element. Triggering the respective input event sequence directly selects an element.")],1),e._v(" "),t("p",[e._v("This is an example for 2 input events and 4 elements:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Element A")]),e._v(" has code "),t("code",[e._v("11")])]),e._v(" "),t("li",[t("strong",[e._v("Element B")]),e._v(" has code "),t("code",[e._v("12")])]),e._v(" "),t("li",[t("strong",[e._v("Element C")]),e._v(" has code "),t("code",[e._v("21")])]),e._v(" "),t("li",[t("strong",[e._v("Element D")]),e._v(" has code "),t("code",[e._v("22")])])]),e._v(" "),t("p",[e._v("Triggering input event "),t("code",[e._v("1")]),e._v(" and then input event "),t("code",[e._v("2")]),e._v(" would directly select "),t("em",[e._v("Element B")]),e._v(".")]),e._v(" "),t("p",[e._v("Huffman input uses the theory of "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Huffman_coding#n-ary_Huffman_coding",target:"_blank",rel:"noopener noreferrer"}},[e._v("n-ary huffman codes"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"input-events-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events-3"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible input events for "),t("em",[e._v("Huffman Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Input [1-9]")]),e._v(": defines the input events of numbers "),t("code",[e._v("1-9")]),e._v(" that are used to enter the codes for selecting the elements. At least two input events have to be defined.")])]),e._v(" "),t("h4",{attrs:{id:"advanced-settings-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings-3"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the Advanced settings for "),t("em",[e._v("Huffman Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Show numbers")]),e._v(": if checked the assigned codes are shown at the bottom of each element")]),e._v(" "),t("li",[t("strong",[e._v("Show colors")]),e._v(": if checked a color code is shown at the bottom of each element")]),e._v(" "),t("li",[t("strong",[e._v("Color whole element")]),e._v(": if checked the all grid elements are fully colored in the color of the next input event to trigger in order to select the element of interest")]),e._v(" "),t("li",[t("strong",[e._v("Mark inactive elements")]),e._v(": if checked all impossible elements are grayed out, so that e.g. starting input of the code with "),t("code",[e._v("1")]),e._v(" grays out all elements with codes that aren’t starting with "),t("code",[e._v("1")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Timeout")]),e._v(": time of inactivity (in milliseconds) for resetting the current, incomplete input. So if the first digit of the code "),t("code",[e._v("1")]),e._v(" was typed accidentally the user has to wait this time in order to be able to restart with another code. Simultaneously this is the time the user has to input the next digit of the code. If set to "),t("code",[e._v("0")]),e._v(" the timeout is disabled.")]),e._v(" "),t("li",[t("strong",[e._v("Number of elements")]),e._v(": by default (if this property is set to "),t("code",[e._v("0")]),e._v(") the codes are automatically generated based on the number of elements in the current grid. This means that in one grid the n-th element could have a different code than in an other grid. To prevent this the "),t("code",[e._v("number of elements")]),e._v(" property can be set to the maximum number of elements that are existing in any grid. Therefore in every grid the n-th element will have the same code.")]),e._v(" "),t("li",[t("strong",[e._v("Color[1-n]")]),e._v(": select the colors of the input events. If e.g. three inputs 1-4 are connected to a red, yellow, green and blue button, the colors can be adapted here in order to match the button colors. Default colors are taken from the "),t("a",{attrs:{href:"https://davidmathlogic.com/colorblind/",target:"_blank",rel:"noopener noreferrer"}},[e._v("“Wong” color pallete"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"sequential-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sequential-input"}},[e._v("#")]),e._v(" Sequential Input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=plpOzwMUahw&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=11&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method sequential input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The sequential input method can be used with 2-3 "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(". 2 input events are necessary, one (Previous element) is optional. The sequential input sequentially focuses all elements and afterwards restarts at the first element.")],1),e._v(" "),t("h4",{attrs:{id:"input-events-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events-4"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible input events for "),t("em",[e._v("Sequential Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Next element")]),e._v(": moves the focus to the next element. If focus is currently on the last element, the first element will be focused.")]),e._v(" "),t("li",[t("strong",[e._v("Previous Element")]),e._v(" (optional): moves the focus to the previous element. If focus is currently on the first element, the last element will be focused.")]),e._v(" "),t("li",[t("strong",[e._v("Select element")]),e._v(": selects the element that is currently focused")])]),e._v(" "),t("p",[e._v("The desired keys for each input event can be selected by clicking first on "),t("em",[e._v("Record key")]),e._v(" and consecutively clicking on the desired key.")]),e._v(" "),t("h4",{attrs:{id:"advanced-settings-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings-4"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the Advanced settings for "),t("em",[e._v("Sequential Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Go to start position after select")]),e._v(": if checked, the first element is highlighted after selecting an element. Otherwise focus stays on the current element after selection.")]),e._v(" "),t("li",[t("strong",[e._v("Start manually by user input event")]),e._v(": if checked, the input method will only start after a user input event, e.g. pressing a key / button.")]),e._v(" "),t("li",[t("strong",[e._v("Scanning rounds until stop")]),e._v(": the number of times all elements are iterated, until the input method is stopped. Only takes effect if "),t("em",[e._v("start manually by user input event")]),e._v(" is active.")]),e._v(" "),t("li",[t("strong",[e._v("Automatic (timed) sequential input")]),e._v(": if checked the active element is automatically changed after a specific time, making it possible to use this input just with a single input event\n"),t("ul",[t("li",[t("strong",[e._v("Scanning time")]),e._v(": time to wait before highlighting the next element (in milliseconds)")]),e._v(" "),t("li",[t("strong",[e._v("Time factor first element")]),e._v(": the time to keep the first element highlighted is “Scanning Time” multiplied with this factor. Increasing the time for the first element often improves usability.")])])])]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=s.exports},548:function(e,t,n){e.exports=n.p+"assets/img/input_channel_keyboard_en1.962335af.jpg"},549:function(e,t,n){e.exports=n.p+"assets/img/input_channel_mic_en.c03ecd8d.png"},550:function(e,t,n){e.exports=n.p+"assets/img/input_channel_are_en.43aab746.jpg"},551:function(e,t,n){e.exports=n.p+"assets/img/input_options_general_en.264c9e4c.jpg"},552:function(e,t,n){e.exports=n.p+"assets/img/scanning_vertical.9edd8062.gif"},553:function(e,t,n){e.exports=n.p+"assets/img/scanning_horizontal.b306105b.gif"},554:function(e,t){e.exports="data:image/gif;base64,R0lGODlhIQHHAPcAAP4AAP4AAP4AAP4AAP4AAP4AAP4AAP4AAP4AAPYAAK8ICGkNEj4TGiwVHB0YHiEdIikmKTQxMkhCOWhbOnFlQHFmSWBWYFdWbVFXeUxZgkhdikFklj5ooTtxrT6Au0iMw1Ka0l6n3GOs3myw3Hy30o66wp7AtqbGsanKt6vPwavQyavT2KzX3qzX3a3Y263Y2qvX3qzX4KzX4qzX46zX5KzX5a3Y5q3Y5qrY5q3Y5q3Y5rLa57ze6sHg68Ph6cvh49Ti2uDjz+3jw/Xju/7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ltP7pwP7ryPvt0fbv2vHw4+Xu6t3t8Nns8t7v9ODw9er1+Pj7/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v/+/v/+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v/+/v////7+/v/////+/iH/C05FVFNDQVBFMi4wAwEAAAAh+QQEVQARACwAAAAAIQHHAAAI/gD9CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bDAjhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnOhE6jSp1KtarVq1ipQs3KtavXr2DDTt0qtqzZs2jTNiWrtq3bt3C/si0gUEuPHTcgQNjRQ4tAoHXv3hhMuLDhw4gTK17MuLHjx5AjS55Mma9ff4D92cU7o8SKHTyw/P0ZeEUJEp77js451x+WwhYsEBYN+DXl27hz697Nuzdk2qRt35hBIsKHFRcg/MAcnEaJCA6iRyhBAzhrhDu1MNYCVLvN7+BB/nL/qX0wcQgXSlxw8GHGeJ/aS0SfH73Ejfc45/Zg3APo/vAABnhRfz/tNxwJ6JWAwQPH3UCgTz2sAJ0FFzxwgQUORLDCg/lhp1MFIpygAQ6HVUACUHgJqOKKDu2A4g00IGiBghBosMJgLv60g3wOaFDCjxrUl+N1B+1UwQMPgHCCByZS8IEGFWAA1GAsVmllQTdMeYOED5z2gAU3EjYlCdFBYF8JENSX5VMe5gTiCxiYwMADImBAIgUQvHjlnlUO2RNnQWZQggVmxoAjijxeYMIKJqznQAl+0tUmTicguYEJSIpAwQMbVACDfzfwKaqAHPJkYAwaPCAooSXM4KB//is84EAGHxiXgQMQbLjTXOUphh9P3o0q7He/ZkeYDAsKKkGX93V3wwb0zfdBs2wW+ZRwh1nXk2u+devtt+CGS5m2PHE7GAwYQECCCRIox5xPrsVw63wPaBADua1pJhiOqr27rb54iSvwwAQX/Jhlq/27WQ2mrUBDDMv5W65mPJiwAQYfmMDDZbtOGtfHIIcsclBzjWzyySinVXLKLLfsslYevyzzzDQPtXLNOOc888069+zzyDz/LPTQagVN9NFIe2V00kw3LdXSTkcttVH5ViEFFEpkrfXWXHft9ddghy2211BIUUXCE1uN9dhst+3221qXfbbEHasN99144y03/tqtTZH334C/PQXdT/kd+OGIez04YIYn7vjhi1dr0E5VPG754VUAVfnlnOed+U+bdy56258TOblOUoyu+thSAJX66rB/3fpPr8due9azm17QTmvfbjsUQPXue+zA/yT88KoXrztBOyF/O1DOP/9T9LF3bG1Ox1N/ufI9Za+95dzz5P33iYc/V+3kW557T+in//j6PLXvPuLwzxX6/ImX3tP9+COuP0/86x/g/tc3AUKOcKxpnAH/Fjl4KXCBd2tgh67XIbtBsG17Q2AFr3ZBt2UwMxbsoNg+KLndTe2EKEQK1FLIQhSusIUwdNoLY0jDo82whjj02Q1zyMOa7bCH/kB02Q+DSMSTDbGISATZEZPIRLdUjYMiHKHZ0FY3KEYxbCSElz9CeEWyTVFiBexi2yRYrgeKMWxk3JUZz6g4MHosgGz82v8oF0fSaa6OYyOgx+SHR67Bbyd87OPW/og6QYKtfh4bnyHDxztDgo2ROlGkIM3nMUeCDXqW/BomM8k1650Oe5zcGiRBGcq4Ba+UWaMkBQsQSEMSMietdKXrUKkERK4Sjo6co05wmcs7olKPq/THGgWZxsKhspgJLCUZnyjJK2bxX1zE4zPTZkVpftGTJmyiNoUYs216U2RL/KY4uxLOcZrTKuU8pzqjks51ulMp7XynPIsSz3naMzOr/rynPmGWz336cy0eE0g04zjNKjbTmdckzRarWcdphpGTyMzPMImpQbpMFI/LfCMtdZkTXhqSozjxaB+B+UmcxLKPrzQpLWs5S1TasqQFOGhDT0nLUeJEpgTFJvN0slIlbJKWPy2lTgfSSFTaNKYrPSpO2ahKmJ4Ujyll5Uqj+tQ6vjSbId2oL3+51VCSFKsWVWZFhXnMsV60jhkN5kKXCsGCsmmgBE2oFuF6Rod28594VeFd88pXm+21r4DVYj8DS9iJDbawiJXUYRNL2Hoy1pyOfaw4IytZb1K2stpk5iLlCk2GNpSz1GTrAu0azLPGMaJhFSvjVFvCnXZUq6Bb/ilICyBSPH7VtSp1aUt1SztaXhW3SDUqTYVrvJoOFW09DapQp7fS40pMtF1UalKHG8qmgrWqcaTqVHcbyt8SdZew9UltbdtVTt72u8kMJWrJyloHtneCMBWoZ5kKWoM60q3XoasYSQtTzAb2sv5NIoADXMQBEziIBj5wD4fF4AY7+MEQjrCEJ0zhClv4whjOsIY3zGGG6De6X/TwfOk7NxFDV4AZpIhp2Ti4hayYxQx5sRhbLJHxxrHEB7HxjRWi4zPi+CHYZaMUFBJkIRPZtxM5cRShoBAlL7nJNZ1ITxXSUyVQeaVJjnJCnCxCJm9ZyxEpshiHnBAxj/nILp1I/o/F+OOCrJnNPN6oisXq4rLWWb0W+TBC24wQPe/ZIX7ucog7TOhCG/rQiE60ohfN6EY7+tGQjrSkJ03pSlv60pjOtKY3zelOe5ohmyEMwhoSalH3C9T7usGoUR0wVZ96IaXm12VYbepZwzrVq751q11ta4XEOte+xvWrg71rYCfk18OOCLYMI5qFLJvZDHn2bKKtmGYrRNrTdna1qZ0YaycE24PxNkLALe6DkJvbN6BAnUgUbnRniyK9SsECMkWYXhekPBUAQbo3gAMRkcjeBOnVppDkgXr7mjBHshS7AT6QXlUKSeoy+LEH84IJ6PsE/B4Mw+tCGApc3E4aP3hh/ipQ8MJsXDOEOcGcIh7yiQ8m4UmSOEJ6RfIbpMACJJD5QXqVmJMnxEAVv7gEcu4ghRhoSRVXV74H0wOjd1zfhmn6zxFe8JsTXeoIMdDTo+70wZwAAyVYgAgIg/WDaN3jN/g6u8tuEK2/vORk77q8x34CCKy96zeoudqZjveaWz3uU18M21vkdZBXfOyqVkjAUhAnDahb3ThSfMeRFPPIJ6TVMIf7DiRfGLQXZvOX7/wD4J740A8G7XsvPUJ2nXfSq/4gAcM4if7+eoNgvuCpB/3qqW5znIua84rRPURSbicQTQDxoUoIYV4QGyVdjN3JR0jnoW4YhYzcAypHfvQP/nIYzxfG+oWhPWHAf/qPQ5/8vK++8r2ecfGjH+bU375Brt97olNp/YyZSMCCrvKM174gmEcn8qZ5wOd9v2d6rbdv7CZ8tmcYBvh/BLFr4geBA3F7aQdyFCgQrFdzn8d5c5d2dmd5u/d2h8GAAJhy/CZ+JhiBjLGCDKF18kZ5iDd4BKF1ahd0gJd1k6dwfBd4CfiBReeD5cd1QjiBNDgQMDhvdJKDZmcYHMiEbZdyK2d/RygQWveEUFgQWldxSBJ/VegPbpd6PRgRPIcYJ1eGZihyvqKGPceGbehyawiHbzhzjXGG2+GGh2GHdyiHaTgR56Zt2waIiFFuBvGH17YY/oRYEIb4bYF4iI3IiN3mbtAmiIMoiYWRiA6BbD7XcKnGa5kobJsYGK1mbDPXiaS4c6D4iaOYbKVYbKyIiqsYigBTa6r4ea9oEJr4abq4i7zYi774i8AYjMI4jMRYjMZ4jMiYjMq4jMzYjM6YYblIaqZ4i/eWitIYi7VIi9eojbQma9nojdsIjt3oieEojrrGjX74iOOGiJaYbY5YiZT4bvF4ie3YbvNIj/doj+94AiAAeTeAiQMhHOqGgf9YjwU5ETwHhC1Hh6JHenoYgw8Qggu5c4QBkf6nhy/HgxOJixR3fAm4kfdmGIencxzZkdoHkgFnkhUHdxgJkciHkTeA/oMmp4ZcKJH3MRFuVwEZQHpfGIZxQpA9ORh/94RBKZS+VxhFCYJ3Qn1FOZJEiXcmmYU1uHweSYQ6GJPHRwH+F4RXiYMnMHRj2IQomAHQx5VimYDe94UICCdwAn0uqIHhtwA2mYH+sHi+528iCHsVqYTU95Z1uXUlyHlcSHAHOIJUiXx+2WojaRiJ2ZGEUpaNeYEkspiR+XIkYCIdiIBCKXaFOXwpV3BLN374R5Usd3/SZ5Q5J4boN4GmyX1Px4VbSX5OSXroF5WieZq2qX64mXQT4Hrkt3eLKX9YUpFkuSS66ZpU6ZsS0WoDxykLCHxptwHBGZlDSYAIyJqVWXck/iJ7edmAWDl2T5idG4ACR0mXilmVmTmCh5d9nemdXgmW5olwlGeTlSmZ6QkRBsJ4k3mUSYmVzimVSLiZEAd9Scma/ZlwpdmUHvmUPsiFPIl3g7mVCgqeElmgSoh8TXmU/miWUUh8ZamWDBmHISqiFLkYMNmHIzqHJUqiJcmiIbmHKZqHeGgYJ4qiK6qiELGI66iO5sajheijisiO+XiQ7yiPRWqkkAiPR4qPS8qkSYqkEhGN40iO43iKuGiNU2ql1YiN5ailATeNsiil52iOxGaLYYqlz5imarqmbNqmbvqmcBqncjqndFqndnqneJqneiphYlqm6OinVDqmgQqo/oN6bGgKqF7Kia54pqxnMIiRqKL4p8oGpAQBbkT6pJPYpPqIqZnKqe7oqZu6o5E4pI46qoc4AybwI6pqAgDJhhPYkkpYmhhZAdLZmyT5oqdHbyjZcAgHdca5qxznn7p6k3BIq/2GgRiJJySQdAs3o6UKoyVaArJCH10ii1oYfuXJodfqgA/qg/KWLgTad7iHgUmJl5gZlh06mwBqhfIZIuSKd5uiJAxQoVD5rI4RlCaQJmmCK9FBAiCql8tHkPE5cnNZn5WifZEZnO15ghSHc3jZnQw7mKVZmbSaAblXgBmgASaQARhYn/baGIkZA44iARkgAUHiACTgl6MZkwIr/pwEYRhfaX+3iZy5qpy7iZ7ft7L5FpozO39RyZ2t6bNvp5MEiX5OggET8AFFu7If2xjWxyPRAXYS0K8uyxC71pb36Z02x5mMCXxfOSj2R7G4B5/1yXjZmrAeCbRiK28SWZkehycm0LHQ2bSLkZgrMLW4orQnm7I4ia0yW66Ut4Touq04aKyDO5U7iKH1qpUf2nWDKbjairgJWAH06oMeR6up1590qxhBySMRkCZ4668ICa0t6qIpaaLOequni7p8KKOtS6Opq7q8urmkG5I1MC/RUgLWGqSmCqqh2qO9K6pQCrzBS7zD+6PFi7zJy7u0q6SMCAMl8AHSK70kEDHwQXaohrqo3wips0im2Wum20uNX8qlWSq+itq83luKNCAD7DsDG7On8Bu/8ju/9Fu/9nu/+Ju/+ru//Nu//vu/exIQACH5BAFlAAAALAAABQAYAb0AhzLNMv////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+AAMIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnElzI4CbOHPiVKizp8+fQIMKHUq0qNGjSJMqXcqTaFOhT4NGXUq1qtWrWLNq/TkVaFefX3uG3Uq2rNmzaL0mLDo2Z9uda9PKnUu3rtK3cBE6jQuVr92/gAPLxXuTsGG/ghMrXpyUMIDDeoc6Zky5cmDHkA/ujWy5s2fFmBFzFQ2W9OfTqM2G5izVtM7JqWPLZuv6de28miXfns27t1rWrYGPrkm8uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MP+ix9Pvrz58+jT+6YKe71t4e43545/tD39x7vvu82vvzD//vjBB6BY/+lnH30HupfgegsyWOB9DfYWoYQPIlhhfBPylqFsG8bWoYcXKhiigwIO+N58Jg6HYooElshigCu+iJtBMpbmIosfopbejjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFQKVGOLMV6Z42lbftallyP69mVnY5IZJoU3mlimZWtS1iZjb8J5poZzzhbnYncmlqdge/JZJ4d/gpimmoGm1idghyJaqI6Lctmoo4MCmKhdk1L6qGdVZqrpppx26umnoIYq6qiklmrqqaimquqqrHJ65Yn+NL66X6T9VUqXrbdeaiatBuq6a5Yy4jqYr2wS66axcvLaq7IWMoshsskC+6KwaVFbLbSgYauntts6K6K3JEo7LbeXkasouOHGKiuM6spqLVrvqtbqvPTWa++9+Oar77789uvvvwAHLPDAAa/rH7pimvtXvGUx3LDCliJMp8QTi5uiw1thnDHEdWmclccfc5wrxYCSXLLFhJpsqMgjozwgyFfBHDPLw6rMqM03uywpzdfiDKnOtfIMr9BD+4wpwUgnrfTSTDfttKYCRC311FRXbfXVWGet9dZcd+3112CHLfbYZJdt9tlop6322my37fbbcMct99x012333Xjnrff+3nz37fffgAcu+OBqGwxA1oYfjrXhiBvcuOOLQ34145FLbjXlk1tedeKPy9r5q5+DXrnno4ueueZUY3456lNzXvqVodcYu+yv03466bfjvvq6s7/Yu++1y/h7isMTHzzwhCev/PLMN+/889BHL/301Fdv/fXYZ6/99tx37/334Icv/vjkl2/++einr/767LfvPlHF3xT//MfrRH/uP8WvOP4+3b+7UP7b3FD0F8DUDbB+OSlg6w7Iv/4hUH4P3N//gqJAqcEvghIUIAAjSEAOerCBPalg1C4IQvt9cIL5w6AIBUBCFKawhDhZYVFkyEAXOhCGEMRhBg1YQw1S8IT+PvyhDmnYQx4K0YYm1OEOF7jBIaoQiEYESgedSEUkJtGKMYQiE5uIxRx2cYkWbGEQX/jFKZZRi2Es4haliMYRijGKZBzjDb8IRjdyUY4hfGIV8XhFPvYRjnP0YxaVSMQjCnKQZ9wjIAO5yD+uMY6NdGQaDRlJRB7Si5csJCUfyUhO5pGQbWShGie5SVJC0pOStOMdK4lJVtZRlKNUJRsVicpUwrKUsjylKXWZy07u8pN0XKH7hknMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t0nNN9YygaH05i+BmclwirOX5HSlGctJy3Ha8py3nGUwzbnKb1pSnfT+rKc772nPV84wn/K8pD9jGU9eFtSg8EyoQvWJzncuFJcHTWc/B8rQiDqUoA8NqCspCtGMarSfmvzoPlsJUj0m8qQCDakvG3rRjmLUoyu1KDhB2U6W8nOkJMWpSmMKU4nilKMitWlOhTpUmd6UqOvEZ02NelSmAhWhPW1pUJ36VJ6+9Koureg/lxpVqUJVq11taljFitWpbhWlSp0nV8tqVrZa1a0+RapJ2YnWie7Uq1/Nql73alBu+vWvgA2sYAdL2MIa9rCITaxiF8vYxjr2sZCNbGPHWlTKJrWka4WrZ+46U7XWVadzTStdU4rBxXCWrJrt7Gg3etrKUpYxra1+6lv5OlvaxtWpl/2paQGaV9vi9bZnXS1mPSvQ3WbWt79NrmpZy9vatlU2sc2tXI+LXNRW17qpiW5ohyvcn2qXpnQ07menS1zRmteuzQXua8XbXfKSlrq9fe51Zate6KZXucvl7nm9e9/88leJ7N2vZAdM4AIb+MAITrCC/xoQACH+FU1hZGUgd2l0aCBTY3JlZW5Ub0dpZgA7"},555:function(e,t,n){e.exports=n.p+"assets/img/scanning_non_binary.f5d202a9.gif"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{1056:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"input-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-options"}},[e._v("#")]),e._v(" Input Options")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Y0itTyz-D5Y&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=5&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Overview input options"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("This chapter is about how grid elements can be selected with different input modalities.")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("p",[e._v("Clicking on Button “Input Options” in "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#main---view"}},[e._v("Main view")]),e._v(" opens a menu with the following entries:")],1),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Mouse/Touch input:")]),e._v(" options for input types like normal mouse click, tap or hovering")]),e._v(" "),t("li",[t("strong",[e._v("Scanning:")]),e._v(" Input method for 1-2 input events, subsequently select groups of elements until one element is chosen")]),e._v(" "),t("li",[t("strong",[e._v("Direction input:")]),e._v(" Input method for 2-5 input events, 1-4 input events for navigating in different directions, 1 input event for selecting an element")]),e._v(" "),t("li",[t("strong",[e._v("Huffman input:")]),e._v(" 2-9 input events, assigns a code to each grid element which consists of an ordered sequence of the available input events")]),e._v(" "),t("li",[t("strong",[e._v("Sequential input:")]),e._v(" 2 input events, one for navigating to the next element one for selecting the current element")])]),e._v(" "),t("h2",{attrs:{id:"introduction-to-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-to-input-events"}},[e._v("#")]),e._v(" Introduction to input events")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=ZsBsifa2kwc&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=6&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input actions and input events"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("An input event in general is any kind of defined, single user interaction. AsTeRICS Grid currently supports the following input event types:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Keypress, Mouseclick, Tap:")]),e._v(" event of pressing a key on the keyboard, click on the mouse or tap on the screen, also can be an external button press using additional external hardware")]),e._v(" "),t("li",[t("strong",[e._v("Microphone input:")]),e._v(" event from microphone input, e.g. reaching a threshold of microphone input volume at a specific frequency.")]),e._v(" "),t("li",[t("strong",[e._v("AsTeRICS ARE event:")]),e._v(" any event that is generated by a running model within the AsTeRICS Framework. This type of event is very flexible and can be e.g. eye movement, head movement or a signal of an EMG muscle activity sensor.")])]),e._v(" "),t("p",[e._v("These types of input events can be used in all input methods except "),t("em",[e._v("Mouse/Touch input")]),e._v(" where the input events are mouse movements and click/tap events.")]),e._v(" "),t("h3",{attrs:{id:"keypress-mouseclick-tap-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keypress-mouseclick-tap-input-events"}},[e._v("#")]),e._v(" “Keypress, Mouseclick, Tap” input events")]),e._v(" "),t("p",[e._v("Figure 1 shows the configuration possibilities of a “keypress, mouseclick, tap” event (f.e. choose Scanning as Input option and enable Scanning):")]),e._v(" "),t("p",[t("img",{attrs:{src:n(547),alt:"input event keypress options"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 1: Configuration of a “keypress, mouseclick, tap” input event")])]),e._v(" "),t("p",[e._v("These are the shown elements and options:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Dropdown")]),e._v(": allows to choose between "),t("em",[e._v("Keypress, Mouseclick, Tap")]),e._v(", "),t("em",[e._v("Microphone input")]),e._v(" or "),t("em",[e._v("AsTeRICS ARE")]),e._v(" event (or "),t("em",[e._v("not defined")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("Record action")]),e._v(": click in order to start action record mode. A subsequent keypress on the keyboard, mouse click or tap on the screen will be recorded and defines which user action is used for the event.")]),e._v(" "),t("li",[t("strong",[e._v("Current action")]),e._v(": prints the currently recorded/used (e.g. "),t("code",[e._v("Space")]),e._v(").")]),e._v(" "),t("li",[t("strong",[e._v("More")]),e._v(": an accordion of additional options that can be opened/closed by a click")]),e._v(" "),t("li",[t("strong",[e._v("Timeout")]),e._v(": minimum pause in milliseconds between two subsequent actions (if faster, the second action is ignored). Mandatory if different "),t("em",[e._v("Repetitions")]),e._v(" are set for the same key in order to wait for possible upcoming repetitions before performing the action.")]),e._v(" "),t("li",[t("strong",[e._v("Repetitions")]),e._v(": the number of times the key has to be pressed in order to perform the action")]),e._v(" "),t("li",[t("strong",[e._v("Hold duration")]),e._v(": time in milliseconds how long a key has to be pressed in order to perform the action")])]),e._v(" "),t("p",[e._v("Note that it’s not possible to set both "),t("em",[e._v("Repetitions")]),e._v(" greater 1 and "),t("em",[e._v("Hold duration")]),e._v(" greater 0 at the same time.")]),e._v(" "),t("h4",{attrs:{id:"usage-examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage-examples"}},[e._v("#")]),e._v(" Usage examples")]),e._v(" "),t("p",[e._v("Here are some examples for the properties "),t("em",[e._v("Timeout")]),e._v(", "),t("em",[e._v("Repetitions")]),e._v(" and "),t("em",[e._v("Hold duration")]),e._v(" that could be useful in real use cases:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Different actions with same key (e.g. Space), distinction by hold duration:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Action 1")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=0")]),e._v(" "),t("li",[t("strong",[e._v("Action 2")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=400")]),e._v(" "),t("li",[e._v("Pressing the key once performs action 1, Pressing and holding the key for 400ms performs action 2")]),e._v(" "),t("li",[e._v("This is the default configuration for input method "),t("em",[e._v("Scanning")]),e._v(" where this configuration can be tested")])])]),e._v(" "),t("li",[t("strong",[e._v("Different actions with same key (e.g. Space), distinction by repetition:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Action 1")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=0")]),e._v(" "),t("li",[t("strong",[e._v("Action 2")]),e._v(": Timeout=300, Repetitions=2, Hold Duration=0")]),e._v(" "),t("li",[e._v("Pressing the key once and waiting 300ms performs action 1, pressing the key twice (with less than 300ms pause) performs action 2")])])]),e._v(" "),t("li",[t("strong",[e._v("Filter unintended keypresses")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("all actions")]),e._v(": Timeout=0, Repetitions=1, Hold Duration=300")]),e._v(" "),t("li",[e._v("any unintended keypresses are ignored and actions are only performed if a key is pressed longer than 300ms")])])])]),e._v(" "),t("h3",{attrs:{id:"microphone-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#microphone-input-events"}},[e._v("#")]),e._v(" Microphone input events")]),e._v(" "),t("p",[e._v("Figure 2 shows the configuration possibilities of a microphone input event:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(548),alt:"input event keypress options"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 2: Configuration of a microphone input event")])]),e._v(" "),t("p",[e._v("These are the shown elements and options:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Start/stop recording")]),e._v(": starts or stops recording from microphone. At the first time the browser will ask for permission to access the microphone. It’s required to see the live volume and frequency values below.")]),e._v(" "),t("li",[t("strong",[e._v("Volume threshold high")]),e._v(": the volume threshold for triggering a microphone event. If the volume level rises above this threshold, the microphone event is triggered.")]),e._v(" "),t("li",[t("strong",[e._v("Volume current value")]),e._v(": the current volume level recorded from microphone.")]),e._v(" "),t("li",[t("strong",[e._v("Volume threshold low")]),e._v(": after triggering a microphone event, the volume has to drop below this lower threshold before another microphone event will be triggered.")]),e._v(" "),t("li",[t("strong",[e._v("Frequency threshold high")]),e._v(": a microphone event is only triggered, if the frequency with the maximum volume is between "),t("em",[e._v("threshold low")]),e._v(" and "),t("em",[e._v("threshold high")]),e._v(". In this way it’s to some extent possible to distinguish between different sounds for triggering different actions.")]),e._v(" "),t("li",[t("strong",[e._v("Frequency current value")]),e._v(": the frequency of the current microphone input, where the volume is highest. Playing a 440 Hz note on a guitar will result in a value similar to 440 Hz.")]),e._v(" "),t("li",[t("strong",[e._v("Frequency threshold low")]),e._v(": see "),t("em",[e._v("Frequency threshold high")]),e._v(" above.")])]),e._v(" "),t("h3",{attrs:{id:"asterics-are-input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-are-input-events"}},[e._v("#")]),e._v(" AsTeRICS ARE input events")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=P8s7Ylr1USM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=20&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS input events"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("AsTeRICS ARE input events are triggered by external events of a running "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#asterics-model"}},[e._v("model")]),e._v(" within the "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#asterics-framework"}},[e._v("AsTeRICS Framework")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:n(549),alt:"input event asterics are options"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 3: Configuration of an AsTeRICS ARE input event")])]),e._v(" "),t("p",[e._v("Figure 3 shows the configuration of an AsTeRICS ARE input event (AsTeRICS ARE Event is selected as select element in Figure 1, (1)):")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Dropdown")]),e._v(": allows to choose between "),t("em",[e._v("Keypress")]),e._v(" or "),t("em",[e._v("AsTeRICS ARE")]),e._v(" event (or not defined). Here, the AsTeRICS ARE event is selected.")]),e._v(" "),t("li",[t("strong",[e._v("Record ARE event")]),e._v(": start recording of AsTeRICS ARE events. Subsequently trigger the desired event in ARE in order to be recorded.")]),e._v(" "),t("li",[t("strong",[e._v("ARE URL")]),e._v(": the URL of the running AsTeRICS instance. If AsTeRICS ARE is running on the same computer this field can be empty.")]),e._v(" "),t("li",[t("strong",[e._v("List of events")]),e._v(": list of recorded ARE events. Any of these events triggers the currently configured action.")]),e._v(" "),t("li",[t("strong",[e._v("Recycle bin symbols")]),e._v(": a click on the recycle bin symbol next to a recorded event deletes it")])]),e._v(" "),t("h4",{attrs:{id:"example-of-using-an-asterics-are-event"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-of-using-an-asterics-are-event"}},[e._v("#")]),e._v(" Example of using an AsTeRICS ARE event")]),e._v(" "),t("p",[e._v("Follow these steps in order to set up an AsTeRICS Grid input method while using AsTeRICS ARE event for input:")]),e._v(" "),t("ol",[t("li",[e._v("Open the settings modal for the desired input method in AsTeRICS Grid")]),e._v(" "),t("li",[e._v("Start AsTeRICS ARE")]),e._v(" "),t("li",[e._v("Select "),t("em",[e._v("AsTeRICS ARE event")]),e._v(" for the desired input action in AsTeRICS Grid")]),e._v(" "),t("li",[e._v("Click on “Record ARE event” to start recording")]),e._v(" "),t("li",[e._v("Do any action in AsTeRICS ARE that tiggers an event, e.g. clicking on a button")]),e._v(" "),t("li",[e._v("The recorded event should be shown in AsTeRICS Grid")]),e._v(" "),t("li",[e._v("Save and close the input options in AsTeRICS Grid by clicking “OK”")]),e._v(" "),t("li",[e._v("Redo the same action in AsTeRICS ARE as before - it should trigger the configured input action in AsTeRICS Grid")])]),e._v(" "),t("h2",{attrs:{id:"input-options-modals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-options-modals"}},[e._v("#")]),e._v(" Input options modals")]),e._v(" "),t("p",[e._v("Each input option dialog opened by “"),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#main---view"}},[e._v("Main view")]),e._v(" - Input options” has about the same structure, see Figure 4 (can be seen as shown below when input option (here: Scanning) is enabled):")],1),e._v(" "),t("p",[t("img",{attrs:{src:n(550),alt:"general structure of an input option dialog"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 4: General structure of an input option dialog, when input option is enabled")])]),e._v(" "),t("p",[e._v("These are the basic elements of an input option dialog as in figure 4:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Enable checkbox")]),e._v(": Generally enable or disable this input method. The subsequent sections are only visible if the input method is enabled.")]),e._v(" "),t("li",[t("strong",[e._v("Input section")]),e._v(": configure input actions like described in section "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("Introduction to input events")])],1),e._v(" "),t("li",[t("strong",[e._v("Advanced settings")]),e._v(": configure advanced settings for this input method")]),e._v(" "),t("li",[t("strong",[e._v("Test configuration")]),e._v(": opens a 10x10 test grid where the current input configuration can be tested")]),e._v(" "),t("li",[t("strong",[e._v("Cancel")]),e._v(": close the dialog discarding changes")]),e._v(" "),t("li",[t("strong",[e._v("OK")]),e._v(": close the dialog saving and applying changes")])]),e._v(" "),t("h3",{attrs:{id:"mouse-touch-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mouse-touch-input"}},[e._v("#")]),e._v(" Mouse/Touch input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=umxrgE0sUjw&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=7&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mouse and touch input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[t("em",[e._v("Mouse/Touch input")]),e._v(" has the following options:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select with mouse click (or tap)")]),e._v(": if checked, elements can be selected by a simple mouse click or tap on a touchscreen")]),e._v(" "),t("li",[t("strong",[e._v("Select with double click (or tap)")]),e._v(": if checked, elements can be selected by a double mouse click or tap on a touchscreen")]),e._v(" "),t("li",[t("strong",[e._v("Enable hovering")]),e._v(": enables hovering where elements are selected by moving the mouse on the element (=hovering) and waiting for some time. Hovering also works on touchscreens where the finger is held on an element for some time.\n"),t("ul",[t("li",[t("strong",[e._v("Hover time")]),e._v(": time in milliseconds to wait until a hovered element is selected. The value "),t("code",[e._v("0")]),e._v(" means that the hovered element is never selected.")]),e._v(" "),t("li",[t("strong",[e._v("Hide cursor")]),e._v(": if checked the cursor is hidden and not visible while hovering above elements. This can be useful e.g. for eye-tracking where the cursor may be distracting.")]),e._v(" "),t("li",[t("strong",[e._v("Read out active element")]),e._v(": if checked the label of the hovered element is directly read out if the active element has changed")]),e._v(" "),t("li",[t("strong",[e._v("Disable hover pane")]),e._v(": Normally (without activating this option) it is possible to continue hovering after navigation to another grid without lifting the finger (on a touchscreen). Technically this function is implented by a global invisible hover pane., normally for hovering a global invisible hover pane is inserted. However this hover pane can cause problems in combination with a software controlled mouse cursor (emulated software mouse), because click actions may not reach the actual elements. In this case it might be useful / necessary to activate the function "),t("em",[e._v("Disable hover pane")]),e._v(".")])])])]),e._v(" "),t("h4",{attrs:{id:"advanced-setting-directly-select-element"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-setting-directly-select-element"}},[e._v("#")]),e._v(" Advanced setting “directly select element”")]),e._v(" "),t("p",[e._v("In Advanced Settings there is the additional option “"),t("em",[e._v("Directly select element on pressing mouse button (not waiting for complete click)")]),e._v("”. If it is enabled, the element is selected when pressing the mouse button, not when releasing the mouse button (which is default). For Touchscreens it’s similar: an element is selected directly at touching the screen, not after lifting the finger again (which is default). This can make sense for:")]),e._v(" "),t("ul",[t("li",[e._v("facilitating operation for people which can’t reliably “tap” (quickly put finger on and lifting the finger afterwards) on the touchscreen.")]),e._v(" "),t("li",[e._v("when using AsTeRICS Grid with an eyetracker and an additional button for clicking / selecting. Since the mouse controlled via an eyetracker always moves a little bit, in default mode it can happen that instead of selecting an element, the image of an element is dragged. This can be prevented if the selection of the element is done directly at pressing the mouse button.")])]),e._v(" "),t("h3",{attrs:{id:"scanning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#scanning"}},[e._v("#")]),e._v(" Scanning")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=L7OF1lKZbLs&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=8&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method scanning"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The input method "),t("em",[e._v("Scanning")]),e._v(" is suited to be used with 1-2 input events. It works as follows:")]),e._v(" "),t("ol",[t("li",[e._v("Available elements are divided into groups")]),e._v(" "),t("li",[e._v("One group is highlighted")]),e._v(" "),t("li",[e._v("Group containing the desired element is selected")]),e._v(" "),t("li",[e._v("Remaining elements are again divided into groups")]),e._v(" "),t("li",[e._v("Steps 3 and 4 are repeated until the single desired element is selected")])]),e._v(" "),t("h4",{attrs:{id:"input-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(" for "),t("em",[e._v("Scanning")]),e._v(":")],1),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select element")]),e._v(": The select element selects the current group or element, it can be chosen by clicking on "),t("em",[e._v("Record key")]),e._v(" and afterwards clicking on the desired key.")]),e._v(" "),t("li",[t("strong",[e._v("Next scanning group")]),e._v(": Here, the key for moveing the focus to the next group or element can be chosen. This input event is optional and can be omitted if timed scanning is activated (see Advanced settings). As above, the desired key shall be tapped after clicking on "),t("em",[e._v("Record key")]),e._v(".")])]),e._v(" "),t("h4",{attrs:{id:"advanced-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the advanced settings for "),t("em",[e._v("Scanning")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Vertical scanning")]),e._v(": determines the orientation element groups are build:\n"),t("ul",[t("li",[t("strong",[e._v("vertical")]),e._v(" (checked): groups are built vertical, moving left to right "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{attrs:{src:n(551),alt:"vertical scanning",width:"130"}})])]),e._v(" "),t("li",[t("strong",[e._v("horizontal")]),e._v(" (unchecked): groups are built horizontal, moving top to bottom "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{staticStyle:{"margin-left":"2em"},attrs:{src:n(552),alt:"horizontal scanning",width:"130"}})])])])]),e._v(" "),t("li",[t("strong",[e._v("Binary scanning")]),e._v(": defines if scanning groups are rows/columns or one half of existing elements:\n"),t("ul",[t("li",[t("strong",[e._v("binary")]),e._v(" (checked): groups are built by separating remaining elements in two halves each scanning step "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{attrs:{src:n(553),alt:"binary scanning",width:"130"}})])]),e._v(" "),t("li",[t("strong",[e._v("non-binary")]),e._v(" (unchecked): groups are built row/column by row/column "),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{staticStyle:{"margin-left":"2em"},attrs:{src:n(554),alt:"non-binary scanning",width:"130"}})])])])]),e._v(" "),t("li",[t("strong",[e._v("Start manually by user input event")]),e._v(": if checked, scanning will only start after a user input event, e.g. pressing a key / button.")]),e._v(" "),t("li",[t("strong",[e._v("Scanning rounds until going back")]),e._v(": the number of times the current scanning elements are iterated, until scanning goes back one step. For row/column scanning a value of "),t("code",[e._v("3")]),e._v(" means that after selecting a row, the selected row is iterated 3 times and if no element is selected, scanning restarts for selecting a different row. If "),t("em",[e._v("start manually by user event")]),e._v(" is checked, this number also defines the number of iterations on the top level until scanning is stopped.")]),e._v(" "),t("li",[t("strong",[e._v("Automatic (timed) scanning")]),e._v(": if checked the active scanning group is automatically changed after a specific time, making it possible to use scanning just with a single input event\n"),t("ul",[t("li",[t("strong",[e._v("Scanning time")]),e._v(": time to wait before highlighting the next scanning group (in milliseconds)")]),e._v(" "),t("li",[t("strong",[e._v("Time factor first element")]),e._v(": the time to keep the first scanning group (e.g. first row/column) highlighted is “Scanning Time” multiplied with this factor. Increasing the time for the first group often improves usability.")])])])]),e._v(" "),t("h3",{attrs:{id:"direction-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#direction-input"}},[e._v("#")]),e._v(" Direction Input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Ui27d_ZlFz8&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=9&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method direction input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The input method "),t("em",[e._v("Direction Input")]),e._v(" is suited to be used with 2-5 "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(". It gives the possibility to simply navigate through elements in up to 4 directions.")],1),e._v(" "),t("h4",{attrs:{id:"input-events-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events-2"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible input events for "),t("em",[e._v("Direction Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select element")]),e._v(": selects the currently highlighted element")]),e._v(" "),t("li",[t("strong",[e._v("Go right")]),e._v(": navigate to the right")]),e._v(" "),t("li",[t("strong",[e._v("Go left")]),e._v(": navigate to the left")]),e._v(" "),t("li",[t("strong",[e._v("Go down")]),e._v(": navigate down")]),e._v(" "),t("li",[t("strong",[e._v("Go up")]),e._v(": navigate up")])]),e._v(" "),t("p",[e._v("The desired keys for each input event can be selected by clicking first on "),t("em",[e._v("Record key")]),e._v(" and consecutively clicking on the desired key.")]),e._v(" "),t("h4",{attrs:{id:"advanced-settings-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings-2"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the Advanced settings for "),t("em",[e._v("Direction Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Wrap around")]),e._v(": if checked navigation continues at the opposite border, so e.g. moving left on the most left element sets the focus to the most right element")]),e._v(" "),t("li",[t("strong",[e._v("Go to start position after select")]),e._v(": if checked the focused element is set to the first element after an element was selected respective")])]),e._v(" "),t("h3",{attrs:{id:"huffman-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#huffman-input"}},[e._v("#")]),e._v(" Huffman Input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=2EEmOdOQk98&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=10&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method huffman input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The input method "),t("em",[e._v("huffman input")]),e._v(" is suited to be used with 2-9 "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(". It assigns an unique code of input event sequences to each element. Triggering the respective input event sequence directly selects an element.")],1),e._v(" "),t("p",[e._v("This is an example for 2 input events and 4 elements:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Element A")]),e._v(" has code "),t("code",[e._v("11")])]),e._v(" "),t("li",[t("strong",[e._v("Element B")]),e._v(" has code "),t("code",[e._v("12")])]),e._v(" "),t("li",[t("strong",[e._v("Element C")]),e._v(" has code "),t("code",[e._v("21")])]),e._v(" "),t("li",[t("strong",[e._v("Element D")]),e._v(" has code "),t("code",[e._v("22")])])]),e._v(" "),t("p",[e._v("Triggering input event "),t("code",[e._v("1")]),e._v(" and then input event "),t("code",[e._v("2")]),e._v(" would directly select "),t("em",[e._v("Element B")]),e._v(".")]),e._v(" "),t("p",[e._v("Huffman input uses the theory of "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Huffman_coding#n-ary_Huffman_coding",target:"_blank",rel:"noopener noreferrer"}},[e._v("n-ary huffman codes"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"input-events-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events-3"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible input events for "),t("em",[e._v("Huffman Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Input [1-9]")]),e._v(": defines the input events of numbers "),t("code",[e._v("1-9")]),e._v(" that are used to enter the codes for selecting the elements. At least two input events have to be defined.")])]),e._v(" "),t("h4",{attrs:{id:"advanced-settings-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings-3"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the Advanced settings for "),t("em",[e._v("Huffman Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Show numbers")]),e._v(": if checked the assigned codes are shown at the bottom of each element")]),e._v(" "),t("li",[t("strong",[e._v("Show colors")]),e._v(": if checked a color code is shown at the bottom of each element")]),e._v(" "),t("li",[t("strong",[e._v("Color whole element")]),e._v(": if checked the all grid elements are fully colored in the color of the next input event to trigger in order to select the element of interest")]),e._v(" "),t("li",[t("strong",[e._v("Mark inactive elements")]),e._v(": if checked all impossible elements are grayed out, so that e.g. starting input of the code with "),t("code",[e._v("1")]),e._v(" grays out all elements with codes that aren’t starting with "),t("code",[e._v("1")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Timeout")]),e._v(": time of inactivity (in milliseconds) for resetting the current, incomplete input. So if the first digit of the code "),t("code",[e._v("1")]),e._v(" was typed accidentally the user has to wait this time in order to be able to restart with another code. Simultaneously this is the time the user has to input the next digit of the code. If set to "),t("code",[e._v("0")]),e._v(" the timeout is disabled.")]),e._v(" "),t("li",[t("strong",[e._v("Number of elements")]),e._v(": by default (if this property is set to "),t("code",[e._v("0")]),e._v(") the codes are automatically generated based on the number of elements in the current grid. This means that in one grid the n-th element could have a different code than in an other grid. To prevent this the "),t("code",[e._v("number of elements")]),e._v(" property can be set to the maximum number of elements that are existing in any grid. Therefore in every grid the n-th element will have the same code.")]),e._v(" "),t("li",[t("strong",[e._v("Color[1-n]")]),e._v(": select the colors of the input events. If e.g. three inputs 1-4 are connected to a red, yellow, green and blue button, the colors can be adapted here in order to match the button colors. Default colors are taken from the "),t("a",{attrs:{href:"https://davidmathlogic.com/colorblind/",target:"_blank",rel:"noopener noreferrer"}},[e._v("“Wong” color pallete"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"sequential-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sequential-input"}},[e._v("#")]),e._v(" Sequential Input")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=plpOzwMUahw&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=11&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Input method sequential input"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The sequential input method can be used with 2-3 "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html#introduction-to-input-events"}},[e._v("input events")]),e._v(". 2 input events are necessary, one (Previous element) is optional. The sequential input sequentially focuses all elements and afterwards restarts at the first element.")],1),e._v(" "),t("h4",{attrs:{id:"input-events-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-events-4"}},[e._v("#")]),e._v(" Input events")]),e._v(" "),t("p",[e._v("These are the possible input events for "),t("em",[e._v("Sequential Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Next element")]),e._v(": moves the focus to the next element. If focus is currently on the last element, the first element will be focused.")]),e._v(" "),t("li",[t("strong",[e._v("Previous Element")]),e._v(" (optional): moves the focus to the previous element. If focus is currently on the first element, the last element will be focused.")]),e._v(" "),t("li",[t("strong",[e._v("Select element")]),e._v(": selects the element that is currently focused")])]),e._v(" "),t("p",[e._v("The desired keys for each input event can be selected by clicking first on "),t("em",[e._v("Record key")]),e._v(" and consecutively clicking on the desired key.")]),e._v(" "),t("h4",{attrs:{id:"advanced-settings-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings-4"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("p",[e._v("These are the Advanced settings for "),t("em",[e._v("Sequential Input")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Go to start position after select")]),e._v(": if checked, the first element is highlighted after selecting an element. Otherwise focus stays on the current element after selection.")]),e._v(" "),t("li",[t("strong",[e._v("Start manually by user input event")]),e._v(": if checked, the input method will only start after a user input event, e.g. pressing a key / button.")]),e._v(" "),t("li",[t("strong",[e._v("Scanning rounds until stop")]),e._v(": the number of times all elements are iterated, until the input method is stopped. Only takes effect if "),t("em",[e._v("start manually by user input event")]),e._v(" is active.")]),e._v(" "),t("li",[t("strong",[e._v("Automatic (timed) sequential input")]),e._v(": if checked the active element is automatically changed after a specific time, making it possible to use this input just with a single input event\n"),t("ul",[t("li",[t("strong",[e._v("Scanning time")]),e._v(": time to wait before highlighting the next element (in milliseconds)")]),e._v(" "),t("li",[t("strong",[e._v("Time factor first element")]),e._v(": the time to keep the first element highlighted is “Scanning Time” multiplied with this factor. Increasing the time for the first element often improves usability.")])])])]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=s.exports},547:function(e,t,n){e.exports=n.p+"assets/img/input_channel_keyboard_en1.962335af.jpg"},548:function(e,t,n){e.exports=n.p+"assets/img/input_channel_mic_en.c03ecd8d.png"},549:function(e,t,n){e.exports=n.p+"assets/img/input_channel_are_en.43aab746.jpg"},550:function(e,t,n){e.exports=n.p+"assets/img/input_options_general_en.264c9e4c.jpg"},551:function(e,t,n){e.exports=n.p+"assets/img/scanning_vertical.9edd8062.gif"},552:function(e,t,n){e.exports=n.p+"assets/img/scanning_horizontal.b306105b.gif"},553:function(e,t){e.exports="data:image/gif;base64,R0lGODlhIQHHAPcAAP4AAP4AAP4AAP4AAP4AAP4AAP4AAP4AAP4AAPYAAK8ICGkNEj4TGiwVHB0YHiEdIikmKTQxMkhCOWhbOnFlQHFmSWBWYFdWbVFXeUxZgkhdikFklj5ooTtxrT6Au0iMw1Ka0l6n3GOs3myw3Hy30o66wp7AtqbGsanKt6vPwavQyavT2KzX3qzX3a3Y263Y2qvX3qzX4KzX4qzX46zX5KzX5a3Y5q3Y5qrY5q3Y5q3Y5rLa57ze6sHg68Ph6cvh49Ti2uDjz+3jw/Xju/7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ksv7ltP7pwP7ryPvt0fbv2vHw4+Xu6t3t8Nns8t7v9ODw9er1+Pj7/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v/+/v/+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v/+/v////7+/v/////+/iH/C05FVFNDQVBFMi4wAwEAAAAh+QQEVQARACwAAAAAIQHHAAAI/gD9CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bDAjhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnOhE6jSp1KtarVq1ipQs3KtavXr2DDTt0qtqzZs2jTNiWrtq3bt3C/si0gUEuPHTcgQNjRQ4tAoHXv3hhMuLDhw4gTK17MuLHjx5AjS55Mma9ff4D92cU7o8SKHTyw/P0ZeEUJEp77js451x+WwhYsEBYN+DXl27hz697Nuzdk2qRt35hBIsKHFRcg/MAcnEaJCA6iRyhBAzhrhDu1MNYCVLvN7+BB/nL/qX0wcQgXSlxw8GHGeJ/aS0SfH73Ejfc45/Zg3APo/vAABnhRfz/tNxwJ6JWAwQPH3UCgTz2sAJ0FFzxwgQUORLDCg/lhp1MFIpygAQ6HVUACUHgJqOKKDu2A4g00IGiBghBosMJgLv60g3wOaFDCjxrUl+N1B+1UwQMPgHCCByZS8IEGFWAA1GAsVmllQTdMeYOED5z2gAU3EjYlCdFBYF8JENSX5VMe5gTiCxiYwMADImBAIgUQvHjlnlUO2RNnQWZQggVmxoAjijxeYMIKJqznQAl+0tUmTicguYEJSIpAwQMbVACDfzfwKaqAHPJkYAwaPCAooSXM4KB//is84EAGHxiXgQMQbLjTXOUphh9P3o0q7He/ZkeYDAsKKkGX93V3wwb0zfdBs2wW+ZRwh1nXk2u+devtt+CGS5m2PHE7GAwYQECCCRIox5xPrsVw63wPaBADua1pJhiOqr27rb54iSvwwAQX/Jhlq/27WQ2mrUBDDMv5W65mPJiwAQYfmMDDZbtOGtfHIIcsclBzjWzyySinVXLKLLfsslYevyzzzDQPtXLNOOc888069+zzyDz/LPTQagVN9NFIe2V00kw3LdXSTkcttVH5ViEFFEpkrfXWXHft9ddghy2211BIUUXCE1uN9dhst+3221qXfbbEHasN99144y03/tqtTZH334C/PQXdT/kd+OGIez04YIYn7vjhi1dr0E5VPG754VUAVfnlnOed+U+bdy56258TOblOUoyu+thSAJX66rB/3fpPr8due9azm17QTmvfbjsUQPXue+zA/yT88KoXrztBOyF/O1DOP/9T9LF3bG1Ox1N/ufI9Za+95dzz5P33iYc/V+3kW557T+in//j6PLXvPuLwzxX6/ImX3tP9+COuP0/86x/g/tc3AUKOcKxpnAH/Fjl4KXCBd2tgh67XIbtBsG17Q2AFr3ZBt2UwMxbsoNg+KLndTe2EKEQK1FLIQhSusIUwdNoLY0jDo82whjj02Q1zyMOa7bCH/kB02Q+DSMSTDbGISATZEZPIRLdUjYMiHKHZ0FY3KEYxbCSElz9CeEWyTVFiBexi2yRYrgeKMWxk3JUZz6g4MHosgGz82v8oF0fSaa6OYyOgx+SHR67Bbyd87OPW/og6QYKtfh4bnyHDxztDgo2ROlGkIM3nMUeCDXqW/BomM8k1650Oe5zcGiRBGcq4Ba+UWaMkBQsQSEMSMietdKXrUKkERK4Sjo6co05wmcs7olKPq/THGgWZxsKhspgJLCUZnyjJK2bxX1zE4zPTZkVpftGTJmyiNoUYs216U2RL/KY4uxLOcZrTKuU8pzqjks51ulMp7XynPIsSz3naMzOr/rynPmGWz336cy0eE0g04zjNKjbTmdckzRarWcdphpGTyMzPMImpQbpMFI/LfCMtdZkTXhqSozjxaB+B+UmcxLKPrzQpLWs5S1TasqQFOGhDT0nLUeJEpgTFJvN0slIlbJKWPy2lTgfSSFTaNKYrPSpO2ahKmJ4Ujyll5Uqj+tQ6vjSbId2oL3+51VCSFKsWVWZFhXnMsV60jhkN5kKXCsGCsmmgBE2oFuF6Rod28594VeFd88pXm+21r4DVYj8DS9iJDbawiJXUYRNL2Hoy1pyOfaw4IytZb1K2stpk5iLlCk2GNpSz1GTrAu0azLPGMaJhFSvjVFvCnXZUq6Bb/ilICyBSPH7VtSp1aUt1SztaXhW3SDUqTYVrvJoOFW09DapQp7fS40pMtF1UalKHG8qmgrWqcaTqVHcbyt8SdZew9UltbdtVTt72u8kMJWrJyloHtneCMBWoZ5kKWoM60q3XoasYSQtTzAb2sv5NIoADXMQBEziIBj5wD4fF4AY7+MEQjrCEJ0zhClv4whjOsIY3zGGG6De6X/TwfOk7NxFDV4AZpIhp2Ti4hayYxQx5sRhbLJHxxrHEB7HxjRWi4zPi+CHYZaMUFBJkIRPZtxM5cRShoBAlL7nJNZ1ITxXSUyVQeaVJjnJCnCxCJm9ZyxEpshiHnBAxj/nILp1I/o/F+OOCrJnNPN6oisXq4rLWWb0W+TBC24wQPe/ZIX7ucog7TOhCG/rQiE60ohfN6EY7+tGQjrSkJ03pSlv60pjOtKY3zelOe5ohmyEMwhoSalH3C9T7usGoUR0wVZ96IaXm12VYbepZwzrVq751q11ta4XEOte+xvWrg71rYCfk18OOCLYMI5qFLJvZDHn2bKKtmGYrRNrTdna1qZ0YaycE24PxNkLALe6DkJvbN6BAnUgUbnRniyK9SsECMkWYXhekPBUAQbo3gAMRkcjeBOnVppDkgXr7mjBHshS7AT6QXlUKSeoy+LEH84IJ6PsE/B4Mw+tCGApc3E4aP3hh/ipQ8MJsXDOEOcGcIh7yiQ8m4UmSOEJ6RfIbpMACJJD5QXqVmJMnxEAVv7gEcu4ghRhoSRVXV74H0wOjd1zfhmn6zxFe8JsTXeoIMdDTo+70wZwAAyVYgAgIg/WDaN3jN/g6u8tuEK2/vORk77q8x34CCKy96zeoudqZjveaWz3uU18M21vkdZBXfOyqVkjAUhAnDahb3ThSfMeRFPPIJ6TVMIf7DiRfGLQXZvOX7/wD4J740A8G7XsvPUJ2nXfSq/4gAcM4if7+eoNgvuCpB/3qqW5znIua84rRPURSbicQTQDxoUoIYV4QGyVdjN3JR0jnoW4YhYzcAypHfvQP/nIYzxfG+oWhPWHAf/qPQ5/8vK++8r2ecfGjH+bU375Brt97olNp/YyZSMCCrvKM174gmEcn8qZ5wOd9v2d6rbdv7CZ8tmcYBvh/BLFr4geBA3F7aQdyFCgQrFdzn8d5c5d2dmd5u/d2h8GAAJhy/CZ+JhiBjLGCDKF18kZ5iDd4BKF1ahd0gJd1k6dwfBd4CfiBReeD5cd1QjiBNDgQMDhvdJKDZmcYHMiEbZdyK2d/RygQWveEUFgQWldxSBJ/VegPbpd6PRgRPIcYJ1eGZihyvqKGPceGbehyawiHbzhzjXGG2+GGh2GHdyiHaTgR56Zt2waIiFFuBvGH17YY/oRYEIb4bYF4iI3IiN3mbtAmiIMoiYWRiA6BbD7XcKnGa5kobJsYGK1mbDPXiaS4c6D4iaOYbKVYbKyIiqsYigBTa6r4ea9oEJr4abq4i7zYi774i8AYjMI4jMRYjMZ4jMiYjMq4jMzYjM6YYblIaqZ4i/eWitIYi7VIi9eojbQma9nojdsIjt3oieEojrrGjX74iOOGiJaYbY5YiZT4bvF4ie3YbvNIj/doj+94AiAAeTeAiQMhHOqGgf9YjwU5ETwHhC1Hh6JHenoYgw8Qggu5c4QBkf6nhy/HgxOJixR3fAm4kfdmGIencxzZkdoHkgFnkhUHdxgJkciHkTeA/oMmp4ZcKJH3MRFuVwEZQHpfGIZxQpA9ORh/94RBKZS+VxhFCYJ3Qn1FOZJEiXcmmYU1uHweSYQ6GJPHRwH+F4RXiYMnMHRj2IQomAHQx5VimYDe94UICCdwAn0uqIHhtwA2mYH+sHi+528iCHsVqYTU95Z1uXUlyHlcSHAHOIJUiXx+2WojaRiJ2ZGEUpaNeYEkspiR+XIkYCIdiIBCKXaFOXwpV3BLN374R5Usd3/SZ5Q5J4boN4GmyX1Px4VbSX5OSXroF5WieZq2qX64mXQT4Hrkt3eLKX9YUpFkuSS66ZpU6ZsS0WoDxykLCHxptwHBGZlDSYAIyJqVWXck/iJ7edmAWDl2T5idG4ACR0mXilmVmTmCh5d9nemdXgmW5olwlGeTlSmZ6QkRBsJ4k3mUSYmVzimVSLiZEAd9Scma/ZlwpdmUHvmUPsiFPIl3g7mVCgqeElmgSoh8TXmU/miWUUh8ZamWDBmHISqiFLkYMNmHIzqHJUqiJcmiIbmHKZqHeGgYJ4qiK6qiELGI66iO5sajheijisiO+XiQ7yiPRWqkkAiPR4qPS8qkSYqkEhGN40iO43iKuGiNU2ql1YiN5ailATeNsiil52iOxGaLYYqlz5imarqmbNqmbvqmcBqncjqndFqndnqneJqneiphYlqm6OinVDqmgQqo/oN6bGgKqF7Kia54pqxnMIiRqKL4p8oGpAQBbkT6pJPYpPqIqZnKqe7oqZu6o5E4pI46qoc4AybwI6pqAgDJhhPYkkpYmhhZAdLZmyT5oqdHbyjZcAgHdca5qxznn7p6k3BIq/2GgRiJJySQdAs3o6UKoyVaArJCH10ii1oYfuXJodfqgA/qg/KWLgTad7iHgUmJl5gZlh06mwBqhfIZIuSKd5uiJAxQoVD5rI4RlCaQJmmCK9FBAiCql8tHkPE5cnNZn5WifZEZnO15ghSHc3jZnQw7mKVZmbSaAblXgBmgASaQARhYn/baGIkZA44iARkgAUHiACTgl6MZkwIr/pwEYRhfaX+3iZy5qpy7iZ7ft7L5FpozO39RyZ2t6bNvp5MEiX5OggET8AFFu7If2xjWxyPRAXYS0K8uyxC71pb36Z02x5mMCXxfOSj2R7G4B5/1yXjZmrAeCbRiK28SWZkehycm0LHQ2bSLkZgrMLW4orQnm7I4ia0yW66Ut4Touq04aKyDO5U7iKH1qpUf2nWDKbjairgJWAH06oMeR6up1590qxhBySMRkCZ4668ICa0t6qIpaaLOequni7p8KKOtS6Opq7q8urmkG5I1MC/RUgLWGqSmCqqh2qO9K6pQCrzBS7zD+6PFi7zJy7u0q6SMCAMl8AHSK70kEDHwQXaohrqo3wips0im2Wum20uNX8qlWSq+itq83luKNCAD7DsDG7On8Bu/8ju/9Fu/9nu/+Ju/+ru//Nu//vu/exIQACH5BAFlAAAALAAABQAYAb0AhzLNMv////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+AAMIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnElzI4CbOHPiVKizp8+fQIMKHUq0qNGjSJMqXcqTaFOhT4NGXUq1qtWrWLNq/TkVaFefX3uG3Uq2rNmzaL0mLDo2Z9uda9PKnUu3rtK3cBE6jQuVr92/gAPLxXuTsGG/ghMrXpyUMIDDeoc6Zky5cmDHkA/ujWy5s2fFmBFzFQ2W9OfTqM2G5izVtM7JqWPLZuv6de28miXfns27t1rWrYGPrkm8uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MP+ix9Pvrz58+jT+6YKe71t4e43545/tD39x7vvu82vvzD//vjBB6BY/+lnH30HupfgegsyWOB9DfYWoYQPIlhhfBPylqFsG8bWoYcXKhiigwIO+N58Jg6HYooElshigCu+iJtBMpbmIosfopbejjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFQKVGOLMV6Z42lbftallyP69mVnY5IZJoU3mlimZWtS1iZjb8J5poZzzhbnYncmlqdge/JZJ4d/gpimmoGm1idghyJaqI6Lctmoo4MCmKhdk1L6qGdVZqrpppx26umnoIYq6qiklmrqqaimquqqrHJ65Yn+NL66X6T9VUqXrbdeaiatBuq6a5Yy4jqYr2wS66axcvLaq7IWMoshsskC+6KwaVFbLbSgYauntts6K6K3JEo7LbeXkasouOHGKiuM6spqLVrvqtbqvPTWa++9+Oar77789uvvvwAHLPDAAa/rH7pimvtXvGUx3LDCliJMp8QTi5uiw1thnDHEdWmclccfc5wrxYCSXLLFhJpsqMgjozwgyFfBHDPLw6rMqM03uywpzdfiDKnOtfIMr9BD+4wpwUgnrfTSTDfttKYCRC311FRXbfXVWGet9dZcd+3112CHLfbYZJdt9tlop6322my37fbbcMct99x012333Xjnrff+3nz37fffgAcu+OBqGwxA1oYfjrXhiBvcuOOLQ34145FLbjXlk1tedeKPy9r5q5+DXrnno4ueueZUY3456lNzXvqVodcYu+yv03466bfjvvq6s7/Yu++1y/h7isMTHzzwhCev/PLMN+/889BHL/301Fdv/fXYZ6/99tx37/334Icv/vjkl2/++einr/767LfvPlHF3xT//MfrRH/uP8WvOP4+3b+7UP7b3FD0F8DUDbB+OSlg6w7Iv/4hUH4P3N//gqJAqcEvghIUIAAjSEAOerCBPalg1C4IQvt9cIL5w6AIBUBCFKawhDhZYVFkyEAXOhCGEMRhBg1YQw1S8IT+PvyhDmnYQx4K0YYm1OEOF7jBIaoQiEYESgedSEUkJtGKMYQiE5uIxRx2cYkWbGEQX/jFKZZRi2Es4haliMYRijGKZBzjDb8IRjdyUY4hfGIV8XhFPvYRjnP0YxaVSMQjCnKQZ9wjIAO5yD+uMY6NdGQaDRlJRB7Si5csJCUfyUhO5pGQbWShGie5SVJC0pOStOMdK4lJVtZRlKNUJRsVicpUwrKUsjylKXWZy07u8pN0XKH7hknMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t0nNN9YygaH05i+BmclwirOX5HSlGctJy3Ha8py3nGUwzbnKb1pSnfT+rKc772nPV84wn/K8pD9jGU9eFtSg8EyoQvWJzncuFJcHTWc/B8rQiDqUoA8NqCspCtGMarSfmvzoPlsJUj0m8qQCDakvG3rRjmLUoyu1KDhB2U6W8nOkJMWpSmMKU4nilKMitWlOhTpUmd6UqOvEZ02NelSmAhWhPW1pUJ36VJ6+9Koureg/lxpVqUJVq11taljFitWpbhWlSp0nV8tqVrZa1a0+RapJ2YnWie7Uq1/Nql73alBu+vWvgA2sYAdL2MIa9rCITaxiF8vYxjr2sZCNbGPHWlTKJrWka4WrZ+46U7XWVadzTStdU4rBxXCWrJrt7Gg3etrKUpYxra1+6lv5OlvaxtWpl/2paQGaV9vi9bZnXS1mPSvQ3WbWt79NrmpZy9vatlU2sc2tXI+LXNRW17qpiW5ohyvcn2qXpnQ07menS1zRmteuzQXua8XbXfKSlrq9fe51Zate6KZXucvl7nm9e9/88leJ7N2vZAdM4AIb+MAITrCC/xoQACH+FU1hZGUgd2l0aCBTY3JlZW5Ub0dpZgA7"},554:function(e,t,n){e.exports=n.p+"assets/img/scanning_non_binary.f5d202a9.gif"}}]); \ No newline at end of file diff --git a/assets/js/179.49976074.js b/assets/js/180.7e542b45.js similarity index 94% rename from assets/js/179.49976074.js rename to assets/js/180.7e542b45.js index ee08bcbaf0..e4db237b5f 100644 --- a/assets/js/179.49976074.js +++ b/assets/js/180.7e542b45.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[179],{1125:function(e,t,a){"use strict";a.r(t);var i=a(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"averager"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#averager"}},[e._v("#")]),e._v(" Averager")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Basic Math)")]),e._v(" "),t("p",[e._v("The averager component takes an input stream and forwards the average of certain amount of buffered last inputs. The size of the buffer can be set via a property. The component can be used to eliminate spikes in an input data stream. Furthermore the unit can also be used as an accumulator which accumulates all inputs within a certain time interval.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(692),alt:"Screenshot: Averager plugin",title:"Screenshot: Averager plugin"}})]),e._v(" "),t("p",[e._v("Averager plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [double]:")]),e._v(" This port reads the inputs to be averaged.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [double]:")]),e._v(" This port provides the current average of the buffered inputs.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enablePlugin:")]),e._v(" Enables the functionality of this plugin.")]),e._v(" "),t("li",[t("strong",[e._v("disablePlugin:")]),e._v(" Disables the functionality of this plugin. New values aren’t accumulated anymore and no output is sent to the output port. If property autoReenableTime set, the plugin is automatically re-enabled after the time defined by this property. Generally disabling is delayed until the buffer of values is full, preventing any startup glitches.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enabled [boolean]:")]),e._v(" if true (default), the plugin is enabled, if false the plugin does nothing. Generally disabling is delayed until the buffer of values is full, preventing any startup glitches.")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer]:")]),e._v(" Denotes the operating mode of the unit, three modes are available:\n"),t("ul",[t("li",[t("em",[e._v("average:")]),e._v(" unit performs averaging calculations and emits double values average with integer.")]),e._v(" "),t("li",[t("em",[e._v("output:")]),e._v(" unit performs calculations and rounds result to integer.")]),e._v(" "),t("li",[t("em",[e._v("accumulate:")]),e._v(" unit accumulates inputs for certain amount of time.")])])]),e._v(" "),t("li",[t("strong",[e._v("bufferSize [integer]:")]),e._v(" Specifies the size of the buffer in the averaging modes or the amount of milliseconds to accumulate in the accumulator mode.")]),e._v(" "),t("li",[t("strong",[e._v("autoReenableTime [integer]:")]),e._v(" Time in ms, after the plugin automatically re-enables itself after being disabled. Set to zero (default) to deactivate this functionality (never auto re-enable).")])])])}),[],!1,null,null,null);t.default=r.exports},692:function(e,t,a){e.exports=a.p+"assets/img/averager.e86f771d.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[180],{1130:function(e,t,a){"use strict";a.r(t);var i=a(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"averager"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#averager"}},[e._v("#")]),e._v(" Averager")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Basic Math)")]),e._v(" "),t("p",[e._v("The averager component takes an input stream and forwards the average of certain amount of buffered last inputs. The size of the buffer can be set via a property. The component can be used to eliminate spikes in an input data stream. Furthermore the unit can also be used as an accumulator which accumulates all inputs within a certain time interval.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(694),alt:"Screenshot: Averager plugin",title:"Screenshot: Averager plugin"}})]),e._v(" "),t("p",[e._v("Averager plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [double]:")]),e._v(" This port reads the inputs to be averaged.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [double]:")]),e._v(" This port provides the current average of the buffered inputs.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enablePlugin:")]),e._v(" Enables the functionality of this plugin.")]),e._v(" "),t("li",[t("strong",[e._v("disablePlugin:")]),e._v(" Disables the functionality of this plugin. New values aren’t accumulated anymore and no output is sent to the output port. If property autoReenableTime set, the plugin is automatically re-enabled after the time defined by this property. Generally disabling is delayed until the buffer of values is full, preventing any startup glitches.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enabled [boolean]:")]),e._v(" if true (default), the plugin is enabled, if false the plugin does nothing. Generally disabling is delayed until the buffer of values is full, preventing any startup glitches.")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer]:")]),e._v(" Denotes the operating mode of the unit, three modes are available:\n"),t("ul",[t("li",[t("em",[e._v("average:")]),e._v(" unit performs averaging calculations and emits double values average with integer.")]),e._v(" "),t("li",[t("em",[e._v("output:")]),e._v(" unit performs calculations and rounds result to integer.")]),e._v(" "),t("li",[t("em",[e._v("accumulate:")]),e._v(" unit accumulates inputs for certain amount of time.")])])]),e._v(" "),t("li",[t("strong",[e._v("bufferSize [integer]:")]),e._v(" Specifies the size of the buffer in the averaging modes or the amount of milliseconds to accumulate in the accumulator mode.")]),e._v(" "),t("li",[t("strong",[e._v("autoReenableTime [integer]:")]),e._v(" Time in ms, after the plugin automatically re-enables itself after being disabled. Set to zero (default) to deactivate this functionality (never auto re-enable).")])])])}),[],!1,null,null,null);t.default=r.exports},694:function(e,t,a){e.exports=a.p+"assets/img/averager.e86f771d.jpg"}}]); \ No newline at end of file diff --git a/assets/js/180.e75ce4ae.js b/assets/js/181.976242b9.js similarity index 95% rename from assets/js/180.e75ce4ae.js rename to assets/js/181.976242b9.js index 7050059db2..c8c1237c05 100644 --- a/assets/js/180.e75ce4ae.js +++ b/assets/js/181.976242b9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[180],{1128:function(t,e,i){"use strict";i.r(e);var r=i(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"basic-tremor-reduction-algorithms"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-tremor-reduction-algorithms"}},[t._v("#")]),t._v(" Basic Tremor Reduction algorithms")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Singal Shaping)")]),t._v(" "),e("p",[t._v("This plugin contains three algorithms for user hand tremor reduction: Arithmetic Mean, Outlier Reduction and Exponential Smoothing. The Arithmetic Mean algorithm calculates the cursor position as an average of the past n cursor positions. N is defined by the bufferSize parameter. The Outlier Reduction algorithm keeps the maximum distance between two followed cursor positions. The maximum distance is defined by the maxDistance parameter. If the distance between two cursor positions is greater than maxDistance, it is reduced to the value of maxDistance. The Exponential Smoothing algorithm implements the "),e("a",{attrs:{href:"http://en.wikipedia.org/wiki/Exponential_smoothing",target:"_blank",rel:"noopener noreferrer"}},[t._v("Exponential smoothing"),e("OutboundLink")],1),t._v(" technique. The factor parameter defines the Exponential Smoothing and the degree parameters define the degree of the equation.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(695),alt:"Screenshot: Basic Tremor Reduction algorithms plugin",title:"Screenshot: Basic Tremor Reduction algorithms plugin"}})]),t._v(" "),e("p",[t._v("Basic Tremor Reduction algorithms plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputX [integer]:")]),t._v(" Input mouse X position.")]),t._v(" "),e("li",[e("strong",[t._v("inputY [integer]:")]),t._v(" Input mouse Y position.")]),t._v(" "),e("li",[e("strong",[t._v("bufferSize [integer]:")]),t._v(" The new buffer size value for the Arithmetic Mean algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("maxDistance [double]:")]),t._v(" The new maximum distance value for the Outlier Reduction algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("factor [double]:")]),t._v(" The new factor value for Exponential Smoothing algorithm.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputX [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output mouse X position.")]),t._v(" "),e("li",[e("strong",[t._v("outputY [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output mouse Y position.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("algorithm [integer]:")]),t._v(" Defines the algorithm used for the tremor reduction.")]),t._v(" "),e("li",[e("strong",[t._v("eventsType [integer]:")]),t._v(" Defines if the mouse coordinates are absolute or relative.")]),t._v(" "),e("li",[e("strong",[t._v("bufferSize [integer]:")]),t._v(" The buffer size value for the Arithmetic Mean algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("maxDistance [double]:")]),t._v(" The maximum distance value for the Outlier Reduction algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("factor [double]:")]),t._v(" The factor value for Exponential Smoothing algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("degree [integer]:")]),t._v(" The degree of the equation for Exponential Smoothing algorithm.")])])])}),[],!1,null,null,null);e.default=o.exports},695:function(t,e,i){t.exports=i.p+"assets/img/basictralgorithms.e1416158.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[181],{1134:function(t,e,i){"use strict";i.r(e);var r=i(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"basic-tremor-reduction-algorithms"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-tremor-reduction-algorithms"}},[t._v("#")]),t._v(" Basic Tremor Reduction algorithms")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Singal Shaping)")]),t._v(" "),e("p",[t._v("This plugin contains three algorithms for user hand tremor reduction: Arithmetic Mean, Outlier Reduction and Exponential Smoothing. The Arithmetic Mean algorithm calculates the cursor position as an average of the past n cursor positions. N is defined by the bufferSize parameter. The Outlier Reduction algorithm keeps the maximum distance between two followed cursor positions. The maximum distance is defined by the maxDistance parameter. If the distance between two cursor positions is greater than maxDistance, it is reduced to the value of maxDistance. The Exponential Smoothing algorithm implements the "),e("a",{attrs:{href:"http://en.wikipedia.org/wiki/Exponential_smoothing",target:"_blank",rel:"noopener noreferrer"}},[t._v("Exponential smoothing"),e("OutboundLink")],1),t._v(" technique. The factor parameter defines the Exponential Smoothing and the degree parameters define the degree of the equation.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(698),alt:"Screenshot: Basic Tremor Reduction algorithms plugin",title:"Screenshot: Basic Tremor Reduction algorithms plugin"}})]),t._v(" "),e("p",[t._v("Basic Tremor Reduction algorithms plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputX [integer]:")]),t._v(" Input mouse X position.")]),t._v(" "),e("li",[e("strong",[t._v("inputY [integer]:")]),t._v(" Input mouse Y position.")]),t._v(" "),e("li",[e("strong",[t._v("bufferSize [integer]:")]),t._v(" The new buffer size value for the Arithmetic Mean algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("maxDistance [double]:")]),t._v(" The new maximum distance value for the Outlier Reduction algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("factor [double]:")]),t._v(" The new factor value for Exponential Smoothing algorithm.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputX [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output mouse X position.")]),t._v(" "),e("li",[e("strong",[t._v("outputY [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output mouse Y position.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("algorithm [integer]:")]),t._v(" Defines the algorithm used for the tremor reduction.")]),t._v(" "),e("li",[e("strong",[t._v("eventsType [integer]:")]),t._v(" Defines if the mouse coordinates are absolute or relative.")]),t._v(" "),e("li",[e("strong",[t._v("bufferSize [integer]:")]),t._v(" The buffer size value for the Arithmetic Mean algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("maxDistance [double]:")]),t._v(" The maximum distance value for the Outlier Reduction algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("factor [double]:")]),t._v(" The factor value for Exponential Smoothing algorithm.")]),t._v(" "),e("li",[e("strong",[t._v("degree [integer]:")]),t._v(" The degree of the equation for Exponential Smoothing algorithm.")])])])}),[],!1,null,null,null);e.default=o.exports},698:function(t,e,i){t.exports=i.p+"assets/img/basictralgorithms.e1416158.jpg"}}]); \ No newline at end of file diff --git a/assets/js/181.d74ca735.js b/assets/js/182.8b71f340.js similarity index 92% rename from assets/js/181.d74ca735.js rename to assets/js/182.8b71f340.js index 4f8367692d..e7839321d7 100644 --- a/assets/js/181.d74ca735.js +++ b/assets/js/182.8b71f340.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[181],{1127:function(t,e,r){"use strict";r.r(e);var n=r(2),a=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"benchmark"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#benchmark"}},[t._v("#")]),t._v(" Benchmark")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component may be used to perform benchmark of data throughput at a particular location of the model / design. It counts port activity of data and event ports per given time.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(694),alt:"Screenshot: Benchmark plugin",title:"Screenshot: Benchmark plugin"}})]),t._v(" "),e("p",[t._v("Benchmark plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" Input port for numeric values. Incoming activity increases the data counter.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("dataCount [integer]:")]),t._v(" The current value of the data counter.")]),t._v(" "),e("li",[e("strong",[t._v("eventCount [integer]:")]),t._v(" The current value of the event counter.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("eventIncrease:")]),t._v(" Incoming events increase the event counter.")]),t._v(" "),e("li",[e("strong",[t._v("resetCounter:")]),t._v(" An incoming event resets data counter and event counter to 0.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("time [integer]:")]),t._v(" The time period in milliseconds for measuring data activity and events. After the time has passed, the current values of data counter and event counter are provided at the output port, and the counters are reset to zero.")])])])}),[],!1,null,null,null);e.default=a.exports},694:function(t,e,r){t.exports=r.p+"assets/img/benchmark.86b6eaf0.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[182],{1132:function(t,e,r){"use strict";r.r(e);var n=r(2),a=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"benchmark"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#benchmark"}},[t._v("#")]),t._v(" Benchmark")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component may be used to perform benchmark of data throughput at a particular location of the model / design. It counts port activity of data and event ports per given time.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(697),alt:"Screenshot: Benchmark plugin",title:"Screenshot: Benchmark plugin"}})]),t._v(" "),e("p",[t._v("Benchmark plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" Input port for numeric values. Incoming activity increases the data counter.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("dataCount [integer]:")]),t._v(" The current value of the data counter.")]),t._v(" "),e("li",[e("strong",[t._v("eventCount [integer]:")]),t._v(" The current value of the event counter.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("eventIncrease:")]),t._v(" Incoming events increase the event counter.")]),t._v(" "),e("li",[e("strong",[t._v("resetCounter:")]),t._v(" An incoming event resets data counter and event counter to 0.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("time [integer]:")]),t._v(" The time period in milliseconds for measuring data activity and events. After the time has passed, the current values of data counter and event counter are provided at the output port, and the counters are reset to zero.")])])])}),[],!1,null,null,null);e.default=a.exports},697:function(t,e,r){t.exports=r.p+"assets/img/benchmark.86b6eaf0.jpg"}}]); \ No newline at end of file diff --git a/assets/js/182.5f45c9fe.js b/assets/js/183.f0192aed.js similarity index 93% rename from assets/js/182.5f45c9fe.js rename to assets/js/183.f0192aed.js index 9a8775cf05..6bb7ecf002 100644 --- a/assets/js/182.5f45c9fe.js +++ b/assets/js/183.f0192aed.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[182],{1130:function(e,t,n){"use strict";n.r(t);var o=n(2),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"blink-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#blink-detection"}},[e._v("#")]),e._v(" Blink Detection")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This component detects the shape that a blink produces in an electro-oculogram signal. The plugin analyses the input samples and recognises both a single blink and a double blink. Here a single blink is defined by an action whereby both eyes are simultaneously and voluntary closed and open. A double blink refers to the repletion of this action twice in an consecutive way. When one of these conditions is found the corresponding event is fired. In addition, a true Boolean will be output to the corresponding output port.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(696),alt:"Screenshot: Blink Detection plugin",title:"Screenshot: Blink Detection plugin"}})]),e._v(" "),t("p",[e._v("Blink Detection plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The input signal shall correspond to a 250-Hz sampled electro-oculogram signal, i.e., an output port of the "),t("a",{attrs:{href:"../sensors/Enobio.htm"}},[e._v("Enobio")]),e._v(" component when the corresponding electrode is placed on the user’s forehead.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [integer]:")]),e._v(" Input values that correspond to a 250-Hz sampled electro-oculogram signal.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("BlinkDetected:")]),e._v(" This event port fires an event if a blink is detected in the input sequence of integers.")]),e._v(" "),t("li",[t("strong",[e._v("DoubleblinkDetected:")]),e._v(" This event port fires an event if a double blink is detected in the input sequence of integers.")])])])}),[],!1,null,null,null);t.default=i.exports},696:function(e,t,n){e.exports=n.p+"assets/img/blinkdetection.5593407c.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[183],{1135:function(e,t,n){"use strict";n.r(t);var o=n(2),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"blink-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#blink-detection"}},[e._v("#")]),e._v(" Blink Detection")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This component detects the shape that a blink produces in an electro-oculogram signal. The plugin analyses the input samples and recognises both a single blink and a double blink. Here a single blink is defined by an action whereby both eyes are simultaneously and voluntary closed and open. A double blink refers to the repletion of this action twice in an consecutive way. When one of these conditions is found the corresponding event is fired. In addition, a true Boolean will be output to the corresponding output port.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(699),alt:"Screenshot: Blink Detection plugin",title:"Screenshot: Blink Detection plugin"}})]),e._v(" "),t("p",[e._v("Blink Detection plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The input signal shall correspond to a 250-Hz sampled electro-oculogram signal, i.e., an output port of the "),t("a",{attrs:{href:"../sensors/Enobio.htm"}},[e._v("Enobio")]),e._v(" component when the corresponding electrode is placed on the user’s forehead.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [integer]:")]),e._v(" Input values that correspond to a 250-Hz sampled electro-oculogram signal.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("BlinkDetected:")]),e._v(" This event port fires an event if a blink is detected in the input sequence of integers.")]),e._v(" "),t("li",[t("strong",[e._v("DoubleblinkDetected:")]),e._v(" This event port fires an event if a double blink is detected in the input sequence of integers.")])])])}),[],!1,null,null,null);t.default=i.exports},699:function(e,t,n){e.exports=n.p+"assets/img/blinkdetection.5593407c.jpg"}}]); \ No newline at end of file diff --git a/assets/js/183.2935bcd9.js b/assets/js/184.b91c67fe.js similarity index 98% rename from assets/js/183.2935bcd9.js rename to assets/js/184.b91c67fe.js index 028784cb75..9c7187e990 100644 --- a/assets/js/183.2935bcd9.js +++ b/assets/js/184.b91c67fe.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[183],{1132:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"blink-detector-trainer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#blink-detector-trainer"}},[t._v("#")]),t._v(" Blink Detector Trainer")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This component calculates the maxThreshold, minThreshold, BlinkLength and DoubleBlinkSeparation customized properties of the "),e("a",{attrs:{href:"../processors/BlinkDetector.htm"}},[t._v("Blink Detector")]),t._v(" plugin for each specific subject. For a description of the meaning of these properties, please see "),e("a",{attrs:{href:"../processors/BlinkDetector.htm"}},[t._v("Blink Detector")]),t._v(". The training of the system consists on asking the subject to follow a protocol. This protocol consists on a series of 5 simple blinks and 5 double blinks. Note that the subject can perform only "),e("strong",[t._v("one")]),t._v(" simple (or double) blink each time the protocol indicates so through its Protocol port. When the protocol finishes, the results show up through the Results output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(700),alt:"Screenshot: Blink Detector Trainer plugin",title:"Screenshot: Blink Detector Trainer plugin"}})]),t._v(" "),e("p",[t._v("Blink Detector plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The input signal shall correspond to a 250-Hz sampled electro-oculogram signal, i.e., an output port of the "),e("a",{attrs:{href:"../sensors/Enobio.htm"}},[t._v("Enobio")]),t._v(" component when the corresponding electrode is placed on the user’s forehead.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [integer]:")]),t._v(" Input values that correspond to a 250-Hz sampled electro-oculogram signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Protocol [string]:")]),t._v(" Actions to be performed by the user. Note that the user must perform just one blink (or double blink) each time the corresponding message is delivered through this port.")]),t._v(" "),e("li",[e("strong",[t._v("Results [string]:")]),t._v(" Final parameters calculated for the specific subject. They will delivered when the protocol has finished.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartProtocol [integer]:")]),t._v(" Starts the training protocol. The actions to be performed by the subject will be delivered through the Protocol port.")]),t._v(" "),e("li",[e("strong",[t._v("StopProtocol:")]),t._v(" Stops the training protocol.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sampleRate [integer]:")]),t._v(" Sample rate of the input signal in Hertz.")]),t._v(" "),e("li",[e("strong",[t._v("language [list]:")]),t._v(" Language of the messages thrown through the Protocol port while the protocol is running. The user can chose English or Spanish.")])])])}),[],!1,null,null,null);e.default=s.exports},700:function(t,e,r){t.exports=r.p+"assets/img/blinkdetectortrainer.c93653c5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[184],{1136:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"blink-detector-trainer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#blink-detector-trainer"}},[t._v("#")]),t._v(" Blink Detector Trainer")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This component calculates the maxThreshold, minThreshold, BlinkLength and DoubleBlinkSeparation customized properties of the "),e("a",{attrs:{href:"../processors/BlinkDetector.htm"}},[t._v("Blink Detector")]),t._v(" plugin for each specific subject. For a description of the meaning of these properties, please see "),e("a",{attrs:{href:"../processors/BlinkDetector.htm"}},[t._v("Blink Detector")]),t._v(". The training of the system consists on asking the subject to follow a protocol. This protocol consists on a series of 5 simple blinks and 5 double blinks. Note that the subject can perform only "),e("strong",[t._v("one")]),t._v(" simple (or double) blink each time the protocol indicates so through its Protocol port. When the protocol finishes, the results show up through the Results output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(700),alt:"Screenshot: Blink Detector Trainer plugin",title:"Screenshot: Blink Detector Trainer plugin"}})]),t._v(" "),e("p",[t._v("Blink Detector plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The input signal shall correspond to a 250-Hz sampled electro-oculogram signal, i.e., an output port of the "),e("a",{attrs:{href:"../sensors/Enobio.htm"}},[t._v("Enobio")]),t._v(" component when the corresponding electrode is placed on the user’s forehead.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [integer]:")]),t._v(" Input values that correspond to a 250-Hz sampled electro-oculogram signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Protocol [string]:")]),t._v(" Actions to be performed by the user. Note that the user must perform just one blink (or double blink) each time the corresponding message is delivered through this port.")]),t._v(" "),e("li",[e("strong",[t._v("Results [string]:")]),t._v(" Final parameters calculated for the specific subject. They will delivered when the protocol has finished.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartProtocol [integer]:")]),t._v(" Starts the training protocol. The actions to be performed by the subject will be delivered through the Protocol port.")]),t._v(" "),e("li",[e("strong",[t._v("StopProtocol:")]),t._v(" Stops the training protocol.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sampleRate [integer]:")]),t._v(" Sample rate of the input signal in Hertz.")]),t._v(" "),e("li",[e("strong",[t._v("language [list]:")]),t._v(" Language of the messages thrown through the Protocol port while the protocol is running. The user can chose English or Spanish.")])])])}),[],!1,null,null,null);e.default=s.exports},700:function(t,e,r){t.exports=r.p+"assets/img/blinkdetectortrainer.c93653c5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/184.7bd2bdae.js b/assets/js/185.52b131f8.js similarity index 94% rename from assets/js/184.7bd2bdae.js rename to assets/js/185.52b131f8.js index ffe5611666..903e96c2f0 100644 --- a/assets/js/184.7bd2bdae.js +++ b/assets/js/185.52b131f8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[184],{1133:function(t,e,r){"use strict";r.r(e);var i=r(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"comport"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comport"}},[t._v("#")]),t._v(" ComPort")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Communication)")]),t._v(" "),e("p",[t._v("The ComPort plugin can be used to send and receive data from serial devices (e.g. microcontrollers/embedded devices/wireless links etc.) via a COM port or virtual COM port. The plugin provides support for different data formats of serial communication, e.g. string or binary")]),t._v(" "),e("p",[e("img",{attrs:{src:r(701),alt:"Screenshot: COMPort plugin",title:"Screenshot: COMPort plugin"}})]),t._v(" "),e("p",[t._v("COMPort plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("send [string]:")]),t._v(" string which will be sent to the microcontroller / embedded module")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("received [string]:")]),t._v(" string which has been received (was sent from the microcontroller / embedded module)")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("enablePlugin:")]),t._v(" Enables the functionality of this plugin.")]),t._v(" "),e("li",[e("strong",[t._v("disablePlugin:")]),t._v(" Disables the functionality of this plugin. Any open COM port is closed and no new values are received.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("enabled [boolean]:")]),t._v(" If true (default), the plugin is enabled, if false the plugin does nothing and doesn’t attempt to open the given COM port.")]),t._v(" "),e("li",[e("strong",[t._v("ComPort [string]:")]),t._v(" Defines the COM Port of the target serial device. e.g. COM0")]),t._v(" "),e("li",[e("strong",[t._v("BaudRate [integer]:")]),t._v(" Defines the Baudrate for the communication. It must match the baudrate of the target device")]),t._v(" "),e("li",[t._v("**ReceivedDataType [combobox selection]"),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("*can be used to indicate other data type like binary integer type etc. (currently, only string is supported)")]),t._v(" "),e("li",[t._v("**SendDataType [combobox selection]"),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("*can be used to indicate data type for sending (currently, string is supported and a selectable termination character can be added)")])])])}),[],!1,null,null,null);e.default=s.exports},701:function(t,e,r){t.exports=r.p+"assets/img/comport.81304d08.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[185],{1141:function(t,e,r){"use strict";r.r(e);var i=r(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"comport"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comport"}},[t._v("#")]),t._v(" ComPort")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Communication)")]),t._v(" "),e("p",[t._v("The ComPort plugin can be used to send and receive data from serial devices (e.g. microcontrollers/embedded devices/wireless links etc.) via a COM port or virtual COM port. The plugin provides support for different data formats of serial communication, e.g. string or binary")]),t._v(" "),e("p",[e("img",{attrs:{src:r(707),alt:"Screenshot: COMPort plugin",title:"Screenshot: COMPort plugin"}})]),t._v(" "),e("p",[t._v("COMPort plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("send [string]:")]),t._v(" string which will be sent to the microcontroller / embedded module")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("received [string]:")]),t._v(" string which has been received (was sent from the microcontroller / embedded module)")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("enablePlugin:")]),t._v(" Enables the functionality of this plugin.")]),t._v(" "),e("li",[e("strong",[t._v("disablePlugin:")]),t._v(" Disables the functionality of this plugin. Any open COM port is closed and no new values are received.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("enabled [boolean]:")]),t._v(" If true (default), the plugin is enabled, if false the plugin does nothing and doesn’t attempt to open the given COM port.")]),t._v(" "),e("li",[e("strong",[t._v("ComPort [string]:")]),t._v(" Defines the COM Port of the target serial device. e.g. COM0")]),t._v(" "),e("li",[e("strong",[t._v("BaudRate [integer]:")]),t._v(" Defines the Baudrate for the communication. It must match the baudrate of the target device")]),t._v(" "),e("li",[t._v("**ReceivedDataType [combobox selection]"),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("*can be used to indicate other data type like binary integer type etc. (currently, only string is supported)")]),t._v(" "),e("li",[t._v("**SendDataType [combobox selection]"),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("*can be used to indicate data type for sending (currently, string is supported and a selectable termination character can be added)")])])])}),[],!1,null,null,null);e.default=s.exports},707:function(t,e,r){t.exports=r.p+"assets/img/comport.81304d08.jpg"}}]); \ No newline at end of file diff --git a/assets/js/185.1daebdac.js b/assets/js/186.73fa246c.js similarity index 94% rename from assets/js/185.1daebdac.js rename to assets/js/186.73fa246c.js index 5a296d3aa7..8ad73cc4b1 100644 --- a/assets/js/185.1daebdac.js +++ b/assets/js/186.73fa246c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[185],{1135:function(t,e,o){"use strict";o.r(e);var r=o(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"comparator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comparator"}},[t._v("#")]),t._v(" Comparator")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component compares the numerical values of two input ports and provides output depending on the result of the comparison.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(703),alt:"Screenshot: Comparator plugin",title:"Screenshot: Comparator plugin"}})]),t._v(" "),e("p",[t._v("Comparator plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inA [double]:")]),t._v(" Input port for signal a. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("inB [double]:")]),t._v(" Input port for signal b. "),e("strong",[t._v("This input port supports synchronization")])])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" Output port of the comparator (value according to condition and operational mode).")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("conditionTrue:")]),t._v(" This event is triggered when the comparator condition switches from false to true.")]),t._v(" "),e("li",[e("strong",[t._v("comparatorFalse:")]),t._v(" This event is triggered when the comparator condition switches from true to false.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("condition [integer]:")]),t._v(" Defines the condition to be met. Available conditions are “a greater b”, “a equals b”, “a lower b”, “a greater threshold”, “a equals threshold”, “a lower threshold” and “a between threshold and threshold2”.")]),t._v(" "),e("li",[e("strong",[t._v("outputMode [integer]:")]),t._v(" Defines the mode of operation, respectively which values are put to the output port of the plugin. Following modes are available: “output min”, “output max” and “output a if condition met”.")]),t._v(" "),e("li",[e("strong",[t._v("eventMode [integer]:")]),t._v(" Defines the mode of event generation (if events are created on every comparison of input values or only if the output condition changes).")]),t._v(" "),e("li",[e("strong",[t._v("threshold [double]:")]),t._v(" Defines the threshold value for the condition modes “a greater than threshold”, “a equals threshold” and “a lower than threshold”.")]),t._v(" "),e("li",[e("strong",[t._v("threshold2 [double]:")]),t._v(" Defines the threshold2 value for the condition mode “a between threshold and threshold2”.")])])])}),[],!1,null,null,null);e.default=n.exports},703:function(t,e,o){t.exports=o.p+"assets/img/comparator.2dfefc2b.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[186],{1139:function(t,e,o){"use strict";o.r(e);var r=o(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"comparator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comparator"}},[t._v("#")]),t._v(" Comparator")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component compares the numerical values of two input ports and provides output depending on the result of the comparison.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(705),alt:"Screenshot: Comparator plugin",title:"Screenshot: Comparator plugin"}})]),t._v(" "),e("p",[t._v("Comparator plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inA [double]:")]),t._v(" Input port for signal a. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("inB [double]:")]),t._v(" Input port for signal b. "),e("strong",[t._v("This input port supports synchronization")])])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" Output port of the comparator (value according to condition and operational mode).")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("conditionTrue:")]),t._v(" This event is triggered when the comparator condition switches from false to true.")]),t._v(" "),e("li",[e("strong",[t._v("comparatorFalse:")]),t._v(" This event is triggered when the comparator condition switches from true to false.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("condition [integer]:")]),t._v(" Defines the condition to be met. Available conditions are “a greater b”, “a equals b”, “a lower b”, “a greater threshold”, “a equals threshold”, “a lower threshold” and “a between threshold and threshold2”.")]),t._v(" "),e("li",[e("strong",[t._v("outputMode [integer]:")]),t._v(" Defines the mode of operation, respectively which values are put to the output port of the plugin. Following modes are available: “output min”, “output max” and “output a if condition met”.")]),t._v(" "),e("li",[e("strong",[t._v("eventMode [integer]:")]),t._v(" Defines the mode of event generation (if events are created on every comparison of input values or only if the output condition changes).")]),t._v(" "),e("li",[e("strong",[t._v("threshold [double]:")]),t._v(" Defines the threshold value for the condition modes “a greater than threshold”, “a equals threshold” and “a lower than threshold”.")]),t._v(" "),e("li",[e("strong",[t._v("threshold2 [double]:")]),t._v(" Defines the threshold2 value for the condition mode “a between threshold and threshold2”.")])])])}),[],!1,null,null,null);e.default=n.exports},705:function(t,e,o){t.exports=o.p+"assets/img/comparator.2dfefc2b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/186.070ded75.js b/assets/js/187.aa22d126.js similarity index 94% rename from assets/js/186.070ded75.js rename to assets/js/187.aa22d126.js index 488ceb0ee1..1213142f52 100644 --- a/assets/js/186.070ded75.js +++ b/assets/js/187.aa22d126.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[186],{1134:function(e,t,s){"use strict";s.r(t);var r=s(2),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"compute-bandpower"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compute-bandpower"}},[e._v("#")]),e._v(" Compute Bandpower")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This component computes the power that an input signal has in a specific frequency band. The plugin stores as many values as the DataLen property indicates before providing a new value in the output port. This solution is based on the FFT so only the bins corresponding to the specified band are considered. This approach removes the contribution of the out-band frequencies to the final value. This approach improves the power output of the filter plugin which uses the filtered signal for computing the output value so the frequencies out of the pass band contributes to the final value since the filter is implemented as FIR filter with a finite number of coefficients so the frequency response will not never be perfect.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(702),alt:"Screenshot: Compute Bandpower plugin",title:"Screenshot: Compute Bandpower plugin"}})]),e._v(" "),t("p",[e._v("Compute Bandpower plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The values in the input port shall correspond to a time series.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [double]:")]),e._v(" Input port for the values of time series which power in band is computed.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [double]:")]),e._v(" Output of the value that corresponds to the power of the signal present in the last DataLen samples. If the input signal is expressed in volts, then the output is expressed in squared volts.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("DataLen [integer]:")]),e._v(" Defines the length of the time series over which the band power computation is performed. Only power of two values are allowed for this property.")]),e._v(" "),t("li",[t("strong",[e._v("SampleRate [integer]:")]),e._v(" Defines the sample rate of the input time series. It is defined in samples per second.")]),e._v(" "),t("li",[t("strong",[e._v("StartBandFrequency [integer]:")]),e._v(" Defines the beginning of the band to be analysed. It is defined in Hertz.")]),e._v(" "),t("li",[t("strong",[e._v("EndBandFrequency [integer]:")]),e._v(" Defines the end of the band to be analysed. It is defined in Hertz.")])])])}),[],!1,null,null,null);t.default=n.exports},702:function(e,t,s){e.exports=s.p+"assets/img/computebandpower.9a67636f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[187],{1138:function(e,t,s){"use strict";s.r(t);var r=s(2),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"compute-bandpower"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compute-bandpower"}},[e._v("#")]),e._v(" Compute Bandpower")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This component computes the power that an input signal has in a specific frequency band. The plugin stores as many values as the DataLen property indicates before providing a new value in the output port. This solution is based on the FFT so only the bins corresponding to the specified band are considered. This approach removes the contribution of the out-band frequencies to the final value. This approach improves the power output of the filter plugin which uses the filtered signal for computing the output value so the frequencies out of the pass band contributes to the final value since the filter is implemented as FIR filter with a finite number of coefficients so the frequency response will not never be perfect.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(704),alt:"Screenshot: Compute Bandpower plugin",title:"Screenshot: Compute Bandpower plugin"}})]),e._v(" "),t("p",[e._v("Compute Bandpower plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The values in the input port shall correspond to a time series.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("input [double]:")]),e._v(" Input port for the values of time series which power in band is computed.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [double]:")]),e._v(" Output of the value that corresponds to the power of the signal present in the last DataLen samples. If the input signal is expressed in volts, then the output is expressed in squared volts.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("DataLen [integer]:")]),e._v(" Defines the length of the time series over which the band power computation is performed. Only power of two values are allowed for this property.")]),e._v(" "),t("li",[t("strong",[e._v("SampleRate [integer]:")]),e._v(" Defines the sample rate of the input time series. It is defined in samples per second.")]),e._v(" "),t("li",[t("strong",[e._v("StartBandFrequency [integer]:")]),e._v(" Defines the beginning of the band to be analysed. It is defined in Hertz.")]),e._v(" "),t("li",[t("strong",[e._v("EndBandFrequency [integer]:")]),e._v(" Defines the end of the band to be analysed. It is defined in Hertz.")])])])}),[],!1,null,null,null);t.default=n.exports},704:function(e,t,s){e.exports=s.p+"assets/img/computebandpower.9a67636f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/187.648b725a.js b/assets/js/188.c205c103.js similarity index 93% rename from assets/js/187.648b725a.js rename to assets/js/188.c205c103.js index 3769a26d25..eada08004f 100644 --- a/assets/js/187.648b725a.js +++ b/assets/js/188.c205c103.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[187],{1136:function(t,e,s){"use strict";s.r(e);var r=s(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component sends double values from the chosen slot.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(704),alt:"Screenshot: ConstantDispatcher plugin",title:"Screenshot: ConstantDispatcher plugin"}})]),t._v(" "),e("p",[t._v("ConstantDispatcher plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("slotDispatch [integer]:")]),t._v(" Sends the value from the slot defined by number.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" The port for the output value.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("dispatchSlot1…dispatchSlot20 :")]),t._v(" Sends the double value from the slot: 1…20.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchNextSlot:")]),t._v(" Sends double value from the next slot.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchPreviousSlot:")]),t._v(" Sends double value from the previous slot.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchSlotSeries:")]),t._v(" Sends slots values in sequence from slot 1 to slot defined by the Number property with the delay defined by the Delay property.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("number [integer]:")]),t._v(" Number of used slots.")]),t._v(" "),e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" Delay in ms used in sequence slot dispatch.")]),t._v(" "),e("li",[e("strong",[t._v("slot1…slot20 [double]:")]),t._v(" The slot for the value: 1…20.")]),t._v(" "),e("li",[e("strong",[t._v("autosendSlot [integer]:")]),t._v(" Number of slot which is automatically sent at start (0=disable).")])])])}),[],!1,null,null,null);e.default=o.exports},704:function(t,e,s){t.exports=s.p+"assets/img/constantdispatcher.bda97c1f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[188],{1140:function(t,e,s){"use strict";s.r(e);var r=s(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component sends double values from the chosen slot.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(706),alt:"Screenshot: ConstantDispatcher plugin",title:"Screenshot: ConstantDispatcher plugin"}})]),t._v(" "),e("p",[t._v("ConstantDispatcher plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("slotDispatch [integer]:")]),t._v(" Sends the value from the slot defined by number.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" The port for the output value.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("dispatchSlot1…dispatchSlot20 :")]),t._v(" Sends the double value from the slot: 1…20.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchNextSlot:")]),t._v(" Sends double value from the next slot.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchPreviousSlot:")]),t._v(" Sends double value from the previous slot.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchSlotSeries:")]),t._v(" Sends slots values in sequence from slot 1 to slot defined by the Number property with the delay defined by the Delay property.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("number [integer]:")]),t._v(" Number of used slots.")]),t._v(" "),e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" Delay in ms used in sequence slot dispatch.")]),t._v(" "),e("li",[e("strong",[t._v("slot1…slot20 [double]:")]),t._v(" The slot for the value: 1…20.")]),t._v(" "),e("li",[e("strong",[t._v("autosendSlot [integer]:")]),t._v(" Number of slot which is automatically sent at start (0=disable).")])])])}),[],!1,null,null,null);e.default=o.exports},706:function(t,e,s){t.exports=s.p+"assets/img/constantdispatcher.bda97c1f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/188.08e6cab1.js b/assets/js/189.41ec9e30.js similarity index 96% rename from assets/js/188.08e6cab1.js rename to assets/js/189.41ec9e30.js index 2e30132047..4573e130dc 100644 --- a/assets/js/188.08e6cab1.js +++ b/assets/js/189.41ec9e30.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[188],{1140:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"deadzone"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deadzone"}},[e._v("#")]),e._v(" Deadzone")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Signal Shaping)")]),e._v(" "),t("p",[e._v("The purpose of this component is to define active and passive areas (zones) for one- or two dimensional sensor values. This function could also be called “resting zone” or “centerzone”. It can be useful for example when a mouse pointer should not move before a certain value of a sensor (displacement of an analogue sensor, strength of activity) is reached.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(706),alt:"Screenshot: Deadzone plugin",title:"Screenshot: Deadzone plugin"}})]),e._v(" "),t("p",[e._v("Deadzone plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("inX [double]:")]),e._v(" Input of x values. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("inY [double]:")]),e._v(" Input of y values. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("radius [double]:")]),e._v(" The radius of the active/passive zone around the centre point.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("outX [double]:")]),e._v(" Output of modified x values.")]),e._v(" "),t("li",[t("strong",[e._v("outY [double]:")]),e._v(" Output of modified y values.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("setCenter:")]),e._v(" An incoming event stores the current x- and y- input values to represent the centre (It defines them as offset values). This can be useful for sensor calibration because it defines the “baseline” or resting position.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enterZone:")]),e._v(" This event is triggered when the x- and/or y- values enter the active zone. The active zone is the zone, in which values are passed to the output ports, see property ‘mode’.")]),e._v(" "),t("li",[t("strong",[e._v("exitZone:")]),e._v(" This event is triggered when the x- and/or y- values leave the active zone. The active zone is the zone, in which values are passed to the output ports, see property ‘mode’.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xCenter [double]:")]),e._v(" This value defines the x- position of the centre (the middle of the active/passive zones).")]),e._v(" "),t("li",[t("strong",[e._v("yCenter [double]:")]),e._v(" This value defines the y- position of the centre (the middle of the active/passive zones).")]),e._v(" "),t("li",[t("strong",[e._v("radius [double]:")]),e._v(" The radius of the active/passive zone around the centre point.")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer]:")]),e._v(" Selects the mode of operation of the centerzone component, following modes are available:\n"),t("ul",[t("li",[t("em",[e._v("“only inner values”:")]),e._v(" x- and y- values are passed to the output ports only if the distance to the centre is lower than the given radius.")]),e._v(" "),t("li",[t("em",[e._v("“only outer values”:")]),e._v(" x- and y- values are passed to the output ports only if the distance to the centre is greater than the given radius.")]),e._v(" "),t("li",[t("em",[e._v("“deadzone”:")]),e._v(" x- and y- values are passed to the output ports only if the distance to the center is greater than the given radius, and additionally a correction of the values is performed so that they start with 0 when leaving the inner zone. This is useful for defining a “deadzone” for sensor values, where an inactive area shall be provided and no sudden acceleration is desired when leaving this inactive area.")])])])])])}),[],!1,null,null,null);t.default=s.exports},706:function(e,t,n){e.exports=n.p+"assets/img/deadzone.fa4ae800.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[189],{1145:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"deadzone"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deadzone"}},[e._v("#")]),e._v(" Deadzone")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Signal Shaping)")]),e._v(" "),t("p",[e._v("The purpose of this component is to define active and passive areas (zones) for one- or two dimensional sensor values. This function could also be called “resting zone” or “centerzone”. It can be useful for example when a mouse pointer should not move before a certain value of a sensor (displacement of an analogue sensor, strength of activity) is reached.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(709),alt:"Screenshot: Deadzone plugin",title:"Screenshot: Deadzone plugin"}})]),e._v(" "),t("p",[e._v("Deadzone plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("inX [double]:")]),e._v(" Input of x values. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("inY [double]:")]),e._v(" Input of y values. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("radius [double]:")]),e._v(" The radius of the active/passive zone around the centre point.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("outX [double]:")]),e._v(" Output of modified x values.")]),e._v(" "),t("li",[t("strong",[e._v("outY [double]:")]),e._v(" Output of modified y values.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("setCenter:")]),e._v(" An incoming event stores the current x- and y- input values to represent the centre (It defines them as offset values). This can be useful for sensor calibration because it defines the “baseline” or resting position.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enterZone:")]),e._v(" This event is triggered when the x- and/or y- values enter the active zone. The active zone is the zone, in which values are passed to the output ports, see property ‘mode’.")]),e._v(" "),t("li",[t("strong",[e._v("exitZone:")]),e._v(" This event is triggered when the x- and/or y- values leave the active zone. The active zone is the zone, in which values are passed to the output ports, see property ‘mode’.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("xCenter [double]:")]),e._v(" This value defines the x- position of the centre (the middle of the active/passive zones).")]),e._v(" "),t("li",[t("strong",[e._v("yCenter [double]:")]),e._v(" This value defines the y- position of the centre (the middle of the active/passive zones).")]),e._v(" "),t("li",[t("strong",[e._v("radius [double]:")]),e._v(" The radius of the active/passive zone around the centre point.")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer]:")]),e._v(" Selects the mode of operation of the centerzone component, following modes are available:\n"),t("ul",[t("li",[t("em",[e._v("“only inner values”:")]),e._v(" x- and y- values are passed to the output ports only if the distance to the centre is lower than the given radius.")]),e._v(" "),t("li",[t("em",[e._v("“only outer values”:")]),e._v(" x- and y- values are passed to the output ports only if the distance to the centre is greater than the given radius.")]),e._v(" "),t("li",[t("em",[e._v("“deadzone”:")]),e._v(" x- and y- values are passed to the output ports only if the distance to the center is greater than the given radius, and additionally a correction of the values is performed so that they start with 0 when leaving the inner zone. This is useful for defining a “deadzone” for sensor values, where an inactive area shall be provided and no sudden acceleration is desired when leaving this inactive area.")])])])])])}),[],!1,null,null,null);t.default=s.exports},709:function(e,t,n){e.exports=n.p+"assets/img/deadzone.fa4ae800.jpg"}}]); \ No newline at end of file diff --git a/assets/js/19.993ddc49.js b/assets/js/19.910f1b2b.js similarity index 99% rename from assets/js/19.993ddc49.js rename to assets/js/19.910f1b2b.js index 341ad4938f..cd555c6862 100644 --- a/assets/js/19.993ddc49.js +++ b/assets/js/19.910f1b2b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{289:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_74b8c615b8455605.d7a70de8.png"},290:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_c0991ef32ae9b458.424ba3f3.png"},291:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_4dfe72317ab9f571.6b0975c3.jpg"},292:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_b6693a1cbcd9178a.03fc763d.png"},293:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_f1a0b4f36dd370ba.c1a39a2a.jpg"},294:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_fb7627584ba9d5d7.45a2067d.png"},295:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_3e993efbc73f2910.c6357005.png"},939:function(t,e,a){"use strict";a.r(e);var s=a(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"are-middleware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-middleware"}},[t._v("#")]),t._v(" ARE Middleware")]),t._v(" "),e("h2",{attrs:{id:"the-asterics-runtime-environment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-asterics-runtime-environment"}},[t._v("#")]),t._v(" The AsTeRICS Runtime Environment")]),t._v(" "),e("p",[t._v("The AsTeRICS Runtime environment (ARE) is an OSGi-based middleware [3] which allows software plugins to run in parallel. The plugins usually represent a sensor or an actuator and are implemented as independent OSGi bundles. The runtime environment identifies AsTeRICS plugins from other OSGi bundles based on metadata defined inside the plugins.")]),t._v(" "),e("p",[t._v("The ARE expects from plugin-developers to define the structure of their plugins (properties, inputs, outputs and event ports) in XML files. Based on these XMLs, the middleware constructs a runtime representation of each installed AsTeRICS plugin.")]),t._v(" "),e("p",[t._v("Furthermore, the ARE expects a runtime model (system model) which usually comes from the AsTeRICS Configuration Suite (ACS). The ACS is running on a Windows Personal Computer (.net 4.0 required) and mainly used to graphically design the layout of the system as a network of interconnected components. The system model is another XML file that defines the components participating in a specific application, connections between them, events and other properties. Based on this file, ARE knows which plugins to activate and how to define the data flow between them. Since the system model represents the main communication means between the ACS and the ARE, it is expected to be a serialisable object, easy to transfer and translate. ARE and ACS communicate through an appropriate TCP/IP-based communication protocol named ASAPI.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(289),alt:""}})]),t._v(" "),e("p",[t._v("The ARE also provides “services” to plugin developers (for example communication support for COM ports) and it allows reporting errors on the runtime environment, registering event listeners and interacting with its graphical user interface (ARE GUI).")]),t._v(" "),e("p",[t._v("The ARE GUI is a simple graphical environment developed to allow end-users to interact directly with the runtime environment. It may be used to modify runtime parameters of a model via buttons or sliders, and to monitor live signals and events of the running model.")]),t._v(" "),e("h2",{attrs:{id:"are-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-components"}},[t._v("#")]),t._v(" ARE Components")]),t._v(" "),e("p",[t._v("The ARE consist of the following main parts:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("The ARE middleware")])]),t._v(" "),e("li",[e("p",[t._v("ARE plugins (also referred to as “components”) – sensor, processor and actuator modules which provide functional building blocks for assistive functionalities")])]),t._v(" "),e("li",[e("p",[t._v("A service layer which provides infrastructure to the ARE components,"),e("br"),t._v("\nfor example COM port and communication management for connection of the Communication Interface Modules (CIMs)")])])]),t._v(" "),e("p",[t._v("The ARE is commonly deployed on an embedded device, running an appropriate operating system (OS), typically an embedded variant of Windows. On top of the OS, an appropriate Java Virtual Machine (JVM) is used to host the OSGi component framework which provides support for modularity and dynamic loading/unloading of components.")]),t._v(" "),e("p",[t._v("All the core components of the framework (described in detail later) are defined as OSGi modules. Certain components that need to access legacy code (e.g., written in C or C++) are also deployed on top of OSGi, and are interfaced to the native code using Java Native Interface (JNI) as needed. In this regard, and with the exception of the pluggable components that use native code interfaces with platform-specific JNI bindings, the ARE middleware is expected to be "),e("em",[t._v("platform independent")]),t._v(".")]),t._v(" "),e("p",[t._v("The implementation requires basically JAVA 1.7 (JDK/JRE 7) and an OSGi framework (which is part of the source code downloads).")]),t._v(" "),e("h2",{attrs:{id:"about-osgi"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#about-osgi"}},[t._v("#")]),t._v(" About OSGi")]),t._v(" "),e("p",[t._v("The Open Service Gateway initiative (OSGi) is an open specification that enables the modular assembly of software built with the Java technology [3]. The OSGi Service Platform facilitates the componentization of software modules and applications and assures interoperability of applications and services over a variety of networked devices.")]),t._v(" "),e("p",[t._v("OSGi technology is the dynamic module system for Java™. Java provides the portability that is required to support products on many different platforms. The OSGi technology provides the standardized primitives that allow applications to be constructed from small, reusable and collaborative components. These components can be composed into an application and deployed; The OSGi Service Platform provides a service-oriented architecture that enables these components to dynamically discover each other for collaboration, and thereby forms the optimal basis for the AsTeRICS middleware.")]),t._v(" "),e("h2",{attrs:{id:"getting-started-with-asterics-development"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-with-asterics-development"}},[t._v("#")]),t._v(" Getting Started with AsTeRICS Development")]),t._v(" "),e("p",[t._v("The AsTeRICS source code repository is hosted at github and located at")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS",target:"_blank",rel:"noopener noreferrer"}},[e("strong",[t._v("https://github.com/asterics/AsTeRICS")]),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("The source code contains open source software modules in JAVA, C++ and C, and proprietary modules by AsTeRICS partners which are available in binary from (.dll or .exe).")]),t._v(" "),e("p",[t._v("The licenses of the utilized software packages and 3rd party products can be viewed in the file "),e("em",[t._v("/documentation/licenses.doc")])]),t._v(" "),e("p",[t._v("Currently, the editor for OSKA (the on-screen keyboard application) is the only commercial software package within the AsTeRICS framework – and not included in the free downloads. The OSKA editor is only needed if you want to design custom on-screen keyboard layouts for OSKA (see AsTeRICS User Manual).")]),t._v(" "),e("h2",{attrs:{id:"understanding-the-component-build-scripts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-component-build-scripts"}},[t._v("#")]),t._v(" Understanding the component build-scripts")]),t._v(" "),e("p",[t._v("A typical ANT build script for an ARE component looks like the following:")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("component.id"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("processor.MyComponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- set global properties for this build --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("build"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../out/production/${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src.java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("dist"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("runtime"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../../examples/ARE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("path")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${osgi}/org.eclipse.osgi_3.6.0.v20100517.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${middleware}/asterics.ARE.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the time stamp --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("tstamp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the build directory structure used by compile --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile the source "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("javac")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("srcdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${src.java}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("destdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("verbose")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("debug")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${debug}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("classpath")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${classpath}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("classpath")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("refid")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("generate the OSGi bundle"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("jarfile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("manifest")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}/META-INF/MANIFEST.MF"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("fileset")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("copy")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("file")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("tofile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${runtime}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[t._v("In the first section of the build script, folder locations for the build intermediates, the final build products (.jar file) and the classpath are defined. The classpath usually points to the “bin” folder, the middleware “asterics.ARE.jar” and the osgi distribution. If a component needs additional resources, their location has to be defined here.")]),t._v(" "),e("p",[t._v("Subsequently the build script defines two build targets: the compilation of the Java source code and the creation of the .jar file. If the .jar file shall contain additional .dlls with native code, they have to be specified in the Manifest file as shows in section 5.14.1.")]),t._v(" "),e("p",[t._v("After the .jar file has been created in the distribution folder, it is copied to the runtime folder (/bin/ARE).")]),t._v(" "),e("h2",{attrs:{id:"starting-the-are-middleware-and-component-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#starting-the-are-middleware-and-component-deployments"}},[t._v("#")]),t._v(" Starting the ARE middleware and component deployments")]),t._v(" "),e("p",[t._v("To test the ARE and component bundles, open the folder “/bin/ARE”, and use ARE.exe, start.bat or start_debug.bat.")]),t._v(" "),e("h2",{attrs:{id:"structure-of-the-runtime-folder-bin-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-the-runtime-folder-bin-are"}},[t._v("#")]),t._v(" Structure of the runtime folder “./bin/ARE”:")]),t._v(" "),e("p",[t._v("This folder contains dependencies for running the ARE middleware and the .jars resulting from ANT builds, it has the following structure:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("/\n+- bin/\n +- ARE/\n +- data/ folder for plugin working data\n +- models/ stored models (configurations)\n +- profile/\n +- config.ini system bundles to be started\n +- services.ini general service bundles to be started\n +- services-windows.ini windows-specific service bundles\n +- services-linux.ini linux-specific service bundles\n +- services-macosx.ini macosx-specific service bundles\n +- org.eclipse.osgi/ osgi bundle cache folder\n +- 1238790741.log system log messages, stack trace\n +- tools/ plugin helper apps and dlls\n +- .logger stores console logging settings\n +- ARE.exe starts the ARE without console output\n +- areProperties stores recent window/GUI properties\n +- component bundle(s)\n +- asterics.ARE.jar ARE middleware\n +- asterics.mw.services.cimcommunication.jar CIM port manager\n +- grizzly-httpservice-bundle-2.3.23.jar http service for webservice feature\n +- javacv-*-linux|windows|macosx.jar platform specific javacv service\n +- tmp/*.log application log files\n +- jtester.exe helper app for checking Java version\n +- logging.properties configuration of loglevel etc.\n +- org.eclipse.osgi.*.jar osgi distribution\n +- sleeper.exe helper app for launcher timing\n +- start.bat starts ARE with console output\n +- findjava.bat searches for the newest 32bit JRE\n +- start_debug.bat starts ARE with Eclipse debug support\n +- start.sh starts ARE without console on Linux\n +- start_debug.sh starts ARE with debugging on Linux\n +- VCChecker.jar helper jar for checking VC redist dependency\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Important Note: The osgi configuration folder “org.eclipse.osgi” in the “profile” subdirectory has to be deleted if .dlls in .jar bundles are updated or changed. (This folder is automatically created when starting the ARE and holds working data for the OSGI-bundles.) The One-Click build.xml script described in chapter 2.4.2 deletes the folder automatically.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-services"}},[t._v("#")]),t._v(" AsteRICS services")]),t._v(" "),e("p",[t._v("An AsteRICS service is a bundle that provides ARE-wide functionality usable by other services or plugins. The service can be optionally disabled which means that the service bundle is not installed and not activated. The file services.ini contains a list of general services to be loaded. Whereas the services-windows.ini, services-linux.ini and services-macosx.ini files contain platform dependent service names. You can also create your own use-case specific services ini file and edit the start script to load it.")]),t._v(" "),e("h2",{attrs:{id:"running-a-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-a-deployment"}},[t._v("#")]),t._v(" Running a deployment")]),t._v(" "),e("p",[t._v("The “ARE.exe” starter application launches the ARE without console output and without debugging instrumentation.")]),t._v(" "),e("p",[t._v("Alternatively, the commandline batch script “start_debug.bat” which is provided in the folder “.bin/ARE” runs Java with additional configuration parameters including:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the location of the OSGi distribution")])]),t._v(" "),e("li",[e("p",[t._v("the profile subfolder which contains the config.ini file: “./bin/ARE/profile”")])]),t._v(" "),e("li",[e("p",[t._v("debugging instrumentation for the remote debugging server connection")])])]),t._v(" "),e("p",[t._v("After starting the ARE middleware, bundles are loaded and started on-demand if they are needed for the deployment of a model. If everything is properly configured, the ARE window comes up with a GUI and provides ASAPI server functionalities for connection of the ACS or other client applications.")]),t._v(" "),e("h2",{attrs:{id:"are-webserver-including-rest-api-websocket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver-including-rest-api-websocket"}},[t._v("#")]),t._v(" ARE webserver (including REST API, websocket)")]),t._v(" "),e("p",[t._v("The ARE contains a service that creates several web-based services. These include")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a webserver with document root "),e("em",[t._v("ARE/web")]),t._v(" and URL: "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a websocket at URL "),e("a",{attrs:{href:"http://localhost:8082/ws/astericsData",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8082/ws/astericsData"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a REST API at URL "),e("a",{attrs:{href:"http://localhost:8081/rest",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/rest"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a javascript REST API client implementation example at "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])])]),t._v(" "),e("h2",{attrs:{id:"define-autostart-model-per-command-line"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#define-autostart-model-per-command-line"}},[t._v("#")]),t._v(" Define autostart model per command line")]),t._v(" "),e("p",[t._v("By starting the ARE with the name of a model as first command line parameter a model that should be started automatically can be defined. The model must exist in the sub-folder “models”.")]),t._v(" "),e("p",[t._v("‘ARE.exe CameraMouse.acs’")]),t._v(" "),e("p",[t._v("or")]),t._v(" "),e("p",[t._v("‘start_debug.bat CameraMouse.acs’")]),t._v(" "),e("h2",{attrs:{id:"change-model-task-submit-timeout"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-model-task-submit-timeout"}},[t._v("#")]),t._v(" Change model task submit timeout")]),t._v(" "),e("p",[t._v("The file “areProperties” contains properties to configure ARE features and to configure the internal model execution behaviour. The following internal model execution properties exist:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("ThreadPoolTasks.submitTimeout=20000")]),t._v(" "),e("ul",[e("li",[t._v("When submitting a task to be executed in the ModelExecutor thread a submit timeout can be configured. After the time elapsed a TimeoutException is thrown. The timeout value must be specified in milliseconds."),e("br"),t._v("\nThe submit timeout is used for starting, stopping, pausing and resuming a model.")])])])]),t._v(" "),e("h2",{attrs:{id:"debugging-the-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#debugging-the-are"}},[t._v("#")]),t._v(" Debugging the ARE")]),t._v(" "),e("p",[t._v("If the ARE is started using the “start_debug.bat” script and source-level debug information was added during the compilation (see section 2.3), debugging with Eclipse is supported via a remote debugging connection. This is a convenient way for debugging an OSGI-based java framework with a lot of plugins. To enable the debugging support in Eclipse, a Debug Configuration is created via the dedicated menu entry:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(290),alt:""}})]),t._v(" "),e("p",[t._v("Create a “Remote Java Application” Debug Configuration and assign a name for it, e.g. “ARE”. Then, specify the connection properties of the Debug Configuration to use the Host “localhost” and the Socket/Port “1044” (this port is given in the ARE build scripts for the remote debug server to listen for incoming client connections):")]),t._v(" "),e("p",[e("img",{attrs:{src:a(291),alt:""}})]),t._v(" "),e("p",[t._v("Now launch the ARE using “start_debug.bat”. The messages in the console window should indicate the establishment of the listening socket 1044 for the debugging connection:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(292),alt:""}})]),t._v(" "),e("p",[t._v("Now, the usual debugging support of Eclipse can be used, including breakpoints in middleware or components, variable and context watch windows, single stepping etc. All these operations are performed in the Eclipse “Debug” perspective.")]),t._v(" "),e("p",[t._v("The following screenshot shows a program execution of the ARE which ran into a breakpoint (here: the OSKA plugin was halted as a command was selected in the OSKA-application and transferred to the ARE plugin’s command handler:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(293),alt:""}})]),t._v(" "),e("p",[t._v("I"),e("img",{attrs:{src:a(294),alt:""}}),t._v(" f the source-level debug information is missing (due to compilation without debugging support) an error message indicates a problem, e.g. the missing line number for breakpoint installation:")]),t._v(" "),e("h2",{attrs:{id:"services-and-utils-infrastructure-for-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#services-and-utils-infrastructure-for-plugins"}},[t._v("#")]),t._v(" Services and Utils: Infrastructure for plugins")]),t._v(" "),e("p",[t._v("The ARE Services are a set of classes that enable the direct interaction between AsTeRICS plugins and other software to directly interact with the runtime environment. The most significant ARE Services are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIM Communication Service: the ARE CIM Communication service layer is a unified approach to allow plugins of the ARE to communicate with their associated hardware modules attached to the AsTeRICS platform via a COM port. A range of hardware modules are provided which implement the dedicated Communication Interface Module (CIM) protocol. Further details on this communication protocol and implementation details for the ARE CIM Communication Service can be found in chapter 5.15.")])]),t._v(" "),e("li",[e("p",[t._v("Remote Connection Service: the remote connection services allows external software that cannot be integrated into the standard plugin inter communication system used by the ARE, for example because of programming language incompatibilities, to work with the AsTeRICS system. For example, the interconnection of OSKA (the On-Screen Keyboard Application developed by AsTeRICS partner SENSORY) and the ARE uses the Remote Connection Service to send key selection information to the ARE. On the other hand, the ARE can reply with cell selection commands or other information. The actual communication is done via a protocol that can be understood by the Java ServerSocket implementation. The port number that the external software component connects to identifies the connecting component.")])]),t._v(" "),e("li",[e("p",[t._v("Local Storage Service: The Local Storage Service will allow plugins to store individual working data “per model” and “per plugin-instance”. This is necessary when plugins need to store own calibration data, pattern recognition samples or similar data. In course of the architectural refinements for the final prototype, a service class will be provided which generates an according folder and respective file read- and write methods.")])]),t._v(" "),e("li",[e("p",[t._v("Native Hook Services for systemwide keyboard and mouse capturing")])]),t._v(" "),e("li",[e("p",[t._v("Computer Vision services to support a unified way for frame grabbing, computer vision processing and video frame rendering.")])]),t._v(" "),e("li",[e("p",[t._v("Logging service")])]),t._v(" "),e("li",[e("p",[t._v("ConversionUtils: Helper class to convert port data streams into Java data types and vice versa.")])]),t._v(" "),e("li",[e("p",[t._v("Class "),e("strong",[t._v("ResourceRegistry")]),t._v(" to fetch resource URIs. If a plugin needs access to a config, data or a multimedia file, the class ResourceRegistry must be used.")])])]),t._v(" "),e("h2",{attrs:{id:"communicating-with-peripherals-cim-communication-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communicating-with-peripherals-cim-communication-service"}},[t._v("#")]),t._v(" Communicating with peripherals: CIM Communication service")]),t._v(" "),e("p",[t._v("Communication between actuator and sensor components in the ARE and peripheral devices is currently defined to use a serial communication i.e. a COM port or a virtual COM port. Messaging via this interface can either adhere to the CIM protocol (see section 5.15) or use any other protocol using the raw port implementation of the CIM communication services.")]),t._v(" "),e("p",[t._v("All the communication with peripheral devices is done through a service in the ARE service layer called CIM Communication. The service is provided as a separate OSGi bundle which places its classes in the package "),e("code",[t._v("$1")]),t._v(". Access to the classes is done by exporting the entire package in the bundle.")]),t._v(" "),e("p",[t._v("Four classes of the CIM Communication service are important to the component programmer:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMPortManager")])]),t._v(" "),e("li",[e("p",[t._v("CIMController")])]),t._v(" "),e("li",[e("p",[t._v("CIMProtocolPacket")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventHandler")])])]),t._v(" "),e("h2",{attrs:{id:"cimportcontroller"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportcontroller"}},[t._v("#")]),t._v(" CIMPortController")]),t._v(" "),e("p",[t._v("CIMPortController is an abstract class which hides the actual implementation of the port controller. The port controller provides the same methods for sending packets using the CIM protocol, for raw port implementations and for future uses such as a port controller handling Zigbee connections.")]),t._v(" "),e("h2",{attrs:{id:"cimportmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportmanager"}},[t._v("#")]),t._v(" CIMPortManager")]),t._v(" "),e("p",[t._v("All CIM ports and other COM ports are access through the main class of the package CIMPortManager. This is implemented as a singleton with a public access method getInstance(). Thus all calls to the CIM communication service have to be done through:")]),t._v(" "),e("p",[e("code",[t._v("CIMPortManager.getInstance()")])]),t._v(" "),e("p",[t._v("Upon creation the CIMPortManager detects all the connected CIMs and registers them in a HashMap. CIMs are identified and stored by the combination of their CIM Id and their unique number. Therefore multiple CIMs of the same CIM Id can be used on the AsTeRICS platform.")]),t._v(" "),e("p",[t._v("On some computers there exist certain serial ports which do not work correctly and behave strangely. An example of such a port is a loopback port which echoes everything written to it or ports created by Bluetooth dongles. Since the CIMPortManager iterates through all serial ports, these ports can cause problems in the auto detection of attached CIMs and even lock up the runtime. Therefore a file "),e("em",[t._v("ignore_ports.txt")]),t._v(" in the directory "),e("em",[t._v("data/cimcommunication")]),t._v(" is parsed upon start of the auto detection. This file should be filled with the name of the COM ports behaving erratically one name per line.")]),t._v(" "),e("p",[t._v("To be able to communicate with a CIM, the CIM port manager provides several methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" uniqueNumber"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("These methods return a CIMPortController (read on for details) instance of the requested CIM. The method using two parameters will return the instance to the port controller which works with the CIM of the exact CIM ID and unique number. If the CIM cannot be found, null will be returned.")]),t._v(" "),e("p",[t._v("Requesting a connection without naming a unique number will return the first port controller connected to a CIM of the correct ID found in the HashMap holding all the port controllers.")]),t._v(" "),e("p",[t._v("Sending data to the connected peripheral can be done in several ways using the following methods of CIMPortManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMUniqueIdentifier")]),t._v(" cuid"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" ctrl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Basically these three methods do the same thing, however they do it at different speeds as the first two methods will look up the port controller that the packet should be sent to. Again the method taking only the CIM ID as a parameter will look up the first correct port controller. The third method which is passed the CIMPortController instance returned on getConnection() is the fastest method and should be used whenever possible.")]),t._v(" "),e("p",[t._v("Sending a CIM packet is done by providing the feature address and request code for a certain packet. The feature addresses and request codes can be found in the CIM protocol specification and the basic addresses and requests are also provided as static fields in the CIMProtocolPacket class. If data has to be attached to a CIM protocol packet a byte array holding said data has to be passed to the method, otherwise the data parameter of the method has to be set to null. The caller can also decide whether a CRC checksum should be added to the packet although this is currently unimplemented.")]),t._v(" "),e("h2",{attrs:{id:"cimeventhandler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimeventhandler"}},[t._v("#")]),t._v(" CIMEventHandler")]),t._v(" "),e("p",[t._v("Receiving a packet is done through use of the CIMEventHandler interface. This interface should be implemented by plugins that wish to communicate with CIMs (or raw ports). The interface contains two methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("These methods are called upon correct reception of a packet or upon discovery of an error (timeout of a reply, packet transmission errors, incorrect order of incoming packets …) respectively by the port controller.")]),t._v(" "),e("p",[t._v("Upon correct reception of a CIM protocol based packet the method handlePacketReceived() is called with an instance of CIMEventPacketReceived as parameter. After conversion of the CIMEvent to this class, the packet can be extracted from the event and processed further.")]),t._v(" "),e("p",[t._v("All detected errors lead to a call of handlePacketError() with an appropriate CIMEvent implementation. The possible implemenations are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMEventErrorPacketFault: holds information to error in packet and the broken packet itself")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventErrorPacketLost: holds information on serial number of lost packet")])])]),t._v(" "),e("p",[t._v("To register the event handler with a specific CIM port controller, the CIMPortController class exposes the following methods:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("addEventHandler(CIMEventHandler hdlr)")])]),t._v(" "),e("li",[e("p",[t._v("removeEventHandler(CIMEventHandler hdlr)")])])]),t._v(" "),e("p",[t._v("A port controller can handle multiple attached event handlers and remove each one separately.")]),t._v(" "),e("h2",{attrs:{id:"cimprotocolpacket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimprotocolpacket"}},[t._v("#")]),t._v(" CIMProtocolPacket")]),t._v(" "),e("p",[t._v("This class holds all the information given in a packet transferred to or from a CIM. There are two ways the developer has to use this class. Upon sending packets the sending component has to set the feature address and the request code. The CIMProtocolPacket class provides the constants as static field to facilitate setting commands.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x00")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x01")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_EVENT_REPLY")]),t._v(" \t\t\t "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Furthermore the class contains constants for the global features that every CIM has to provide.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FEATURE_UNIQUE_SERIAL_NUMBER")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Upon reception of an incoming packet the component associated with the CIM sending the packet is notified and a reference to the packet is passed as an instance of CIMProtocolPacket wrapped in a CIMEvent instance. The developer can access all the fields of the packet via the getter methods the class provides:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAreCimID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSerialNumber")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFeatureAddress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequestReplyCode")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getCrc")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[t._v("#")]),t._v(" Serial ports not adhering to CIM Protocol (Raw Ports)")]),t._v(" "),e("p",[t._v("Some peripherals use a proprietary protocol to transfer their data. If this is the case the user can open a raw port through the CIMPortManager method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will open the port with the name specified in the parameter portName and set the communication to the specified Baud rate.")]),t._v(" "),e("p",[t._v("Data can be sent to peripheral using the sendPacket() method for the returned CIMPortController. The packet will simply transfer the byte array passed in the data parameter and ignore the values giving the in the other parameter fields.")]),t._v(" "),e("p",[t._v("Received data will be forwarded to the event handler through calls to handlePacketReceived() with a CIMEventRawPacket as parameter. This class holds a public member variable b which holds the value of the received byte. The event handler has to handle the reconstruction of the proprietary packet itself.")]),t._v(" "),e("p",[e("strong",[t._v("HighSpeed Raw Ports:")])]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" highSpeed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("A second variant opf the getRawConnection method allows specification of a “highSpeed” parameter. If highSpeed is true, the CIMPortController does not apply any connection handling or callbacks for received data to avoid performance problems in higher bandwidth streaming use cases. In this case, the CIMPortController can return the JAVA InputStream for the openend COM port connection and the plug developer can use it as desired:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("portController "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COM12")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("115200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" portController"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputStream")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("available")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" myHandlePacket "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h2",{attrs:{id:"communication-through-a-socket-interface-remote-connection-manager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communication-through-a-socket-interface-remote-connection-manager"}},[t._v("#")]),t._v(" Communication through a socket interface: Remote Connection Manager")]),t._v(" "),e("p",[t._v("When using third party software that runs on the same platform (as for example the prominently used On Screen Keyboard Application OSKA), it becomes necessary to establish a communication between ARE and the third party application. This is managed by the RemoteConnectionManager found in the package eu.asterics.mw.services. The main interface to this manager are the classes RemoteConnectionManager and IRemoteConnectionListener.")]),t._v(" "),e("h2",{attrs:{id:"iremoteconnectionlistener"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#iremoteconnectionlistener"}},[t._v("#")]),t._v(" IRemoteConnectionListener")]),t._v(" "),e("p",[t._v("This interface is implemented by plugins that need to communicate via a socket communication. The interface contains the following methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionEstablished")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("dataReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionLost")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionClosed")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("connectionEstablished() is called whenever a plugin requests a connection and the connection has been established. This can either happen if a connection has already been established before or if the new connection has finished its setup and connection process.")]),t._v(" "),e("p",[t._v("dataReceived() is called whenever new data arrives from the other end of the connection. Data is transferred in a byte array and has to be processed by the event listener.")]),t._v(" "),e("p",[t._v("connectionLost() is called when the connection management cannot read from or write to the socket.")]),t._v(" "),e("p",[t._v("connectionClosed() is called after the connection has been closed.")]),t._v(" "),e("h2",{attrs:{id:"remoteconnectionmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#remoteconnectionmanager"}},[t._v("#")]),t._v(" RemoteConnectionManager")]),t._v(" "),e("p",[t._v("The RemoteConnectionManager is implemented as a singleton and can be accessed via a public static member of the class. Thus access is always achieved through:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RemoteConnectionManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance\n")])])]),e("p",[t._v("A connection is opened by calling the RemoteConnectionManager’s method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" requestConnection "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRemoteConnectionListener")]),t._v(" l"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This call will try to access a connection on the specified port. Although the port is actually an integer it is passed as a String here. The method will return true if a connection on this port has already been established and attach the remote connection listener passed in the second argument to the connection. If there is no active connection on the specified port, the requestConnection method will initiate the setup of the connection and return false. With this return value the user can decide whether he needs to perform setup actions or will be able to do this in the connectionEstablished() callback.")]),t._v(" "),e("p",[t._v("The socket connection handling is implemented using two threads, one for sending, one for receiving data. The receiver thread will continuously read data from the socket and forward it to the registered listener calling the dataReceived() method. Since incoming data is handled in another thread than the plugin which will use the socket connection, access to the methods handling this data or the way of passing data should be done in a synchronised code block.")]),t._v(" "),e("p",[t._v("Sending data is done calling the method sendData of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is called using a String holding the port number of the connection socket and an array of bytes to be sent. The call to this method will place the data in an outgoing queue and return true if this was successful. Thus it is not guaranteed that the data has already been sent when the method returns. The sender thread will grab data from the outgoing queue and transfer it via the socket or call the connectionLost() method of the registered listener if there are problems while sending.")]),t._v(" "),e("p",[t._v("Once the connection to a socket is not needed anymore, the user has to close the connection, calling the following method of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("closeConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will close the socket connection, end all threads and return.")]),t._v(" "),e("h2",{attrs:{id:"local-storage-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#local-storage-service"}},[t._v("#")]),t._v(" Local Storage Service")]),t._v(" "),e("p",[t._v("If a model needs to save its own calibration data, training data or other private data that can be different in every model and every instance, the local storage service provides a method to save different data to the same file name on a per plugin instance per model basis.")]),t._v(" "),e("p",[t._v("The service uses a directory tree structure that is placed in the directory the OSGi is run from. Data is saved in a directory called “storage”. In this directory, directories for every model name of a model that uses at least one plugin that accesses local storage can be found. In the third directory layer, directories with the plugin instance name of every plugin that accesses local storage can be found. Thus if a model named “timertest” uses a plugin instance named “timer1” that saves local data this data can be found at the path location “storage/timertest/timer1”.")]),t._v(" "),e("p",[t._v("The service practically consists of only one method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLocalStorageFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fileName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method located in the AREServices class will return a File object pointing to the requested file name or null if the file could not be opened or the model name could not be retrieved. After opening the file the standard JAVA ways to manipulate files apply.")]),t._v(" "),e("h2",{attrs:{id:"keyboard-mouse-native-hook-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-mouse-native-hook-services"}},[t._v("#")]),t._v(" Keyboard/Mouse Native Hook Services")]),t._v(" "),e("p",[t._v("The AsTeRICS service jnativehook (if enabled) provides access to the library "),e("a",{attrs:{href:"https://github.com/kwhat/jnativehook",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/kwhat/jnativehook"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Additionally, the service contains the singleton NativeHookServices that initializes the library to be usable in plugins. A plugin that wants to be a keaboard/mouse listener only has to add the listener to the GlobalScreen instance of the library.")]),t._v(" "),e("h2",{attrs:{id:"computer-vision-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#computer-vision-services"}},[t._v("#")]),t._v(" Computer Vision Services")]),t._v(" "),e("p",[t._v("The AsTeRICS services javacv and computervision (if enabled) provide access to the library "),e("a",{attrs:{href:"https://github.com/bytedeco/javacv",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/bytedeco/javacv"),e("OutboundLink")],1),t._v(", which again provides access to numerous libs in the field of computer vision (e.g. OpenCV), frame grabbing and frame rendering. Additionally, some helper classes are provided for face detection.")]),t._v(" "),e("h2",{attrs:{id:"data-conversion-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-conversion-utilities"}},[t._v("#")]),t._v(" Data Conversion Utilities")]),t._v(" "),e("p",[t._v("The middleware provides the class “ConversionUtils” that provide static helper methods to convert model data types to byte arrays and vice versa. The conversion is needed to convert incoming data of input ports or outgoing data to output ports. There are methods for each type of conversion. If two connected ports (output to input) have different data types the data is automatically converted to the data type of the input port.")]),t._v(" "),e("p",[t._v("Check the class ConversionUtils for a full list of supported methods: "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"fetching-resource-uris-with-resourceregistry-class"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fetching-resource-uris-with-resourceregistry-class"}},[t._v("#")]),t._v(" Fetching resource URIs with ResourceRegistry class")]),t._v(" "),e("p",[t._v("If a plugin needs resources like data files (images, keyboard files, haarcascade definitions,…), the class "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("ResourceRegistry"),e("OutboundLink")],1),t._v(" must be used to fetch the resource URI.")]),t._v(" "),e("p",[t._v("This can be done by using the method:")]),t._v(" "),e("p",[e("code",[t._v("public URI getResource(String resourcePath, RES_TYPE type) throws URISyntaxException")])]),t._v(" "),e("p",[t._v("Returns the URI according to the given resourcePath string and the given resource type RES_TYPE.")]),t._v(" "),e("p",[t._v("Please refer to the Javadoc of the class and to the "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Fetching-resources-with-class-ResourceRegistry",target:"_blank",rel:"noopener noreferrer"}},[t._v("wiki page"),e("OutboundLink")],1),t._v(" for further examples.")]),t._v(" "),e("h2",{attrs:{id:"error-reporting-astericserrorhandling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-astericserrorhandling"}},[t._v("#")]),t._v(" Error Reporting (AstericsErrorHandling)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("AstericsErrorHandling")]),t._v(" provides a unified logging and error reporting mechanism. It contains methods for reporting an error of a component or even the ARE.")]),t._v(" "),e("h3",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),e("p",[t._v("The Logging support provides a uniform way of error reporting in the runtime environment so we have utilized the Java logging libraries and the various severity levels supported. The AsTeRICS error handling mechanism is used extensively from the runtime core classes but also utilized by the AsTeRICS components via the AstericsErrorHandling interface.")]),t._v(" "),e("p",[t._v("Each component is allowed to report an error message, a debug information or a simple information to be displayed on the screen. The ARE maintains four separate log files and updates them whenever a new error occurs. In particular there are different loggers for reporting severe errors, warnings, fine errors and one logger that contains them all.")]),t._v(" "),e("p",[t._v("ARE also maintains a status object for the current status of the runtime environment. Whenever a fatal error occurs (either internally or caused by one of the deployed components) the status changes to fatal error. Other possible statuses are unknown, OK, deployed, running and paused.")]),t._v(" "),e("p",[t._v("The ACS can request the current status of the runtime environment and update its own state accordingly. For example the ACS user can be informed about the current ARE status while the ACS will terminate a connection (or refuse to establish a new one) with a non-working ARE.")]),t._v(" "),e("p",[t._v("Using a Logger is the recommended way to report notifications or error descriptions to the user. In the ARE framework, using the Java logging service is recommended. The Java logger can be configured using the file “logging.properties” (see section 2.3.3.1) and used as follows:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("…"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsErrorHandling")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"error-reporting-of-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-of-components"}},[t._v("#")]),t._v(" Error Reporting of components")]),t._v(" "),e("p",[t._v("If a component wants to notify an error it should use the following method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_warning.log” file. Additionally the status of the component is set to error with the given error message and an error dialog is shown in the ARE gui, if enabled.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportInfo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" info"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_fine.log” file.")]),t._v(" "),e("h3",{attrs:{id:"status-checking"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#status-checking"}},[t._v("#")]),t._v(" Status checking")]),t._v(" "),e("p",[t._v("The status checking mechanism is responsible for recording the current status of the ARE or the error state of a component. The status is recorded by creating and storing objects called "),e("em",[t._v("statusObjects")]),t._v(". A statusObject stores the status of its creator as a string, its creator (the ARE or the specific component) and the error message.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" status"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The status of the ARE can be one of the following strings:")]),t._v(" "),e("p",[t._v("UNKNOWN: initial state for the ARE")]),t._v(" "),e("p",[t._v("OK: ARE is running and ready to deploy a model")]),t._v(" "),e("p",[t._v("DEPLOYED: A model has been deployed and the ARE is now ready to run the model")]),t._v(" "),e("p",[t._v("RUNNING: A model is running on the ARE")]),t._v(" "),e("p",[t._v("PAUSED: A model has been deployed and the ARE is in paused mode")]),t._v(" "),e("p",[t._v("ERROR: An error occurred")]),t._v(" "),e("p",[t._v("FATAL_ERROR: A fatal error occurred, model or deployment aborted")]),t._v(" "),e("p",[t._v("The status of a component can only be the ERROR state because this is the only state of a component that we are interested in recording for later use. An ERROR statusObject is automatically created when a component calls the reportError method as described above.")]),t._v(" "),e("p",[t._v("For retrieving the statusObjects, the following method is used:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("queryStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" fullList"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is particularly useful for the ACS to determine the current status of the runtime environment and of the deployed components. If the ARE or one of the components are in a problematic state it can be reflected in the ACS.")]),t._v(" "),e("p",[t._v("The boolean "),e("em",[t._v("fullList")]),t._v(" argument specifies whether the error list to be returned will include all statusObjects generated since the ARE startup or just those that have not been requested by the ACS before.")]),t._v(" "),e("h2",{attrs:{id:"the-are-thread-pool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-thread-pool"}},[t._v("#")]),t._v(" The ARE Thread Pool")]),t._v(" "),e("p",[t._v("In order to avoid resource greedy threads and to achieve best thread handling, ARE uses one of the Thread Pool implementations provided by Java since JRE 1.5. In particular, we have utilized the java.util.concurrent.Executors library for creating a CachedThreadPool.")]),t._v(" "),e("p",[t._v("A cached thread pool will create threads as needed but will reuse previously instantiated threads when they are available and inactive. A cached thread pool is particularly useful for many short-lived asynchronous tasks and improves the performance of the runtime environment.")]),t._v(" "),e("p",[t._v("Developers are expected to use the ARE thread pool for executing their tasks that require a new Thread. You will need to import the middleware services package in order to get access to the "),e("strong",[t._v("AstericsThreadPool")]),t._v(" class.")]),t._v(" "),e("h2",{attrs:{id:"the-are-gui-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-gui-support"}},[t._v("#")]),t._v(" The ARE GUI support")]),t._v(" "),e("p",[t._v("The ARE provides a panel area (“ARE Desktop”) where plugins can display their graphical elements using the ARE GUI support classes. The ACS provides a dedicated canvas editor that allows end users positioning and resizing graphical elements of the plugins. Based on this information, the ARE displays plugins on the local device, maintaining the correct screen position and aspect ratio of graphical elements with respect to the screen resolution of the deployment device. (For more information about the usage of the ACS GUI editor and the ARE GUI control panel refer to the User Manual.)")]),t._v(" "),e("p",[e("img",{attrs:{src:a(295),alt:""}})]),t._v(" "),e("p",[e("strong",[t._v("GUI composition using the ACS GUI designer (right), resulting ARE GUI (left)")])]),t._v(" "),e("p",[t._v("In order to be recognized as GUI-plugin by ACS and ARE, the bundle descriptor of the plugin has to be extended with a dedicated "),e("code",[t._v("")]),t._v(" entry, which specifies the default size in a virtual coordinate system of 10000/10000 pixels. In the deployment model, the ACS will create position and size information according to the area defined in the ACS GUI designer.")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("gui")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("width")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("5000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("height")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[e("strong",[t._v("The gui element addition to the bundle descriptor")])]),t._v(" "),e("p",[t._v("The AsTeRICS middleware provides some services to the plugin developers in order to allow them displaying their GUI element onto the ARE Desktop. The middleware services encapsulate the complexity of dealing with positioning and allow displaying all GUI elements onto the same container: the ARE Desktop.")]),t._v(" "),e("p",[t._v("All GUI services are defined in eu.asterics.mw.services.AREServices so developers need to import this class in order to get access to the following methods:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void displayPanel (JPanel panel, IRuntimeComponentInstance componentInstance, boolean display)")])])]),t._v(" "),e("p",[t._v("This method is used for displaying (or hiding) a plugin’s panel at/from the ARE desktop. Developers need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the panel they want to be displayed (or removed)")])]),t._v(" "),e("li",[e("p",[t._v("the plugin object, in order to help the middleware finding the desired position and dimensions from the deployment model")])]),t._v(" "),e("li",[e("p",[t._v("a boolean argument specifying if they wish to hide or show the given panel.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("Dimension getAvailableSpace(IRuntimeComponentInstance componentInstance)")])])])]),t._v(" "),e("p",[t._v("The space that each plugin will occupy on the ARE desktop is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the available space for their graphical elements by calling the getAvailableSpace method which will return the space occupied for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Point getComponentPosition (IRuntimeComponentInstance componentInstance)")])])]),t._v(" "),e("p",[t._v("The positioning of plugin’s GUI elements is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the position of their graphical elements by calling the getComponentPosition which will return the position on screen for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void adjustFonts(JPanel panel, int maxFontSize, int minFontSize, int offset)")])])]),t._v(" "),e("p",[t._v("This service can be used by plugin developers interested in auto-adjusting the fonts of their GUI components depending on the space occupied for their plugins on the ARE desktop. They need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a panel to which all the internal fonts will be auto-adjusted")])]),t._v(" "),e("li",[e("p",[t._v("the maximum font size (in case there is more space available than needed)")])]),t._v(" "),e("li",[e("p",[t._v("the minimum font size, in case there is too little space which causes the text to become non-readable. Finally, the offset argument is used in case we want to occupy a percentage of the available space.")])])]),t._v(" "),e("p",[t._v("A good approach to GUI plugin development is to analyse existing plugins which provide GUI elements, e.g. the BarDisplay or Oscilloscope actuators, or the Slider or Cellboard sensor components.")]),t._v(" "),e("p",[t._v("If the plugin uses "),e("strong",[t._v("Swing to implement a GUI-widget")]),t._v(" (e.g. Slider,…), please check the following guidelines as well 4.2.8")]),t._v(" "),e("h2",{attrs:{id:"are-core-events-notification-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-core-events-notification-services"}},[t._v("#")]),t._v(" ARE core events notification services")]),t._v(" "),e("p",[t._v("The ARE core events notification service allows plugins to register/unregister to the ARE middleware in order to receive notifications of ARE core events.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void registerAREEventListener(IAREEventListener clazz)")])])]),t._v(" "),e("p",[t._v("It is sometimes necessary that plugins can be notified of various ARE events so they can react as needed. This method can be called by component instances that wish to be notified of such ARE events. Currently, the core events supported are:")]),t._v(" "),e("ul",[e("li",[e("p",[e("em",[t._v("preDeployModel:")]),t._v(" registered ARE event listeners will be notified just before the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postDeployModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStartModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStartModel:")]),t._v(" registered ARE event listeners will be notified immediately after the currently deployed model has been started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStopModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStopModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("prePauseModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postPauseModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preResumeModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postResumeModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified just before the bundles are is installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified immediately after the bundles have been installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("void unregisterAREEventListener(IAREEventListener clazz)")])])])]),t._v(" "),e("p",[t._v("Plugins already registered for receiving ARE core events can un-register using this method.")]),t._v(" "),e("h2",{attrs:{id:"dynamic-properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-properties"}},[t._v("#")]),t._v(" Dynamic Properties")]),t._v(" "),e("p",[t._v("In some applications, the ACS should be able to provide several options for property values which are not known in advance but depend on the current state of the ARE (see AsTeRUCS User Manual, section “Dynamic Properties”)… A typical example is the selection of a file which is available in the ARE file system (e.g. a .wav-file for the wave player plugin). This feature is particularly useful for plugins that are hardware dependent (selecting e.g. a soundcard or a midi player), or depend on the file system.")]),t._v(" "),e("p",[t._v("If a plugin is implementing a dynamic property, the values will be requested from the ARE, as soon as the ACS is synchronized with the ARE, via the ASAPI function:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])]),e("p",[t._v("The ARE middleware will forward the request for valid property values to the component instance with the given ID. The "),e("code",[t._v("List getRuntimePropertyList(String key)")]),t._v(" method has to be implemented in the "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" class which every AsTeRICS component extends.\nThe method implementation creates the list of valid properties and returns it to the middleware and the latter forwards the string list to the ACS via ASAPI. The ACS will dynamically update the property list in the properties window.")]),t._v(" "),e("p",[t._v("For an example of the dynamic property implementation, see the WaveFilePlayer plugin.")]),t._v(" "),e("h2",{attrs:{id:"data-synchronization"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-synchronization"}},[t._v("#")]),t._v(" Data Synchronization")]),t._v(" "),e("p",[t._v("Some plugins need data of multiple input ports to be able to start processing. Without data synchronization it is possible that one input port of a plugin receives multiple values before another port gets one value, although both signal channels deliver values at the same sampling rate.")]),t._v(" "),e("p",[t._v("The synchronization service provides a buffering mechanism at the middleware level that can be utilized by plugin developers in order to make sure that incoming data of selected input ports arrives synchronized.")]),t._v(" "),e("p",[t._v("To use the synchronization service in the plugin code, plugin developers are expected to extend the "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" instead of implementing the "),e("em",[t._v("IRuntimeInputPort.")]),t._v(" Basically, "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" provides a default implementation for the necessary buffering methods, as shown in the table below.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DefaultRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("receiveData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" startBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" stopBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" isBuffered "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("The designer can define that a plugin’s input port should be synchronized with some other input ports via the ACS. This will cause an argument change of the inputPort element on the deployment model file (e.g.,"),e("code",[t._v('')]),t._v(").")]),t._v(" "),e("p",[t._v("As soon as a model is deployed on the ARE, the middleware collects per component every port noted as synchronized port. When the model is successfully deployed and started, the ARE will buffer data which enters synchronized input ports until data on all synchronized ports has arrived. At that point, the ARE will call a new "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" callback method.")]),t._v(" "),e("p",[t._v("Developers that wish to support data synchronization need to implement the following method at their component instances.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncedValuesReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Where dataRow is a HashMap between Input Port ID and byte[]. For synchronized input ports, instead of implementing the regular "),e("em",[t._v("void receiveData(byte[] data)")]),t._v(" method which delivers incoming data of a single port, developers need to implement the "),e("em",[t._v("syncedValuesReceived")]),t._v(" method which will be called from the ARE with synchronized data from all the input ports that have been selected.")]),t._v(" "),e("h2",{attrs:{id:"interfacing-native-c-c-code-via-jni"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#interfacing-native-c-c-code-via-jni"}},[t._v("#")]),t._v(" Interfacing Native C/C++ Code via JNI")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("## Specifying native libraries in the Manifest\n")])])]),e("p",[t._v("The Manifest file of a bundle which includes native libraries has to specify these .dlls as shown in the following example:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-sensors.mycomponent\nBundle-SymbolicName: org.asterics.mycomponent\nBundle-Version: 0.1.0\nBundle-NativeCode: lib/native/mylib1.dll;\n lib/native/mylib2.dll;\n lib/native/mylib3.dll;\n osname=win32;processor=x86;\n osname=win;processor=x86-64;\n osname=win8;processor=x86;\n osname=win8;processor=x86-64;\n osname=windows 8;processor=x86;\n osname=windows 8;processor=x86-64;\n osname=windows8;processor=x86;\n osname=windows8;processor=x86-64;\n osname=Windows 8.1;processor=x86;\n osname=Windows 8.1;processor=x86-64\nDynamicImport-Package: *\n")])])]),e("p",[t._v("Components which interface native code via JNI and their respective manifest files can be found in the SVN, e.g. the “webcamera” component or the signal processing plugins by Starlab.")]),t._v(" "),e("p",[t._v("Note that the .jar containing the .dlls can be built manually using the command:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("jar "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-cvfm")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/mybundle.jar META-INF/MANIFEST.MF "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n")])])]),e("h2",{attrs:{id:"java-implementation-jni-bridge"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java-implementation-jni-bridge"}},[t._v("#")]),t._v(" Java-Implementation: JNI-Bridge")]),t._v(" "),e("p",[t._v("The recommended way to interface Java code of an ARE component with native code in a .dll is a bridge class which encapsulates the JNI functions and callbacks and maps the functions of the ARE component’s lifecycle-, port- and property-management to the corresponding functions in the native code. Here is a simple example which comprises one component property and receives data callbacks from a thread implemented in C. The received values are transferred to the component’s output port:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jni")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mycomponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Statically load the native library */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib1.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib2.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib3.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAnonymousLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("my_outport "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Activates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("activate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Deactivates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("deactivate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Gets the value of the named property.\n *\n * @param key the name of the property to be accessed\n * @return the value of the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Sets the named property to the defined value.\n *\n * @param key the name of the property to be accessed\n * @param value the value to be assigned to the named property\n * @return the value previously assigned to the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code on demand to signify \n * an internal error. The first argument corresponds to an error code \n * and the second argument corresponds to a textual description \n * of the error.\n * @param errorCode an error code\n * @param message a textual description of the error\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorReport_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" errorCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n logger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("severe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorCode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('": "')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code to send data\n * to the component’s output port.\n *\n * @param data1 (range is [0, Short.MAX_VALUE])\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("newData_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"c-implementation-callbacks-and-jni-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#c-implementation-callbacks-and-jni-code"}},[t._v("#")]),t._v(" C-Implementation: Callbacks and JNI code")]),t._v(" "),e("p",[t._v("The native C-code needs to be compiled into a .dll and include the JNI header files and libraries. An example for the Microsoft Visual Studio compiler looks as follows:")]),t._v(" "),e("p",[t._v("The following C-example shows how to implement a JNI-callback from a C-thread and an ARE-compliant exchange of a component property:")]),t._v(" "),e("div",{staticClass:"language-c extra-class"},[e("pre",{pre:!0,attrs:{class:"language-c"}},[e("code",[e("span",{pre:!0,attrs:{class:"token macro property"}},[e("span",{pre:!0,attrs:{class:"token directive-hash"}},[t._v("#")]),e("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("")])]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" JavaVM "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" jobject g_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myProperty"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_activate")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\terror_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetJavaVM")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tjclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newData_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// explicitly ask for a global reference")]),t._v("\n\tg_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_init")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_deactivate")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_exit")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tenv"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeleteGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_getProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\t\t\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_setProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n\t strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown */")]),t._v("\n\t strValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tpollingIntervalValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prepare JNI callback")]),t._v("\n JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n g_jvm"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("AttachCurrentThread")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newCoordinates_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// perform JNI callback")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("CallVoidMethod")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("my_new_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("This native C-code needs to be compiled into a .dll, the JNI header files and libraries have to be specified to the compiler and linker respectively. An example for the Microsoft Visual Studio build tools looks as follows:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('cl -c -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include" -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include\\win32" -I ".\\3rdparylib" my_c_file.cpp /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue \nlink my_c_file.obj /DLL /OUT:".\\my_c_file.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"libmsvc" /LIBPATH:"3rdparylib" "odbc32.lib" "odbccp32.lib" "comctl32.lib" "winmm.lib" "opengl32.lib" "ole32.lib" "strmiids.lib" "uuid.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "oleaut32.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"atlthunk" /NODEFAULTLIB:"LIBCMT" /MANIFESTUAC:"level=\'asInvoker\' uiAccess=\'false\'" /DEBUG /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:QUEUE\n')])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The compiler and linker switches may differ depending on the nature of your dependency libraries and setup.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-packaging-environment-ape"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-packaging-environment-ape"}},[t._v("#")]),t._v(" AsTeRICS Packaging Environment (APE)")]),t._v(" "),e("p",[t._v("The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using "),e("a",{attrs:{href:"http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGIBBCI",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaFX packaging technology"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("See "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/AsTeRICS-Packaging-Environment-(APE)",target:"_blank",rel:"noopener noreferrer"}},[t._v("APE documentation"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{289:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_c0991ef32ae9b458.424ba3f3.png"},290:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_4dfe72317ab9f571.6b0975c3.jpg"},291:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_b6693a1cbcd9178a.03fc763d.png"},292:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_f1a0b4f36dd370ba.c1a39a2a.jpg"},293:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_fb7627584ba9d5d7.45a2067d.png"},294:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_3e993efbc73f2910.c6357005.png"},295:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_74b8c615b8455605.d7a70de8.png"},943:function(t,e,a){"use strict";a.r(e);var s=a(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"are-middleware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-middleware"}},[t._v("#")]),t._v(" ARE Middleware")]),t._v(" "),e("h2",{attrs:{id:"the-asterics-runtime-environment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-asterics-runtime-environment"}},[t._v("#")]),t._v(" The AsTeRICS Runtime Environment")]),t._v(" "),e("p",[t._v("The AsTeRICS Runtime environment (ARE) is an OSGi-based middleware [3] which allows software plugins to run in parallel. The plugins usually represent a sensor or an actuator and are implemented as independent OSGi bundles. The runtime environment identifies AsTeRICS plugins from other OSGi bundles based on metadata defined inside the plugins.")]),t._v(" "),e("p",[t._v("The ARE expects from plugin-developers to define the structure of their plugins (properties, inputs, outputs and event ports) in XML files. Based on these XMLs, the middleware constructs a runtime representation of each installed AsTeRICS plugin.")]),t._v(" "),e("p",[t._v("Furthermore, the ARE expects a runtime model (system model) which usually comes from the AsTeRICS Configuration Suite (ACS). The ACS is running on a Windows Personal Computer (.net 4.0 required) and mainly used to graphically design the layout of the system as a network of interconnected components. The system model is another XML file that defines the components participating in a specific application, connections between them, events and other properties. Based on this file, ARE knows which plugins to activate and how to define the data flow between them. Since the system model represents the main communication means between the ACS and the ARE, it is expected to be a serialisable object, easy to transfer and translate. ARE and ACS communicate through an appropriate TCP/IP-based communication protocol named ASAPI.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(295),alt:""}})]),t._v(" "),e("p",[t._v("The ARE also provides “services” to plugin developers (for example communication support for COM ports) and it allows reporting errors on the runtime environment, registering event listeners and interacting with its graphical user interface (ARE GUI).")]),t._v(" "),e("p",[t._v("The ARE GUI is a simple graphical environment developed to allow end-users to interact directly with the runtime environment. It may be used to modify runtime parameters of a model via buttons or sliders, and to monitor live signals and events of the running model.")]),t._v(" "),e("h2",{attrs:{id:"are-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-components"}},[t._v("#")]),t._v(" ARE Components")]),t._v(" "),e("p",[t._v("The ARE consist of the following main parts:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("The ARE middleware")])]),t._v(" "),e("li",[e("p",[t._v("ARE plugins (also referred to as “components”) – sensor, processor and actuator modules which provide functional building blocks for assistive functionalities")])]),t._v(" "),e("li",[e("p",[t._v("A service layer which provides infrastructure to the ARE components,"),e("br"),t._v("\nfor example COM port and communication management for connection of the Communication Interface Modules (CIMs)")])])]),t._v(" "),e("p",[t._v("The ARE is commonly deployed on an embedded device, running an appropriate operating system (OS), typically an embedded variant of Windows. On top of the OS, an appropriate Java Virtual Machine (JVM) is used to host the OSGi component framework which provides support for modularity and dynamic loading/unloading of components.")]),t._v(" "),e("p",[t._v("All the core components of the framework (described in detail later) are defined as OSGi modules. Certain components that need to access legacy code (e.g., written in C or C++) are also deployed on top of OSGi, and are interfaced to the native code using Java Native Interface (JNI) as needed. In this regard, and with the exception of the pluggable components that use native code interfaces with platform-specific JNI bindings, the ARE middleware is expected to be "),e("em",[t._v("platform independent")]),t._v(".")]),t._v(" "),e("p",[t._v("The implementation requires basically JAVA 1.7 (JDK/JRE 7) and an OSGi framework (which is part of the source code downloads).")]),t._v(" "),e("h2",{attrs:{id:"about-osgi"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#about-osgi"}},[t._v("#")]),t._v(" About OSGi")]),t._v(" "),e("p",[t._v("The Open Service Gateway initiative (OSGi) is an open specification that enables the modular assembly of software built with the Java technology [3]. The OSGi Service Platform facilitates the componentization of software modules and applications and assures interoperability of applications and services over a variety of networked devices.")]),t._v(" "),e("p",[t._v("OSGi technology is the dynamic module system for Java™. Java provides the portability that is required to support products on many different platforms. The OSGi technology provides the standardized primitives that allow applications to be constructed from small, reusable and collaborative components. These components can be composed into an application and deployed; The OSGi Service Platform provides a service-oriented architecture that enables these components to dynamically discover each other for collaboration, and thereby forms the optimal basis for the AsTeRICS middleware.")]),t._v(" "),e("h2",{attrs:{id:"getting-started-with-asterics-development"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-with-asterics-development"}},[t._v("#")]),t._v(" Getting Started with AsTeRICS Development")]),t._v(" "),e("p",[t._v("The AsTeRICS source code repository is hosted at github and located at")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS",target:"_blank",rel:"noopener noreferrer"}},[e("strong",[t._v("https://github.com/asterics/AsTeRICS")]),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("The source code contains open source software modules in JAVA, C++ and C, and proprietary modules by AsTeRICS partners which are available in binary from (.dll or .exe).")]),t._v(" "),e("p",[t._v("The licenses of the utilized software packages and 3rd party products can be viewed in the file "),e("em",[t._v("/documentation/licenses.doc")])]),t._v(" "),e("p",[t._v("Currently, the editor for OSKA (the on-screen keyboard application) is the only commercial software package within the AsTeRICS framework – and not included in the free downloads. The OSKA editor is only needed if you want to design custom on-screen keyboard layouts for OSKA (see AsTeRICS User Manual).")]),t._v(" "),e("h2",{attrs:{id:"understanding-the-component-build-scripts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-component-build-scripts"}},[t._v("#")]),t._v(" Understanding the component build-scripts")]),t._v(" "),e("p",[t._v("A typical ANT build script for an ARE component looks like the following:")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("component.id"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("processor.MyComponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- set global properties for this build --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("build"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../out/production/${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src.java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("dist"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("runtime"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../../examples/ARE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("path")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${osgi}/org.eclipse.osgi_3.6.0.v20100517.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${middleware}/asterics.ARE.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the time stamp --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("tstamp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the build directory structure used by compile --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile the source "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("javac")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("srcdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${src.java}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("destdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("verbose")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("debug")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${debug}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("classpath")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${classpath}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("classpath")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("refid")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("generate the OSGi bundle"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("jarfile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("manifest")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}/META-INF/MANIFEST.MF"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("fileset")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("copy")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("file")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("tofile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${runtime}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[t._v("In the first section of the build script, folder locations for the build intermediates, the final build products (.jar file) and the classpath are defined. The classpath usually points to the “bin” folder, the middleware “asterics.ARE.jar” and the osgi distribution. If a component needs additional resources, their location has to be defined here.")]),t._v(" "),e("p",[t._v("Subsequently the build script defines two build targets: the compilation of the Java source code and the creation of the .jar file. If the .jar file shall contain additional .dlls with native code, they have to be specified in the Manifest file as shows in section 5.14.1.")]),t._v(" "),e("p",[t._v("After the .jar file has been created in the distribution folder, it is copied to the runtime folder (/bin/ARE).")]),t._v(" "),e("h2",{attrs:{id:"starting-the-are-middleware-and-component-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#starting-the-are-middleware-and-component-deployments"}},[t._v("#")]),t._v(" Starting the ARE middleware and component deployments")]),t._v(" "),e("p",[t._v("To test the ARE and component bundles, open the folder “/bin/ARE”, and use ARE.exe, start.bat or start_debug.bat.")]),t._v(" "),e("h2",{attrs:{id:"structure-of-the-runtime-folder-bin-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-the-runtime-folder-bin-are"}},[t._v("#")]),t._v(" Structure of the runtime folder “./bin/ARE”:")]),t._v(" "),e("p",[t._v("This folder contains dependencies for running the ARE middleware and the .jars resulting from ANT builds, it has the following structure:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("/\n+- bin/\n +- ARE/\n +- data/ folder for plugin working data\n +- models/ stored models (configurations)\n +- profile/\n +- config.ini system bundles to be started\n +- services.ini general service bundles to be started\n +- services-windows.ini windows-specific service bundles\n +- services-linux.ini linux-specific service bundles\n +- services-macosx.ini macosx-specific service bundles\n +- org.eclipse.osgi/ osgi bundle cache folder\n +- 1238790741.log system log messages, stack trace\n +- tools/ plugin helper apps and dlls\n +- .logger stores console logging settings\n +- ARE.exe starts the ARE without console output\n +- areProperties stores recent window/GUI properties\n +- component bundle(s)\n +- asterics.ARE.jar ARE middleware\n +- asterics.mw.services.cimcommunication.jar CIM port manager\n +- grizzly-httpservice-bundle-2.3.23.jar http service for webservice feature\n +- javacv-*-linux|windows|macosx.jar platform specific javacv service\n +- tmp/*.log application log files\n +- jtester.exe helper app for checking Java version\n +- logging.properties configuration of loglevel etc.\n +- org.eclipse.osgi.*.jar osgi distribution\n +- sleeper.exe helper app for launcher timing\n +- start.bat starts ARE with console output\n +- findjava.bat searches for the newest 32bit JRE\n +- start_debug.bat starts ARE with Eclipse debug support\n +- start.sh starts ARE without console on Linux\n +- start_debug.sh starts ARE with debugging on Linux\n +- VCChecker.jar helper jar for checking VC redist dependency\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Important Note: The osgi configuration folder “org.eclipse.osgi” in the “profile” subdirectory has to be deleted if .dlls in .jar bundles are updated or changed. (This folder is automatically created when starting the ARE and holds working data for the OSGI-bundles.) The One-Click build.xml script described in chapter 2.4.2 deletes the folder automatically.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-services"}},[t._v("#")]),t._v(" AsteRICS services")]),t._v(" "),e("p",[t._v("An AsteRICS service is a bundle that provides ARE-wide functionality usable by other services or plugins. The service can be optionally disabled which means that the service bundle is not installed and not activated. The file services.ini contains a list of general services to be loaded. Whereas the services-windows.ini, services-linux.ini and services-macosx.ini files contain platform dependent service names. You can also create your own use-case specific services ini file and edit the start script to load it.")]),t._v(" "),e("h2",{attrs:{id:"running-a-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-a-deployment"}},[t._v("#")]),t._v(" Running a deployment")]),t._v(" "),e("p",[t._v("The “ARE.exe” starter application launches the ARE without console output and without debugging instrumentation.")]),t._v(" "),e("p",[t._v("Alternatively, the commandline batch script “start_debug.bat” which is provided in the folder “.bin/ARE” runs Java with additional configuration parameters including:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the location of the OSGi distribution")])]),t._v(" "),e("li",[e("p",[t._v("the profile subfolder which contains the config.ini file: “./bin/ARE/profile”")])]),t._v(" "),e("li",[e("p",[t._v("debugging instrumentation for the remote debugging server connection")])])]),t._v(" "),e("p",[t._v("After starting the ARE middleware, bundles are loaded and started on-demand if they are needed for the deployment of a model. If everything is properly configured, the ARE window comes up with a GUI and provides ASAPI server functionalities for connection of the ACS or other client applications.")]),t._v(" "),e("h2",{attrs:{id:"are-webserver-including-rest-api-websocket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver-including-rest-api-websocket"}},[t._v("#")]),t._v(" ARE webserver (including REST API, websocket)")]),t._v(" "),e("p",[t._v("The ARE contains a service that creates several web-based services. These include")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a webserver with document root "),e("em",[t._v("ARE/web")]),t._v(" and URL: "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a websocket at URL "),e("a",{attrs:{href:"http://localhost:8082/ws/astericsData",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8082/ws/astericsData"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a REST API at URL "),e("a",{attrs:{href:"http://localhost:8081/rest",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/rest"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a javascript REST API client implementation example at "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])])]),t._v(" "),e("h2",{attrs:{id:"define-autostart-model-per-command-line"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#define-autostart-model-per-command-line"}},[t._v("#")]),t._v(" Define autostart model per command line")]),t._v(" "),e("p",[t._v("By starting the ARE with the name of a model as first command line parameter a model that should be started automatically can be defined. The model must exist in the sub-folder “models”.")]),t._v(" "),e("p",[t._v("‘ARE.exe CameraMouse.acs’")]),t._v(" "),e("p",[t._v("or")]),t._v(" "),e("p",[t._v("‘start_debug.bat CameraMouse.acs’")]),t._v(" "),e("h2",{attrs:{id:"change-model-task-submit-timeout"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-model-task-submit-timeout"}},[t._v("#")]),t._v(" Change model task submit timeout")]),t._v(" "),e("p",[t._v("The file “areProperties” contains properties to configure ARE features and to configure the internal model execution behaviour. The following internal model execution properties exist:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("ThreadPoolTasks.submitTimeout=20000")]),t._v(" "),e("ul",[e("li",[t._v("When submitting a task to be executed in the ModelExecutor thread a submit timeout can be configured. After the time elapsed a TimeoutException is thrown. The timeout value must be specified in milliseconds."),e("br"),t._v("\nThe submit timeout is used for starting, stopping, pausing and resuming a model.")])])])]),t._v(" "),e("h2",{attrs:{id:"debugging-the-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#debugging-the-are"}},[t._v("#")]),t._v(" Debugging the ARE")]),t._v(" "),e("p",[t._v("If the ARE is started using the “start_debug.bat” script and source-level debug information was added during the compilation (see section 2.3), debugging with Eclipse is supported via a remote debugging connection. This is a convenient way for debugging an OSGI-based java framework with a lot of plugins. To enable the debugging support in Eclipse, a Debug Configuration is created via the dedicated menu entry:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(289),alt:""}})]),t._v(" "),e("p",[t._v("Create a “Remote Java Application” Debug Configuration and assign a name for it, e.g. “ARE”. Then, specify the connection properties of the Debug Configuration to use the Host “localhost” and the Socket/Port “1044” (this port is given in the ARE build scripts for the remote debug server to listen for incoming client connections):")]),t._v(" "),e("p",[e("img",{attrs:{src:a(290),alt:""}})]),t._v(" "),e("p",[t._v("Now launch the ARE using “start_debug.bat”. The messages in the console window should indicate the establishment of the listening socket 1044 for the debugging connection:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(291),alt:""}})]),t._v(" "),e("p",[t._v("Now, the usual debugging support of Eclipse can be used, including breakpoints in middleware or components, variable and context watch windows, single stepping etc. All these operations are performed in the Eclipse “Debug” perspective.")]),t._v(" "),e("p",[t._v("The following screenshot shows a program execution of the ARE which ran into a breakpoint (here: the OSKA plugin was halted as a command was selected in the OSKA-application and transferred to the ARE plugin’s command handler:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(292),alt:""}})]),t._v(" "),e("p",[t._v("I"),e("img",{attrs:{src:a(293),alt:""}}),t._v(" f the source-level debug information is missing (due to compilation without debugging support) an error message indicates a problem, e.g. the missing line number for breakpoint installation:")]),t._v(" "),e("h2",{attrs:{id:"services-and-utils-infrastructure-for-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#services-and-utils-infrastructure-for-plugins"}},[t._v("#")]),t._v(" Services and Utils: Infrastructure for plugins")]),t._v(" "),e("p",[t._v("The ARE Services are a set of classes that enable the direct interaction between AsTeRICS plugins and other software to directly interact with the runtime environment. The most significant ARE Services are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIM Communication Service: the ARE CIM Communication service layer is a unified approach to allow plugins of the ARE to communicate with their associated hardware modules attached to the AsTeRICS platform via a COM port. A range of hardware modules are provided which implement the dedicated Communication Interface Module (CIM) protocol. Further details on this communication protocol and implementation details for the ARE CIM Communication Service can be found in chapter 5.15.")])]),t._v(" "),e("li",[e("p",[t._v("Remote Connection Service: the remote connection services allows external software that cannot be integrated into the standard plugin inter communication system used by the ARE, for example because of programming language incompatibilities, to work with the AsTeRICS system. For example, the interconnection of OSKA (the On-Screen Keyboard Application developed by AsTeRICS partner SENSORY) and the ARE uses the Remote Connection Service to send key selection information to the ARE. On the other hand, the ARE can reply with cell selection commands or other information. The actual communication is done via a protocol that can be understood by the Java ServerSocket implementation. The port number that the external software component connects to identifies the connecting component.")])]),t._v(" "),e("li",[e("p",[t._v("Local Storage Service: The Local Storage Service will allow plugins to store individual working data “per model” and “per plugin-instance”. This is necessary when plugins need to store own calibration data, pattern recognition samples or similar data. In course of the architectural refinements for the final prototype, a service class will be provided which generates an according folder and respective file read- and write methods.")])]),t._v(" "),e("li",[e("p",[t._v("Native Hook Services for systemwide keyboard and mouse capturing")])]),t._v(" "),e("li",[e("p",[t._v("Computer Vision services to support a unified way for frame grabbing, computer vision processing and video frame rendering.")])]),t._v(" "),e("li",[e("p",[t._v("Logging service")])]),t._v(" "),e("li",[e("p",[t._v("ConversionUtils: Helper class to convert port data streams into Java data types and vice versa.")])]),t._v(" "),e("li",[e("p",[t._v("Class "),e("strong",[t._v("ResourceRegistry")]),t._v(" to fetch resource URIs. If a plugin needs access to a config, data or a multimedia file, the class ResourceRegistry must be used.")])])]),t._v(" "),e("h2",{attrs:{id:"communicating-with-peripherals-cim-communication-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communicating-with-peripherals-cim-communication-service"}},[t._v("#")]),t._v(" Communicating with peripherals: CIM Communication service")]),t._v(" "),e("p",[t._v("Communication between actuator and sensor components in the ARE and peripheral devices is currently defined to use a serial communication i.e. a COM port or a virtual COM port. Messaging via this interface can either adhere to the CIM protocol (see section 5.15) or use any other protocol using the raw port implementation of the CIM communication services.")]),t._v(" "),e("p",[t._v("All the communication with peripheral devices is done through a service in the ARE service layer called CIM Communication. The service is provided as a separate OSGi bundle which places its classes in the package "),e("code",[t._v("$1")]),t._v(". Access to the classes is done by exporting the entire package in the bundle.")]),t._v(" "),e("p",[t._v("Four classes of the CIM Communication service are important to the component programmer:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMPortManager")])]),t._v(" "),e("li",[e("p",[t._v("CIMController")])]),t._v(" "),e("li",[e("p",[t._v("CIMProtocolPacket")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventHandler")])])]),t._v(" "),e("h2",{attrs:{id:"cimportcontroller"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportcontroller"}},[t._v("#")]),t._v(" CIMPortController")]),t._v(" "),e("p",[t._v("CIMPortController is an abstract class which hides the actual implementation of the port controller. The port controller provides the same methods for sending packets using the CIM protocol, for raw port implementations and for future uses such as a port controller handling Zigbee connections.")]),t._v(" "),e("h2",{attrs:{id:"cimportmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportmanager"}},[t._v("#")]),t._v(" CIMPortManager")]),t._v(" "),e("p",[t._v("All CIM ports and other COM ports are access through the main class of the package CIMPortManager. This is implemented as a singleton with a public access method getInstance(). Thus all calls to the CIM communication service have to be done through:")]),t._v(" "),e("p",[e("code",[t._v("CIMPortManager.getInstance()")])]),t._v(" "),e("p",[t._v("Upon creation the CIMPortManager detects all the connected CIMs and registers them in a HashMap. CIMs are identified and stored by the combination of their CIM Id and their unique number. Therefore multiple CIMs of the same CIM Id can be used on the AsTeRICS platform.")]),t._v(" "),e("p",[t._v("On some computers there exist certain serial ports which do not work correctly and behave strangely. An example of such a port is a loopback port which echoes everything written to it or ports created by Bluetooth dongles. Since the CIMPortManager iterates through all serial ports, these ports can cause problems in the auto detection of attached CIMs and even lock up the runtime. Therefore a file "),e("em",[t._v("ignore_ports.txt")]),t._v(" in the directory "),e("em",[t._v("data/cimcommunication")]),t._v(" is parsed upon start of the auto detection. This file should be filled with the name of the COM ports behaving erratically one name per line.")]),t._v(" "),e("p",[t._v("To be able to communicate with a CIM, the CIM port manager provides several methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" uniqueNumber"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("These methods return a CIMPortController (read on for details) instance of the requested CIM. The method using two parameters will return the instance to the port controller which works with the CIM of the exact CIM ID and unique number. If the CIM cannot be found, null will be returned.")]),t._v(" "),e("p",[t._v("Requesting a connection without naming a unique number will return the first port controller connected to a CIM of the correct ID found in the HashMap holding all the port controllers.")]),t._v(" "),e("p",[t._v("Sending data to the connected peripheral can be done in several ways using the following methods of CIMPortManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMUniqueIdentifier")]),t._v(" cuid"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" ctrl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Basically these three methods do the same thing, however they do it at different speeds as the first two methods will look up the port controller that the packet should be sent to. Again the method taking only the CIM ID as a parameter will look up the first correct port controller. The third method which is passed the CIMPortController instance returned on getConnection() is the fastest method and should be used whenever possible.")]),t._v(" "),e("p",[t._v("Sending a CIM packet is done by providing the feature address and request code for a certain packet. The feature addresses and request codes can be found in the CIM protocol specification and the basic addresses and requests are also provided as static fields in the CIMProtocolPacket class. If data has to be attached to a CIM protocol packet a byte array holding said data has to be passed to the method, otherwise the data parameter of the method has to be set to null. The caller can also decide whether a CRC checksum should be added to the packet although this is currently unimplemented.")]),t._v(" "),e("h2",{attrs:{id:"cimeventhandler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimeventhandler"}},[t._v("#")]),t._v(" CIMEventHandler")]),t._v(" "),e("p",[t._v("Receiving a packet is done through use of the CIMEventHandler interface. This interface should be implemented by plugins that wish to communicate with CIMs (or raw ports). The interface contains two methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("These methods are called upon correct reception of a packet or upon discovery of an error (timeout of a reply, packet transmission errors, incorrect order of incoming packets …) respectively by the port controller.")]),t._v(" "),e("p",[t._v("Upon correct reception of a CIM protocol based packet the method handlePacketReceived() is called with an instance of CIMEventPacketReceived as parameter. After conversion of the CIMEvent to this class, the packet can be extracted from the event and processed further.")]),t._v(" "),e("p",[t._v("All detected errors lead to a call of handlePacketError() with an appropriate CIMEvent implementation. The possible implemenations are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMEventErrorPacketFault: holds information to error in packet and the broken packet itself")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventErrorPacketLost: holds information on serial number of lost packet")])])]),t._v(" "),e("p",[t._v("To register the event handler with a specific CIM port controller, the CIMPortController class exposes the following methods:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("addEventHandler(CIMEventHandler hdlr)")])]),t._v(" "),e("li",[e("p",[t._v("removeEventHandler(CIMEventHandler hdlr)")])])]),t._v(" "),e("p",[t._v("A port controller can handle multiple attached event handlers and remove each one separately.")]),t._v(" "),e("h2",{attrs:{id:"cimprotocolpacket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimprotocolpacket"}},[t._v("#")]),t._v(" CIMProtocolPacket")]),t._v(" "),e("p",[t._v("This class holds all the information given in a packet transferred to or from a CIM. There are two ways the developer has to use this class. Upon sending packets the sending component has to set the feature address and the request code. The CIMProtocolPacket class provides the constants as static field to facilitate setting commands.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x00")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x01")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_EVENT_REPLY")]),t._v(" \t\t\t "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Furthermore the class contains constants for the global features that every CIM has to provide.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FEATURE_UNIQUE_SERIAL_NUMBER")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Upon reception of an incoming packet the component associated with the CIM sending the packet is notified and a reference to the packet is passed as an instance of CIMProtocolPacket wrapped in a CIMEvent instance. The developer can access all the fields of the packet via the getter methods the class provides:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAreCimID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSerialNumber")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFeatureAddress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequestReplyCode")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getCrc")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[t._v("#")]),t._v(" Serial ports not adhering to CIM Protocol (Raw Ports)")]),t._v(" "),e("p",[t._v("Some peripherals use a proprietary protocol to transfer their data. If this is the case the user can open a raw port through the CIMPortManager method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will open the port with the name specified in the parameter portName and set the communication to the specified Baud rate.")]),t._v(" "),e("p",[t._v("Data can be sent to peripheral using the sendPacket() method for the returned CIMPortController. The packet will simply transfer the byte array passed in the data parameter and ignore the values giving the in the other parameter fields.")]),t._v(" "),e("p",[t._v("Received data will be forwarded to the event handler through calls to handlePacketReceived() with a CIMEventRawPacket as parameter. This class holds a public member variable b which holds the value of the received byte. The event handler has to handle the reconstruction of the proprietary packet itself.")]),t._v(" "),e("p",[e("strong",[t._v("HighSpeed Raw Ports:")])]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" highSpeed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("A second variant opf the getRawConnection method allows specification of a “highSpeed” parameter. If highSpeed is true, the CIMPortController does not apply any connection handling or callbacks for received data to avoid performance problems in higher bandwidth streaming use cases. In this case, the CIMPortController can return the JAVA InputStream for the openend COM port connection and the plug developer can use it as desired:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("portController "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COM12")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("115200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" portController"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputStream")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("available")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" myHandlePacket "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h2",{attrs:{id:"communication-through-a-socket-interface-remote-connection-manager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communication-through-a-socket-interface-remote-connection-manager"}},[t._v("#")]),t._v(" Communication through a socket interface: Remote Connection Manager")]),t._v(" "),e("p",[t._v("When using third party software that runs on the same platform (as for example the prominently used On Screen Keyboard Application OSKA), it becomes necessary to establish a communication between ARE and the third party application. This is managed by the RemoteConnectionManager found in the package eu.asterics.mw.services. The main interface to this manager are the classes RemoteConnectionManager and IRemoteConnectionListener.")]),t._v(" "),e("h2",{attrs:{id:"iremoteconnectionlistener"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#iremoteconnectionlistener"}},[t._v("#")]),t._v(" IRemoteConnectionListener")]),t._v(" "),e("p",[t._v("This interface is implemented by plugins that need to communicate via a socket communication. The interface contains the following methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionEstablished")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("dataReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionLost")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionClosed")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("connectionEstablished() is called whenever a plugin requests a connection and the connection has been established. This can either happen if a connection has already been established before or if the new connection has finished its setup and connection process.")]),t._v(" "),e("p",[t._v("dataReceived() is called whenever new data arrives from the other end of the connection. Data is transferred in a byte array and has to be processed by the event listener.")]),t._v(" "),e("p",[t._v("connectionLost() is called when the connection management cannot read from or write to the socket.")]),t._v(" "),e("p",[t._v("connectionClosed() is called after the connection has been closed.")]),t._v(" "),e("h2",{attrs:{id:"remoteconnectionmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#remoteconnectionmanager"}},[t._v("#")]),t._v(" RemoteConnectionManager")]),t._v(" "),e("p",[t._v("The RemoteConnectionManager is implemented as a singleton and can be accessed via a public static member of the class. Thus access is always achieved through:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RemoteConnectionManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance\n")])])]),e("p",[t._v("A connection is opened by calling the RemoteConnectionManager’s method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" requestConnection "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRemoteConnectionListener")]),t._v(" l"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This call will try to access a connection on the specified port. Although the port is actually an integer it is passed as a String here. The method will return true if a connection on this port has already been established and attach the remote connection listener passed in the second argument to the connection. If there is no active connection on the specified port, the requestConnection method will initiate the setup of the connection and return false. With this return value the user can decide whether he needs to perform setup actions or will be able to do this in the connectionEstablished() callback.")]),t._v(" "),e("p",[t._v("The socket connection handling is implemented using two threads, one for sending, one for receiving data. The receiver thread will continuously read data from the socket and forward it to the registered listener calling the dataReceived() method. Since incoming data is handled in another thread than the plugin which will use the socket connection, access to the methods handling this data or the way of passing data should be done in a synchronised code block.")]),t._v(" "),e("p",[t._v("Sending data is done calling the method sendData of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is called using a String holding the port number of the connection socket and an array of bytes to be sent. The call to this method will place the data in an outgoing queue and return true if this was successful. Thus it is not guaranteed that the data has already been sent when the method returns. The sender thread will grab data from the outgoing queue and transfer it via the socket or call the connectionLost() method of the registered listener if there are problems while sending.")]),t._v(" "),e("p",[t._v("Once the connection to a socket is not needed anymore, the user has to close the connection, calling the following method of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("closeConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will close the socket connection, end all threads and return.")]),t._v(" "),e("h2",{attrs:{id:"local-storage-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#local-storage-service"}},[t._v("#")]),t._v(" Local Storage Service")]),t._v(" "),e("p",[t._v("If a model needs to save its own calibration data, training data or other private data that can be different in every model and every instance, the local storage service provides a method to save different data to the same file name on a per plugin instance per model basis.")]),t._v(" "),e("p",[t._v("The service uses a directory tree structure that is placed in the directory the OSGi is run from. Data is saved in a directory called “storage”. In this directory, directories for every model name of a model that uses at least one plugin that accesses local storage can be found. In the third directory layer, directories with the plugin instance name of every plugin that accesses local storage can be found. Thus if a model named “timertest” uses a plugin instance named “timer1” that saves local data this data can be found at the path location “storage/timertest/timer1”.")]),t._v(" "),e("p",[t._v("The service practically consists of only one method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLocalStorageFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fileName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method located in the AREServices class will return a File object pointing to the requested file name or null if the file could not be opened or the model name could not be retrieved. After opening the file the standard JAVA ways to manipulate files apply.")]),t._v(" "),e("h2",{attrs:{id:"keyboard-mouse-native-hook-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-mouse-native-hook-services"}},[t._v("#")]),t._v(" Keyboard/Mouse Native Hook Services")]),t._v(" "),e("p",[t._v("The AsTeRICS service jnativehook (if enabled) provides access to the library "),e("a",{attrs:{href:"https://github.com/kwhat/jnativehook",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/kwhat/jnativehook"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Additionally, the service contains the singleton NativeHookServices that initializes the library to be usable in plugins. A plugin that wants to be a keaboard/mouse listener only has to add the listener to the GlobalScreen instance of the library.")]),t._v(" "),e("h2",{attrs:{id:"computer-vision-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#computer-vision-services"}},[t._v("#")]),t._v(" Computer Vision Services")]),t._v(" "),e("p",[t._v("The AsTeRICS services javacv and computervision (if enabled) provide access to the library "),e("a",{attrs:{href:"https://github.com/bytedeco/javacv",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/bytedeco/javacv"),e("OutboundLink")],1),t._v(", which again provides access to numerous libs in the field of computer vision (e.g. OpenCV), frame grabbing and frame rendering. Additionally, some helper classes are provided for face detection.")]),t._v(" "),e("h2",{attrs:{id:"data-conversion-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-conversion-utilities"}},[t._v("#")]),t._v(" Data Conversion Utilities")]),t._v(" "),e("p",[t._v("The middleware provides the class “ConversionUtils” that provide static helper methods to convert model data types to byte arrays and vice versa. The conversion is needed to convert incoming data of input ports or outgoing data to output ports. There are methods for each type of conversion. If two connected ports (output to input) have different data types the data is automatically converted to the data type of the input port.")]),t._v(" "),e("p",[t._v("Check the class ConversionUtils for a full list of supported methods: "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"fetching-resource-uris-with-resourceregistry-class"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fetching-resource-uris-with-resourceregistry-class"}},[t._v("#")]),t._v(" Fetching resource URIs with ResourceRegistry class")]),t._v(" "),e("p",[t._v("If a plugin needs resources like data files (images, keyboard files, haarcascade definitions,…), the class "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("ResourceRegistry"),e("OutboundLink")],1),t._v(" must be used to fetch the resource URI.")]),t._v(" "),e("p",[t._v("This can be done by using the method:")]),t._v(" "),e("p",[e("code",[t._v("public URI getResource(String resourcePath, RES_TYPE type) throws URISyntaxException")])]),t._v(" "),e("p",[t._v("Returns the URI according to the given resourcePath string and the given resource type RES_TYPE.")]),t._v(" "),e("p",[t._v("Please refer to the Javadoc of the class and to the "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Fetching-resources-with-class-ResourceRegistry",target:"_blank",rel:"noopener noreferrer"}},[t._v("wiki page"),e("OutboundLink")],1),t._v(" for further examples.")]),t._v(" "),e("h2",{attrs:{id:"error-reporting-astericserrorhandling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-astericserrorhandling"}},[t._v("#")]),t._v(" Error Reporting (AstericsErrorHandling)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("AstericsErrorHandling")]),t._v(" provides a unified logging and error reporting mechanism. It contains methods for reporting an error of a component or even the ARE.")]),t._v(" "),e("h3",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),e("p",[t._v("The Logging support provides a uniform way of error reporting in the runtime environment so we have utilized the Java logging libraries and the various severity levels supported. The AsTeRICS error handling mechanism is used extensively from the runtime core classes but also utilized by the AsTeRICS components via the AstericsErrorHandling interface.")]),t._v(" "),e("p",[t._v("Each component is allowed to report an error message, a debug information or a simple information to be displayed on the screen. The ARE maintains four separate log files and updates them whenever a new error occurs. In particular there are different loggers for reporting severe errors, warnings, fine errors and one logger that contains them all.")]),t._v(" "),e("p",[t._v("ARE also maintains a status object for the current status of the runtime environment. Whenever a fatal error occurs (either internally or caused by one of the deployed components) the status changes to fatal error. Other possible statuses are unknown, OK, deployed, running and paused.")]),t._v(" "),e("p",[t._v("The ACS can request the current status of the runtime environment and update its own state accordingly. For example the ACS user can be informed about the current ARE status while the ACS will terminate a connection (or refuse to establish a new one) with a non-working ARE.")]),t._v(" "),e("p",[t._v("Using a Logger is the recommended way to report notifications or error descriptions to the user. In the ARE framework, using the Java logging service is recommended. The Java logger can be configured using the file “logging.properties” (see section 2.3.3.1) and used as follows:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("…"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsErrorHandling")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"error-reporting-of-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-of-components"}},[t._v("#")]),t._v(" Error Reporting of components")]),t._v(" "),e("p",[t._v("If a component wants to notify an error it should use the following method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_warning.log” file. Additionally the status of the component is set to error with the given error message and an error dialog is shown in the ARE gui, if enabled.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportInfo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" info"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_fine.log” file.")]),t._v(" "),e("h3",{attrs:{id:"status-checking"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#status-checking"}},[t._v("#")]),t._v(" Status checking")]),t._v(" "),e("p",[t._v("The status checking mechanism is responsible for recording the current status of the ARE or the error state of a component. The status is recorded by creating and storing objects called "),e("em",[t._v("statusObjects")]),t._v(". A statusObject stores the status of its creator as a string, its creator (the ARE or the specific component) and the error message.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" status"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The status of the ARE can be one of the following strings:")]),t._v(" "),e("p",[t._v("UNKNOWN: initial state for the ARE")]),t._v(" "),e("p",[t._v("OK: ARE is running and ready to deploy a model")]),t._v(" "),e("p",[t._v("DEPLOYED: A model has been deployed and the ARE is now ready to run the model")]),t._v(" "),e("p",[t._v("RUNNING: A model is running on the ARE")]),t._v(" "),e("p",[t._v("PAUSED: A model has been deployed and the ARE is in paused mode")]),t._v(" "),e("p",[t._v("ERROR: An error occurred")]),t._v(" "),e("p",[t._v("FATAL_ERROR: A fatal error occurred, model or deployment aborted")]),t._v(" "),e("p",[t._v("The status of a component can only be the ERROR state because this is the only state of a component that we are interested in recording for later use. An ERROR statusObject is automatically created when a component calls the reportError method as described above.")]),t._v(" "),e("p",[t._v("For retrieving the statusObjects, the following method is used:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("queryStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" fullList"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is particularly useful for the ACS to determine the current status of the runtime environment and of the deployed components. If the ARE or one of the components are in a problematic state it can be reflected in the ACS.")]),t._v(" "),e("p",[t._v("The boolean "),e("em",[t._v("fullList")]),t._v(" argument specifies whether the error list to be returned will include all statusObjects generated since the ARE startup or just those that have not been requested by the ACS before.")]),t._v(" "),e("h2",{attrs:{id:"the-are-thread-pool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-thread-pool"}},[t._v("#")]),t._v(" The ARE Thread Pool")]),t._v(" "),e("p",[t._v("In order to avoid resource greedy threads and to achieve best thread handling, ARE uses one of the Thread Pool implementations provided by Java since JRE 1.5. In particular, we have utilized the java.util.concurrent.Executors library for creating a CachedThreadPool.")]),t._v(" "),e("p",[t._v("A cached thread pool will create threads as needed but will reuse previously instantiated threads when they are available and inactive. A cached thread pool is particularly useful for many short-lived asynchronous tasks and improves the performance of the runtime environment.")]),t._v(" "),e("p",[t._v("Developers are expected to use the ARE thread pool for executing their tasks that require a new Thread. You will need to import the middleware services package in order to get access to the "),e("strong",[t._v("AstericsThreadPool")]),t._v(" class.")]),t._v(" "),e("h2",{attrs:{id:"the-are-gui-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-gui-support"}},[t._v("#")]),t._v(" The ARE GUI support")]),t._v(" "),e("p",[t._v("The ARE provides a panel area (“ARE Desktop”) where plugins can display their graphical elements using the ARE GUI support classes. The ACS provides a dedicated canvas editor that allows end users positioning and resizing graphical elements of the plugins. Based on this information, the ARE displays plugins on the local device, maintaining the correct screen position and aspect ratio of graphical elements with respect to the screen resolution of the deployment device. (For more information about the usage of the ACS GUI editor and the ARE GUI control panel refer to the User Manual.)")]),t._v(" "),e("p",[e("img",{attrs:{src:a(294),alt:""}})]),t._v(" "),e("p",[e("strong",[t._v("GUI composition using the ACS GUI designer (right), resulting ARE GUI (left)")])]),t._v(" "),e("p",[t._v("In order to be recognized as GUI-plugin by ACS and ARE, the bundle descriptor of the plugin has to be extended with a dedicated "),e("code",[t._v("")]),t._v(" entry, which specifies the default size in a virtual coordinate system of 10000/10000 pixels. In the deployment model, the ACS will create position and size information according to the area defined in the ACS GUI designer.")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("gui")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("width")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("5000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("height")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[e("strong",[t._v("The gui element addition to the bundle descriptor")])]),t._v(" "),e("p",[t._v("The AsTeRICS middleware provides some services to the plugin developers in order to allow them displaying their GUI element onto the ARE Desktop. The middleware services encapsulate the complexity of dealing with positioning and allow displaying all GUI elements onto the same container: the ARE Desktop.")]),t._v(" "),e("p",[t._v("All GUI services are defined in eu.asterics.mw.services.AREServices so developers need to import this class in order to get access to the following methods:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void displayPanel (JPanel panel, IRuntimeComponentInstance componentInstance, boolean display)")])])]),t._v(" "),e("p",[t._v("This method is used for displaying (or hiding) a plugin’s panel at/from the ARE desktop. Developers need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the panel they want to be displayed (or removed)")])]),t._v(" "),e("li",[e("p",[t._v("the plugin object, in order to help the middleware finding the desired position and dimensions from the deployment model")])]),t._v(" "),e("li",[e("p",[t._v("a boolean argument specifying if they wish to hide or show the given panel.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("Dimension getAvailableSpace(IRuntimeComponentInstance componentInstance)")])])])]),t._v(" "),e("p",[t._v("The space that each plugin will occupy on the ARE desktop is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the available space for their graphical elements by calling the getAvailableSpace method which will return the space occupied for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Point getComponentPosition (IRuntimeComponentInstance componentInstance)")])])]),t._v(" "),e("p",[t._v("The positioning of plugin’s GUI elements is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the position of their graphical elements by calling the getComponentPosition which will return the position on screen for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void adjustFonts(JPanel panel, int maxFontSize, int minFontSize, int offset)")])])]),t._v(" "),e("p",[t._v("This service can be used by plugin developers interested in auto-adjusting the fonts of their GUI components depending on the space occupied for their plugins on the ARE desktop. They need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a panel to which all the internal fonts will be auto-adjusted")])]),t._v(" "),e("li",[e("p",[t._v("the maximum font size (in case there is more space available than needed)")])]),t._v(" "),e("li",[e("p",[t._v("the minimum font size, in case there is too little space which causes the text to become non-readable. Finally, the offset argument is used in case we want to occupy a percentage of the available space.")])])]),t._v(" "),e("p",[t._v("A good approach to GUI plugin development is to analyse existing plugins which provide GUI elements, e.g. the BarDisplay or Oscilloscope actuators, or the Slider or Cellboard sensor components.")]),t._v(" "),e("p",[t._v("If the plugin uses "),e("strong",[t._v("Swing to implement a GUI-widget")]),t._v(" (e.g. Slider,…), please check the following guidelines as well 4.2.8")]),t._v(" "),e("h2",{attrs:{id:"are-core-events-notification-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-core-events-notification-services"}},[t._v("#")]),t._v(" ARE core events notification services")]),t._v(" "),e("p",[t._v("The ARE core events notification service allows plugins to register/unregister to the ARE middleware in order to receive notifications of ARE core events.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void registerAREEventListener(IAREEventListener clazz)")])])]),t._v(" "),e("p",[t._v("It is sometimes necessary that plugins can be notified of various ARE events so they can react as needed. This method can be called by component instances that wish to be notified of such ARE events. Currently, the core events supported are:")]),t._v(" "),e("ul",[e("li",[e("p",[e("em",[t._v("preDeployModel:")]),t._v(" registered ARE event listeners will be notified just before the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postDeployModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStartModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStartModel:")]),t._v(" registered ARE event listeners will be notified immediately after the currently deployed model has been started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStopModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStopModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("prePauseModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postPauseModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preResumeModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postResumeModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified just before the bundles are is installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified immediately after the bundles have been installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("void unregisterAREEventListener(IAREEventListener clazz)")])])])]),t._v(" "),e("p",[t._v("Plugins already registered for receiving ARE core events can un-register using this method.")]),t._v(" "),e("h2",{attrs:{id:"dynamic-properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-properties"}},[t._v("#")]),t._v(" Dynamic Properties")]),t._v(" "),e("p",[t._v("In some applications, the ACS should be able to provide several options for property values which are not known in advance but depend on the current state of the ARE (see AsTeRUCS User Manual, section “Dynamic Properties”)… A typical example is the selection of a file which is available in the ARE file system (e.g. a .wav-file for the wave player plugin). This feature is particularly useful for plugins that are hardware dependent (selecting e.g. a soundcard or a midi player), or depend on the file system.")]),t._v(" "),e("p",[t._v("If a plugin is implementing a dynamic property, the values will be requested from the ARE, as soon as the ACS is synchronized with the ARE, via the ASAPI function:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])]),e("p",[t._v("The ARE middleware will forward the request for valid property values to the component instance with the given ID. The "),e("code",[t._v("List getRuntimePropertyList(String key)")]),t._v(" method has to be implemented in the "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" class which every AsTeRICS component extends.\nThe method implementation creates the list of valid properties and returns it to the middleware and the latter forwards the string list to the ACS via ASAPI. The ACS will dynamically update the property list in the properties window.")]),t._v(" "),e("p",[t._v("For an example of the dynamic property implementation, see the WaveFilePlayer plugin.")]),t._v(" "),e("h2",{attrs:{id:"data-synchronization"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-synchronization"}},[t._v("#")]),t._v(" Data Synchronization")]),t._v(" "),e("p",[t._v("Some plugins need data of multiple input ports to be able to start processing. Without data synchronization it is possible that one input port of a plugin receives multiple values before another port gets one value, although both signal channels deliver values at the same sampling rate.")]),t._v(" "),e("p",[t._v("The synchronization service provides a buffering mechanism at the middleware level that can be utilized by plugin developers in order to make sure that incoming data of selected input ports arrives synchronized.")]),t._v(" "),e("p",[t._v("To use the synchronization service in the plugin code, plugin developers are expected to extend the "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" instead of implementing the "),e("em",[t._v("IRuntimeInputPort.")]),t._v(" Basically, "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" provides a default implementation for the necessary buffering methods, as shown in the table below.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DefaultRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("receiveData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" startBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" stopBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" isBuffered "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("The designer can define that a plugin’s input port should be synchronized with some other input ports via the ACS. This will cause an argument change of the inputPort element on the deployment model file (e.g.,"),e("code",[t._v('')]),t._v(").")]),t._v(" "),e("p",[t._v("As soon as a model is deployed on the ARE, the middleware collects per component every port noted as synchronized port. When the model is successfully deployed and started, the ARE will buffer data which enters synchronized input ports until data on all synchronized ports has arrived. At that point, the ARE will call a new "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" callback method.")]),t._v(" "),e("p",[t._v("Developers that wish to support data synchronization need to implement the following method at their component instances.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncedValuesReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Where dataRow is a HashMap between Input Port ID and byte[]. For synchronized input ports, instead of implementing the regular "),e("em",[t._v("void receiveData(byte[] data)")]),t._v(" method which delivers incoming data of a single port, developers need to implement the "),e("em",[t._v("syncedValuesReceived")]),t._v(" method which will be called from the ARE with synchronized data from all the input ports that have been selected.")]),t._v(" "),e("h2",{attrs:{id:"interfacing-native-c-c-code-via-jni"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#interfacing-native-c-c-code-via-jni"}},[t._v("#")]),t._v(" Interfacing Native C/C++ Code via JNI")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("## Specifying native libraries in the Manifest\n")])])]),e("p",[t._v("The Manifest file of a bundle which includes native libraries has to specify these .dlls as shown in the following example:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-sensors.mycomponent\nBundle-SymbolicName: org.asterics.mycomponent\nBundle-Version: 0.1.0\nBundle-NativeCode: lib/native/mylib1.dll;\n lib/native/mylib2.dll;\n lib/native/mylib3.dll;\n osname=win32;processor=x86;\n osname=win;processor=x86-64;\n osname=win8;processor=x86;\n osname=win8;processor=x86-64;\n osname=windows 8;processor=x86;\n osname=windows 8;processor=x86-64;\n osname=windows8;processor=x86;\n osname=windows8;processor=x86-64;\n osname=Windows 8.1;processor=x86;\n osname=Windows 8.1;processor=x86-64\nDynamicImport-Package: *\n")])])]),e("p",[t._v("Components which interface native code via JNI and their respective manifest files can be found in the SVN, e.g. the “webcamera” component or the signal processing plugins by Starlab.")]),t._v(" "),e("p",[t._v("Note that the .jar containing the .dlls can be built manually using the command:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("jar "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-cvfm")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/mybundle.jar META-INF/MANIFEST.MF "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n")])])]),e("h2",{attrs:{id:"java-implementation-jni-bridge"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java-implementation-jni-bridge"}},[t._v("#")]),t._v(" Java-Implementation: JNI-Bridge")]),t._v(" "),e("p",[t._v("The recommended way to interface Java code of an ARE component with native code in a .dll is a bridge class which encapsulates the JNI functions and callbacks and maps the functions of the ARE component’s lifecycle-, port- and property-management to the corresponding functions in the native code. Here is a simple example which comprises one component property and receives data callbacks from a thread implemented in C. The received values are transferred to the component’s output port:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jni")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mycomponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Statically load the native library */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib1.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib2.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib3.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAnonymousLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("my_outport "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Activates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("activate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Deactivates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("deactivate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Gets the value of the named property.\n *\n * @param key the name of the property to be accessed\n * @return the value of the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Sets the named property to the defined value.\n *\n * @param key the name of the property to be accessed\n * @param value the value to be assigned to the named property\n * @return the value previously assigned to the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code on demand to signify \n * an internal error. The first argument corresponds to an error code \n * and the second argument corresponds to a textual description \n * of the error.\n * @param errorCode an error code\n * @param message a textual description of the error\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorReport_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" errorCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n logger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("severe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorCode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('": "')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code to send data\n * to the component’s output port.\n *\n * @param data1 (range is [0, Short.MAX_VALUE])\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("newData_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"c-implementation-callbacks-and-jni-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#c-implementation-callbacks-and-jni-code"}},[t._v("#")]),t._v(" C-Implementation: Callbacks and JNI code")]),t._v(" "),e("p",[t._v("The native C-code needs to be compiled into a .dll and include the JNI header files and libraries. An example for the Microsoft Visual Studio compiler looks as follows:")]),t._v(" "),e("p",[t._v("The following C-example shows how to implement a JNI-callback from a C-thread and an ARE-compliant exchange of a component property:")]),t._v(" "),e("div",{staticClass:"language-c extra-class"},[e("pre",{pre:!0,attrs:{class:"language-c"}},[e("code",[e("span",{pre:!0,attrs:{class:"token macro property"}},[e("span",{pre:!0,attrs:{class:"token directive-hash"}},[t._v("#")]),e("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("")])]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" JavaVM "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" jobject g_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myProperty"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_activate")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\terror_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetJavaVM")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tjclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newData_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// explicitly ask for a global reference")]),t._v("\n\tg_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_init")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_deactivate")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_exit")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tenv"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeleteGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_getProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\t\t\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_setProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n\t strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown */")]),t._v("\n\t strValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tpollingIntervalValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prepare JNI callback")]),t._v("\n JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n g_jvm"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("AttachCurrentThread")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newCoordinates_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// perform JNI callback")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("CallVoidMethod")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("my_new_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("This native C-code needs to be compiled into a .dll, the JNI header files and libraries have to be specified to the compiler and linker respectively. An example for the Microsoft Visual Studio build tools looks as follows:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('cl -c -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include" -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include\\win32" -I ".\\3rdparylib" my_c_file.cpp /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue \nlink my_c_file.obj /DLL /OUT:".\\my_c_file.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"libmsvc" /LIBPATH:"3rdparylib" "odbc32.lib" "odbccp32.lib" "comctl32.lib" "winmm.lib" "opengl32.lib" "ole32.lib" "strmiids.lib" "uuid.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "oleaut32.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"atlthunk" /NODEFAULTLIB:"LIBCMT" /MANIFESTUAC:"level=\'asInvoker\' uiAccess=\'false\'" /DEBUG /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:QUEUE\n')])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The compiler and linker switches may differ depending on the nature of your dependency libraries and setup.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-packaging-environment-ape"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-packaging-environment-ape"}},[t._v("#")]),t._v(" AsTeRICS Packaging Environment (APE)")]),t._v(" "),e("p",[t._v("The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using "),e("a",{attrs:{href:"http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGIBBCI",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaFX packaging technology"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("See "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/AsTeRICS-Packaging-Environment-(APE)",target:"_blank",rel:"noopener noreferrer"}},[t._v("APE documentation"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/189.fc8b1114.js b/assets/js/190.9164d136.js similarity index 90% rename from assets/js/189.fc8b1114.js rename to assets/js/190.9164d136.js index 4865a5b6e8..4445909254 100644 --- a/assets/js/189.fc8b1114.js +++ b/assets/js/190.9164d136.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[189],{1139:function(t,e,i){"use strict";i.r(e);var o=i(2),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"decimation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#decimation"}},[t._v("#")]),t._v(" Decimation")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The decimation operation performed by this component consists in an anti-aliasing low band pass filter plus a down-sampling. The component outputs a computed sample after receiving a certain number of input samples according to the down-sampling-ratio property value. So the resultant signal is like the original signal, but sampled to a lower ratio determined by the mentioned property.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(705),alt:"Screenshot: Decimation plugin",title:"Screenshot: Decimation plugin"}})]),t._v(" "),e("p",[t._v("Decimation plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the signal to be decimated.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port of the decimated signal.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("DownSamplingRatio [integer]:")]),t._v(" Defines the ratio between the number of samples in the input and output ports.")])])])}),[],!1,null,null,null);e.default=n.exports},705:function(t,e,i){t.exports=i.p+"assets/img/decimation.9b7875bb.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[190],{1144:function(t,e,i){"use strict";i.r(e);var o=i(2),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"decimation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#decimation"}},[t._v("#")]),t._v(" Decimation")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The decimation operation performed by this component consists in an anti-aliasing low band pass filter plus a down-sampling. The component outputs a computed sample after receiving a certain number of input samples according to the down-sampling-ratio property value. So the resultant signal is like the original signal, but sampled to a lower ratio determined by the mentioned property.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(708),alt:"Screenshot: Decimation plugin",title:"Screenshot: Decimation plugin"}})]),t._v(" "),e("p",[t._v("Decimation plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the signal to be decimated.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port of the decimated signal.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("DownSamplingRatio [integer]:")]),t._v(" Defines the ratio between the number of samples in the input and output ports.")])])])}),[],!1,null,null,null);e.default=n.exports},708:function(t,e,i){t.exports=i.p+"assets/img/decimation.9b7875bb.jpg"}}]); \ No newline at end of file diff --git a/assets/js/190.72f3bd5b.js b/assets/js/191.920c3f4e.js similarity index 88% rename from assets/js/190.72f3bd5b.js rename to assets/js/191.920c3f4e.js index 424ae0c60e..5f14ae60e0 100644 --- a/assets/js/190.72f3bd5b.js +++ b/assets/js/191.920c3f4e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[190],{1141:function(t,e,r){"use strict";r.r(e);var s=r(2),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"delay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#delay"}},[t._v("#")]),t._v(" Delay")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin passes received double values after a defined delay.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(707),alt:"Screenshot: Delay plugin",title:"Screenshot: Delay plugin"}})]),t._v(" "),e("p",[t._v("Delay plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in (double):")]),t._v(" Input port for the incoming signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out (double):")]),t._v(" Output port for the delayed signal.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" Delay between input and output signal (in milliseconds).")])])])}),[],!1,null,null,null);e.default=a.exports},707:function(t,e,r){t.exports=r.p+"assets/img/delay.04385069.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[191],{1146:function(t,e,r){"use strict";r.r(e);var s=r(2),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"delay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#delay"}},[t._v("#")]),t._v(" Delay")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin passes received double values after a defined delay.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(710),alt:"Screenshot: Delay plugin",title:"Screenshot: Delay plugin"}})]),t._v(" "),e("p",[t._v("Delay plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in (double):")]),t._v(" Input port for the incoming signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out (double):")]),t._v(" Output port for the delayed signal.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" Delay between input and output signal (in milliseconds).")])])])}),[],!1,null,null,null);e.default=a.exports},710:function(t,e,r){t.exports=r.p+"assets/img/delay.04385069.jpg"}}]); \ No newline at end of file diff --git a/assets/js/191.f9b30f5b.js b/assets/js/192.c8172be6.js similarity index 91% rename from assets/js/191.f9b30f5b.js rename to assets/js/192.c8172be6.js index 8e294cb7fc..ad08a41856 100644 --- a/assets/js/191.f9b30f5b.js +++ b/assets/js/192.c8172be6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[191],{1143:function(t,e,i){"use strict";i.r(e);var r=i(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"derivative"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#derivative"}},[t._v("#")]),t._v(" Derivative")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component computes the first derivative operation of the input signal by using an approximation by a numerical differentiation method using five points. Due to the fact that the component takes into consideration the previous four samples plus the current one, it will output the derivative value corresponding to the centre sample of the five ones. It means two samples earlier from the one that is received in the input port.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(709),alt:"Screenshot: Derivative plugin",title:"Screenshot: Derivative plugin"}})]),t._v(" "),e("p",[t._v("Derivative plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the signal to be derived.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port of the first derivative of the input signal. The output values present a delay of two samples because of the reason given in the general description.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("SampleFrequency [integer]:")]),t._v(" Defines the frequency which the input signal is sampled, so the distance between two consecutive samples, which is used by the component, is defined.")])])])}),[],!1,null,null,null);e.default=s.exports},709:function(t,e,i){t.exports=i.p+"assets/img/derivative.b98138ff.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[192],{1147:function(t,e,i){"use strict";i.r(e);var r=i(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"derivative"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#derivative"}},[t._v("#")]),t._v(" Derivative")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component computes the first derivative operation of the input signal by using an approximation by a numerical differentiation method using five points. Due to the fact that the component takes into consideration the previous four samples plus the current one, it will output the derivative value corresponding to the centre sample of the five ones. It means two samples earlier from the one that is received in the input port.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(711),alt:"Screenshot: Derivative plugin",title:"Screenshot: Derivative plugin"}})]),t._v(" "),e("p",[t._v("Derivative plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the signal to be derived.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port of the first derivative of the input signal. The output values present a delay of two samples because of the reason given in the general description.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("SampleFrequency [integer]:")]),t._v(" Defines the frequency which the input signal is sampled, so the distance between two consecutive samples, which is used by the component, is defined.")])])])}),[],!1,null,null,null);e.default=s.exports},711:function(t,e,i){t.exports=i.p+"assets/img/derivative.b98138ff.jpg"}}]); \ No newline at end of file diff --git a/assets/js/192.7e779dea.js b/assets/js/193.7290c10c.js similarity index 89% rename from assets/js/192.7e779dea.js rename to assets/js/193.7290c10c.js index 24e85f94fe..94497ed888 100644 --- a/assets/js/192.7e779dea.js +++ b/assets/js/193.7290c10c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[192],{1144:function(t,e,r){"use strict";r.r(e);var i=r(2),n=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"differentiate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#differentiate"}},[t._v("#")]),t._v(" Differentiate")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The differentiate component outputs the difference of the previous to the current input value on the output port. This functionality can be considered as a simplified implementation of the derivative component.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(710),alt:"Screenshot: Differentiate plugin",title:"Screenshot: Differentiate plugin"}})]),t._v(" "),e("p",[t._v("Differentiate plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" Input port for signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" Output of difference value.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("resetValue [double]:")]),t._v(" The value that is used in the first difference calculation after start.")])])])}),[],!1,null,null,null);e.default=n.exports},710:function(t,e,r){t.exports=r.p+"assets/img/differentiate.7fe386c5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[193],{1149:function(t,e,r){"use strict";r.r(e);var i=r(2),n=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"differentiate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#differentiate"}},[t._v("#")]),t._v(" Differentiate")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The differentiate component outputs the difference of the previous to the current input value on the output port. This functionality can be considered as a simplified implementation of the derivative component.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(713),alt:"Screenshot: Differentiate plugin",title:"Screenshot: Differentiate plugin"}})]),t._v(" "),e("p",[t._v("Differentiate plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" Input port for signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" Output of difference value.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("resetValue [double]:")]),t._v(" The value that is used in the first difference calculation after start.")])])])}),[],!1,null,null,null);e.default=n.exports},713:function(t,e,r){t.exports=r.p+"assets/img/differentiate.7fe386c5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/193.a707fac8.js b/assets/js/194.06f3a7e1.js similarity index 91% rename from assets/js/193.a707fac8.js rename to assets/js/194.06f3a7e1.js index 8ec9093d67..0dedc1b5a0 100644 --- a/assets/js/193.a707fac8.js +++ b/assets/js/194.06f3a7e1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[193],{1142:function(t,e,i){"use strict";i.r(e);var s=i(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"dissimilarity"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dissimilarity"}},[t._v("#")]),t._v(" Dissimilarity")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This component computes the Euclidean distance between two input vectors. The component stores the input values from both input ports until DataLen values have been received, then the computation is performed and sent to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(708),alt:"Screenshot: Dissimilarity plugin",title:"Screenshot: Dissimilarity plugin"}})]),t._v(" "),e("p",[t._v("Dissimilarity plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1 [double]:")]),t._v(" Input port for the first signal.")]),t._v(" "),e("li",[e("strong",[t._v("input2 [double]:")]),t._v(" Input port for the second signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port for the dissimilarity computation. A value is provided every time DataLen samples arrive to the input ports.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("DataLen [integer]:")]),t._v(" Defines the length of the signals over which the dissimilarity is computed.")])])])}),[],!1,null,null,null);e.default=r.exports},708:function(t,e,i){t.exports=i.p+"assets/img/dissimilarity.a5839466.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[194],{1148:function(t,e,i){"use strict";i.r(e);var s=i(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"dissimilarity"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dissimilarity"}},[t._v("#")]),t._v(" Dissimilarity")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This component computes the Euclidean distance between two input vectors. The component stores the input values from both input ports until DataLen values have been received, then the computation is performed and sent to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(712),alt:"Screenshot: Dissimilarity plugin",title:"Screenshot: Dissimilarity plugin"}})]),t._v(" "),e("p",[t._v("Dissimilarity plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1 [double]:")]),t._v(" Input port for the first signal.")]),t._v(" "),e("li",[e("strong",[t._v("input2 [double]:")]),t._v(" Input port for the second signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port for the dissimilarity computation. A value is provided every time DataLen samples arrive to the input ports.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("DataLen [integer]:")]),t._v(" Defines the length of the signals over which the dissimilarity is computed.")])])])}),[],!1,null,null,null);e.default=r.exports},712:function(t,e,i){t.exports=i.p+"assets/img/dissimilarity.a5839466.jpg"}}]); \ No newline at end of file diff --git a/assets/js/194.58d64633.js b/assets/js/195.f9cbfe73.js similarity index 87% rename from assets/js/194.58d64633.js rename to assets/js/195.f9cbfe73.js index adc1cfb29c..fc7be31178 100644 --- a/assets/js/194.58d64633.js +++ b/assets/js/195.f9cbfe73.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[194],{1145:function(t,o,r){"use strict";r.r(o);var e=r(2),s=Object(e.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"double-to-string"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#double-to-string"}},[t._v("#")]),t._v(" Double To String")]),t._v(" "),o("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),o("p",[t._v("This component converts the double values at the input port to string values at the output.")]),t._v(" "),o("p",[o("img",{attrs:{src:r(711),alt:"Screenshot: DoubleToString plugin",title:"Screenshot: DoubleToString plugin"}})]),t._v(" "),o("p",[t._v("DoubleToString plugin")]),t._v(" "),o("h2",{attrs:{id:"input-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("input [double]:")]),t._v(" Input port for the double values to be converted.")])]),t._v(" "),o("h2",{attrs:{id:"output-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("output [string]:")]),t._v(" Output port for the converted string values.")])])])}),[],!1,null,null,null);o.default=s.exports},711:function(t,o,r){t.exports=r.p+"assets/img/doubletostring.1cadca65.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[195],{1151:function(t,o,r){"use strict";r.r(o);var e=r(2),s=Object(e.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"double-to-string"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#double-to-string"}},[t._v("#")]),t._v(" Double To String")]),t._v(" "),o("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),o("p",[t._v("This component converts the double values at the input port to string values at the output.")]),t._v(" "),o("p",[o("img",{attrs:{src:r(715),alt:"Screenshot: DoubleToString plugin",title:"Screenshot: DoubleToString plugin"}})]),t._v(" "),o("p",[t._v("DoubleToString plugin")]),t._v(" "),o("h2",{attrs:{id:"input-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("input [double]:")]),t._v(" Input port for the double values to be converted.")])]),t._v(" "),o("h2",{attrs:{id:"output-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("output [string]:")]),t._v(" Output port for the converted string values.")])])])}),[],!1,null,null,null);o.default=s.exports},715:function(t,o,r){t.exports=r.p+"assets/img/doubletostring.1cadca65.jpg"}}]); \ No newline at end of file diff --git a/assets/js/195.87d0d207.js b/assets/js/196.37a564e1.js similarity index 95% rename from assets/js/195.87d0d207.js rename to assets/js/196.37a564e1.js index 1291f7d9aa..39ae88553b 100644 --- a/assets/js/195.87d0d207.js +++ b/assets/js/196.37a564e1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[195],{1146:function(t,e,r){"use strict";r.r(e);var i=r(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ecmascriptinterpreter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ecmascriptinterpreter"}},[t._v("#")]),t._v(" ECMAScriptInterpreter")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Scripting)")]),t._v(" "),e("p",[t._v("This component is a general purpose processor that can relays the input and incoming events to a script compatible to the ECMA script specification (e.g. JavaScript). The script is specified by the property scriptname. If the property is left empty, the component will load the file “script.js” from local storage. If this file does not exist, the component will generate the file in local storage and fill it with a default “pass-through” script.")]),t._v(" "),e("p",[t._v("There are certain constraints for the script:")]),t._v(" "),e("ul",[e("li",[t._v("the script has to contain an object named scriptclass.")]),t._v(" "),e("li",[t._v("the object has to implement a method dataInput(input_index, input_data)")]),t._v(" "),e("li",[t._v("the object has to implement a method eventInput(event_index)")])]),t._v(" "),e("p",[t._v("The script is provided with the following external variables:")]),t._v(" "),e("ul",[e("li",[t._v("output: an array of size 8 representing 8 IRuntimeOutputPorts")]),t._v(" "),e("li",[t._v("eventout: an array of size 8 representing 8 IRuntimeEventTriggererPorts")]),t._v(" "),e("li",[t._v("property: an array of size 8 holding strings with the property inputs from the components property fields")])]),t._v(" "),e("p",[t._v("The sendData method of the output variables has to be called with a string. If necessary this needs to be converted into a Java string, this can be done like this:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("\t\tstr = new java.lang.String(in\\_data);\n\t\toutput\\[in\\_nb\\].sendData(str.getBytes());\n")])])]),e("p",[t._v("For more information please see a demo script in the plugin source code!")]),t._v(" "),e("p",[e("img",{attrs:{src:r(712),alt:"Screenshot: ECMAScriptInterpreter plugin",title:"Screenshot: ECMAScriptInterpreter plugin"}})]),t._v(" "),e("p",[t._v("ECMAScriptInterpreter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputPort1 - inputPort8 [string]:")]),t._v(" input ports for script parameters")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputPort1 - outputPort8 [string]:")]),t._v(" output ports for script results")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("elpPort1 - elpPort8:")]),t._v(" 8 event listener ports which can be used by the script code.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("etpPort1 - elpPort8:")]),t._v(" 8 event trigger ports which can be used by the script code.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("scriptname [string]:")]),t._v(" a valid filename of an ECMA-compatible script (e.g. Javascript) which shall be interpreted")]),t._v(" "),e("li",[e("strong",[t._v("value1 - value8 [string]:")]),t._v(" 8 properties which can be used by the script.")])])])}),[],!1,null,null,null);e.default=s.exports},712:function(t,e,r){t.exports=r.p+"assets/img/ecmascriptinterpreter.dc7ee5f0.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[196],{1150:function(t,e,r){"use strict";r.r(e);var i=r(2),s=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ecmascriptinterpreter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ecmascriptinterpreter"}},[t._v("#")]),t._v(" ECMAScriptInterpreter")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Scripting)")]),t._v(" "),e("p",[t._v("This component is a general purpose processor that can relays the input and incoming events to a script compatible to the ECMA script specification (e.g. JavaScript). The script is specified by the property scriptname. If the property is left empty, the component will load the file “script.js” from local storage. If this file does not exist, the component will generate the file in local storage and fill it with a default “pass-through” script.")]),t._v(" "),e("p",[t._v("There are certain constraints for the script:")]),t._v(" "),e("ul",[e("li",[t._v("the script has to contain an object named scriptclass.")]),t._v(" "),e("li",[t._v("the object has to implement a method dataInput(input_index, input_data)")]),t._v(" "),e("li",[t._v("the object has to implement a method eventInput(event_index)")])]),t._v(" "),e("p",[t._v("The script is provided with the following external variables:")]),t._v(" "),e("ul",[e("li",[t._v("output: an array of size 8 representing 8 IRuntimeOutputPorts")]),t._v(" "),e("li",[t._v("eventout: an array of size 8 representing 8 IRuntimeEventTriggererPorts")]),t._v(" "),e("li",[t._v("property: an array of size 8 holding strings with the property inputs from the components property fields")])]),t._v(" "),e("p",[t._v("The sendData method of the output variables has to be called with a string. If necessary this needs to be converted into a Java string, this can be done like this:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("\t\tstr = new java.lang.String(in\\_data);\n\t\toutput\\[in\\_nb\\].sendData(str.getBytes());\n")])])]),e("p",[t._v("For more information please see a demo script in the plugin source code!")]),t._v(" "),e("p",[e("img",{attrs:{src:r(714),alt:"Screenshot: ECMAScriptInterpreter plugin",title:"Screenshot: ECMAScriptInterpreter plugin"}})]),t._v(" "),e("p",[t._v("ECMAScriptInterpreter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputPort1 - inputPort8 [string]:")]),t._v(" input ports for script parameters")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputPort1 - outputPort8 [string]:")]),t._v(" output ports for script results")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("elpPort1 - elpPort8:")]),t._v(" 8 event listener ports which can be used by the script code.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("etpPort1 - elpPort8:")]),t._v(" 8 event trigger ports which can be used by the script code.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("scriptname [string]:")]),t._v(" a valid filename of an ECMA-compatible script (e.g. Javascript) which shall be interpreted")]),t._v(" "),e("li",[e("strong",[t._v("value1 - value8 [string]:")]),t._v(" 8 properties which can be used by the script.")])])])}),[],!1,null,null,null);e.default=s.exports},714:function(t,e,r){t.exports=r.p+"assets/img/ecmascriptinterpreter.dc7ee5f0.jpg"}}]); \ No newline at end of file diff --git a/assets/js/196.66746a27.js b/assets/js/197.75b5e356.js similarity index 97% rename from assets/js/196.66746a27.js rename to assets/js/197.75b5e356.js index 800afdb179..a0f9d7446f 100644 --- a/assets/js/196.66746a27.js +++ b/assets/js/197.75b5e356.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[196],{1150:function(t,e,s){"use strict";s.r(e);var n=s(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"event-block"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-block"}},[t._v("#")]),t._v(" Event Block")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This plugin, depending on its state, can pass or block events from the input port.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(716),alt:"Screenshot: EventBlock plugin",title:"Screenshot: EventBlock plugin"}})]),t._v(" "),e("p",[t._v("EventBlock plugin")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("input:")]),t._v(" Input port for the events.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("pass:")]),t._v(" Pass the events.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("block:")]),t._v(" Block the events.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("change:")]),t._v(" Change the state of component: pass/block to the opposite.")])])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v(":")]),t._v(" Output port for events.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("block [boolean]:")]),t._v(" If is set to true, the component will block the events after start.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("blockAfterEvent [boolean]:")]),t._v(" If is set to true, the component will block the events after passing one event.")])])])])}),[],!1,null,null,null);e.default=r.exports},716:function(t,e,s){t.exports=s.p+"assets/img/eventblock.a52607a8.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[197],{1152:function(t,e,s){"use strict";s.r(e);var n=s(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"event-block"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-block"}},[t._v("#")]),t._v(" Event Block")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This plugin, depending on its state, can pass or block events from the input port.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(716),alt:"Screenshot: EventBlock plugin",title:"Screenshot: EventBlock plugin"}})]),t._v(" "),e("p",[t._v("EventBlock plugin")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("input:")]),t._v(" Input port for the events.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("pass:")]),t._v(" Pass the events.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("block:")]),t._v(" Block the events.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("change:")]),t._v(" Change the state of component: pass/block to the opposite.")])])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v(":")]),t._v(" Output port for events.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("block [boolean]:")]),t._v(" If is set to true, the component will block the events after start.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("blockAfterEvent [boolean]:")]),t._v(" If is set to true, the component will block the events after passing one event.")])])])])}),[],!1,null,null,null);e.default=r.exports},716:function(t,e,s){t.exports=s.p+"assets/img/eventblock.a52607a8.jpg"}}]); \ No newline at end of file diff --git a/assets/js/197.04387a26.js b/assets/js/198.d3c53347.js similarity index 93% rename from assets/js/197.04387a26.js rename to assets/js/198.d3c53347.js index c93c7e4b8f..81ef3c159c 100644 --- a/assets/js/197.04387a26.js +++ b/assets/js/198.d3c53347.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[197],{1147:function(e,t,r){"use strict";r.r(t);var s=r(2),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("The EventCascade component can be used to generate a sequence (or loops) of events with selectable delay times. The sequence can be started and stopped via incoming events.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(713),alt:"Screenshot: EventCascade plugin",title:"Screenshot: EventCascade plugin"}})]),e._v(" "),t("p",[e._v("EventCascade plugin")]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("nextEvent:")]),e._v(" Triggers the next event in the event cascade (with wrap-around)")]),e._v(" "),t("li",[t("strong",[e._v("previousEvent:")]),e._v(" Triggers the previouse event in the event cascade (with wrap-around)")]),e._v(" "),t("li",[t("strong",[e._v("startCascade:")]),e._v(" Starts the event sequence")]),e._v(" "),t("li",[t("strong",[e._v("startCascade:")]),e._v(" Stops the event sequence")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" Sets the next event number to zero (first in the sequence)")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("trigger1 - trigger15:")]),e._v(" The available event trigger outputs")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activeTriggers [integer]:")]),e._v(" How many event triggers are active (defines the wrap-around)")]),e._v(" "),t("li",[t("strong",[e._v("loops [integer]:")]),e._v(" How many loops will be performed before the event sequence stops (0=endless loop)")]),e._v(" "),t("li",[t("strong",[e._v("autoStart [boolean]:")]),e._v(" Defines if the event cascade will be automatically started at model startup")]),e._v(" "),t("li",[t("strong",[e._v("delayBeforeTrigger1 - delayBeforeTrigger15[integer]:")]),e._v(" Delay time before the corresponding trigger event is created")])])])}),[],!1,null,null,null);t.default=n.exports},713:function(e,t,r){e.exports=r.p+"assets/img/eventcascade.b78f3d67.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[198],{1153:function(e,t,r){"use strict";r.r(t);var s=r(2),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("The EventCascade component can be used to generate a sequence (or loops) of events with selectable delay times. The sequence can be started and stopped via incoming events.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(717),alt:"Screenshot: EventCascade plugin",title:"Screenshot: EventCascade plugin"}})]),e._v(" "),t("p",[e._v("EventCascade plugin")]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("nextEvent:")]),e._v(" Triggers the next event in the event cascade (with wrap-around)")]),e._v(" "),t("li",[t("strong",[e._v("previousEvent:")]),e._v(" Triggers the previouse event in the event cascade (with wrap-around)")]),e._v(" "),t("li",[t("strong",[e._v("startCascade:")]),e._v(" Starts the event sequence")]),e._v(" "),t("li",[t("strong",[e._v("startCascade:")]),e._v(" Stops the event sequence")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" Sets the next event number to zero (first in the sequence)")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("trigger1 - trigger15:")]),e._v(" The available event trigger outputs")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activeTriggers [integer]:")]),e._v(" How many event triggers are active (defines the wrap-around)")]),e._v(" "),t("li",[t("strong",[e._v("loops [integer]:")]),e._v(" How many loops will be performed before the event sequence stops (0=endless loop)")]),e._v(" "),t("li",[t("strong",[e._v("autoStart [boolean]:")]),e._v(" Defines if the event cascade will be automatically started at model startup")]),e._v(" "),t("li",[t("strong",[e._v("delayBeforeTrigger1 - delayBeforeTrigger15[integer]:")]),e._v(" Delay time before the corresponding trigger event is created")])])])}),[],!1,null,null,null);t.default=n.exports},717:function(e,t,r){e.exports=r.p+"assets/img/eventcascade.b78f3d67.jpg"}}]); \ No newline at end of file diff --git a/assets/js/198.1507c05a.js b/assets/js/199.f79d59f9.js similarity index 95% rename from assets/js/198.1507c05a.js rename to assets/js/199.f79d59f9.js index e7c5a9534d..226705670d 100644 --- a/assets/js/198.1507c05a.js +++ b/assets/js/199.f79d59f9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[198],{1148:function(e,t,i){"use strict";i.r(t);var n=i(2),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component counts events. It can increase and decrease a counts via incoming events.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(714),alt:"Screenshot: EventCounter plugin",title:"Screenshot: EventCounter plugin"}})]),e._v(" "),t("p",[e._v("EventCounter plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("setValue [integer]:")]),e._v(" Sets the event counter to the incoming value. Note that this value is not propagated to the output port (to avoid loops).")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [integer]:")]),e._v(" Sends the number of events.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("increase:")]),e._v(" Increases the number of events.")]),e._v(" "),t("li",[t("strong",[e._v("decrease:")]),e._v(" Decreases the number of events.")]),e._v(" "),t("li",[t("strong",[e._v("resetToZero:")]),e._v(" Sets the event counter to zero.")]),e._v(" "),t("li",[t("strong",[e._v("resetToInitial:")]),e._v(" Sets the event counter to the initial value (property).")]),e._v(" "),t("li",[t("strong",[e._v("sendNow:")]),e._v(" sendes the current value of the counter to the output port")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("mode [integer]:")]),e._v(" Defines counting mode:")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("no limit:")]),e._v(" The component counts events without any limitation.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("limit maximum:")]),e._v(" In this mode, the maximum value of the counter is limited by the maxValue property.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("limit minimum:")]),e._v(" In this mode, the minimum value of the counter is limited by the minValue property.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("limit minimum and maximum:")]),e._v(" In this mode, both maximum and minimum values of the counter are limited by the maxValue amd minValue properties.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("minValue [integer]:")]),e._v(" Defines the minimum value of the counter.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("maxValue [integer]:")]),e._v(" Defines the maximum value of the counter.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("initialValue [integer]:")]),e._v(" Defines the initial value of the counter.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("wrapAround [boolean]:")]),e._v(" if selected and the appropriate mode is set, exceeding the maximum value will wrap to the minimum value and vice versa.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("sendInitialValue [boolean]:")]),e._v(" if selected, the initial value is sent at the startup.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("autoSend [boolean]:")]),e._v(" if selected, the changes of the event counter are sent immediately to the output port")])])])])}),[],!1,null,null,null);t.default=o.exports},714:function(e,t,i){e.exports=i.p+"assets/img/eventcounter.2b933163.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[199],{1154:function(e,t,i){"use strict";i.r(t);var n=i(2),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component counts events. It can increase and decrease a counts via incoming events.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(718),alt:"Screenshot: EventCounter plugin",title:"Screenshot: EventCounter plugin"}})]),e._v(" "),t("p",[e._v("EventCounter plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("setValue [integer]:")]),e._v(" Sets the event counter to the incoming value. Note that this value is not propagated to the output port (to avoid loops).")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("output [integer]:")]),e._v(" Sends the number of events.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("increase:")]),e._v(" Increases the number of events.")]),e._v(" "),t("li",[t("strong",[e._v("decrease:")]),e._v(" Decreases the number of events.")]),e._v(" "),t("li",[t("strong",[e._v("resetToZero:")]),e._v(" Sets the event counter to zero.")]),e._v(" "),t("li",[t("strong",[e._v("resetToInitial:")]),e._v(" Sets the event counter to the initial value (property).")]),e._v(" "),t("li",[t("strong",[e._v("sendNow:")]),e._v(" sendes the current value of the counter to the output port")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("mode [integer]:")]),e._v(" Defines counting mode:")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("no limit:")]),e._v(" The component counts events without any limitation.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("limit maximum:")]),e._v(" In this mode, the maximum value of the counter is limited by the maxValue property.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("limit minimum:")]),e._v(" In this mode, the minimum value of the counter is limited by the minValue property.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("limit minimum and maximum:")]),e._v(" In this mode, both maximum and minimum values of the counter are limited by the maxValue amd minValue properties.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("minValue [integer]:")]),e._v(" Defines the minimum value of the counter.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("maxValue [integer]:")]),e._v(" Defines the maximum value of the counter.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("initialValue [integer]:")]),e._v(" Defines the initial value of the counter.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("wrapAround [boolean]:")]),e._v(" if selected and the appropriate mode is set, exceeding the maximum value will wrap to the minimum value and vice versa.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("sendInitialValue [boolean]:")]),e._v(" if selected, the initial value is sent at the startup.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("autoSend [boolean]:")]),e._v(" if selected, the changes of the event counter are sent immediately to the output port")])])])])}),[],!1,null,null,null);t.default=o.exports},718:function(e,t,i){e.exports=i.p+"assets/img/eventcounter.2b933163.jpg"}}]); \ No newline at end of file diff --git a/assets/js/2.2469d7ea.js b/assets/js/2.1654fade.js similarity index 99% rename from assets/js/2.2469d7ea.js rename to assets/js/2.1654fade.js index f1e9de4575..6849b056f9 100644 --- a/assets/js/2.2469d7ea.js +++ b/assets/js/2.1654fade.js @@ -2,4 +2,4 @@ /** * @link https://github.com/gajus/sister for the canonical source repository * @license https://github.com/gajus/sister/blob/master/LICENSE BSD 3-Clause -*/o=function(){var e={},t={};return e.on=function(e,n){var o={name:e,handler:n};return t[e]=t[e]||[],t[e].unshift(o),o},e.off=function(e){var n=t[e.name].indexOf(e);-1!==n&&t[e.name].splice(n,1)},e.trigger=function(e,n){var o,r=t[e];if(r)for(o=r.length;o--;)r[o].handler(n)},e},e.exports=o},319:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(n(320)),r=i(n(323)),s=i(n(325)),a=i(n(326));function i(e){return e&&e.__esModule?e:{default:e}}const u=(0,o.default)("youtube-player"),c={proxyEvents:e=>{const t={};for(const n of s.default){const o="on"+n.slice(0,1).toUpperCase()+n.slice(1);t[o]=t=>{u('event "%s"',o,t),e.trigger(n,t)}}return t},promisifyPlayer:(e,t=!1)=>{const n={};for(const o of a.default)t&&r.default[o]?n[o]=(...t)=>e.then(e=>{const n=r.default[o],s=e.getPlayerState(),a=e[o].apply(e,t);return n.stateChangeRequired||Array.isArray(n.acceptableStates)&&!n.acceptableStates.includes(s)?new Promise(t=>{const o=()=>{const r=e.getPlayerState();let s;"number"==typeof n.timeout&&(s=setTimeout(()=>{e.removeEventListener("onStateChange",o),t()},n.timeout)),Array.isArray(n.acceptableStates)&&n.acceptableStates.includes(r)&&(e.removeEventListener("onStateChange",o),clearTimeout(s),t())};e.addEventListener("onStateChange",o)}).then(()=>a):a}):n[o]=(...t)=>e.then(e=>e[o].apply(e,t));return n}};t.default=c,e.exports=t.default},320:function(e,t,n){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let o=0,r=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(o++,"%c"===e&&(r=o))}),t.splice(r,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(321)(t);const{formatters:o}=e.exports;o.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},321:function(e,t,n){e.exports=function(e){function t(e){let n,r,s,a=null;function i(...e){if(!i.enabled)return;const o=i,r=Number(new Date),s=r-(n||r);o.diff=s,o.prev=n,o.curr=r,n=r,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let a=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(n,r)=>{if("%%"===n)return"%";a++;const s=t.formatters[r];if("function"==typeof s){const t=e[a];n=s.call(o,t),e.splice(a,1),a--}return n}),t.formatArgs.call(o,e);(o.log||t.log).apply(o,e)}return i.namespace=e,i.useColors=t.useColors(),i.color=t.selectColor(e),i.extend=o,i.destroy=t.destroy,Object.defineProperty(i,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==a?a:(r!==t.namespaces&&(r=t.namespaces,s=t.enabled(e)),s),set:e=>{a=e}}),"function"==typeof t.init&&t.init(i),i}function o(e,n){const o=t(this.namespace+(void 0===n?":":n)+e);return o.log=this.log,o}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const o=("string"==typeof e?e:"").split(/[\s,]+/),r=o.length;for(n=0;n{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var a=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"days":case"day":case"d":return a*s;case"hours":case"hour":case"hrs":case"hr":case"h":return a*r;case"minutes":case"minute":case"mins":case"min":case"m":return a*o;case"seconds":case"second":case"secs":case"sec":case"s":return a*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}(e);if("number"===u&&!1===isNaN(e))return t.long?a(i=e,s,"day")||a(i,r,"hour")||a(i,o,"minute")||a(i,n,"second")||i+" ms":function(e){if(e>=s)return Math.round(e/s)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=o)return Math.round(e/o)+"m";if(e>=n)return Math.round(e/n)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},323:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,r=n(324),s=(o=r)&&o.__esModule?o:{default:o};t.default={pauseVideo:{acceptableStates:[s.default.ENDED,s.default.PAUSED],stateChangeRequired:!1},playVideo:{acceptableStates:[s.default.ENDED,s.default.PLAYING],stateChangeRequired:!1},seekTo:{acceptableStates:[s.default.ENDED,s.default.PLAYING,s.default.PAUSED],stateChangeRequired:!0,timeout:3e3}},e.exports=t.default},324:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={BUFFERING:3,ENDED:0,PAUSED:2,PLAYING:1,UNSTARTED:-1,VIDEO_CUED:5},e.exports=t.default},325:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=["ready","stateChange","playbackQualityChange","playbackRateChange","error","apiChange","volumeChange"],e.exports=t.default},326:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=["cueVideoById","loadVideoById","cueVideoByUrl","loadVideoByUrl","playVideo","pauseVideo","stopVideo","getVideoLoadedFraction","cuePlaylist","loadPlaylist","nextVideo","previousVideo","playVideoAt","setShuffle","setLoop","getPlaylist","getPlaylistIndex","setOption","mute","unMute","isMuted","setVolume","getVolume","seekTo","getPlayerState","getPlaybackRate","setPlaybackRate","getAvailablePlaybackRates","getPlaybackQuality","setPlaybackQuality","getAvailableQualityLevels","getCurrentTime","getDuration","removeEventListener","getVideoUrl","getVideoEmbedCode","getOptions","getOption","addEventListener","destroy","setSize","getIframe","getSphericalProperties","setSphericalProperties"],e.exports=t.default},327:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,r=n(328),s=(o=r)&&o.__esModule?o:{default:o};t.default=e=>new Promise(t=>{if(window.YT&&window.YT.Player&&window.YT.Player instanceof Function)return void t(window.YT);{const t="http:"===window.location.protocol?"http:":"https:";(0,s.default)(t+"//www.youtube.com/iframe_api",t=>{t&&e.trigger("error",t)})}const n=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{n&&n(),t(window.YT)}}),e.exports=t.default},328:function(e,t){function n(e,t){e.onload=function(){this.onerror=this.onload=null,t(null,e)},e.onerror=function(){this.onerror=this.onload=null,t(new Error("Failed to load "+this.src),e)}}function o(e,t){e.onreadystatechange=function(){"complete"!=this.readyState&&"loaded"!=this.readyState||(this.onreadystatechange=null,t(null,e))}}e.exports=function(e,t,r){var s=document.head||document.getElementsByTagName("head")[0],a=document.createElement("script");"function"==typeof t&&(r=t,t={}),t=t||{},r=r||function(){},a.type=t.type||"text/javascript",a.charset=t.charset||"utf8",a.async=!("async"in t)||!!t.async,a.src=e,t.attrs&&function(e,t){for(var n in t)e.setAttribute(n,t[n])}(a,t.attrs),t.text&&(a.text=""+t.text),("onload"in a?n:o)(a,r),a.onload||n(a,r),s.appendChild(a)}},333:function(e,t,n){"use strict";var o={name:"Figure",props:{src:{type:String,required:!0},zoom:{type:Boolean,default:!0},alt:{type:String,default:""},scale:{type:Number,default:1}},computed:{source(){return this.src.startsWith("/")?this.$withBase(this.src):this.src}}},r=(n(316),n(2)),s=Object(r.a)(o,(function(){var e=this._self._c;return e("div",{staticClass:"container",class:{"no-zoom":!this.zoom}},[e("img",{style:{transform:`scale(${this.scale})`},attrs:{src:this.source,alt:this.alt}})])}),[],!1,null,"3d11415a",null);t.a=s.exports},364:function(e,t,n){},384:function(e,t,n){"use strict";var o=n(333),r=n(15),s=n(317),a=n.n(s),i={name:"Video",props:{code:{type:String,required:!0},nocookie:{type:Boolean,default:!1},stop:{type:Boolean,default:!1},active:{type:Boolean,default:!0}},data:()=>({player:null,ready:!1}),computed:{id(){return"youtube-player-"+this.code}},methods:{onSlideChangeTransitionStart(){this.player&&this.ready&&(this.stop?this.player.stopVideo():this.player.pauseVideo())}},mounted(){this.player||(this.player=a()(this.id,{wmode:"transparent",host:"https://www.youtube-nocookie.com",videoId:this.code,playerVars:{wmode:"transparent",showinfo:0,autohide:1,color:"white",origin:window?window.location.origin:this.$themeConfig.host}}),this.player.on("ready",e=>{this.ready=!0}),r.a.$on("slide-change-transition-start",this.onSlideChangeTransitionStart))},beforeDestroy(){r.a.$off("slide-change-transition-start",this.onSlideChangeTransitionStart)}},u=(n(881),n(2)),c=Object(u.a)(i,(function(){var e=this._self._c;return e("div",{directives:[{name:"show",rawName:"v-show",value:this.active,expression:"active"}]},[e("div",{staticClass:"player",staticStyle:{width:"100%",height:"100%"},attrs:{id:this.id}})])}),[],!1,null,"19b6035f",null).exports,l={name:"Media",components:{Figure:o.a,Video:c},props:{content:{type:String,default:null},active:{type:Boolean,default:!1},stop:{type:Boolean,default:!1},zoom:{type:Boolean,default:!0}},computed:{isYoutube(){const e=[/https:\/\/.*youtube\.com.*v=(.*?)(&.*)?$/,/https?:\/\/.*youtu\.be\/(.*?)(\?.*)?$/].find(e=>e.exec(this.content));return!(!this.content||!e)&&this.content.replace(e,(e,t)=>t)}}},d=Object(u.a)(l,(function(){var e=this._self._c;return e("div",{staticClass:"media"},[this.content&&!this.isYoutube?e("Figure",{attrs:{src:this.content,zoom:this.zoom}}):this.isYoutube?e("Video",{attrs:{code:this.isYoutube,stop:this.stop,active:this.active,nocookie:""}}):e("div",{staticClass:"media-default"})],1)}),[],!1,null,"077ae56c",null);t.a=d.exports},881:function(e,t,n){"use strict";n(364)}}]); \ No newline at end of file +*/o=function(){var e={},t={};return e.on=function(e,n){var o={name:e,handler:n};return t[e]=t[e]||[],t[e].unshift(o),o},e.off=function(e){var n=t[e.name].indexOf(e);-1!==n&&t[e.name].splice(n,1)},e.trigger=function(e,n){var o,r=t[e];if(r)for(o=r.length;o--;)r[o].handler(n)},e},e.exports=o},319:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(n(320)),r=i(n(323)),s=i(n(325)),a=i(n(326));function i(e){return e&&e.__esModule?e:{default:e}}const u=(0,o.default)("youtube-player"),c={proxyEvents:e=>{const t={};for(const n of s.default){const o="on"+n.slice(0,1).toUpperCase()+n.slice(1);t[o]=t=>{u('event "%s"',o,t),e.trigger(n,t)}}return t},promisifyPlayer:(e,t=!1)=>{const n={};for(const o of a.default)t&&r.default[o]?n[o]=(...t)=>e.then(e=>{const n=r.default[o],s=e.getPlayerState(),a=e[o].apply(e,t);return n.stateChangeRequired||Array.isArray(n.acceptableStates)&&!n.acceptableStates.includes(s)?new Promise(t=>{const o=()=>{const r=e.getPlayerState();let s;"number"==typeof n.timeout&&(s=setTimeout(()=>{e.removeEventListener("onStateChange",o),t()},n.timeout)),Array.isArray(n.acceptableStates)&&n.acceptableStates.includes(r)&&(e.removeEventListener("onStateChange",o),clearTimeout(s),t())};e.addEventListener("onStateChange",o)}).then(()=>a):a}):n[o]=(...t)=>e.then(e=>e[o].apply(e,t));return n}};t.default=c,e.exports=t.default},320:function(e,t,n){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let o=0,r=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(o++,"%c"===e&&(r=o))}),t.splice(r,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(321)(t);const{formatters:o}=e.exports;o.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},321:function(e,t,n){e.exports=function(e){function t(e){let n,r,s,a=null;function i(...e){if(!i.enabled)return;const o=i,r=Number(new Date),s=r-(n||r);o.diff=s,o.prev=n,o.curr=r,n=r,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let a=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(n,r)=>{if("%%"===n)return"%";a++;const s=t.formatters[r];if("function"==typeof s){const t=e[a];n=s.call(o,t),e.splice(a,1),a--}return n}),t.formatArgs.call(o,e);(o.log||t.log).apply(o,e)}return i.namespace=e,i.useColors=t.useColors(),i.color=t.selectColor(e),i.extend=o,i.destroy=t.destroy,Object.defineProperty(i,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==a?a:(r!==t.namespaces&&(r=t.namespaces,s=t.enabled(e)),s),set:e=>{a=e}}),"function"==typeof t.init&&t.init(i),i}function o(e,n){const o=t(this.namespace+(void 0===n?":":n)+e);return o.log=this.log,o}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const o=("string"==typeof e?e:"").split(/[\s,]+/),r=o.length;for(n=0;n{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var a=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"days":case"day":case"d":return a*s;case"hours":case"hour":case"hrs":case"hr":case"h":return a*r;case"minutes":case"minute":case"mins":case"min":case"m":return a*o;case"seconds":case"second":case"secs":case"sec":case"s":return a*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}(e);if("number"===u&&!1===isNaN(e))return t.long?a(i=e,s,"day")||a(i,r,"hour")||a(i,o,"minute")||a(i,n,"second")||i+" ms":function(e){if(e>=s)return Math.round(e/s)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=o)return Math.round(e/o)+"m";if(e>=n)return Math.round(e/n)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},323:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,r=n(324),s=(o=r)&&o.__esModule?o:{default:o};t.default={pauseVideo:{acceptableStates:[s.default.ENDED,s.default.PAUSED],stateChangeRequired:!1},playVideo:{acceptableStates:[s.default.ENDED,s.default.PLAYING],stateChangeRequired:!1},seekTo:{acceptableStates:[s.default.ENDED,s.default.PLAYING,s.default.PAUSED],stateChangeRequired:!0,timeout:3e3}},e.exports=t.default},324:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={BUFFERING:3,ENDED:0,PAUSED:2,PLAYING:1,UNSTARTED:-1,VIDEO_CUED:5},e.exports=t.default},325:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=["ready","stateChange","playbackQualityChange","playbackRateChange","error","apiChange","volumeChange"],e.exports=t.default},326:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=["cueVideoById","loadVideoById","cueVideoByUrl","loadVideoByUrl","playVideo","pauseVideo","stopVideo","getVideoLoadedFraction","cuePlaylist","loadPlaylist","nextVideo","previousVideo","playVideoAt","setShuffle","setLoop","getPlaylist","getPlaylistIndex","setOption","mute","unMute","isMuted","setVolume","getVolume","seekTo","getPlayerState","getPlaybackRate","setPlaybackRate","getAvailablePlaybackRates","getPlaybackQuality","setPlaybackQuality","getAvailableQualityLevels","getCurrentTime","getDuration","removeEventListener","getVideoUrl","getVideoEmbedCode","getOptions","getOption","addEventListener","destroy","setSize","getIframe","getSphericalProperties","setSphericalProperties"],e.exports=t.default},327:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,r=n(328),s=(o=r)&&o.__esModule?o:{default:o};t.default=e=>new Promise(t=>{if(window.YT&&window.YT.Player&&window.YT.Player instanceof Function)return void t(window.YT);{const t="http:"===window.location.protocol?"http:":"https:";(0,s.default)(t+"//www.youtube.com/iframe_api",t=>{t&&e.trigger("error",t)})}const n=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{n&&n(),t(window.YT)}}),e.exports=t.default},328:function(e,t){function n(e,t){e.onload=function(){this.onerror=this.onload=null,t(null,e)},e.onerror=function(){this.onerror=this.onload=null,t(new Error("Failed to load "+this.src),e)}}function o(e,t){e.onreadystatechange=function(){"complete"!=this.readyState&&"loaded"!=this.readyState||(this.onreadystatechange=null,t(null,e))}}e.exports=function(e,t,r){var s=document.head||document.getElementsByTagName("head")[0],a=document.createElement("script");"function"==typeof t&&(r=t,t={}),t=t||{},r=r||function(){},a.type=t.type||"text/javascript",a.charset=t.charset||"utf8",a.async=!("async"in t)||!!t.async,a.src=e,t.attrs&&function(e,t){for(var n in t)e.setAttribute(n,t[n])}(a,t.attrs),t.text&&(a.text=""+t.text),("onload"in a?n:o)(a,r),a.onload||n(a,r),s.appendChild(a)}},333:function(e,t,n){"use strict";var o={name:"Figure",props:{src:{type:String,required:!0},zoom:{type:Boolean,default:!0},alt:{type:String,default:""},scale:{type:Number,default:1}},computed:{source(){return this.src.startsWith("/")?this.$withBase(this.src):this.src}}},r=(n(316),n(2)),s=Object(r.a)(o,(function(){var e=this._self._c;return e("div",{staticClass:"container",class:{"no-zoom":!this.zoom}},[e("img",{style:{transform:`scale(${this.scale})`},attrs:{src:this.source,alt:this.alt}})])}),[],!1,null,"3d11415a",null);t.a=s.exports},364:function(e,t,n){},384:function(e,t,n){"use strict";var o=n(333),r=n(15),s=n(317),a=n.n(s),i={name:"Video",props:{code:{type:String,required:!0},nocookie:{type:Boolean,default:!1},stop:{type:Boolean,default:!1},active:{type:Boolean,default:!0}},data:()=>({player:null,ready:!1}),computed:{id(){return"youtube-player-"+this.code}},methods:{onSlideChangeTransitionStart(){this.player&&this.ready&&(this.stop?this.player.stopVideo():this.player.pauseVideo())}},mounted(){this.player||(this.player=a()(this.id,{wmode:"transparent",host:"https://www.youtube-nocookie.com",videoId:this.code,playerVars:{wmode:"transparent",showinfo:0,autohide:1,color:"white",origin:window?window.location.origin:this.$themeConfig.host}}),this.player.on("ready",e=>{this.ready=!0}),r.a.$on("slide-change-transition-start",this.onSlideChangeTransitionStart))},beforeDestroy(){r.a.$off("slide-change-transition-start",this.onSlideChangeTransitionStart)}},u=(n(884),n(2)),c=Object(u.a)(i,(function(){var e=this._self._c;return e("div",{directives:[{name:"show",rawName:"v-show",value:this.active,expression:"active"}]},[e("div",{staticClass:"player",staticStyle:{width:"100%",height:"100%"},attrs:{id:this.id}})])}),[],!1,null,"19b6035f",null).exports,l={name:"Media",components:{Figure:o.a,Video:c},props:{content:{type:String,default:null},active:{type:Boolean,default:!1},stop:{type:Boolean,default:!1},zoom:{type:Boolean,default:!0}},computed:{isYoutube(){const e=[/https:\/\/.*youtube\.com.*v=(.*?)(&.*)?$/,/https?:\/\/.*youtu\.be\/(.*?)(\?.*)?$/].find(e=>e.exec(this.content));return!(!this.content||!e)&&this.content.replace(e,(e,t)=>t)}}},d=Object(u.a)(l,(function(){var e=this._self._c;return e("div",{staticClass:"media"},[this.content&&!this.isYoutube?e("Figure",{attrs:{src:this.content,zoom:this.zoom}}):this.isYoutube?e("Video",{attrs:{code:this.isYoutube,stop:this.stop,active:this.active,nocookie:""}}):e("div",{staticClass:"media-default"})],1)}),[],!1,null,"077ae56c",null);t.a=d.exports},884:function(e,t,n){"use strict";n(364)}}]); \ No newline at end of file diff --git a/assets/js/20.08cf7673.js b/assets/js/20.08cf7673.js deleted file mode 100644 index f6301b8e46..0000000000 --- a/assets/js/20.08cf7673.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{443:function(e,t,i){e.exports=i.p+"assets/img/github-edit.407e1611.png"},444:function(e,t,i){e.exports=i.p+"assets/img/github-edit-preview.73262122.png"},445:function(e,t,i){e.exports=i.p+"assets/img/github-edit-commit-explanation.71943c6f.png"},446:function(e,t,i){e.exports=i.p+"assets/img/github-edit-upload.4d561aef.png"},447:function(e,t,i){e.exports=i.p+"assets/img/github-upload-location.98927c88.png"},448:function(e,t,i){e.exports=i.p+"assets/img/github-upload.56f5573f.png"},449:function(e,t,i){e.exports=i.p+"assets/img/github-dev-preview.1b4ac609.png"},999:function(e,t,i){"use strict";i.r(t);var s=i(2),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"website-editor-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#website-editor-guide"}},[e._v("#")]),e._v(" Website Editor Guide")]),e._v(" "),t("p",[e._v("This guide describes how to edit or update content of the website "),t("a",{attrs:{href:"https://www.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.asterics.eu"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("Editors can improve, correct and adapt the contents of this website in two ways:")]),e._v(" "),t("ul",[t("li",[e._v("online, or")]),e._v(" "),t("li",[e._v("offline")])]),e._v(" "),t("h2",{attrs:{id:"online"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#online"}},[e._v("#")]),e._v(" Online")]),e._v(" "),t("p",[e._v("You can edit the contents of this website online, or "),t("em",[e._v("remotely")]),e._v(", via GitHub.")]),e._v(" "),t("p",[e._v("The easiest way to locate the files in their source repository, is by clicking the link "),t("code",[e._v("Edit this page on GitHub")]),e._v(" provided within every page of this website.\nAfter clicking the link, a website at GitHub is opened, displaying the relevant file and allowing to perform the required changes and committing immediately.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(443),alt:"GitHub Editing",title:"GitHub Editing"}})]),e._v(" "),t("p",[e._v("Testing the changes is not possible when editing the files remotely, but GitHub provides a simple preview function, which understands basic markdown syntax.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(444),alt:"GitHub Editing - Preview",title:"GitHub Editing - Preview"}})]),e._v(" "),t("p",[e._v("Note, however, that GitHub supports only a "),t("strong",[e._v("subset")]),e._v(" of the markdown features described in the "),t("RouterLink",{attrs:{to:"/guide/markdown.html"}},[e._v("markdown guide")]),e._v(" of this website.\nThe preview does not show the same "),t("em",[e._v("style")]),e._v(" of the page as shown on "),t("a",{attrs:{href:"https://www.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.asterics.eu"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("After you finish editing a file, you can commit your changes to the repository.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(445),alt:"Github Editing - Commit",title:"GitHub Editing - Commit"}})]),e._v(" "),t("p",[e._v("At the bottom of the page you will find the "),t("strong",[e._v("Commit changes")]),e._v(" section.\nPerform the following steps to save your changes.")]),e._v(" "),t("ol",[t("li",[e._v("Enter your commit message")]),e._v(" "),t("li",[e._v("Optionally, provide a detailed description of the current changes")]),e._v(" "),t("li",[e._v("Define a GitHub profile as the author of the commit")]),e._v(" "),t("li",[e._v("Create a "),t("em",[e._v("new branch")]),e._v(" , if you don’t have write access to the repository, and start a pull request")]),e._v(" "),t("li",[e._v("Propose the changes to the owners of the repository")])]),e._v(" "),t("h3",{attrs:{id:"uploading-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#uploading-files"}},[e._v("#")]),e._v(" Uploading Files")]),e._v(" "),t("p",[e._v("GitHub allows you to upload files and pictures, by "),t("em",[e._v("dragging & dropping")]),e._v(", "),t("em",[e._v("selecting")]),e._v(", and "),t("em",[e._v("pasting")]),e._v(" them.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(446),alt:"GitHub Editing - Uploading Files",title:"GitHub Editing - Uploading Files"}})]),e._v(" "),t("p",[e._v("The above screenshots shows GitHub’s behavior when adding files ("),t("code",[e._v("editor.md")]),e._v(") and pictures ("),t("code",[e._v("github-edit.png")]),e._v(").\nFiles are stored in the respective repository directly.\nHowever, pictures are stored in user specific locations.\nYou can keep (and reuse) this link, without the need to add the picture to the source repository.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Hint")]),e._v(" "),t("p",[e._v("Pictures uploaded to "),t("code",[e._v("githubusercontent.com")]),e._v(" are added, by the developers of this website, to the source repository at a later point, when merging the changes to the main branch.")])]),e._v(" "),t("p",[e._v("Note, that you "),t("strong",[e._v("can’t")]),e._v(" determine their path or location using this view.")]),e._v(" "),t("p",[e._v("Alternatively, you can open the folder in a repository via GitHub, like in the following screenshot, by clicking the directory.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(447),alt:"GitHub Editing - Upload Location",title:"GitHub Editing - Upload Location"}})]),e._v(" "),t("p",[e._v("Afterwards you can create new files or upload multiple files in the opened directory and thereby define the path or location of the uploaded files in the repository.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(448),alt:"GitHub Editing - Uploading Files",title:"GitHub Editing - Uploading Files"}})]),e._v(" "),t("h3",{attrs:{id:"web-based-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#web-based-editor"}},[e._v("#")]),e._v(" Web-based editor")]),e._v(" "),t("p",[e._v("GitHub provides a "),t("a",{attrs:{href:"https://docs.github.com/en/codespaces/developing-in-codespaces/web-based-editor",target:"_blank",rel:"noopener noreferrer"}},[e._v("web-based editor"),t("OutboundLink")],1),e._v(" that allows editing files remotely, but with a similar experience to working locally.")]),e._v(" "),t("p",[e._v("To edit the files of a GitHub repository online, you can press "),t("code",[e._v(".")]),e._v(" on the main page of the repository.\nGitHub displays the files inside the "),t("em",[e._v("web-based editor")]),e._v(", allowing you to edit several files at once, remotely.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(449),alt:"GitHub Web-based Editor",title:"GitHub Web-based Editor"}})]),e._v(" "),t("h2",{attrs:{id:"offline"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#offline"}},[e._v("#")]),e._v(" Offline")]),e._v(" "),t("p",[e._v("To edit the contents of this website offline, or "),t("em",[e._v("locally")]),e._v(", you need to download the "),t("a",{attrs:{href:"https://github.com/asterics/asterics-docs.git",target:"_blank",rel:"noopener noreferrer"}},[e._v("source repository"),t("OutboundLink")],1),e._v(".\nAll required steps are described in the "),t("RouterLink",{attrs:{to:"/guide/docs.html"}},[e._v("developer guide")]),e._v(".")],1),e._v(" "),t("p",[e._v("After cloning the source repository and installing all required tools, run following commands.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" docs init "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Initialize git submodules")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" docs setup "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Create folder docs/ containing all files")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" dev "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Build website and host files with the development server")]),e._v("\n")])])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Detailed Instructions")]),e._v(" "),t("p",[e._v("For details, please refer to the "),t("RouterLink",{attrs:{to:"/guide/docs.html"}},[e._v("developer guide")]),e._v(".")],1)]),e._v(" "),t("p",[e._v("With the last command, a development server is started hosting the files locally.\nYou should see a similar output:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("success "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("13")]),e._v(":13:42"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" Build 6b0cef finished "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("in")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("400")]),e._v(" ms"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("!")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v(" http://localhost:8080/ "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Afterwards you need to perform the desired changes within the files inside "),t("code",[e._v("docs/")]),e._v(".\nWhen saving changes inside those files, a new build is triggered and the content displayed in the browser is updated, automatically.")]),e._v(" "),t("p",[e._v("After finishing editing the files, you need to create a pull request or commit and push your changes to the source repository. Please check the "),t("RouterLink",{attrs:{to:"/guide/docs.html"}},[e._v("developer guide")]),e._v(" for this purpose.")],1),e._v(" "),t("h2",{attrs:{id:"publishing-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#publishing-updates"}},[e._v("#")]),e._v(" Publishing Updates")]),e._v(" "),t("p",[e._v("You can’t publish new builds of the website by yourself.\nThe developers of this website integrate incoming pull request regularly.\nAfter adding the pull request, the website is built and published with the most recent content.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/20.2ef1662c.js b/assets/js/20.2ef1662c.js new file mode 100644 index 0000000000..0228253b94 --- /dev/null +++ b/assets/js/20.2ef1662c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{1002:function(e,t,i){"use strict";i.r(t);var s=i(2),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"website-editor-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#website-editor-guide"}},[e._v("#")]),e._v(" Website Editor Guide")]),e._v(" "),t("p",[e._v("This guide describes how to edit or update content of the website "),t("a",{attrs:{href:"https://www.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.asterics.eu"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("Editors can improve, correct and adapt the contents of this website in two ways:")]),e._v(" "),t("ul",[t("li",[e._v("online, or")]),e._v(" "),t("li",[e._v("offline")])]),e._v(" "),t("h2",{attrs:{id:"online"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#online"}},[e._v("#")]),e._v(" Online")]),e._v(" "),t("p",[e._v("You can edit the contents of this website online, or "),t("em",[e._v("remotely")]),e._v(", via GitHub.")]),e._v(" "),t("p",[e._v("The easiest way to locate the files in their source repository, is by clicking the link "),t("code",[e._v("Edit this page on GitHub")]),e._v(" provided within every page of this website.\nAfter clicking the link, a website at GitHub is opened, displaying the relevant file and allowing to perform the required changes and committing immediately.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(443),alt:"GitHub Editing",title:"GitHub Editing"}})]),e._v(" "),t("p",[e._v("Testing the changes is not possible when editing the files remotely, but GitHub provides a simple preview function, which understands basic markdown syntax.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(444),alt:"GitHub Editing - Preview",title:"GitHub Editing - Preview"}})]),e._v(" "),t("p",[e._v("Note, however, that GitHub supports only a "),t("strong",[e._v("subset")]),e._v(" of the markdown features described in the "),t("RouterLink",{attrs:{to:"/guide/markdown.html"}},[e._v("markdown guide")]),e._v(" of this website.\nThe preview does not show the same "),t("em",[e._v("style")]),e._v(" of the page as shown on "),t("a",{attrs:{href:"https://www.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.asterics.eu"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("After you finish editing a file, you can commit your changes to the repository.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(445),alt:"Github Editing - Commit",title:"GitHub Editing - Commit"}})]),e._v(" "),t("p",[e._v("At the bottom of the page you will find the "),t("strong",[e._v("Commit changes")]),e._v(" section.\nPerform the following steps to save your changes.")]),e._v(" "),t("ol",[t("li",[e._v("Enter your commit message")]),e._v(" "),t("li",[e._v("Optionally, provide a detailed description of the current changes")]),e._v(" "),t("li",[e._v("Define a GitHub profile as the author of the commit")]),e._v(" "),t("li",[e._v("Create a "),t("em",[e._v("new branch")]),e._v(" , if you don’t have write access to the repository, and start a pull request")]),e._v(" "),t("li",[e._v("Propose the changes to the owners of the repository")])]),e._v(" "),t("h3",{attrs:{id:"uploading-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#uploading-files"}},[e._v("#")]),e._v(" Uploading Files")]),e._v(" "),t("p",[e._v("GitHub allows you to upload files and pictures, by "),t("em",[e._v("dragging & dropping")]),e._v(", "),t("em",[e._v("selecting")]),e._v(", and "),t("em",[e._v("pasting")]),e._v(" them.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(446),alt:"GitHub Editing - Uploading Files",title:"GitHub Editing - Uploading Files"}})]),e._v(" "),t("p",[e._v("The above screenshots shows GitHub’s behavior when adding files ("),t("code",[e._v("editor.md")]),e._v(") and pictures ("),t("code",[e._v("github-edit.png")]),e._v(").\nFiles are stored in the respective repository directly.\nHowever, pictures are stored in user specific locations.\nYou can keep (and reuse) this link, without the need to add the picture to the source repository.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Hint")]),e._v(" "),t("p",[e._v("Pictures uploaded to "),t("code",[e._v("githubusercontent.com")]),e._v(" are added, by the developers of this website, to the source repository at a later point, when merging the changes to the main branch.")])]),e._v(" "),t("p",[e._v("Note, that you "),t("strong",[e._v("can’t")]),e._v(" determine their path or location using this view.")]),e._v(" "),t("p",[e._v("Alternatively, you can open the folder in a repository via GitHub, like in the following screenshot, by clicking the directory.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(447),alt:"GitHub Editing - Upload Location",title:"GitHub Editing - Upload Location"}})]),e._v(" "),t("p",[e._v("Afterwards you can create new files or upload multiple files in the opened directory and thereby define the path or location of the uploaded files in the repository.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(448),alt:"GitHub Editing - Uploading Files",title:"GitHub Editing - Uploading Files"}})]),e._v(" "),t("h3",{attrs:{id:"web-based-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#web-based-editor"}},[e._v("#")]),e._v(" Web-based editor")]),e._v(" "),t("p",[e._v("GitHub provides a "),t("a",{attrs:{href:"https://docs.github.com/en/codespaces/developing-in-codespaces/web-based-editor",target:"_blank",rel:"noopener noreferrer"}},[e._v("web-based editor"),t("OutboundLink")],1),e._v(" that allows editing files remotely, but with a similar experience to working locally.")]),e._v(" "),t("p",[e._v("To edit the files of a GitHub repository online, you can press "),t("code",[e._v(".")]),e._v(" on the main page of the repository.\nGitHub displays the files inside the "),t("em",[e._v("web-based editor")]),e._v(", allowing you to edit several files at once, remotely.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(449),alt:"GitHub Web-based Editor",title:"GitHub Web-based Editor"}})]),e._v(" "),t("h2",{attrs:{id:"offline"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#offline"}},[e._v("#")]),e._v(" Offline")]),e._v(" "),t("p",[e._v("To edit the contents of this website offline, or "),t("em",[e._v("locally")]),e._v(", you need to download the "),t("a",{attrs:{href:"https://github.com/asterics/asterics-docs.git",target:"_blank",rel:"noopener noreferrer"}},[e._v("source repository"),t("OutboundLink")],1),e._v(".\nAll required steps are described in the "),t("RouterLink",{attrs:{to:"/guide/docs.html"}},[e._v("developer guide")]),e._v(".")],1),e._v(" "),t("p",[e._v("After cloning the source repository and installing all required tools, run following commands.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" docs init "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Initialize git submodules")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" docs setup "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Create folder docs/ containing all files")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" dev "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Build website and host files with the development server")]),e._v("\n")])])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Detailed Instructions")]),e._v(" "),t("p",[e._v("For details, please refer to the "),t("RouterLink",{attrs:{to:"/guide/docs.html"}},[e._v("developer guide")]),e._v(".")],1)]),e._v(" "),t("p",[e._v("With the last command, a development server is started hosting the files locally.\nYou should see a similar output:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("success "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("13")]),e._v(":13:42"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" Build 6b0cef finished "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("in")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("400")]),e._v(" ms"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("!")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v(" http://localhost:8080/ "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Afterwards you need to perform the desired changes within the files inside "),t("code",[e._v("docs/")]),e._v(".\nWhen saving changes inside those files, a new build is triggered and the content displayed in the browser is updated, automatically.")]),e._v(" "),t("p",[e._v("After finishing editing the files, you need to create a pull request or commit and push your changes to the source repository. Please check the "),t("RouterLink",{attrs:{to:"/guide/docs.html"}},[e._v("developer guide")]),e._v(" for this purpose.")],1),e._v(" "),t("h2",{attrs:{id:"publishing-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#publishing-updates"}},[e._v("#")]),e._v(" Publishing Updates")]),e._v(" "),t("p",[e._v("You can’t publish new builds of the website by yourself.\nThe developers of this website integrate incoming pull request regularly.\nAfter adding the pull request, the website is built and published with the most recent content.")])])}),[],!1,null,null,null);t.default=o.exports},443:function(e,t,i){e.exports=i.p+"assets/img/github-edit.407e1611.png"},444:function(e,t,i){e.exports=i.p+"assets/img/github-edit-preview.73262122.png"},445:function(e,t,i){e.exports=i.p+"assets/img/github-edit-commit-explanation.71943c6f.png"},446:function(e,t,i){e.exports=i.p+"assets/img/github-edit-upload.4d561aef.png"},447:function(e,t,i){e.exports=i.p+"assets/img/github-upload-location.98927c88.png"},448:function(e,t,i){e.exports=i.p+"assets/img/github-upload.56f5573f.png"},449:function(e,t,i){e.exports=i.p+"assets/img/github-dev-preview.1b4ac609.png"}}]); \ No newline at end of file diff --git a/assets/js/199.794f1ba4.js b/assets/js/200.de4bc077.js similarity index 89% rename from assets/js/199.794f1ba4.js rename to assets/js/200.de4bc077.js index 8b57eb20f7..e1cbed2a4d 100644 --- a/assets/js/199.794f1ba4.js +++ b/assets/js/200.de4bc077.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[199],{1149:function(t,e,r){"use strict";r.r(e);var n=r(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This plugin passes received events after a defined delay.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(715),alt:"Screenshot: EventDelay plugin",title:"Screenshot: EventDelay plugin"}})]),t._v(" "),e("p",[t._v("EventDelay plugin")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input:")]),t._v(" Input port for the events.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v(":")]),t._v(" Output port for events.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" Delay between input and output event (in milliseconds).")])])])}),[],!1,null,null,null);e.default=s.exports},715:function(t,e,r){t.exports=r.p+"assets/img/eventdelay.6862b2c8.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[200],{1155:function(t,e,r){"use strict";r.r(e);var n=r(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This plugin passes received events after a defined delay.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(719),alt:"Screenshot: EventDelay plugin",title:"Screenshot: EventDelay plugin"}})]),t._v(" "),e("p",[t._v("EventDelay plugin")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input:")]),t._v(" Input port for the events.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v(":")]),t._v(" Output port for events.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" Delay between input and output event (in milliseconds).")])])])}),[],!1,null,null,null);e.default=s.exports},719:function(t,e,r){t.exports=r.p+"assets/img/eventdelay.6862b2c8.jpg"}}]); \ No newline at end of file diff --git a/assets/js/200.46413237.js b/assets/js/201.18a3636b.js similarity index 90% rename from assets/js/200.46413237.js rename to assets/js/201.18a3636b.js index c91f8e180a..02ab2d95b9 100644 --- a/assets/js/200.46413237.js +++ b/assets/js/201.18a3636b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[200],{1153:function(t,e,n){"use strict";n.r(e);var r=n(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component translates incoming strings to events. Ten string slots for commands and ten associated Event Trigger Ports are available. This component can be useful to generate an event from a string command (which is generated by OSKA or another string-sending component).")]),t._v(" "),e("p",[e("img",{attrs:{src:n(719),alt:"Screenshot: EventDispatcher plugin",title:"Screenshot: EventDispatcher plugin"}})]),t._v(" "),e("p",[t._v("EventDispatcher plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("cmd [string]:")]),t._v(" The incoming command string.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("recognizedCommand1 - recognizedCommand10:")]),t._v(" the events triggered by the recognized commands")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("command1 - command10 [string]:")]),t._v(" Ten string slots for commands. If an incoming string matches one of these property values, the associated event trigger is raised.")])])])}),[],!1,null,null,null);e.default=s.exports},719:function(t,e,n){t.exports=n.p+"assets/img/eventdispatcher.4aaea330.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[201],{1158:function(t,e,n){"use strict";n.r(e);var r=n(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component translates incoming strings to events. Ten string slots for commands and ten associated Event Trigger Ports are available. This component can be useful to generate an event from a string command (which is generated by OSKA or another string-sending component).")]),t._v(" "),e("p",[e("img",{attrs:{src:n(722),alt:"Screenshot: EventDispatcher plugin",title:"Screenshot: EventDispatcher plugin"}})]),t._v(" "),e("p",[t._v("EventDispatcher plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("cmd [string]:")]),t._v(" The incoming command string.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("recognizedCommand1 - recognizedCommand10:")]),t._v(" the events triggered by the recognized commands")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("command1 - command10 [string]:")]),t._v(" Ten string slots for commands. If an incoming string matches one of these property values, the associated event trigger is raised.")])])])}),[],!1,null,null,null);e.default=s.exports},722:function(t,e,n){t.exports=n.p+"assets/img/eventdispatcher.4aaea330.jpg"}}]); \ No newline at end of file diff --git a/assets/js/201.9a8c64ae.js b/assets/js/202.d1e430b3.js similarity index 92% rename from assets/js/201.9a8c64ae.js rename to assets/js/202.d1e430b3.js index ed8d1d86ab..9d5413fb94 100644 --- a/assets/js/201.9a8c64ae.js +++ b/assets/js/202.d1e430b3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[201],{1151:function(t,e,n){"use strict";n.r(e);var s=n(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component stores the state, driven by an event. When the event-in event is received and the internal status is 1, event-out1 is fired and the internal status set to 2. When the event-in event is received and the internal status is 2, event-out2 is fired and the internal status set to 1.")]),t._v(" "),e("p",[e("img",{attrs:{src:n(717),alt:"Screenshot: Event Flip Flop plugin",title:"Screenshot: Event Flip Flop plugin"}})]),t._v(" "),e("p",[t._v("Event Flip Flop plugin")]),t._v(" "),e("h2",{attrs:{id:"event-listener-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-ports"}},[t._v("#")]),t._v(" Event Listener Ports")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("event-in:")]),t._v(" Event input to change the state of the flip-flop and fire an out-event.")]),t._v(" "),e("li",[e("strong",[t._v("selectOut1:")]),t._v(" selects state 1 (event-out1 trigger port will send the next incoming event)")]),t._v(" "),e("li",[e("strong",[t._v("selectOut2:")]),t._v(" selects state 2 (event-out2 trigger port will send the next incoming event)")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("event-out1:")]),t._v(" Event fired, if event-in received and stored state is 1.")]),t._v(" "),e("li",[e("strong",[t._v("event-out2:")]),t._v(" Event fired, if event-in received and stored state is 2.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("p",[t._v("No Properties.")])])}),[],!1,null,null,null);e.default=r.exports},717:function(t,e,n){t.exports=n.p+"assets/img/eventflipflop.4be67c4a.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[202],{1159:function(t,e,n){"use strict";n.r(e);var s=n(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component stores the state, driven by an event. When the event-in event is received and the internal status is 1, event-out1 is fired and the internal status set to 2. When the event-in event is received and the internal status is 2, event-out2 is fired and the internal status set to 1.")]),t._v(" "),e("p",[e("img",{attrs:{src:n(723),alt:"Screenshot: Event Flip Flop plugin",title:"Screenshot: Event Flip Flop plugin"}})]),t._v(" "),e("p",[t._v("Event Flip Flop plugin")]),t._v(" "),e("h2",{attrs:{id:"event-listener-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-ports"}},[t._v("#")]),t._v(" Event Listener Ports")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("event-in:")]),t._v(" Event input to change the state of the flip-flop and fire an out-event.")]),t._v(" "),e("li",[e("strong",[t._v("selectOut1:")]),t._v(" selects state 1 (event-out1 trigger port will send the next incoming event)")]),t._v(" "),e("li",[e("strong",[t._v("selectOut2:")]),t._v(" selects state 2 (event-out2 trigger port will send the next incoming event)")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("event-out1:")]),t._v(" Event fired, if event-in received and stored state is 1.")]),t._v(" "),e("li",[e("strong",[t._v("event-out2:")]),t._v(" Event fired, if event-in received and stored state is 2.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("p",[t._v("No Properties.")])])}),[],!1,null,null,null);e.default=r.exports},723:function(t,e,n){t.exports=n.p+"assets/img/eventflipflop.4be67c4a.png"}}]); \ No newline at end of file diff --git a/assets/js/202.e42ea0ed.js b/assets/js/203.7906aaa0.js similarity index 94% rename from assets/js/202.e42ea0ed.js rename to assets/js/203.7906aaa0.js index 29bacf98ce..0f1c4ed137 100644 --- a/assets/js/202.e42ea0ed.js +++ b/assets/js/203.7906aaa0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[202],{1152:function(e,t,r){"use strict";r.r(t);var n=r(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"eventrouter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventrouter"}},[e._v("#")]),e._v(" EventRouter")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component allows routing up to 6 incoming events to one of 8 corresponding output (trigger) event ports.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(718),alt:"Screenshot: EventRouter",title:"Screenshot: Event Router plugin"}})]),e._v(" "),t("p",[e._v("Event Router plugin")]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventIn1-6:")]),e._v(" The incoming events to be routed.")]),e._v(" "),t("li",[t("strong",[e._v("select1-select8:")]),e._v(" selects one of the 8 corresponding event routes (trigger output ports) events entering the eventIn ports")]),e._v(" "),t("li",[t("strong",[e._v("selectNext:")]),e._v(" selects the next event route")]),e._v(" "),t("li",[t("strong",[e._v("selectPrevious:")]),e._v(" selects the next event route")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut2_1-eventOut2_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn2 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut3_1-eventOut3_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn3 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut4_1-eventOut4_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn4 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut5_1-eventOut5_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn5 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut6_1-eventOut6_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn6 can be routed to.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activeRoutes (integer):")]),e._v(" number of active routes (relevant for the selectNext and selectPrevious functions and the wrapAround feature)")]),e._v(" "),t("li",[t("strong",[e._v("wrapAround (boolean):")]),e._v(" if selected selectNext srats again at the first route when the last active route was reached, and selectPrevious continues at the last active route when triggered at the first route.")])])])}),[],!1,null,null,null);t.default=s.exports},718:function(e,t,r){e.exports=r.p+"assets/img/eventrouter.a4b5b104.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[203],{1156:function(e,t,r){"use strict";r.r(t);var n=r(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"eventrouter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventrouter"}},[e._v("#")]),e._v(" EventRouter")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component allows routing up to 6 incoming events to one of 8 corresponding output (trigger) event ports.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(720),alt:"Screenshot: EventRouter",title:"Screenshot: Event Router plugin"}})]),e._v(" "),t("p",[e._v("Event Router plugin")]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventIn1-6:")]),e._v(" The incoming events to be routed.")]),e._v(" "),t("li",[t("strong",[e._v("select1-select8:")]),e._v(" selects one of the 8 corresponding event routes (trigger output ports) events entering the eventIn ports")]),e._v(" "),t("li",[t("strong",[e._v("selectNext:")]),e._v(" selects the next event route")]),e._v(" "),t("li",[t("strong",[e._v("selectPrevious:")]),e._v(" selects the next event route")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut2_1-eventOut2_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn2 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut3_1-eventOut3_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn3 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut4_1-eventOut4_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn4 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut5_1-eventOut5_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn5 can be routed to.")]),e._v(" "),t("li",[t("strong",[e._v("eventOut6_1-eventOut6_8:")]),e._v(" 8 event trigger ports where the events entering the listener port eventIn6 can be routed to.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activeRoutes (integer):")]),e._v(" number of active routes (relevant for the selectNext and selectPrevious functions and the wrapAround feature)")]),e._v(" "),t("li",[t("strong",[e._v("wrapAround (boolean):")]),e._v(" if selected selectNext srats again at the first route when the last active route was reached, and selectPrevious continues at the last active route when triggered at the first route.")])])])}),[],!1,null,null,null);t.default=s.exports},720:function(e,t,r){e.exports=r.p+"assets/img/eventrouter.a4b5b104.jpg"}}]); \ No newline at end of file diff --git a/assets/js/203.9c30d210.js b/assets/js/204.8c56bc53.js similarity index 94% rename from assets/js/203.9c30d210.js rename to assets/js/204.8c56bc53.js index 9fab6b09b9..4f8ae81ca2 100644 --- a/assets/js/203.9c30d210.js +++ b/assets/js/204.8c56bc53.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[203],{1154:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"eventstatemachine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventstatemachine"}},[e._v("#")]),e._v(" EventStateMachine")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component allows definition of a sequence of events (up to 9 different incoming events are supported). If the sequence appears at the event listener ports in the given order, an event is fired by the EventStateMachine plugin. Optionally, a timing can be specified for a valid event sequence.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(720),alt:"Screenshot: EventStateMachine",title:"Screenshot: Event State Machine plugin"}})]),e._v(" "),t("p",[e._v("Event State Machine plugin")]),e._v(" "),t("h2",{attrs:{id:"eventstatemachine-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventstatemachine-description"}},[e._v("#")]),e._v(" EventStateMachine Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1-in9:")]),e._v(" Incoming events")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" Resets the current state detection to the first element of the sequence")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("finalStateReached:")]),e._v(" fired if the last element of the sequence is reached.")]),e._v(" "),t("li",[t("strong",[e._v("stateError:")]),e._v(" fired if an incoming event does not fit the sequence.")]),e._v(" "),t("li",[t("strong",[e._v("stateChanged:")]),e._v(" fired if a new state of the sequence is reached.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("stateSequence [string]:")]),e._v(" A sequence of digits separated by commas, representing the order of incoming events, for example: “1,5,2,3,1”.")]),e._v(" "),t("li",[t("strong",[e._v("stateTiming [string]:")]),e._v(" An (optional) sequence of timings for the above events, specified in min/max milliseconds for a state transition. One timing information consists of a numeric value for the maximum time or two numeric values separated by a forward slash (/) for minimum and maximum time. For example the timing “1000/2000,500/1000,x,3000” defines that the transition from first to second state my take a minimum of 1000 milliseconds and a maximum of 3000 milliseconds; The transition to the next state may trake 500-1000 milliseconds, the next transition has no timing contraints, the next transition may take up to 3000 milliseconds. If this property is left empty, no timing constraints are active for the event state transitions.")]),e._v(" "),t("li",[t("strong",[e._v("resetOnIncorrectEvent [boolean]:")]),e._v(" if checked, an incoming event which does not fit the current element of the sequence will reset the state detection to the first element of the sequence.")])])])}),[],!1,null,null,null);t.default=s.exports},720:function(e,t,n){e.exports=n.p+"assets/img/eventstatemachine.5875716f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[204],{1157:function(e,t,n){"use strict";n.r(t);var i=n(2),s=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"eventstatemachine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventstatemachine"}},[e._v("#")]),e._v(" EventStateMachine")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component allows definition of a sequence of events (up to 9 different incoming events are supported). If the sequence appears at the event listener ports in the given order, an event is fired by the EventStateMachine plugin. Optionally, a timing can be specified for a valid event sequence.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(721),alt:"Screenshot: EventStateMachine",title:"Screenshot: Event State Machine plugin"}})]),e._v(" "),t("p",[e._v("Event State Machine plugin")]),e._v(" "),t("h2",{attrs:{id:"eventstatemachine-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eventstatemachine-description"}},[e._v("#")]),e._v(" EventStateMachine Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1-in9:")]),e._v(" Incoming events")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" Resets the current state detection to the first element of the sequence")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("finalStateReached:")]),e._v(" fired if the last element of the sequence is reached.")]),e._v(" "),t("li",[t("strong",[e._v("stateError:")]),e._v(" fired if an incoming event does not fit the sequence.")]),e._v(" "),t("li",[t("strong",[e._v("stateChanged:")]),e._v(" fired if a new state of the sequence is reached.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("stateSequence [string]:")]),e._v(" A sequence of digits separated by commas, representing the order of incoming events, for example: “1,5,2,3,1”.")]),e._v(" "),t("li",[t("strong",[e._v("stateTiming [string]:")]),e._v(" An (optional) sequence of timings for the above events, specified in min/max milliseconds for a state transition. One timing information consists of a numeric value for the maximum time or two numeric values separated by a forward slash (/) for minimum and maximum time. For example the timing “1000/2000,500/1000,x,3000” defines that the transition from first to second state my take a minimum of 1000 milliseconds and a maximum of 3000 milliseconds; The transition to the next state may trake 500-1000 milliseconds, the next transition has no timing contraints, the next transition may take up to 3000 milliseconds. If this property is left empty, no timing constraints are active for the event state transitions.")]),e._v(" "),t("li",[t("strong",[e._v("resetOnIncorrectEvent [boolean]:")]),e._v(" if checked, an incoming event which does not fit the current element of the sequence will reset the state detection to the first element of the sequence.")])])])}),[],!1,null,null,null);t.default=s.exports},721:function(e,t,n){e.exports=n.p+"assets/img/eventstatemachine.5875716f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/204.24a38dd3.js b/assets/js/205.fab423f2.js similarity index 97% rename from assets/js/204.24a38dd3.js rename to assets/js/205.fab423f2.js index 98c91f180f..33fb1f1301 100644 --- a/assets/js/204.24a38dd3.js +++ b/assets/js/205.fab423f2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[204],{1155:function(e,t,o){"use strict";o.r(t);var s=o(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"fabi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fabi"}},[e._v("#")]),e._v(" FABI")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Microcontroller Interface)")]),e._v(" "),t("p",[e._v("This component provides an interface for a FABI controller and enables the programming process. It is possible to configure the buttons which are connected to the FABI controller and store the set to the built in EEPROM.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(721),alt:"Screenshot: FABI plugin",title:"Screenshot: FABI plugin"}})]),e._v(" "),t("p",[e._v("FABI plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The Plugin requires a FABI2.0 compatible Version as well as the right COM Port. The Baudrate is predefined at 9600 Baud.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("ButtonMode [integer]:")]),e._v(" Number of the button")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SlotSaveName [string]:")]),e._v(" Name of the slot to save the set of modes")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SlotLoadName [string]:")]),e._v(" Name of the slot to load the set of modes")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("MoveMouseX [integer]:")]),e._v(" Number of pixels to move the mouse in X direction (right)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("MoveMouseY [integer]:")]),e._v(" Number of pixels to move the mouse in Y direction (down)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Text [string]:")]),e._v(" Text for the KeyWrite command")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("key [string]:")]),e._v(" Text for the KeyPress command"),t("br"),e._v("\n(e.g. AT KP KEY_UP presses the “Cursor-Up” key, AT KP KEY_CTRL KEY_ALT KEY_DELETE presses all three keys)"),t("br"),e._v("\nsupported key identifiers for key press command (AT KP):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("\t\t\t\tKEY\\_A KEY\\_B KEY\\_C KEY\\_D KEY\\_E KEY\\_F KEY\\_G KEY\\_H KEY\\_I KEY\\_J KEY\\_K KEY\\_L\n\t\t\t\tKEY\\_M KEY\\_N KEY\\_O KEY\\_P KEY\\_Q KEY\\_R KEY\\_S KEY\\_T KEY\\_U KEY\\_V KEY\\_W KEY\\_X\n\t\t\t\tKEY\\_Y KEY\\_Z KEY\\_1 KEY\\_2 KEY\\_3 KEY\\_4 KEY\\_5 KEY\\_6 KEY\\_7 KEY\\_8 KEY\\_9 KEY\\_0\n\t\t\t\tKEY\\_F1 KEY\\_F2 KEY\\_F3 KEY\\_F4 KEY\\_F5 KEY\\_F6 KEY\\_F7 KEY\\_F8 KEY\\_F9 KEY\\_F10 KEY\\_F11 KEY\\_F12\n\n\t\t\t\tKEY\\_RIGHT KEY\\_LEFT KEY\\_DOWN KEY\\_UP KEY\\_ENTER KEY\\_ESC KEY\\_BACKSPACE KEY\\_TAB\n\t\t\t\tKEY\\_HOME KEY\\_PAGE\\_UP KEY\\_PAGE\\_DOWN KEY\\_DELETE KEY\\_INSERT KEY\\_END\t KEY\\_NUM\\_LOCK KEY\\_SCROLL\\_LOCK\n\t\t\t\tKEY\\_SPACE KEY\\_CAPS\\_LOCK KEY\\_PAUSE KEY\\_SHIFT KEY\\_CTRL KEY\\_ALT KEY\\_RIGHT\\_ALT KEY\\_GUI\n\t\t\t\tKEY\\_RIGHT\\_GUI\n")])])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("List [string]:")]),e._v(" Lists the slots stored in the EEPROM of the FABI controller")]),e._v(" "),t("li",[t("strong",[e._v("ID [string]:")]),e._v(" Shows the ID of the FABI version")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("ID :")]),e._v(" identification string will be returned (e.g. “FABI Version 2.0”)"),t("br"),e._v("\nCorresponding FABI command is : “AT ID”")]),e._v(" "),t("li",[t("strong",[e._v("ButtonMode :")]),e._v(" button mode setting for a button (e.g. AT BM 2 -> next command defines the new function for button 2)"),t("br"),e._v("\nCorresponding FABI command is : “AT BM num”")]),e._v(" "),t("li",[t("strong",[e._v("ClickLeft :")]),e._v(" click left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CL”")]),e._v(" "),t("li",[t("strong",[e._v("ClickRight :")]),e._v(" click right mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CR”")]),e._v(" "),t("li",[t("strong",[e._v("ClickDoubleLeft :")]),e._v(" click double with left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CD”")]),e._v(" "),t("li",[t("strong",[e._v("ClickMiddle :")]),e._v(" click middle mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CM”")]),e._v(" "),t("li",[t("strong",[e._v("PressLeft :")]),e._v(" press/hold the left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT PL”")]),e._v(" "),t("li",[t("strong",[e._v("PressRight :")]),e._v(" press/hold the right mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT PR”")]),e._v(" "),t("li",[t("strong",[e._v("PressMiddle :")]),e._v(" press/hold the middle mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT PM”")]),e._v(" "),t("li",[t("strong",[e._v("ReleaseLeft :")]),e._v(" release the left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT RL”")]),e._v(" "),t("li",[t("strong",[e._v("ReleaseRight :")]),e._v(" release the right mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT RR”")]),e._v(" "),t("li",[t("strong",[e._v("ReleaseMiddle :")]),e._v(" release the middle mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT RM”")]),e._v(" "),t("li",[t("strong",[e._v("WheelUp :")]),e._v(" move mouse wheel up"),t("br"),e._v("\nCorresponding FABI command is : “AT WU”")]),e._v(" "),t("li",[t("strong",[e._v("WheelDown :")]),e._v(" move mouse wheel down"),t("br"),e._v("\nCorresponding FABI command is : “AT WD”")]),e._v(" "),t("li",[t("strong",[e._v("MoveMouseX :")]),e._v(" move mouse in x direction (e.g. AT X 4 moves 4 pixels to the right)"),t("br"),e._v("\nCorresponding FABI command is : “AT MX num”")]),e._v(" "),t("li",[t("strong",[e._v("MoveMouseY :")]),e._v(" move mouse in y direction (e.g. AT Y -10 moves 10 pixels up)"),t("br"),e._v("\nCorresponding FABI command is : “AT MY num”")]),e._v(" "),t("li",[t("strong",[e._v("KeyWrite :")]),e._v(" keyboard write text (e.g. AT KW Hello! writes “Hello!”)"),t("br"),e._v("\nCorresponding FABI command is : “AT KW text”")]),e._v(" "),t("li",[t("strong",[e._v("KeyPress :")]),e._v(" key press: press/hold all keys identified in text (e.g. AT KP KEY_UP presses the “Cursor-Up” key, AT KP KEY_CTRL KEY_ALT KEY_DELETE presses all three keys) The possible KeyPress commands are described in detail at the input port “key”!"),t("br"),e._v("\nCorresponding FABI command is : “AT KP text”")]),e._v(" "),t("li",[t("strong",[e._v("KeyRelease :")]),e._v(" key release: releases all keys identified in text"),t("br"),e._v("\nCorresponding FABI command is : “AT KR text”")]),e._v(" "),t("li",[t("strong",[e._v("KeyReleaseAll :")]),e._v(" release all: releases all currently pressed keys and buttons"),t("br"),e._v("\nCorresponding FABI command is : “AT RA”")]),e._v(" "),t("li",[t("strong",[e._v("Save :")]),e._v(" save settings and current button modes to next free eeprom slot under given name (e.g. AT SAVE mouse1)"),t("br"),e._v("\nCorresponding FABI command is : “AT SAVE text”")]),e._v(" "),t("li",[t("strong",[e._v("Load :")]),e._v(" load button modes from eeprom slot (e.g. AT LOAD mouse1 -> loads profile named “mouse1”)"),t("br"),e._v("\nCorresponding FABI command is : “AT LOAD text”")]),e._v(" "),t("li",[t("strong",[e._v("List :")]),e._v(" list all saved mode names"),t("br"),e._v("\nCorresponding FABI command is : “AT LIST”")]),e._v(" "),t("li",[t("strong",[e._v("Next :")]),e._v(" next mode will be loaded (wrap around after last slot)"),t("br"),e._v("\nCorresponding FABI command is : “AT NEXT”")]),e._v(" "),t("li",[t("strong",[e._v("Clear :")]),e._v(" clear EEPROM content (delete all stored slots)"),t("br"),e._v("\nCorresponding FABI command is : “AT CLEAR”")]),e._v(" "),t("li",[t("strong",[e._v("Idle :")]),e._v(" idle command (no operation)"),t("br"),e._v("\nCorresponding FABI command is : “AT IDLE”")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Stepsize [integer]:")]),e._v(" set mouse wheel stepsize (e.g. AT WS 3 sets the wheel stepsize to 3 rows)"),t("br"),e._v("\nThe stepsize is set when the plugin is started")]),e._v(" "),t("li",[t("strong",[e._v("COMPort [integer]:")]),e._v(" COM Port of FABI.")])])])}),[],!1,null,null,null);t.default=r.exports},721:function(e,t,o){e.exports=o.p+"assets/img/fabi.d2820cd0.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[205],{1160:function(e,t,o){"use strict";o.r(t);var s=o(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"fabi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fabi"}},[e._v("#")]),e._v(" FABI")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Microcontroller Interface)")]),e._v(" "),t("p",[e._v("This component provides an interface for a FABI controller and enables the programming process. It is possible to configure the buttons which are connected to the FABI controller and store the set to the built in EEPROM.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(724),alt:"Screenshot: FABI plugin",title:"Screenshot: FABI plugin"}})]),e._v(" "),t("p",[e._v("FABI plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The Plugin requires a FABI2.0 compatible Version as well as the right COM Port. The Baudrate is predefined at 9600 Baud.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("ButtonMode [integer]:")]),e._v(" Number of the button")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SlotSaveName [string]:")]),e._v(" Name of the slot to save the set of modes")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SlotLoadName [string]:")]),e._v(" Name of the slot to load the set of modes")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("MoveMouseX [integer]:")]),e._v(" Number of pixels to move the mouse in X direction (right)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("MoveMouseY [integer]:")]),e._v(" Number of pixels to move the mouse in Y direction (down)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Text [string]:")]),e._v(" Text for the KeyWrite command")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("key [string]:")]),e._v(" Text for the KeyPress command"),t("br"),e._v("\n(e.g. AT KP KEY_UP presses the “Cursor-Up” key, AT KP KEY_CTRL KEY_ALT KEY_DELETE presses all three keys)"),t("br"),e._v("\nsupported key identifiers for key press command (AT KP):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("\t\t\t\tKEY\\_A KEY\\_B KEY\\_C KEY\\_D KEY\\_E KEY\\_F KEY\\_G KEY\\_H KEY\\_I KEY\\_J KEY\\_K KEY\\_L\n\t\t\t\tKEY\\_M KEY\\_N KEY\\_O KEY\\_P KEY\\_Q KEY\\_R KEY\\_S KEY\\_T KEY\\_U KEY\\_V KEY\\_W KEY\\_X\n\t\t\t\tKEY\\_Y KEY\\_Z KEY\\_1 KEY\\_2 KEY\\_3 KEY\\_4 KEY\\_5 KEY\\_6 KEY\\_7 KEY\\_8 KEY\\_9 KEY\\_0\n\t\t\t\tKEY\\_F1 KEY\\_F2 KEY\\_F3 KEY\\_F4 KEY\\_F5 KEY\\_F6 KEY\\_F7 KEY\\_F8 KEY\\_F9 KEY\\_F10 KEY\\_F11 KEY\\_F12\n\n\t\t\t\tKEY\\_RIGHT KEY\\_LEFT KEY\\_DOWN KEY\\_UP KEY\\_ENTER KEY\\_ESC KEY\\_BACKSPACE KEY\\_TAB\n\t\t\t\tKEY\\_HOME KEY\\_PAGE\\_UP KEY\\_PAGE\\_DOWN KEY\\_DELETE KEY\\_INSERT KEY\\_END\t KEY\\_NUM\\_LOCK KEY\\_SCROLL\\_LOCK\n\t\t\t\tKEY\\_SPACE KEY\\_CAPS\\_LOCK KEY\\_PAUSE KEY\\_SHIFT KEY\\_CTRL KEY\\_ALT KEY\\_RIGHT\\_ALT KEY\\_GUI\n\t\t\t\tKEY\\_RIGHT\\_GUI\n")])])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("List [string]:")]),e._v(" Lists the slots stored in the EEPROM of the FABI controller")]),e._v(" "),t("li",[t("strong",[e._v("ID [string]:")]),e._v(" Shows the ID of the FABI version")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("ID :")]),e._v(" identification string will be returned (e.g. “FABI Version 2.0”)"),t("br"),e._v("\nCorresponding FABI command is : “AT ID”")]),e._v(" "),t("li",[t("strong",[e._v("ButtonMode :")]),e._v(" button mode setting for a button (e.g. AT BM 2 -> next command defines the new function for button 2)"),t("br"),e._v("\nCorresponding FABI command is : “AT BM num”")]),e._v(" "),t("li",[t("strong",[e._v("ClickLeft :")]),e._v(" click left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CL”")]),e._v(" "),t("li",[t("strong",[e._v("ClickRight :")]),e._v(" click right mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CR”")]),e._v(" "),t("li",[t("strong",[e._v("ClickDoubleLeft :")]),e._v(" click double with left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CD”")]),e._v(" "),t("li",[t("strong",[e._v("ClickMiddle :")]),e._v(" click middle mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT CM”")]),e._v(" "),t("li",[t("strong",[e._v("PressLeft :")]),e._v(" press/hold the left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT PL”")]),e._v(" "),t("li",[t("strong",[e._v("PressRight :")]),e._v(" press/hold the right mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT PR”")]),e._v(" "),t("li",[t("strong",[e._v("PressMiddle :")]),e._v(" press/hold the middle mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT PM”")]),e._v(" "),t("li",[t("strong",[e._v("ReleaseLeft :")]),e._v(" release the left mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT RL”")]),e._v(" "),t("li",[t("strong",[e._v("ReleaseRight :")]),e._v(" release the right mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT RR”")]),e._v(" "),t("li",[t("strong",[e._v("ReleaseMiddle :")]),e._v(" release the middle mouse button"),t("br"),e._v("\nCorresponding FABI command is : “AT RM”")]),e._v(" "),t("li",[t("strong",[e._v("WheelUp :")]),e._v(" move mouse wheel up"),t("br"),e._v("\nCorresponding FABI command is : “AT WU”")]),e._v(" "),t("li",[t("strong",[e._v("WheelDown :")]),e._v(" move mouse wheel down"),t("br"),e._v("\nCorresponding FABI command is : “AT WD”")]),e._v(" "),t("li",[t("strong",[e._v("MoveMouseX :")]),e._v(" move mouse in x direction (e.g. AT X 4 moves 4 pixels to the right)"),t("br"),e._v("\nCorresponding FABI command is : “AT MX num”")]),e._v(" "),t("li",[t("strong",[e._v("MoveMouseY :")]),e._v(" move mouse in y direction (e.g. AT Y -10 moves 10 pixels up)"),t("br"),e._v("\nCorresponding FABI command is : “AT MY num”")]),e._v(" "),t("li",[t("strong",[e._v("KeyWrite :")]),e._v(" keyboard write text (e.g. AT KW Hello! writes “Hello!”)"),t("br"),e._v("\nCorresponding FABI command is : “AT KW text”")]),e._v(" "),t("li",[t("strong",[e._v("KeyPress :")]),e._v(" key press: press/hold all keys identified in text (e.g. AT KP KEY_UP presses the “Cursor-Up” key, AT KP KEY_CTRL KEY_ALT KEY_DELETE presses all three keys) The possible KeyPress commands are described in detail at the input port “key”!"),t("br"),e._v("\nCorresponding FABI command is : “AT KP text”")]),e._v(" "),t("li",[t("strong",[e._v("KeyRelease :")]),e._v(" key release: releases all keys identified in text"),t("br"),e._v("\nCorresponding FABI command is : “AT KR text”")]),e._v(" "),t("li",[t("strong",[e._v("KeyReleaseAll :")]),e._v(" release all: releases all currently pressed keys and buttons"),t("br"),e._v("\nCorresponding FABI command is : “AT RA”")]),e._v(" "),t("li",[t("strong",[e._v("Save :")]),e._v(" save settings and current button modes to next free eeprom slot under given name (e.g. AT SAVE mouse1)"),t("br"),e._v("\nCorresponding FABI command is : “AT SAVE text”")]),e._v(" "),t("li",[t("strong",[e._v("Load :")]),e._v(" load button modes from eeprom slot (e.g. AT LOAD mouse1 -> loads profile named “mouse1”)"),t("br"),e._v("\nCorresponding FABI command is : “AT LOAD text”")]),e._v(" "),t("li",[t("strong",[e._v("List :")]),e._v(" list all saved mode names"),t("br"),e._v("\nCorresponding FABI command is : “AT LIST”")]),e._v(" "),t("li",[t("strong",[e._v("Next :")]),e._v(" next mode will be loaded (wrap around after last slot)"),t("br"),e._v("\nCorresponding FABI command is : “AT NEXT”")]),e._v(" "),t("li",[t("strong",[e._v("Clear :")]),e._v(" clear EEPROM content (delete all stored slots)"),t("br"),e._v("\nCorresponding FABI command is : “AT CLEAR”")]),e._v(" "),t("li",[t("strong",[e._v("Idle :")]),e._v(" idle command (no operation)"),t("br"),e._v("\nCorresponding FABI command is : “AT IDLE”")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Stepsize [integer]:")]),e._v(" set mouse wheel stepsize (e.g. AT WS 3 sets the wheel stepsize to 3 rows)"),t("br"),e._v("\nThe stepsize is set when the plugin is started")]),e._v(" "),t("li",[t("strong",[e._v("COMPort [integer]:")]),e._v(" COM Port of FABI.")])])])}),[],!1,null,null,null);t.default=r.exports},724:function(e,t,o){e.exports=o.p+"assets/img/fabi.d2820cd0.png"}}]); \ No newline at end of file diff --git a/assets/js/205.cfffa2ce.js b/assets/js/206.ada7dcb5.js similarity index 95% rename from assets/js/205.cfffa2ce.js rename to assets/js/206.ada7dcb5.js index bd2801e689..4953ce9ced 100644 --- a/assets/js/205.cfffa2ce.js +++ b/assets/js/206.ada7dcb5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[205],{1158:function(t,e,v){"use strict";v.r(e);var _=v(2),r=Object(_.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"fs20commandinterpreter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fs20commandinterpreter"}},[t._v("#")]),t._v(" FS20CommandInterpreter")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Home Control)")]),t._v(" "),e("p",[t._v("The FS20CommandInterpreter receives strings containing commands of the home automation system FS20 for ELV Electronics. Depending on the received commands, events will be fired.")]),t._v(" "),e("p",[e("img",{attrs:{src:v(724),alt:"FS20 Command Interpreter Plugin",title:"FS20 Command Interpreter Plugin"}})]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("command [string]:")]),t._v(" The command string containing the FS20 Command. The data must have the following format: housecode_sendaddress_command, e.g. 11111111_3343_17")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("p",[t._v("Each received command triggers an event, being mapped to this command. The following table will describe this events:")]),t._v(" "),e("p",[t._v("Command Mapping")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Event")]),t._v(" "),e("th",[t._v("Command")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Off")]),t._v(" "),e("td",[t._v("0")])]),t._v(" "),e("tr",[e("td",[t._v("Level1")]),t._v(" "),e("td",[t._v("1")])]),t._v(" "),e("tr",[e("td",[t._v("Level2")]),t._v(" "),e("td",[t._v("2")])]),t._v(" "),e("tr",[e("td",[t._v("Level3")]),t._v(" "),e("td",[t._v("3")])]),t._v(" "),e("tr",[e("td",[t._v("Level4")]),t._v(" "),e("td",[t._v("4")])]),t._v(" "),e("tr",[e("td",[t._v("Level5")]),t._v(" "),e("td",[t._v("5")])]),t._v(" "),e("tr",[e("td",[t._v("Level6")]),t._v(" "),e("td",[t._v("6")])]),t._v(" "),e("tr",[e("td",[t._v("Level7")]),t._v(" "),e("td",[t._v("7")])]),t._v(" "),e("tr",[e("td",[t._v("Level8")]),t._v(" "),e("td",[t._v("8")])]),t._v(" "),e("tr",[e("td",[t._v("Level9")]),t._v(" "),e("td",[t._v("9")])]),t._v(" "),e("tr",[e("td",[t._v("Level10")]),t._v(" "),e("td",[t._v("10")])]),t._v(" "),e("tr",[e("td",[t._v("Level11")]),t._v(" "),e("td",[t._v("11")])]),t._v(" "),e("tr",[e("td",[t._v("Level12")]),t._v(" "),e("td",[t._v("12")])]),t._v(" "),e("tr",[e("td",[t._v("Level13")]),t._v(" "),e("td",[t._v("13")])]),t._v(" "),e("tr",[e("td",[t._v("Level14")]),t._v(" "),e("td",[t._v("14")])]),t._v(" "),e("tr",[e("td",[t._v("Level15")]),t._v(" "),e("td",[t._v("15")])]),t._v(" "),e("tr",[e("td",[t._v("Level16")]),t._v(" "),e("td",[t._v("16")])]),t._v(" "),e("tr",[e("td",[t._v("OnOldLevel")]),t._v(" "),e("td",[t._v("17")])]),t._v(" "),e("tr",[e("td",[t._v("Toggle")]),t._v(" "),e("td",[t._v("18")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up")]),t._v(" "),e("td",[t._v("19")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Down")]),t._v(" "),e("td",[t._v("20")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up and Down")]),t._v(" "),e("td",[t._v("21")])]),t._v(" "),e("tr",[e("td",[t._v("Program internal timer")]),t._v(" "),e("td",[t._v("22")])]),t._v(" "),e("tr",[e("td",[t._v("Off for timer then old brightness level")]),t._v(" "),e("td",[t._v("24")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then off")]),t._v(" "),e("td",[t._v("25")])]),t._v(" "),e("tr",[e("td",[t._v("On old brightness level for timer then off")]),t._v(" "),e("td",[t._v("26")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then old brightness level")]),t._v(" "),e("td",[t._v("30")])]),t._v(" "),e("tr",[e("td",[t._v("On for old level then previous state")]),t._v(" "),e("td",[t._v("31")])])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("housecode [integer]")]),t._v(" The housecode, the plugin should react on. The housecode has 8 digits, each from 1 to 4.")]),t._v(" "),e("li",[e("strong",[t._v("sendaddress [integer]")]),t._v(" The sendaddress, the plugin should react on. The sendaddress has 4 digits, each from 1 to 4.")])])])}),[],!1,null,null,null);e.default=r.exports},724:function(t,e,v){t.exports=v.p+"assets/img/fs20command.da8b3973.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[206],{1163:function(t,e,v){"use strict";v.r(e);var _=v(2),r=Object(_.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"fs20commandinterpreter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fs20commandinterpreter"}},[t._v("#")]),t._v(" FS20CommandInterpreter")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Home Control)")]),t._v(" "),e("p",[t._v("The FS20CommandInterpreter receives strings containing commands of the home automation system FS20 for ELV Electronics. Depending on the received commands, events will be fired.")]),t._v(" "),e("p",[e("img",{attrs:{src:v(727),alt:"FS20 Command Interpreter Plugin",title:"FS20 Command Interpreter Plugin"}})]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("command [string]:")]),t._v(" The command string containing the FS20 Command. The data must have the following format: housecode_sendaddress_command, e.g. 11111111_3343_17")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("p",[t._v("Each received command triggers an event, being mapped to this command. The following table will describe this events:")]),t._v(" "),e("p",[t._v("Command Mapping")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Event")]),t._v(" "),e("th",[t._v("Command")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Off")]),t._v(" "),e("td",[t._v("0")])]),t._v(" "),e("tr",[e("td",[t._v("Level1")]),t._v(" "),e("td",[t._v("1")])]),t._v(" "),e("tr",[e("td",[t._v("Level2")]),t._v(" "),e("td",[t._v("2")])]),t._v(" "),e("tr",[e("td",[t._v("Level3")]),t._v(" "),e("td",[t._v("3")])]),t._v(" "),e("tr",[e("td",[t._v("Level4")]),t._v(" "),e("td",[t._v("4")])]),t._v(" "),e("tr",[e("td",[t._v("Level5")]),t._v(" "),e("td",[t._v("5")])]),t._v(" "),e("tr",[e("td",[t._v("Level6")]),t._v(" "),e("td",[t._v("6")])]),t._v(" "),e("tr",[e("td",[t._v("Level7")]),t._v(" "),e("td",[t._v("7")])]),t._v(" "),e("tr",[e("td",[t._v("Level8")]),t._v(" "),e("td",[t._v("8")])]),t._v(" "),e("tr",[e("td",[t._v("Level9")]),t._v(" "),e("td",[t._v("9")])]),t._v(" "),e("tr",[e("td",[t._v("Level10")]),t._v(" "),e("td",[t._v("10")])]),t._v(" "),e("tr",[e("td",[t._v("Level11")]),t._v(" "),e("td",[t._v("11")])]),t._v(" "),e("tr",[e("td",[t._v("Level12")]),t._v(" "),e("td",[t._v("12")])]),t._v(" "),e("tr",[e("td",[t._v("Level13")]),t._v(" "),e("td",[t._v("13")])]),t._v(" "),e("tr",[e("td",[t._v("Level14")]),t._v(" "),e("td",[t._v("14")])]),t._v(" "),e("tr",[e("td",[t._v("Level15")]),t._v(" "),e("td",[t._v("15")])]),t._v(" "),e("tr",[e("td",[t._v("Level16")]),t._v(" "),e("td",[t._v("16")])]),t._v(" "),e("tr",[e("td",[t._v("OnOldLevel")]),t._v(" "),e("td",[t._v("17")])]),t._v(" "),e("tr",[e("td",[t._v("Toggle")]),t._v(" "),e("td",[t._v("18")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up")]),t._v(" "),e("td",[t._v("19")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Down")]),t._v(" "),e("td",[t._v("20")])]),t._v(" "),e("tr",[e("td",[t._v("Dim Up and Down")]),t._v(" "),e("td",[t._v("21")])]),t._v(" "),e("tr",[e("td",[t._v("Program internal timer")]),t._v(" "),e("td",[t._v("22")])]),t._v(" "),e("tr",[e("td",[t._v("Off for timer then old brightness level")]),t._v(" "),e("td",[t._v("24")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then off")]),t._v(" "),e("td",[t._v("25")])]),t._v(" "),e("tr",[e("td",[t._v("On old brightness level for timer then off")]),t._v(" "),e("td",[t._v("26")])]),t._v(" "),e("tr",[e("td",[t._v("On for timer then old brightness level")]),t._v(" "),e("td",[t._v("30")])]),t._v(" "),e("tr",[e("td",[t._v("On for old level then previous state")]),t._v(" "),e("td",[t._v("31")])])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("housecode [integer]")]),t._v(" The housecode, the plugin should react on. The housecode has 8 digits, each from 1 to 4.")]),t._v(" "),e("li",[e("strong",[t._v("sendaddress [integer]")]),t._v(" The sendaddress, the plugin should react on. The sendaddress has 4 digits, each from 1 to 4.")])])])}),[],!1,null,null,null);e.default=r.exports},727:function(t,e,v){t.exports=v.p+"assets/img/fs20command.da8b3973.jpg"}}]); \ No newline at end of file diff --git a/assets/js/206.d2f6d812.js b/assets/js/207.6aaa4f3f.js similarity index 93% rename from assets/js/206.d2f6d812.js rename to assets/js/207.6aaa4f3f.js index 61a63a5f27..838a8236f2 100644 --- a/assets/js/206.d2f6d812.js +++ b/assets/js/207.6aaa4f3f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[206],{1161:function(t,e,r){"use strict";r.r(e);var o=r(2),i=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"filter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#filter"}},[t._v("#")]),t._v(" Filter")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This plugin implements a FIR Filter")]),t._v(" "),e("p",[e("img",{attrs:{src:r(726),alt:"Screenshot: Filter plugin",title:"Screenshot: Filter plugin"}})]),t._v(" "),e("p",[t._v("Filter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Input [double]:")]),t._v(" The signal to be filtered.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Output [double]:")]),t._v(" The filtered signal.")]),t._v(" "),e("li",[e("strong",[t._v("SignalPower [double]:")]),t._v(" Signal Power on the band pass.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("Order [integer]:")]),t._v(" Order of the filter. It is recommended to use orders around the sampling rate.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("CutoffFreq1 [double]:")]),t._v(" Cutoff frequecy for low and high pass filter types. In case of band pass filters it is the low cutoff frequency of the band.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("CutoffFreq2 [double]:")]),t._v(" In case of band pass filters it is the high cutoff frequency of the band.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("SamplingRate [integer]:")]),t._v(" Sampling rate of the input signal.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("Type [integer]:")]),t._v(" Type of filter (low, high or band pass filter).")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("SignalPowerUpdateRate [integer]:")]),t._v(" Update ratio for the SignalPower output port. The SignalPower output port provides a new value every time the Output port has provided N values, where N is the value of this property.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("SignalPowerBufferSize [integer]:")]),t._v(" Length of the buffer that keeps the filtered signal that is used to compute the power of the signal.")])])])])}),[],!1,null,null,null);e.default=i.exports},726:function(t,e,r){t.exports=r.p+"assets/img/filter.9099ebe7.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[207],{1165:function(t,e,r){"use strict";r.r(e);var o=r(2),i=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"filter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#filter"}},[t._v("#")]),t._v(" Filter")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This plugin implements a FIR Filter")]),t._v(" "),e("p",[e("img",{attrs:{src:r(729),alt:"Screenshot: Filter plugin",title:"Screenshot: Filter plugin"}})]),t._v(" "),e("p",[t._v("Filter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Input [double]:")]),t._v(" The signal to be filtered.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Output [double]:")]),t._v(" The filtered signal.")]),t._v(" "),e("li",[e("strong",[t._v("SignalPower [double]:")]),t._v(" Signal Power on the band pass.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("Order [integer]:")]),t._v(" Order of the filter. It is recommended to use orders around the sampling rate.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("CutoffFreq1 [double]:")]),t._v(" Cutoff frequecy for low and high pass filter types. In case of band pass filters it is the low cutoff frequency of the band.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("CutoffFreq2 [double]:")]),t._v(" In case of band pass filters it is the high cutoff frequency of the band.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("SamplingRate [integer]:")]),t._v(" Sampling rate of the input signal.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("Type [integer]:")]),t._v(" Type of filter (low, high or band pass filter).")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("SignalPowerUpdateRate [integer]:")]),t._v(" Update ratio for the SignalPower output port. The SignalPower output port provides a new value every time the Output port has provided N values, where N is the value of this property.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("SignalPowerBufferSize [integer]:")]),t._v(" Length of the buffer that keeps the filtered signal that is used to compute the power of the signal.")])])])])}),[],!1,null,null,null);e.default=i.exports},729:function(t,e,r){t.exports=r.p+"assets/img/filter.9099ebe7.jpg"}}]); \ No newline at end of file diff --git a/assets/js/207.2bc6221e.js b/assets/js/208.15a04c8c.js similarity index 94% rename from assets/js/207.2bc6221e.js rename to assets/js/208.15a04c8c.js index b1493c46b5..91dd11cfe7 100644 --- a/assets/js/207.2bc6221e.js +++ b/assets/js/208.15a04c8c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[207],{1164:function(e,t,s){"use strict";s.r(t);var r=s(2),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"hrvanalysis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hrvanalysis"}},[e._v("#")]),e._v(" HRVAnalysis")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This component calculates various Heart Rate Variability (HRV) parameters from an incoming signal of raw ECG-data. For a detailed description of the HRV parameters and a guide how to use optical and electrical heart rate sensors see the work of Andreas Schreiber (in /documentation/DIYGuides/HRVAnalysis_Schreiber.pdf and /documentation/OpticalPulseSensor_Schreiber.pdf)")]),e._v(" "),t("p",[t("img",{attrs:{src:s(729),alt:"Screenshot: HRVAnalysis plugin",title:"Screenshot: HRVAnalysis plugin"}})]),e._v(" "),t("p",[e._v("HRVAnalysis plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("HRVInput [double]:")]),e._v(" Input port for the raw signal")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("runtime [double]:")]),e._v(" the current time, since the first sample, in seconds")]),e._v(" "),t("li",[t("strong",[e._v("pulserate [double]:")]),e._v(" the current calculated pulserate")]),e._v(" "),t("li",[t("strong",[e._v("SDNN [double]:")]),e._v(" the standard deviation of all RR-intervals")]),e._v(" "),t("li",[t("strong",[e._v("rMSSD [double]:")]),e._v(" the square-root of the average sum of the quadratic differences between neighboring RR-intervals")]),e._v(" "),t("li",[t("strong",[e._v("SDSD [double]:")]),e._v(" the current standard deviation of successive differences between neighbouring RR-intervals")]),e._v(" "),t("li",[t("strong",[e._v("pNN50 [double]:")]),e._v(" the numer of successive RR-intervales that differ by more than 50ms (expressed as percentage of all RR-intervals)")]),e._v(" "),t("li",[t("strong",[e._v("pNN20 [double]:")]),e._v(" the numer of successive RR-intervales that differ by more than 20ms (expressed as percentage of all RR-intervals)")]),e._v(" "),t("li",[t("strong",[e._v("DD [double]:")]),e._v(" the deviation of 2 succesive RR-intervals")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" An incoming event starts the HRV analysis")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("samplerate [double]:")]),e._v(" specifies the sample rate of the incoming signal.")]),e._v(" "),t("li",[t("strong",[e._v("outlierRange [double]:")]),e._v(" Defines factor of the mean R-amplitudes which is used as a threshold to detect spikes / signal artefacts.")])])])}),[],!1,null,null,null);t.default=a.exports},729:function(e,t,s){e.exports=s.p+"assets/img/hrvanalysis.4919a786.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[208],{1164:function(e,t,s){"use strict";s.r(t);var r=s(2),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"hrvanalysis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hrvanalysis"}},[e._v("#")]),e._v(" HRVAnalysis")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This component calculates various Heart Rate Variability (HRV) parameters from an incoming signal of raw ECG-data. For a detailed description of the HRV parameters and a guide how to use optical and electrical heart rate sensors see the work of Andreas Schreiber (in /documentation/DIYGuides/HRVAnalysis_Schreiber.pdf and /documentation/OpticalPulseSensor_Schreiber.pdf)")]),e._v(" "),t("p",[t("img",{attrs:{src:s(728),alt:"Screenshot: HRVAnalysis plugin",title:"Screenshot: HRVAnalysis plugin"}})]),e._v(" "),t("p",[e._v("HRVAnalysis plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("HRVInput [double]:")]),e._v(" Input port for the raw signal")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("runtime [double]:")]),e._v(" the current time, since the first sample, in seconds")]),e._v(" "),t("li",[t("strong",[e._v("pulserate [double]:")]),e._v(" the current calculated pulserate")]),e._v(" "),t("li",[t("strong",[e._v("SDNN [double]:")]),e._v(" the standard deviation of all RR-intervals")]),e._v(" "),t("li",[t("strong",[e._v("rMSSD [double]:")]),e._v(" the square-root of the average sum of the quadratic differences between neighboring RR-intervals")]),e._v(" "),t("li",[t("strong",[e._v("SDSD [double]:")]),e._v(" the current standard deviation of successive differences between neighbouring RR-intervals")]),e._v(" "),t("li",[t("strong",[e._v("pNN50 [double]:")]),e._v(" the numer of successive RR-intervales that differ by more than 50ms (expressed as percentage of all RR-intervals)")]),e._v(" "),t("li",[t("strong",[e._v("pNN20 [double]:")]),e._v(" the numer of successive RR-intervales that differ by more than 20ms (expressed as percentage of all RR-intervals)")]),e._v(" "),t("li",[t("strong",[e._v("DD [double]:")]),e._v(" the deviation of 2 succesive RR-intervals")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" An incoming event starts the HRV analysis")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("samplerate [double]:")]),e._v(" specifies the sample rate of the incoming signal.")]),e._v(" "),t("li",[t("strong",[e._v("outlierRange [double]:")]),e._v(" Defines factor of the mean R-amplitudes which is used as a threshold to detect spikes / signal artefacts.")])])])}),[],!1,null,null,null);t.default=a.exports},728:function(e,t,s){e.exports=s.p+"assets/img/hrvanalysis.4919a786.jpg"}}]); \ No newline at end of file diff --git a/assets/js/208.65a013ba.js b/assets/js/209.87442804.js similarity index 93% rename from assets/js/208.65a013ba.js rename to assets/js/209.87442804.js index 97f49b3f88..c7d9400771 100644 --- a/assets/js/208.65a013ba.js +++ b/assets/js/209.87442804.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[208],{1159:function(e,t,r){"use strict";r.r(t);var s=r(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"iirfilter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#iirfilter"}},[e._v("#")]),e._v(" IIRFilter")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This plugin provides adjustable Infinite Impulse Response Filters, based on the Java DSP Library: "),t("a",{attrs:{href:"http://www.source-code.biz/dsp/java/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://www.source-code.biz/dsp/java"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("img",{attrs:{src:r(725),alt:"Screenshot: IIRFilter plugin",title:"Screenshot: IIRFilter plugin"}})]),e._v(" "),t("p",[e._v("IIRFilter plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in [double]:")]),e._v(" The signal to be filtered")])]),e._v(" "),t("h2",{attrs:{id:"input-port-description-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description-2"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("out [double]:")]),e._v(" The filtered signal")]),e._v(" "),t("li",[t("strong",[e._v("magnitude [double]:")]),e._v(" the magnitude of the filtered signal in the selected passband (only calculated if the passType = bandpass !)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("passType [integer] (combobox selection):")]),e._v(" can be lowpass, highpass, bandpass or bandstop")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("characteristicType [integer] (combobox selection):")]),e._v(" can be butterworth, bessel or chebyshev")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("order [integer]:")]),e._v(" the filter order (values from 1 to 12 recommended)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("samplingFrequency [integer]:")]),e._v(" the sampling rate of the input signal")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("fc1 [double]:")]),e._v(" corner frequency (lower corner frequency for bandpass filter)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("fc2 [double]:")]),e._v(" higher corner frequency (ignored in case of highpass or lowpass types)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("ripple [double]:")]),e._v(" the passband ripple supression, must be a negative value (only for chebyshev types, ignored for other types)")])])])])}),[],!1,null,null,null);t.default=i.exports},725:function(e,t,r){e.exports=r.p+"assets/img/iirfilter.4bf8743f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[209],{1166:function(e,t,r){"use strict";r.r(t);var s=r(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"iirfilter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#iirfilter"}},[e._v("#")]),e._v(" IIRFilter")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("This plugin provides adjustable Infinite Impulse Response Filters, based on the Java DSP Library: "),t("a",{attrs:{href:"http://www.source-code.biz/dsp/java/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://www.source-code.biz/dsp/java"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("img",{attrs:{src:r(730),alt:"Screenshot: IIRFilter plugin",title:"Screenshot: IIRFilter plugin"}})]),e._v(" "),t("p",[e._v("IIRFilter plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in [double]:")]),e._v(" The signal to be filtered")])]),e._v(" "),t("h2",{attrs:{id:"input-port-description-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description-2"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("out [double]:")]),e._v(" The filtered signal")]),e._v(" "),t("li",[t("strong",[e._v("magnitude [double]:")]),e._v(" the magnitude of the filtered signal in the selected passband (only calculated if the passType = bandpass !)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("passType [integer] (combobox selection):")]),e._v(" can be lowpass, highpass, bandpass or bandstop")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("characteristicType [integer] (combobox selection):")]),e._v(" can be butterworth, bessel or chebyshev")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("order [integer]:")]),e._v(" the filter order (values from 1 to 12 recommended)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("samplingFrequency [integer]:")]),e._v(" the sampling rate of the input signal")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("fc1 [double]:")]),e._v(" corner frequency (lower corner frequency for bandpass filter)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("fc2 [double]:")]),e._v(" higher corner frequency (ignored in case of highpass or lowpass types)")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("ripple [double]:")]),e._v(" the passband ripple supression, must be a negative value (only for chebyshev types, ignored for other types)")])])])])}),[],!1,null,null,null);t.default=i.exports},730:function(e,t,r){e.exports=r.p+"assets/img/iirfilter.4bf8743f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/21.a690ac3a.js b/assets/js/21.69ae0654.js similarity index 94% rename from assets/js/21.a690ac3a.js rename to assets/js/21.69ae0654.js index a136e0d3b8..95622a2189 100644 --- a/assets/js/21.a690ac3a.js +++ b/assets/js/21.69ae0654.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{1051:function(e,s,n){"use strict";n.r(s);var t=n(2),r=Object(t.a)({},(function(){var e=this,s=e._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#users"}},[e._v("#")]),e._v(" Users")]),e._v(" "),s("p",[s("strong",[e._v("Video on YouTube:")]),e._v(" "),s("a",{attrs:{href:"https://www.youtube.com/watch?v=CoRUQJJnYaY&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=16&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Offline and online users"),s("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),s("p",[e._v("This chapter is about offline and online users, their differences and how to add or register them.")]),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),s("p",[e._v("In AsTeRICS Grid a user in general holds a set of grids which realize a specific solution for this user. A user doesn’t necessarily have to be a real person, it’s also possible to create a “user” for a specific usecase, for instance a specific smart home control interface.")]),e._v(" "),s("h3",{attrs:{id:"internet-connection-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internet-connection-requirements"}},[e._v("#")]),e._v(" Internet connection requirements")]),e._v(" "),s("p",[e._v("Despite being a web-application that runs in an internet browser, AsTeRICS Grid is designed to be usable also without internet connection.")]),e._v(" "),s("p",[s("strong",[e._v("Internet connection is required for:")])]),e._v(" "),s("ol",[s("li",[e._v("First usage of AsTeRICS Grid. Initially opening "),s("a",{attrs:{href:"https://grid.asterics.eu/",target:"_blank"}},[e._v("https://grid.asterics.eu/")]),e._v(" automatically downloads the whole application to browser cache and therefore AsTeRICS Grid is usable offline afterwards.")]),e._v(" "),s("li",[e._v("Synchronizing configuration of online users")])]),e._v(" "),s("p",[s("strong",[e._v("Without internet access it is possible to:")])]),e._v(" "),s("ol",[s("li",[e._v("Use AsTeRICS Grid by just re-opening "),s("a",{attrs:{href:"https://grid.asterics.eu/",target:"_blank"}},[e._v("https://grid.asterics.eu/")]),e._v(" in the browser (only initial access needs internet access).")]),e._v(" "),s("li",[e._v("switch between all saved users, which can be both offline and online users")])]),e._v(" "),s("h2",{attrs:{id:"online-users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#online-users"}},[e._v("#")]),e._v(" Online users")]),e._v(" "),s("p",[e._v("Online users are users whose configuration is automatically synchronized with a cloud storage. Therefore it’s possible to this user to log in on different devices while the configuration is always up-to-date on each device.")]),e._v(" "),s("p",[e._v("In view “add online user” it’s possible to register a new online user, Figure 6:")]),e._v(" "),s("p",[s("img",{attrs:{src:n(539),alt:"add online user view"}}),e._v(" "),s("em",[e._v("Fig. 6: Add online user view - register")])]),e._v(" "),s("p",[e._v("The following information is important for registering an online user:")]),e._v(" "),s("ul",[s("li",[e._v("The only data that is needed are a "),s("strong",[e._v("username")]),e._v(" and a "),s("strong",[e._v("password")]),e._v(". The username is needed for uniquely identifying a user and the password for securing his account and encrypting the data.")]),e._v(" "),s("li",[e._v("If you want to "),s("strong",[e._v("use AsTeRICS Grid completely anonymously")]),e._v(" just use a username without any relation to your person.")]),e._v(" "),s("li",[e._v("Since all data is "),s("strong",[e._v("end-to-end encrypted")]),e._v(" only the user itself can ever see his data and configuration, no server admin or anyone else.")]),e._v(" "),s("li",[e._v("End-to-end encryption is great for privacy, however it has the drawback that the "),s("strong",[e._v("data is lost")]),e._v(", if you logout your online account on all devices and forget your password. In this case there is "),s("strong",[e._v("no possibility of password recovery")]),e._v(", so "),s("strong",[e._v("remember your password carefully")]),e._v(". It’s also recommended to "),s("strong",[e._v("do backups")]),e._v(" of your grids (see "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("Manage grids view")]),e._v(").")],1),e._v(" "),s("li",[e._v('Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.')])]),e._v(" "),s("h3",{attrs:{id:"synchronization-states"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-states"}},[e._v("#")]),e._v(" Synchronization states")]),e._v(" "),s("p",[e._v("Online users can have the following synchronization states which are shown at the bottom of the navigation bar:")]),e._v(" "),s("p",[s("img",{attrs:{src:n(540),alt:"online user - synchronizing symbol"}}),e._v(" "),s("strong",[e._v("Synchronizing")]),e._v(": configuration is currently synchronizing with the cloud")]),e._v(" "),s("p",[s("img",{attrs:{src:n(541),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Synchronized")]),e._v(": configuration is up-to-date with the cloud storage")]),e._v(" "),s("p",[s("img",{attrs:{src:n(542),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Synchronization failed")]),e._v(": synchronization not possible, no internet connection")]),e._v(" "),s("p",[s("img",{attrs:{src:n(543),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Synchronization paused")]),e._v(": synchronization paused for a short time and will be resumed shortly")]),e._v(" "),s("p",[s("img",{attrs:{src:n(544),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Online only")]),e._v(": user is logged in online-only, meaning that configuration is not saved on the current device. Changes still will be saved in the cloud and therefore also be synchronized to other devices where this user is logged in. Users will be logged in online-only if the “remember checkbox” is unchecked when logging in (see "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#change-user---view"}},[e._v("change user view")]),e._v(").")],1),e._v(" "),s("h2",{attrs:{id:"offline-users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#offline-users"}},[e._v("#")]),e._v(" Offline users")]),e._v(" "),s("p",[e._v("Offline users are users whose configuration is only saved offline in the storage of the currently used browser. This type of users are perfectly suited for use cases where AsTeRICS Grid is only used on a single device.")]),e._v(" "),s("p",[e._v("In view “add offline user” it’s possible to add a new offline user (see "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#user"}},[e._v("Terms")]),e._v("), Figure 7:")],1),e._v(" "),s("p",[s("img",{attrs:{src:n(545),alt:"add offline user view"}}),e._v(" "),s("em",[e._v("Fig. 7: Add offline user view")])]),e._v(" "),s("p",[e._v("The following information is important regarding offline users:")]),e._v(" "),s("ul",[s("li",[e._v("All "),s("strong",[e._v("data of an offline user never leaves the device")]),e._v(", it’s stored in a browser-internal database.")]),e._v(" "),s("li",[e._v('Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.')])]),e._v(" "),s("h2",{attrs:{id:"backup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#backup"}},[e._v("#")]),e._v(" Backup")]),e._v(" "),s("p",[e._v("Regardless which type of users are used, we "),s("strong",[e._v("highly recommend to do backups")]),e._v(" if you are using AsTeRICS Grid on a regular basis and have put some effort into customizing own grids for your use-case. See "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("manage grids view")]),e._v(" for instructions how to create and restore backups.")],1),e._v(" "),s("p",[e._v("This is why backups are important:")]),e._v(" "),s("ol",[s("li",[s("strong",[e._v("Offline users")]),e._v(": since all data is only stored in an browser-internal storage, any browser crash or failure of your device could cause data loss.")]),e._v(" "),s("li",[s("strong",[e._v("Online users")]),e._v(": Although online users are not susceptible to device or browser errors, data loss is still possible because of the encryption of the user data. If the user forgets his password or decryption fails because of any kind of programming error the data cannot be recovered. Backups as described in "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("manage grids view")]),e._v(" are saved to an unencrypted file and therefore can recover the user data in such a case.")],1)]),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html"}},[e._v("← Previous Chapter")]),e._v(" "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/07_dictionaries.html"}},[e._v("Next Chapter →")])],1),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);s.default=r.exports},539:function(e,s,n){e.exports=n.p+"assets/img/register_online_en.1f0b88fe.jpg"},540:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAeAC8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U65Xxr4yPh1Ut7ZVe8kXdluQi+uO5re1bVINFsZbu5bbGg6Dqx7Ae9eKeKfECatqFzqU4W1hC5O5+EVR1J/DNdeHpe0ldrRHnY3EexhaL95mgvjrXFm837exP90ou38sYrsNM+J9k9gGv0eO6BwUhXIb/aGTx9M18heINK+IvxV16afw34507w34OVB9kvNIVbua6Jzksx4XHtXK6F8cda+Cnj7/AIQz4qa9Y6vaXURl0/XrUYcsDjypYlXIYkj2HHau2cKUtHGy7nkUauIjdxnzPtqz9ENJ1qz1y18+zl8xAcMMYKn0Iq9XkHw38TWemXTyTzOltdRrsbadvqCw6jg+nevXlYOoZSGUjII6GvPrUvZSstj28LiPrFO736nF/FSOVtFtmXPlLN8+PocH/PrXh3j/AMJt468H6noI1GfShfReS11bAF1U9cZ9Rx+NfUF5aQ39tJb3EYlhkGGVu9cRc/CeB5maDUJIoz0R4g5H45FdGHrQjFwmcWMwtWpUVWlqfnb8ILrTP2OdZ8Q6D4t0vVUt7mbzbTXrOOae3u4e25AMK6jqQPb69/4b0HwT+0Z48bxTN4Dv7JNLljltNevE8j7cw/hKdWA9xivsuT4PxTLtk1EOvXDWwI/9Cpy/CJI1Crqe1R0At8D/ANCrWNSkvd5tPQ55UMTJufJ7z63R54OOB0r2bwG8snhWxMpJOGC5/uhiB+lYln8KbaKdWub57iIcmNY9mfxya7iGFLeFIo1CRoAqqvQAdBWeJrQqRUYm+BwlWjNzqaH/2Q=="},541:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAhAC8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6yfEHiS08OWoluCWd+I4k+8x/oPetOWVII2kkZUjUZZmOAB6143421qPW9dklgkMtuihIzggcdevvmuihS9rOz2OLF4j6vT5lv0OhX4sSedltOXyf7olO788f0rsdM8TadqlgLtLhIo87WEzBSreh5rw6vO7b49eE7/AOLh+HNncXF9r8cDzTPbQmS3gZeTHI4PyvjnkYHQkMQK9CeGpNqK0bPFo47EK8pe8l+B9kK6yKGUhlIyGByDTq84+FuqOtxdWMkw8oqHjRm53Z52j6fyr0evNq0/ZS5T3sPWWIpqaVjjPijdyw6JBEhISaXDkdwBkD8/5V5Hqlm+o6Zd2kd1NYyTwvEt1b48yEspAdcgjcM5GQRkV79r2iw+INNktJjtz8yOBkqw6GvMrn4c63DMyRwR3CDpIkqgH8CQa7MNOHI4SdjycfRqyqqpBXR+fN5r3x/+HF5P8HLRZPEN9qrsdG8YTM5eO0z+9ZnOcFdwyWO5M4G7KGvo74C/APRfgX4ZNran+0NdvMSalrEo/e3MnUgE8hAScL+JySTXuf8Awr7Xv+fEf9/k/wDiqP8AhX2vf8+I/wC/yf8AxVdVN04auV3tfy7f59zjqqvUXKqbS3dk9X3/AOB0OdVijBlJVgcgjqK9r8H6lLq3h20uJzumIKs397BIz+leeWfw31m4nVJoktY+8jSK2PwBNepaXpsWkafBZw58uJcAnqe5P4mubFVISikndnZl9GrTm5SVkW6KKK8w98KKKKACiiigD//Z"},542:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAfAC4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U65Xxd44j8OuLaCNZ7wjcQx+VB2z6n2rd1bVrbRbJ7q6fZGvAA5LH0A9a8U1rUP7W1a6uwGCzSFlDdQOw/KuvD0faSvLZHm47EuhC0H7zOjtvihqsc26aK3miJ5TaVOPY5/nmu0tfHejXFpDNJdrbtJ1ifJZT6HH86+LdP8A2t/BcV34xsvEZuPCWpeGpXWWx1QBZrmIHCSQqPvFsjCjJ+ZTyDmu7+EPxIHxY8CWHidNGvdDhvC5itr4De0YYhZBjqrDBB/mME9vsaNZJw7X07P+vU8pYrFYe/tNemvf+vkfWkM8dzEssUiyxsMq6HIP0NSV598L9Yhjt57Ca5VZGk3QxMcE5HOP04r0GvMq0/ZzcT3sPWVempnnPxYeXzdOT/ljtcj/AHuP6V5/XufiDQbfxFYm2uMqQdySL1RvWuCk+FWorIwju7Vk7MxZSfwwf5134etCMOWTsePjsLVnV9pBXTPz9+JX7NfxC/aM8beJfE+vR6f4RfSgbPw9YvHHP9sWN9yvO4zlG56g43fdwDu+mPg7qnivVvh9pkvjTRItA8QxqYZ7WF1ZDsO0SAKSFDAZ2gnFez/8Kr1X/n5s/wDvt/8A4mj/AIVXqv8Az82f/fb/APxNa0p0aStGW/59/V/d5HPWp4mskpQ228l29PxONVijBlJVgcgjqK930O5kvNGsZ5v9bJCjMfUkDmuH0v4VzLdK2oXURgU5KQZJb2yQMV6JGixoqIoVFGAo6Aelc2Kqwmko6nfl+Hq0nKU1ZM//2Q=="},543:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAeACoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6878eeNLm3vX06wlMAj4lmT7xb0B7YrqPFniZPDNgsmwS3Eh2xRnp7k+wr5w+NGuXtv8N/HGr287W2ox6Te3Mc8J2tHIIXZWX0IIBH0rrowsnVkrpJnmYus7xoU3aUmvlc7W21/UrSbzor64WTOSfMJB+oPX8a7S1+KypaQi4smluekjIwVT7j/AAr8k/2ffiz421LwR8YJbzxdrl7LZ+GnuLaS61CWVoJA4AeMsxKNgnkYP5V61/wTx8eeJfGNx44i1/xBqmuJbpaNCNSvJLjyyxlDbd5OM4GcegruXs68lFx6c34tfoeby18LCc4z+FpffZ/qfqLoutW2vWK3VqxKE7SrDDKfQ1frynwD4qttBeW2ulZY7hwfOB4Q9OR6e9eqghgCORXnVqfspWWx7GFxCxFNNvXqee/Fezlb7DdAEwqGjPoCcEfnz+VeM/ErQbrxR8O/FGjWIQ3uoaXdWkAkbapkkiZVyewyRX1HdWkN9bvBcRrLC4wyMMg1y0nwv0eSRmV7qMH+FZBgfmpNbU60PZOlP+rnJiMLUlXVelvpv5H5ZfA79lH4leF/B/xRs9Y0WHTrrWdCbT7CJ76GQzSlt3VHYKOMZYjqPfHpf7DfwJ8afBxvF1x4v0tNJOoC2S3iF1FMzbPMLE+WzAD5x1OevFfoB/wq3Sf+e95/32v/AMTR/wAKt0n/AJ73n/fa/wDxNbU61GnJSTeit8rt/qY1KGKqxlBpWk7v5WX6I8qr23R7W9j0ixR32usCAq3UHaOKp6X8P9J0u6WcLLcSKcr57AhT64AH610tZV8Qp2UUaYXAyp3dR29Gf//Z"},544:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAgACsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U64vxZ8Qho909nYxJNcJxJJJnap9MDqa6DXvENp4dtRNcsSW4SNOWY+1fO/jvxU/hnw/qutiym1S4hRpI7OAgSXEhPyoCeBknqenJrroU1K857I8zGYiVO1Ok/eZ6Vp/xR1CGYfa4YbiEnnYNrD6Hp+ldvF400WQQ/6fGhlAIVuNuezdgfrX54SfGX4xzfELwnZ/8I5b22i3lpH/AGmUiVlt55wSnJfcRCGj3Y+8RJ6rt9u+EPjnVfHnhGO817RH8Pa7C5gvLEuHQOP44yCco3UZ5HI5xk9vsKdXZWt+mh5qxWIw6vJqSdvxPrtWDqGUhlIyCOhpa474b6xDcaKlk9yrXUTNtiJ+bZ1GPXv0rsa8upB05OLPfo1VWpqa6nlPxQeVvEKK/wDq1hXZ+Zz+teCftF/DmP4ofCjVdHezvNQeMpdx2en3SW807RnIRXdHUEjOAV5OBkda+tvFHhW38TWyq7GG4j/1cwGcexHcVxDfCvU9xxdWhHbLMP8A2Wu6FSnOj7ObseNiMPXjiPbU1f8ArY/LK60vwdqPxs8C3U/h7xRbXt1bWF2ssmqQRxWy2kaxyiVDa7sxG2kDjcMlD93IA+ov2S/h/b+GfDeu+I4tH1fQZPE159s+xaxdJNKEBYq+1Yo9gbe2FbJxg55r6kf4PXklwlw7ae08YKpK24soOMgHbkZwPyFTf8Kr1X/n5s/++3/+JranOlBuTld6/i0/0RjWhiKsVBQaWn4X/wAzkrO6lsrqKeFiksbBlYeor36Ni0akjBIyRXB+H/hmbO8S41GeOYRtuWGLJVj7kgce2K76uXFVI1GlHod2X0KlFSc9Ln//2Q=="},545:function(e,s,n){e.exports=n.p+"assets/img/add_offline_en.3ac438a3.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{1055:function(e,s,n){"use strict";n.r(s);var t=n(2),r=Object(t.a)({},(function(){var e=this,s=e._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#users"}},[e._v("#")]),e._v(" Users")]),e._v(" "),s("p",[s("strong",[e._v("Video on YouTube:")]),e._v(" "),s("a",{attrs:{href:"https://www.youtube.com/watch?v=CoRUQJJnYaY&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=16&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Offline and online users"),s("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),s("p",[e._v("This chapter is about offline and online users, their differences and how to add or register them.")]),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),s("p",[e._v("In AsTeRICS Grid a user in general holds a set of grids which realize a specific solution for this user. A user doesn’t necessarily have to be a real person, it’s also possible to create a “user” for a specific usecase, for instance a specific smart home control interface.")]),e._v(" "),s("h3",{attrs:{id:"internet-connection-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internet-connection-requirements"}},[e._v("#")]),e._v(" Internet connection requirements")]),e._v(" "),s("p",[e._v("Despite being a web-application that runs in an internet browser, AsTeRICS Grid is designed to be usable also without internet connection.")]),e._v(" "),s("p",[s("strong",[e._v("Internet connection is required for:")])]),e._v(" "),s("ol",[s("li",[e._v("First usage of AsTeRICS Grid. Initially opening "),s("a",{attrs:{href:"https://grid.asterics.eu/",target:"_blank"}},[e._v("https://grid.asterics.eu/")]),e._v(" automatically downloads the whole application to browser cache and therefore AsTeRICS Grid is usable offline afterwards.")]),e._v(" "),s("li",[e._v("Synchronizing configuration of online users")])]),e._v(" "),s("p",[s("strong",[e._v("Without internet access it is possible to:")])]),e._v(" "),s("ol",[s("li",[e._v("Use AsTeRICS Grid by just re-opening "),s("a",{attrs:{href:"https://grid.asterics.eu/",target:"_blank"}},[e._v("https://grid.asterics.eu/")]),e._v(" in the browser (only initial access needs internet access).")]),e._v(" "),s("li",[e._v("switch between all saved users, which can be both offline and online users")])]),e._v(" "),s("h2",{attrs:{id:"online-users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#online-users"}},[e._v("#")]),e._v(" Online users")]),e._v(" "),s("p",[e._v("Online users are users whose configuration is automatically synchronized with a cloud storage. Therefore it’s possible to this user to log in on different devices while the configuration is always up-to-date on each device.")]),e._v(" "),s("p",[e._v("In view “add online user” it’s possible to register a new online user, Figure 6:")]),e._v(" "),s("p",[s("img",{attrs:{src:n(540),alt:"add online user view"}}),e._v(" "),s("em",[e._v("Fig. 6: Add online user view - register")])]),e._v(" "),s("p",[e._v("The following information is important for registering an online user:")]),e._v(" "),s("ul",[s("li",[e._v("The only data that is needed are a "),s("strong",[e._v("username")]),e._v(" and a "),s("strong",[e._v("password")]),e._v(". The username is needed for uniquely identifying a user and the password for securing his account and encrypting the data.")]),e._v(" "),s("li",[e._v("If you want to "),s("strong",[e._v("use AsTeRICS Grid completely anonymously")]),e._v(" just use a username without any relation to your person.")]),e._v(" "),s("li",[e._v("Since all data is "),s("strong",[e._v("end-to-end encrypted")]),e._v(" only the user itself can ever see his data and configuration, no server admin or anyone else.")]),e._v(" "),s("li",[e._v("End-to-end encryption is great for privacy, however it has the drawback that the "),s("strong",[e._v("data is lost")]),e._v(", if you logout your online account on all devices and forget your password. In this case there is "),s("strong",[e._v("no possibility of password recovery")]),e._v(", so "),s("strong",[e._v("remember your password carefully")]),e._v(". It’s also recommended to "),s("strong",[e._v("do backups")]),e._v(" of your grids (see "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("Manage grids view")]),e._v(").")],1),e._v(" "),s("li",[e._v('Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.')])]),e._v(" "),s("h3",{attrs:{id:"synchronization-states"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-states"}},[e._v("#")]),e._v(" Synchronization states")]),e._v(" "),s("p",[e._v("Online users can have the following synchronization states which are shown at the bottom of the navigation bar:")]),e._v(" "),s("p",[s("img",{attrs:{src:n(541),alt:"online user - synchronizing symbol"}}),e._v(" "),s("strong",[e._v("Synchronizing")]),e._v(": configuration is currently synchronizing with the cloud")]),e._v(" "),s("p",[s("img",{attrs:{src:n(542),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Synchronized")]),e._v(": configuration is up-to-date with the cloud storage")]),e._v(" "),s("p",[s("img",{attrs:{src:n(543),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Synchronization failed")]),e._v(": synchronization not possible, no internet connection")]),e._v(" "),s("p",[s("img",{attrs:{src:n(544),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Synchronization paused")]),e._v(": synchronization paused for a short time and will be resumed shortly")]),e._v(" "),s("p",[s("img",{attrs:{src:n(545),alt:"online user - synchronized symbol"}}),e._v(" "),s("strong",[e._v("Online only")]),e._v(": user is logged in online-only, meaning that configuration is not saved on the current device. Changes still will be saved in the cloud and therefore also be synchronized to other devices where this user is logged in. Users will be logged in online-only if the “remember checkbox” is unchecked when logging in (see "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#change-user---view"}},[e._v("change user view")]),e._v(").")],1),e._v(" "),s("h2",{attrs:{id:"offline-users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#offline-users"}},[e._v("#")]),e._v(" Offline users")]),e._v(" "),s("p",[e._v("Offline users are users whose configuration is only saved offline in the storage of the currently used browser. This type of users are perfectly suited for use cases where AsTeRICS Grid is only used on a single device.")]),e._v(" "),s("p",[e._v("In view “add offline user” it’s possible to add a new offline user (see "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#user"}},[e._v("Terms")]),e._v("), Figure 7:")],1),e._v(" "),s("p",[s("img",{attrs:{src:n(546),alt:"add offline user view"}}),e._v(" "),s("em",[e._v("Fig. 7: Add offline user view")])]),e._v(" "),s("p",[e._v("The following information is important regarding offline users:")]),e._v(" "),s("ul",[s("li",[e._v("All "),s("strong",[e._v("data of an offline user never leaves the device")]),e._v(", it’s stored in a browser-internal database.")]),e._v(" "),s("li",[e._v('Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.')])]),e._v(" "),s("h2",{attrs:{id:"backup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#backup"}},[e._v("#")]),e._v(" Backup")]),e._v(" "),s("p",[e._v("Regardless which type of users are used, we "),s("strong",[e._v("highly recommend to do backups")]),e._v(" if you are using AsTeRICS Grid on a regular basis and have put some effort into customizing own grids for your use-case. See "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("manage grids view")]),e._v(" for instructions how to create and restore backups.")],1),e._v(" "),s("p",[e._v("This is why backups are important:")]),e._v(" "),s("ol",[s("li",[s("strong",[e._v("Offline users")]),e._v(": since all data is only stored in an browser-internal storage, any browser crash or failure of your device could cause data loss.")]),e._v(" "),s("li",[s("strong",[e._v("Online users")]),e._v(": Although online users are not susceptible to device or browser errors, data loss is still possible because of the encryption of the user data. If the user forgets his password or decryption fails because of any kind of programming error the data cannot be recovered. Backups as described in "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#manage-grids---view"}},[e._v("manage grids view")]),e._v(" are saved to an unencrypted file and therefore can recover the user data in such a case.")],1)]),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/05_actions.html"}},[e._v("← Previous Chapter")]),e._v(" "),s("RouterLink",{attrs:{to:"/manuals/asterics-grid/07_dictionaries.html"}},[e._v("Next Chapter →")])],1),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);s.default=r.exports},540:function(e,s,n){e.exports=n.p+"assets/img/register_online_en.1f0b88fe.jpg"},541:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAeAC8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U65Xxr4yPh1Ut7ZVe8kXdluQi+uO5re1bVINFsZbu5bbGg6Dqx7Ae9eKeKfECatqFzqU4W1hC5O5+EVR1J/DNdeHpe0ldrRHnY3EexhaL95mgvjrXFm837exP90ou38sYrsNM+J9k9gGv0eO6BwUhXIb/aGTx9M18heINK+IvxV16afw34507w34OVB9kvNIVbua6Jzksx4XHtXK6F8cda+Cnj7/AIQz4qa9Y6vaXURl0/XrUYcsDjypYlXIYkj2HHau2cKUtHGy7nkUauIjdxnzPtqz9ENJ1qz1y18+zl8xAcMMYKn0Iq9XkHw38TWemXTyTzOltdRrsbadvqCw6jg+nevXlYOoZSGUjII6GvPrUvZSstj28LiPrFO736nF/FSOVtFtmXPlLN8+PocH/PrXh3j/AMJt468H6noI1GfShfReS11bAF1U9cZ9Rx+NfUF5aQ39tJb3EYlhkGGVu9cRc/CeB5maDUJIoz0R4g5H45FdGHrQjFwmcWMwtWpUVWlqfnb8ILrTP2OdZ8Q6D4t0vVUt7mbzbTXrOOae3u4e25AMK6jqQPb69/4b0HwT+0Z48bxTN4Dv7JNLljltNevE8j7cw/hKdWA9xivsuT4PxTLtk1EOvXDWwI/9Cpy/CJI1Crqe1R0At8D/ANCrWNSkvd5tPQ55UMTJufJ7z63R54OOB0r2bwG8snhWxMpJOGC5/uhiB+lYln8KbaKdWub57iIcmNY9mfxya7iGFLeFIo1CRoAqqvQAdBWeJrQqRUYm+BwlWjNzqaH/2Q=="},542:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAhAC8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6yfEHiS08OWoluCWd+I4k+8x/oPetOWVII2kkZUjUZZmOAB6143421qPW9dklgkMtuihIzggcdevvmuihS9rOz2OLF4j6vT5lv0OhX4sSedltOXyf7olO788f0rsdM8TadqlgLtLhIo87WEzBSreh5rw6vO7b49eE7/AOLh+HNncXF9r8cDzTPbQmS3gZeTHI4PyvjnkYHQkMQK9CeGpNqK0bPFo47EK8pe8l+B9kK6yKGUhlIyGByDTq84+FuqOtxdWMkw8oqHjRm53Z52j6fyr0evNq0/ZS5T3sPWWIpqaVjjPijdyw6JBEhISaXDkdwBkD8/5V5Hqlm+o6Zd2kd1NYyTwvEt1b48yEspAdcgjcM5GQRkV79r2iw+INNktJjtz8yOBkqw6GvMrn4c63DMyRwR3CDpIkqgH8CQa7MNOHI4SdjycfRqyqqpBXR+fN5r3x/+HF5P8HLRZPEN9qrsdG8YTM5eO0z+9ZnOcFdwyWO5M4G7KGvo74C/APRfgX4ZNran+0NdvMSalrEo/e3MnUgE8hAScL+JySTXuf8Awr7Xv+fEf9/k/wDiqP8AhX2vf8+I/wC/yf8AxVdVN04auV3tfy7f59zjqqvUXKqbS3dk9X3/AOB0OdVijBlJVgcgjqK9r8H6lLq3h20uJzumIKs397BIz+leeWfw31m4nVJoktY+8jSK2PwBNepaXpsWkafBZw58uJcAnqe5P4mubFVISikndnZl9GrTm5SVkW6KKK8w98KKKKACiiigD//Z"},543:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAfAC4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U65Xxd44j8OuLaCNZ7wjcQx+VB2z6n2rd1bVrbRbJ7q6fZGvAA5LH0A9a8U1rUP7W1a6uwGCzSFlDdQOw/KuvD0faSvLZHm47EuhC0H7zOjtvihqsc26aK3miJ5TaVOPY5/nmu0tfHejXFpDNJdrbtJ1ifJZT6HH86+LdP8A2t/BcV34xsvEZuPCWpeGpXWWx1QBZrmIHCSQqPvFsjCjJ+ZTyDmu7+EPxIHxY8CWHidNGvdDhvC5itr4De0YYhZBjqrDBB/mME9vsaNZJw7X07P+vU8pYrFYe/tNemvf+vkfWkM8dzEssUiyxsMq6HIP0NSV598L9Yhjt57Ca5VZGk3QxMcE5HOP04r0GvMq0/ZzcT3sPWVempnnPxYeXzdOT/ljtcj/AHuP6V5/XufiDQbfxFYm2uMqQdySL1RvWuCk+FWorIwju7Vk7MxZSfwwf5134etCMOWTsePjsLVnV9pBXTPz9+JX7NfxC/aM8beJfE+vR6f4RfSgbPw9YvHHP9sWN9yvO4zlG56g43fdwDu+mPg7qnivVvh9pkvjTRItA8QxqYZ7WF1ZDsO0SAKSFDAZ2gnFez/8Kr1X/n5s/wDvt/8A4mj/AIVXqv8Az82f/fb/APxNa0p0aStGW/59/V/d5HPWp4mskpQ228l29PxONVijBlJVgcgjqK930O5kvNGsZ5v9bJCjMfUkDmuH0v4VzLdK2oXURgU5KQZJb2yQMV6JGixoqIoVFGAo6Aelc2Kqwmko6nfl+Hq0nKU1ZM//2Q=="},544:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAeACoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6878eeNLm3vX06wlMAj4lmT7xb0B7YrqPFniZPDNgsmwS3Eh2xRnp7k+wr5w+NGuXtv8N/HGr287W2ox6Te3Mc8J2tHIIXZWX0IIBH0rrowsnVkrpJnmYus7xoU3aUmvlc7W21/UrSbzor64WTOSfMJB+oPX8a7S1+KypaQi4smluekjIwVT7j/AAr8k/2ffiz421LwR8YJbzxdrl7LZ+GnuLaS61CWVoJA4AeMsxKNgnkYP5V61/wTx8eeJfGNx44i1/xBqmuJbpaNCNSvJLjyyxlDbd5OM4GcegruXs68lFx6c34tfoeby18LCc4z+FpffZ/qfqLoutW2vWK3VqxKE7SrDDKfQ1frynwD4qttBeW2ulZY7hwfOB4Q9OR6e9eqghgCORXnVqfspWWx7GFxCxFNNvXqee/Fezlb7DdAEwqGjPoCcEfnz+VeM/ErQbrxR8O/FGjWIQ3uoaXdWkAkbapkkiZVyewyRX1HdWkN9bvBcRrLC4wyMMg1y0nwv0eSRmV7qMH+FZBgfmpNbU60PZOlP+rnJiMLUlXVelvpv5H5ZfA79lH4leF/B/xRs9Y0WHTrrWdCbT7CJ76GQzSlt3VHYKOMZYjqPfHpf7DfwJ8afBxvF1x4v0tNJOoC2S3iF1FMzbPMLE+WzAD5x1OevFfoB/wq3Sf+e95/32v/AMTR/wAKt0n/AJ73n/fa/wDxNbU61GnJSTeit8rt/qY1KGKqxlBpWk7v5WX6I8qr23R7W9j0ixR32usCAq3UHaOKp6X8P9J0u6WcLLcSKcr57AhT64AH610tZV8Qp2UUaYXAyp3dR29Gf//Z"},545:function(e,s){e.exports="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAgACsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U64vxZ8Qho909nYxJNcJxJJJnap9MDqa6DXvENp4dtRNcsSW4SNOWY+1fO/jvxU/hnw/qutiym1S4hRpI7OAgSXEhPyoCeBknqenJrroU1K857I8zGYiVO1Ok/eZ6Vp/xR1CGYfa4YbiEnnYNrD6Hp+ldvF400WQQ/6fGhlAIVuNuezdgfrX54SfGX4xzfELwnZ/8I5b22i3lpH/AGmUiVlt55wSnJfcRCGj3Y+8RJ6rt9u+EPjnVfHnhGO817RH8Pa7C5gvLEuHQOP44yCco3UZ5HI5xk9vsKdXZWt+mh5qxWIw6vJqSdvxPrtWDqGUhlIyCOhpa474b6xDcaKlk9yrXUTNtiJ+bZ1GPXv0rsa8upB05OLPfo1VWpqa6nlPxQeVvEKK/wDq1hXZ+Zz+teCftF/DmP4ofCjVdHezvNQeMpdx2en3SW807RnIRXdHUEjOAV5OBkda+tvFHhW38TWyq7GG4j/1cwGcexHcVxDfCvU9xxdWhHbLMP8A2Wu6FSnOj7ObseNiMPXjiPbU1f8ArY/LK60vwdqPxs8C3U/h7xRbXt1bWF2ssmqQRxWy2kaxyiVDa7sxG2kDjcMlD93IA+ov2S/h/b+GfDeu+I4tH1fQZPE159s+xaxdJNKEBYq+1Yo9gbe2FbJxg55r6kf4PXklwlw7ae08YKpK24soOMgHbkZwPyFTf8Kr1X/n5s/++3/+JranOlBuTld6/i0/0RjWhiKsVBQaWn4X/wAzkrO6lsrqKeFiksbBlYeor36Ni0akjBIyRXB+H/hmbO8S41GeOYRtuWGLJVj7kgce2K76uXFVI1GlHod2X0KlFSc9Ln//2Q=="},546:function(e,s,n){e.exports=n.p+"assets/img/add_offline_en.3ac438a3.jpg"}}]); \ No newline at end of file diff --git a/assets/js/209.8d1b702d.js b/assets/js/210.8884af79.js similarity index 89% rename from assets/js/209.8d1b702d.js rename to assets/js/210.8884af79.js index 23e7da9871..fc77e29e0d 100644 --- a/assets/js/209.8d1b702d.js +++ b/assets/js/210.8884af79.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[209],{1162:function(t,r,e){"use strict";e.r(r);var n=e(2),o=Object(n.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"int-to-string"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#int-to-string"}},[t._v("#")]),t._v(" Int To String")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),r("p",[t._v("This component converts the incoming integer values to the string values at the output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:e(727),alt:"Screenshot: IntToString plugin",title:"Screenshot: IntToString plugin"}})]),t._v(" "),r("p",[t._v("IntToString plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input [integer]:")]),t._v(" Input port for the integer values to be converted.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [string]:")]),t._v(" Output port for the converted string values.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("hexadecimalOutput [boolean]:")]),t._v(" If this property is set, the integer is converted into a hexadecimal string.")])])])}),[],!1,null,null,null);r.default=o.exports},727:function(t,r,e){t.exports=e.p+"assets/img/inttostring.426a5209.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[210],{1167:function(t,r,e){"use strict";e.r(r);var n=e(2),o=Object(n.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"int-to-string"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#int-to-string"}},[t._v("#")]),t._v(" Int To String")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),r("p",[t._v("This component converts the incoming integer values to the string values at the output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:e(731),alt:"Screenshot: IntToString plugin",title:"Screenshot: IntToString plugin"}})]),t._v(" "),r("p",[t._v("IntToString plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input [integer]:")]),t._v(" Input port for the integer values to be converted.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [string]:")]),t._v(" Output port for the converted string values.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("hexadecimalOutput [boolean]:")]),t._v(" If this property is set, the integer is converted into a hexadecimal string.")])])])}),[],!1,null,null,null);r.default=o.exports},731:function(t,r,e){t.exports=e.p+"assets/img/inttostring.426a5209.jpg"}}]); \ No newline at end of file diff --git a/assets/js/210.b0b3ae19.js b/assets/js/211.17f9fe58.js similarity index 93% rename from assets/js/210.b0b3ae19.js rename to assets/js/211.17f9fe58.js index 440fef4134..54fc96715e 100644 --- a/assets/js/210.b0b3ae19.js +++ b/assets/js/211.17f9fe58.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[210],{1163:function(t,e,i){"use strict";i.r(e);var r=i(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"integrate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integrate"}},[t._v("#")]),t._v(" Integrate")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The integrate component performs successive addition of incoming signal values. This is useful for transforming relative movement information coming from a sensor into absolute position values.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(728),alt:"Screenshot: Integrate plugin",title:"Screenshot: Integrate plugin"}})]),t._v(" "),e("p",[t._v("Integrate plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" The input port for signal values.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" Output of the integrated values.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("reset:")]),t._v(" An incoming event at this port sets the current accumulator value to the rest value (specified in the rest property field).")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("resetValue [double]:")]),t._v(" The initial value of the accumulator, which is set when starting the model or when an event comes in at the elp_rest event listener port.")]),t._v(" "),e("li",[e("strong",[t._v("upperLimit [double]:")]),t._v(" The maximum accumulator value (the integration sum will stay at this value and not get higher even if positive values come in at the input port).")]),t._v(" "),e("li",[e("strong",[t._v("lowerLimit [double]:")]),t._v(" The minimum accumulator value (the integration sum will stay at this value and not get lower even if negative values come in at the input port) Upper and lower limit are useful e.g. to set bounds for mouse movement etc.")]),t._v(" "),e("li",[e("strong",[t._v("wrapAround [boolean]:")]),t._v(" If this property is set to true, the accumulator value is set to the lower_limit if it gets greater than the upper_limit (overflow), and to the upper_limit if it would get lower than the lower_limit (underflow).")])])])}),[],!1,null,null,null);e.default=o.exports},728:function(t,e,i){t.exports=i.p+"assets/img/integrate.dfb8529f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[211],{1168:function(t,e,i){"use strict";i.r(e);var r=i(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"integrate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integrate"}},[t._v("#")]),t._v(" Integrate")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The integrate component performs successive addition of incoming signal values. This is useful for transforming relative movement information coming from a sensor into absolute position values.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(732),alt:"Screenshot: Integrate plugin",title:"Screenshot: Integrate plugin"}})]),t._v(" "),e("p",[t._v("Integrate plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" The input port for signal values.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" Output of the integrated values.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("reset:")]),t._v(" An incoming event at this port sets the current accumulator value to the rest value (specified in the rest property field).")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("resetValue [double]:")]),t._v(" The initial value of the accumulator, which is set when starting the model or when an event comes in at the elp_rest event listener port.")]),t._v(" "),e("li",[e("strong",[t._v("upperLimit [double]:")]),t._v(" The maximum accumulator value (the integration sum will stay at this value and not get higher even if positive values come in at the input port).")]),t._v(" "),e("li",[e("strong",[t._v("lowerLimit [double]:")]),t._v(" The minimum accumulator value (the integration sum will stay at this value and not get lower even if negative values come in at the input port) Upper and lower limit are useful e.g. to set bounds for mouse movement etc.")]),t._v(" "),e("li",[e("strong",[t._v("wrapAround [boolean]:")]),t._v(" If this property is set to true, the accumulator value is set to the lower_limit if it gets greater than the upper_limit (overflow), and to the upper_limit if it would get lower than the lower_limit (underflow).")])])])}),[],!1,null,null,null);e.default=o.exports},732:function(t,e,i){t.exports=i.p+"assets/img/integrate.dfb8529f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/211.bb2dc0f7.js b/assets/js/212.599b809c.js similarity index 96% rename from assets/js/211.bb2dc0f7.js rename to assets/js/212.599b809c.js index 11d22bb1b7..4520548231 100644 --- a/assets/js/211.bb2dc0f7.js +++ b/assets/js/212.599b809c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[211],{1165:function(e,r,t){"use strict";t.r(r);var o=t(2),n=Object(o.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"irmicro"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#irmicro"}},[e._v("#")]),e._v(" IrMicro")]),e._v(" "),r("h2",{attrs:{id:"component-type-processor-subcategory-home-control"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-home-control"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Home Control)")]),e._v(" "),r("p",[e._v("The IRMicro plugin connects to a Microcontroller via a COM port in order to receive and sent infrared (IR-) remote control commands (raw timing values).\nThe values are stored in (or loded from) .csv file (one file per command, given the command’s name as "),r("code",[e._v("filename.csv")]),e._v(") in the ARE subfolder "),r("code",[e._v("./data/processor.IRMicro")]),e._v(".")]),e._v(" "),r("p",[r("img",{attrs:{src:t(730),alt:"Screenshot: IrMicro plugin",title:"Screenshot: IrMicro plugin"}})]),e._v(" "),r("h2",{attrs:{id:"requirements"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),r("p",[e._v("A connection to a microcontroller running the IrMicro firmware is required.\nThe IrMicro firmware is provided in folder "),r("code",[e._v("/CIMS/IrMicro")]),e._v(".\nThis firmware is an Arduino Sketch for record/replay of infrared commands.\nConnect a TSOP module (e.g. TSOP4838) to pin 11 and an IR led with current-limiting resistor to send pin of a compatible microcontroller (for examle pin 3 for the Arduino Uno).\nFor a list of compatible controllers and default send pins see: "),r("a",{attrs:{href:"https://github.com/z3t0/Arduino-IRremote",target:"_blank",rel:"noopener noreferrer"}},[e._v("IR-Remote Github repository"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("sendName[string]:")]),e._v(" A string which contains a known command name. The existing (recorded) commands are stored in .csv files in the folder "),r("code",[e._v("ARE/data/processor.IRMicro")]),e._v(". If the command file is found, the stored timing codes are replayed by the connected microcontroller")])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("recordName[string]:")]),e._v(" A string which contains the name of a command which shall be recorded. The microcontroller is put into recording mode and waits (until a given timeout) for an IR code to be received via the TSOP module. After a command has been recorded, the codes are stored in a .csv file (filename is the command name) in the folder "),r("code",[e._v("ARE/data/processor.IRMicro")]),e._v(".")])])]),e._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("receivedName[string]:")]),e._v(" If a known IR command has been received via the microcontroller’s TSOP module, the command name is put out on this port as a string")]),e._v(" "),r("li",[r("strong",[e._v("receivedHex[string]:")]),e._v(" The timing values of a known or unknown command are sent to this output port as a string")])]),e._v(" "),r("h2",{attrs:{id:"event-listener-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("clearAll:")]),e._v(" all stored IR-commands are cleared.")]),e._v(" "),r("li",[r("strong",[e._v("clearLast:")]),e._v(" the last recorded IR-command is cleared.")])]),e._v(" "),r("h2",{attrs:{id:"event-trigger-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("recordFinished:")]),e._v(" a new command was recorded successfully.")]),e._v(" "),r("li",[r("strong",[e._v("recordTimeout:")]),e._v(" the timeout value was reched when trying to record a new command.")])]),e._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("ComPort[string]:")]),e._v(" The name of the Comunication port which shall be opened in order to communicte with the microcontroller.")]),e._v(" "),r("li",[r("strong",[e._v("Timeout[integer]:")]),e._v(" The timeout for recording a new IR-command (in milliseconds).")])])])}),[],!1,null,null,null);r.default=n.exports},730:function(e,r,t){e.exports=t.p+"assets/img/irmicro.b79a2e80.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[212],{1171:function(e,r,t){"use strict";t.r(r);var o=t(2),n=Object(o.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"irmicro"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#irmicro"}},[e._v("#")]),e._v(" IrMicro")]),e._v(" "),r("h2",{attrs:{id:"component-type-processor-subcategory-home-control"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-home-control"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Home Control)")]),e._v(" "),r("p",[e._v("The IRMicro plugin connects to a Microcontroller via a COM port in order to receive and sent infrared (IR-) remote control commands (raw timing values).\nThe values are stored in (or loded from) .csv file (one file per command, given the command’s name as "),r("code",[e._v("filename.csv")]),e._v(") in the ARE subfolder "),r("code",[e._v("./data/processor.IRMicro")]),e._v(".")]),e._v(" "),r("p",[r("img",{attrs:{src:t(734),alt:"Screenshot: IrMicro plugin",title:"Screenshot: IrMicro plugin"}})]),e._v(" "),r("h2",{attrs:{id:"requirements"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),r("p",[e._v("A connection to a microcontroller running the IrMicro firmware is required.\nThe IrMicro firmware is provided in folder "),r("code",[e._v("/CIMS/IrMicro")]),e._v(".\nThis firmware is an Arduino Sketch for record/replay of infrared commands.\nConnect a TSOP module (e.g. TSOP4838) to pin 11 and an IR led with current-limiting resistor to send pin of a compatible microcontroller (for examle pin 3 for the Arduino Uno).\nFor a list of compatible controllers and default send pins see: "),r("a",{attrs:{href:"https://github.com/z3t0/Arduino-IRremote",target:"_blank",rel:"noopener noreferrer"}},[e._v("IR-Remote Github repository"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("sendName[string]:")]),e._v(" A string which contains a known command name. The existing (recorded) commands are stored in .csv files in the folder "),r("code",[e._v("ARE/data/processor.IRMicro")]),e._v(". If the command file is found, the stored timing codes are replayed by the connected microcontroller")])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("recordName[string]:")]),e._v(" A string which contains the name of a command which shall be recorded. The microcontroller is put into recording mode and waits (until a given timeout) for an IR code to be received via the TSOP module. After a command has been recorded, the codes are stored in a .csv file (filename is the command name) in the folder "),r("code",[e._v("ARE/data/processor.IRMicro")]),e._v(".")])])]),e._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("receivedName[string]:")]),e._v(" If a known IR command has been received via the microcontroller’s TSOP module, the command name is put out on this port as a string")]),e._v(" "),r("li",[r("strong",[e._v("receivedHex[string]:")]),e._v(" The timing values of a known or unknown command are sent to this output port as a string")])]),e._v(" "),r("h2",{attrs:{id:"event-listener-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("clearAll:")]),e._v(" all stored IR-commands are cleared.")]),e._v(" "),r("li",[r("strong",[e._v("clearLast:")]),e._v(" the last recorded IR-command is cleared.")])]),e._v(" "),r("h2",{attrs:{id:"event-trigger-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("recordFinished:")]),e._v(" a new command was recorded successfully.")]),e._v(" "),r("li",[r("strong",[e._v("recordTimeout:")]),e._v(" the timeout value was reched when trying to record a new command.")])]),e._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("ComPort[string]:")]),e._v(" The name of the Comunication port which shall be opened in order to communicte with the microcontroller.")]),e._v(" "),r("li",[r("strong",[e._v("Timeout[integer]:")]),e._v(" The timeout for recording a new IR-command (in milliseconds).")])])])}),[],!1,null,null,null);r.default=n.exports},734:function(e,r,t){e.exports=t.p+"assets/img/irmicro.b79a2e80.jpg"}}]); \ No newline at end of file diff --git a/assets/js/212.3ebcc546.js b/assets/js/213.fdeeaaeb.js similarity index 92% rename from assets/js/212.3ebcc546.js rename to assets/js/213.fdeeaaeb.js index 38b5bc4d52..a3055a89b4 100644 --- a/assets/js/212.3ebcc546.js +++ b/assets/js/213.fdeeaaeb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[212],{1168:function(t,e,r){"use strict";r.r(e);var s=r(2),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The math evaluator is a component with four inputs. These inputs can be combined in a mathematical expression which is entered via a property of the component. The expression parser used is "),e("a",{attrs:{href:"http://sourceforge.net/projects/jeplite/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JEPlite2"),e("OutboundLink")],1),t._v(" which supports arithmetic as well as numerous mathematical expressions.")]),t._v(" "),e("p",[t._v("The list of supported mathematical functions is sin(), cos(), tan(), asin(), ,acos(), atan(), sqrt(), log(), ln(), angle(), abs(), mod(), sum(), rand(), umin(), add().")]),t._v(" "),e("p",[e("img",{attrs:{src:r(732),alt:"Screenshot: MathEvaluator plugin",title:"Screenshot: MathEvaluator plugin"}})]),t._v(" "),e("p",[t._v("MathEvaluator plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The component depends on the JEPlite library which is included in the component’s JAR file.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inA to inD [double]:")]),t._v(" The inputs which can be accessed in the mathematical expression via a to d. "),e("strong",[t._v("These 4 input ports support synchronization")])])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" the result of the expression.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("expression [string]:")]),t._v(" Mathematical expression to be evaluated.")])])])}),[],!1,null,null,null);e.default=a.exports},732:function(t,e,r){t.exports=r.p+"assets/img/mathevaluator.adcd03a1.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[213],{1170:function(t,e,r){"use strict";r.r(e);var s=r(2),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("The math evaluator is a component with four inputs. These inputs can be combined in a mathematical expression which is entered via a property of the component. The expression parser used is "),e("a",{attrs:{href:"http://sourceforge.net/projects/jeplite/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JEPlite2"),e("OutboundLink")],1),t._v(" which supports arithmetic as well as numerous mathematical expressions.")]),t._v(" "),e("p",[t._v("The list of supported mathematical functions is sin(), cos(), tan(), asin(), ,acos(), atan(), sqrt(), log(), ln(), angle(), abs(), mod(), sum(), rand(), umin(), add().")]),t._v(" "),e("p",[e("img",{attrs:{src:r(733),alt:"Screenshot: MathEvaluator plugin",title:"Screenshot: MathEvaluator plugin"}})]),t._v(" "),e("p",[t._v("MathEvaluator plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The component depends on the JEPlite library which is included in the component’s JAR file.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inA to inD [double]:")]),t._v(" The inputs which can be accessed in the mathematical expression via a to d. "),e("strong",[t._v("These 4 input ports support synchronization")])])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" the result of the expression.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("expression [string]:")]),t._v(" Mathematical expression to be evaluated.")])])])}),[],!1,null,null,null);e.default=a.exports},733:function(t,e,r){t.exports=r.p+"assets/img/mathevaluator.adcd03a1.jpg"}}]); \ No newline at end of file diff --git a/assets/js/213.c54e3369.js b/assets/js/214.c90e5ec0.js similarity index 92% rename from assets/js/213.c54e3369.js rename to assets/js/214.c90e5ec0.js index 2b53e2fbfd..c3ae84725b 100644 --- a/assets/js/213.c54e3369.js +++ b/assets/js/214.c90e5ec0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[213],{1167:function(t,e,i){"use strict";i.r(e);var n=i(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"minmax"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minmax"}},[t._v("#")]),t._v(" MinMax")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component stores maximum and minimum of an incoming signal and provides these values at the output ports. Together with the signaltranslation component, the minmax component can be used to auto-scale input values to a desired signal range.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(731),alt:"Screenshot: MinMax plugin",title:"Screenshot: MinMax plugin"}})]),t._v(" "),e("p",[t._v("MinMax plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" Input signal for min/max calculation.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outMax [double]:")]),t._v(" The current maximum value found in the signal.")]),t._v(" "),e("li",[e("strong",[t._v("outMin [double]:")]),t._v(" The current minimum value found in the signal.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("reset:")]),t._v(" An incoming event sets the current minimum and maximum to the values defined in the associated property fields defaultMin and defaultMax.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("defaultMin [double]:")]),t._v(" This is the default minimum value which is set when the model is started or if an event comes in at the rest event listener port.")]),t._v(" "),e("li",[e("strong",[t._v("defaultMax [double]:")]),t._v(" This is the default maximum value which is set when the model is started or if an event comes in at the reset event listener port.")])])])}),[],!1,null,null,null);e.default=s.exports},731:function(t,e,i){t.exports=i.p+"assets/img/minmax.cca23fa8.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[214],{1172:function(t,e,i){"use strict";i.r(e);var n=i(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"minmax"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minmax"}},[t._v("#")]),t._v(" MinMax")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component stores maximum and minimum of an incoming signal and provides these values at the output ports. Together with the signaltranslation component, the minmax component can be used to auto-scale input values to a desired signal range.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(735),alt:"Screenshot: MinMax plugin",title:"Screenshot: MinMax plugin"}})]),t._v(" "),e("p",[t._v("MinMax plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" Input signal for min/max calculation.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outMax [double]:")]),t._v(" The current maximum value found in the signal.")]),t._v(" "),e("li",[e("strong",[t._v("outMin [double]:")]),t._v(" The current minimum value found in the signal.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("reset:")]),t._v(" An incoming event sets the current minimum and maximum to the values defined in the associated property fields defaultMin and defaultMax.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("defaultMin [double]:")]),t._v(" This is the default minimum value which is set when the model is started or if an event comes in at the rest event listener port.")]),t._v(" "),e("li",[e("strong",[t._v("defaultMax [double]:")]),t._v(" This is the default maximum value which is set when the model is started or if an event comes in at the reset event listener port.")])])])}),[],!1,null,null,null);e.default=s.exports},735:function(t,e,i){t.exports=i.p+"assets/img/minmax.cca23fa8.jpg"}}]); \ No newline at end of file diff --git a/assets/js/214.463bf3b2.js b/assets/js/215.c021b553.js similarity index 95% rename from assets/js/214.463bf3b2.js rename to assets/js/215.c021b553.js index 2cff40b26d..3337b4af6a 100644 --- a/assets/js/214.463bf3b2.js +++ b/assets/js/215.c021b553.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[214],{1171:function(t,r,o){"use strict";o.r(r);var s=o(2),u=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"multisource"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#multisource"}},[t._v("#")]),t._v(" MultiSource")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),r("p",[t._v("This plugin passes signals from up to four input ports to one output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:o(736),alt:"Screenshot: MultiSource plugin",title:"Screenshot: MultiSource plugin"}})]),t._v(" "),r("p",[t._v("MultiSource plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input1…input4 [double]:")]),t._v(" Input ports 1 to 4")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [**"),r("strong",[t._v("double*")]),t._v("*]:")]),t._v(" The output port where all input signals are routed.")])])])}),[],!1,null,null,null);r.default=u.exports},736:function(t,r,o){t.exports=o.p+"assets/img/multisource.cf759460.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[215],{1173:function(t,r,o){"use strict";o.r(r);var s=o(2),u=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"multisource"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#multisource"}},[t._v("#")]),t._v(" MultiSource")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),r("p",[t._v("This plugin passes signals from up to four input ports to one output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:o(736),alt:"Screenshot: MultiSource plugin",title:"Screenshot: MultiSource plugin"}})]),t._v(" "),r("p",[t._v("MultiSource plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input1…input4 [double]:")]),t._v(" Input ports 1 to 4")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [**"),r("strong",[t._v("double*")]),t._v("*]:")]),t._v(" The output port where all input signals are routed.")])])])}),[],!1,null,null,null);r.default=u.exports},736:function(t,r,o){t.exports=o.p+"assets/img/multisource.cf759460.jpg"}}]); \ No newline at end of file diff --git a/assets/js/215.bd517545.js b/assets/js/216.4d29d44a.js similarity index 87% rename from assets/js/215.bd517545.js rename to assets/js/216.4d29d44a.js index d373ef0b8e..a62fdc096a 100644 --- a/assets/js/215.bd517545.js +++ b/assets/js/216.4d29d44a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[215],{1172:function(t,r,s){"use strict";s.r(r);var i=s(2),o=Object(i.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"multisourcestring"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#multisourcestring"}},[t._v("#")]),t._v(" MultiSourceString")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),r("p",[t._v("This plugin passes string inputs from up to four input ports to one output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:s(737),alt:"Screenshot: MultiSourceString plugin",title:"Screenshot: MultiSourceString plugin"}})]),t._v(" "),r("p",[t._v("MultiSourceString plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input1…input4 [string]:")]),t._v(" Input ports 1 to 4.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [**"),r("strong",[t._v("string*")]),t._v("*]:")]),t._v(" Output port.")])])])}),[],!1,null,null,null);r.default=o.exports},737:function(t,r,s){t.exports=s.p+"assets/img/multisourcestring.ec5057b7.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[216],{1175:function(t,r,s){"use strict";s.r(r);var i=s(2),o=Object(i.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"multisourcestring"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#multisourcestring"}},[t._v("#")]),t._v(" MultiSourceString")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),r("p",[t._v("This plugin passes string inputs from up to four input ports to one output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:s(739),alt:"Screenshot: MultiSourceString plugin",title:"Screenshot: MultiSourceString plugin"}})]),t._v(" "),r("p",[t._v("MultiSourceString plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input1…input4 [string]:")]),t._v(" Input ports 1 to 4.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [**"),r("strong",[t._v("string*")]),t._v("*]:")]),t._v(" Output port.")])])])}),[],!1,null,null,null);r.default=o.exports},739:function(t,r,s){t.exports=s.p+"assets/img/multisourcestring.ec5057b7.jpg"}}]); \ No newline at end of file diff --git a/assets/js/216.2b049196.js b/assets/js/217.6975c22e.js similarity index 92% rename from assets/js/216.2b049196.js rename to assets/js/217.6975c22e.js index 4fda7011c0..89f8a6e65b 100644 --- a/assets/js/216.2b049196.js +++ b/assets/js/217.6975c22e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[216],{1170:function(t,e,r){"use strict";r.r(e);var o=r(2),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"neural-network-loader"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#neural-network-loader"}},[t._v("#")]),t._v(" Neural Network Loader")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This plugin uses the "),e("a",{attrs:{href:"http://www.heatonresearch.com/encog",target:"_blank",rel:"noopener noreferrer"}},[t._v("Encog framework"),e("OutboundLink")],1),t._v(" (version: 3.0.1). The plugin can load a neural network configuration stored in the Encog EG file. The neural network‘s output is calculated for the input data.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(735),alt:"Screenshot: NeuralNetworkLoader plugin",title:"Screenshot: NeuralNetworkLoader plugin"}})]),t._v(" "),e("p",[t._v("NeuralNetworkLoader plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1…input32 [double]:")]),t._v(" The Neural network inputs.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output1…output32 [**"),e("strong",[t._v("double*")]),t._v("*]:")]),t._v(" The Neural network outputs.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("filePath [string]:")]),t._v(" The EG file path.")])]),t._v(" "),e("p",[e("a",{attrs:{href:"eg_example.htm"}},[t._v("How to prepare example EG file for the Neural Network Loader plugin.")])])])}),[],!1,null,null,null);e.default=a.exports},735:function(t,e,r){t.exports=r.p+"assets/img/neuralnetworkloader.ce3e707d.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[217],{1176:function(t,e,r){"use strict";r.r(e);var o=r(2),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"neural-network-loader"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#neural-network-loader"}},[t._v("#")]),t._v(" Neural Network Loader")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This plugin uses the "),e("a",{attrs:{href:"http://www.heatonresearch.com/encog",target:"_blank",rel:"noopener noreferrer"}},[t._v("Encog framework"),e("OutboundLink")],1),t._v(" (version: 3.0.1). The plugin can load a neural network configuration stored in the Encog EG file. The neural network‘s output is calculated for the input data.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(740),alt:"Screenshot: NeuralNetworkLoader plugin",title:"Screenshot: NeuralNetworkLoader plugin"}})]),t._v(" "),e("p",[t._v("NeuralNetworkLoader plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1…input32 [double]:")]),t._v(" The Neural network inputs.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output1…output32 [**"),e("strong",[t._v("double*")]),t._v("*]:")]),t._v(" The Neural network outputs.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("filePath [string]:")]),t._v(" The EG file path.")])]),t._v(" "),e("p",[e("a",{attrs:{href:"eg_example.htm"}},[t._v("How to prepare example EG file for the Neural Network Loader plugin.")])])])}),[],!1,null,null,null);e.default=a.exports},740:function(t,e,r){t.exports=r.p+"assets/img/neuralnetworkloader.ce3e707d.jpg"}}]); \ No newline at end of file diff --git a/assets/js/217.1bea0583.js b/assets/js/218.4322b73e.js similarity index 96% rename from assets/js/217.1bea0583.js rename to assets/js/218.4322b73e.js index 33d7f37ffd..b8c3916d76 100644 --- a/assets/js/217.1bea0583.js +++ b/assets/js/218.4322b73e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[217],{1174:function(t,e,n){"use strict";n.r(e);var o=n(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"nexusconnector"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nexusconnector"}},[t._v("#")]),t._v(" NexusConnector")]),t._v(" "),e("p",[t._v("Component Type: Processors (Subcategory: Web)")]),t._v(" "),e("p",[t._v("The NexusConnector component provides a bidirectional connection to a GPII Nexus instance.")]),t._v(" "),e("p",[e("img",{attrs:{src:n(739),alt:"Screenshot: NexusConnector plugin",title:"Screenshot: NexusConnector plugin"}})]),t._v(" "),e("p",[t._v("NexusConnector plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The NexusConnector component requres a running GPII Nexus instance to connect to and a peer component constructed within the Nexus for the connector to bind to. The Nexus instance is run and managed separately from this component and AsTeRICS. Please see the “Properties” section below for details on specifying the address of the Nexus instance to connect to.")]),t._v(" "),e("p",[t._v("The NexusConnector component expects the peer component within the Nexus to have a model of the following structure:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("\n\t\t{\n\t\t\tconnector: {\n\t\t\t\tinputs: {\n\t\t\t\t\tin1d: ,\n\t\t\t\t\tin2d: ,\n\t\t\t\t\tin3d: ,\n\t\t\t\t\tin4d: ,\n\t\t\t\t\tin5s: ,\n\t\t\t\t\tin6s: ,\n\t\t\t\t\tin7s: ,\n\t\t\t\t\tin8s: \n\t\t\t\t},\n\t\t\t\toutputs: {\n\t\t\t\t\tout1d: ,\n\t\t\t\t\tout2d: ,\n\t\t\t\t\tout3d: ,\n\t\t\t\t\tout4d: ,\n\t\t\t\t\tout5s: ,\n\t\t\t\t\tout6s: ,\n\t\t\t\t\tout7s: ,\n\t\t\t\t\tout8s: \n\t\t\t\t}\n\t\t\t}\n\t\t}\n")])])]),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("p",[t._v("The NexusConnector component has 8 generic input ports. Four each of type double and string. When a value on one of the inputs changes, that change is relayed to the Nexus and the model of the bound component is updated.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in1d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in2d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in3d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in4d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in5s [string]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in6s [string]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in7s [string]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in8s [string]:")]),t._v(" Sent to the Nexus")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("p",[t._v("The NexusConnector component has 8 generic output ports. Four each of type double and string. When a value, or values, change within the “outputs” section of the peer component in the Nexus, that change is relayed to the NexusConnector and the value on the NexusConnector output ports are updated accordingly.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out2d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out3d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out4d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out5s [string]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out6s [string]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out7s [string]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out8s [string]:")]),t._v(" Received from the Nexus")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("nexusHostname [string]:")]),t._v(" The address of the machine on which the Nexus is running")]),t._v(" "),e("li",[e("strong",[t._v("nexusPort [integer]:")]),t._v(" The port number on which the Nexus is listening")]),t._v(" "),e("li",[e("strong",[t._v("nexusComponentPath [string]:")]),t._v(" The path of the peer component to bind to within the Nexus")])])])}),[],!1,null,null,null);e.default=s.exports},739:function(t,e,n){t.exports=n.p+"assets/img/nexusconnector.2616bf6b.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[218],{1177:function(t,e,n){"use strict";n.r(e);var o=n(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"nexusconnector"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nexusconnector"}},[t._v("#")]),t._v(" NexusConnector")]),t._v(" "),e("p",[t._v("Component Type: Processors (Subcategory: Web)")]),t._v(" "),e("p",[t._v("The NexusConnector component provides a bidirectional connection to a GPII Nexus instance.")]),t._v(" "),e("p",[e("img",{attrs:{src:n(741),alt:"Screenshot: NexusConnector plugin",title:"Screenshot: NexusConnector plugin"}})]),t._v(" "),e("p",[t._v("NexusConnector plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The NexusConnector component requres a running GPII Nexus instance to connect to and a peer component constructed within the Nexus for the connector to bind to. The Nexus instance is run and managed separately from this component and AsTeRICS. Please see the “Properties” section below for details on specifying the address of the Nexus instance to connect to.")]),t._v(" "),e("p",[t._v("The NexusConnector component expects the peer component within the Nexus to have a model of the following structure:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("\n\t\t{\n\t\t\tconnector: {\n\t\t\t\tinputs: {\n\t\t\t\t\tin1d: ,\n\t\t\t\t\tin2d: ,\n\t\t\t\t\tin3d: ,\n\t\t\t\t\tin4d: ,\n\t\t\t\t\tin5s: ,\n\t\t\t\t\tin6s: ,\n\t\t\t\t\tin7s: ,\n\t\t\t\t\tin8s: \n\t\t\t\t},\n\t\t\t\toutputs: {\n\t\t\t\t\tout1d: ,\n\t\t\t\t\tout2d: ,\n\t\t\t\t\tout3d: ,\n\t\t\t\t\tout4d: ,\n\t\t\t\t\tout5s: ,\n\t\t\t\t\tout6s: ,\n\t\t\t\t\tout7s: ,\n\t\t\t\t\tout8s: \n\t\t\t\t}\n\t\t\t}\n\t\t}\n")])])]),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("p",[t._v("The NexusConnector component has 8 generic input ports. Four each of type double and string. When a value on one of the inputs changes, that change is relayed to the Nexus and the model of the bound component is updated.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in1d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in2d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in3d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in4d [double]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in5s [string]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in6s [string]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in7s [string]:")]),t._v(" Sent to the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("in8s [string]:")]),t._v(" Sent to the Nexus")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("p",[t._v("The NexusConnector component has 8 generic output ports. Four each of type double and string. When a value, or values, change within the “outputs” section of the peer component in the Nexus, that change is relayed to the NexusConnector and the value on the NexusConnector output ports are updated accordingly.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out2d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out3d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out4d [double]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out5s [string]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out6s [string]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out7s [string]:")]),t._v(" Received from the Nexus")]),t._v(" "),e("li",[e("strong",[t._v("out8s [string]:")]),t._v(" Received from the Nexus")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("nexusHostname [string]:")]),t._v(" The address of the machine on which the Nexus is running")]),t._v(" "),e("li",[e("strong",[t._v("nexusPort [integer]:")]),t._v(" The port number on which the Nexus is listening")]),t._v(" "),e("li",[e("strong",[t._v("nexusComponentPath [string]:")]),t._v(" The path of the peer component to bind to within the Nexus")])])])}),[],!1,null,null,null);e.default=s.exports},741:function(t,e,n){t.exports=n.p+"assets/img/nexusconnector.2616bf6b.png"}}]); \ No newline at end of file diff --git a/assets/js/218.8ebad802.js b/assets/js/219.c72b493c.js similarity index 94% rename from assets/js/218.8ebad802.js rename to assets/js/219.c72b493c.js index cb327ad020..5e8105ad77 100644 --- a/assets/js/218.8ebad802.js +++ b/assets/js/219.c72b493c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[218],{1173:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"one-event-many-actions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-event-many-actions"}},[e._v("#")]),e._v(" One Event Many Actions")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component allows the user to control up to 10 actions using just one or two input events. In the first step, the event actions are scanned so that the user can choose the action, in the next step the selected action event is triggered. The detailed functionality depends upon the selected mode.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(738),alt:"Screenshot: OneEventManyActions plugin",title:"Screenshot: OneEventManyActions plugin"}})]),e._v(" "),t("p",[e._v("OneEventManyActions plugin")]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("input:")]),e._v(" The control event.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("inputOff:")]),e._v(" Control event used in mode 2 for selecting the action by scanning.")])])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("action1…action10**")]),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("* The event triggers for the actions selected by user.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("actionShown11…actionShown110**")]),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("* These events are used in the scanning process to highlight the currently selected action via a GUI element (e.g. the CellBoard).")])])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("actionsNumber [integer]:")]),e._v(" Number of action used.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("mode [integer]:")]),e._v(" The component’s working mode:")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("mode 1:")]),e._v(" The input event starts the scanning, the inputOff event selects the action.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("mode 2:")]),e._v(" The first input event starts the scanning, the second input event selects the action.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("mode 3:")]),e._v(" The first input event starts the scanning and highlights the first action, the next input events highlight the next actions. If there is no input event for the selected delay time, the currently highlighted action is selected.")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("delay [integer]:")]),e._v(" Delay used for the scanning process (in milliseconds).")])])])])}),[],!1,null,null,null);t.default=i.exports},738:function(e,t,n){e.exports=n.p+"assets/img/oneeventmanyactions.132f9730.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[219],{1178:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"one-event-many-actions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-event-many-actions"}},[e._v("#")]),e._v(" One Event Many Actions")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),e._v(" "),t("p",[e._v("This component allows the user to control up to 10 actions using just one or two input events. In the first step, the event actions are scanned so that the user can choose the action, in the next step the selected action event is triggered. The detailed functionality depends upon the selected mode.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(742),alt:"Screenshot: OneEventManyActions plugin",title:"Screenshot: OneEventManyActions plugin"}})]),e._v(" "),t("p",[e._v("OneEventManyActions plugin")]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("input:")]),e._v(" The control event.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("inputOff:")]),e._v(" Control event used in mode 2 for selecting the action by scanning.")])])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("action1…action10**")]),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("* The event triggers for the actions selected by user.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("actionShown11…actionShown110**")]),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("* These events are used in the scanning process to highlight the currently selected action via a GUI element (e.g. the CellBoard).")])])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("actionsNumber [integer]:")]),e._v(" Number of action used.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("mode [integer]:")]),e._v(" The component’s working mode:")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("mode 1:")]),e._v(" The input event starts the scanning, the inputOff event selects the action.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("mode 2:")]),e._v(" The first input event starts the scanning, the second input event selects the action.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("mode 3:")]),e._v(" The first input event starts the scanning and highlights the first action, the next input events highlight the next actions. If there is no input event for the selected delay time, the currently highlighted action is selected.")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("delay [integer]:")]),e._v(" Delay used for the scanning process (in milliseconds).")])])])])}),[],!1,null,null,null);t.default=i.exports},742:function(e,t,n){e.exports=n.p+"assets/img/oneeventmanyactions.132f9730.jpg"}}]); \ No newline at end of file diff --git a/assets/js/22.51e925bc.js b/assets/js/22.e6b3e260.js similarity index 99% rename from assets/js/22.51e925bc.js rename to assets/js/22.e6b3e260.js index 15d3b08f23..e544546a29 100644 --- a/assets/js/22.51e925bc.js +++ b/assets/js/22.e6b3e260.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{402:function(A,t){A.exports="data:image/png;base64,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"},403:function(A,t){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXsAAAAzCAIAAAD5ID/pAAAAA3NCSVQICAjb4U/gAAAAEHRFWHRTb2Z0d2FyZQBTaHV0dGVyY4LQCQAAFXZJREFUeNrtXX1QW9eVvwakBwnIH6DYBmEXVIcnbUBSmkgOGLGhiDZGNi2Ku0HtzKJkOsjbYNxZULoDWneQpg3KZmqS7aB0GpTZgLptUccO+APRtSU5jkTiSLYbhGMQNEa2MZgAAsd6IHj7hwwIoacPcFwg9/cX7+mcc8/93XPPux+PdzfhOA4gICAgHgmiIAUQEBAw40BAQMCMAwEBAQEzDgQEBMw4EBAQEDDjQEBAwIwDAQEBMw4EBATEo8s4dgWfTudVG11L7hqPMBjSdmy1peuPMHi1lnVI28xX50zWl4//9Zlfnsl53fDjP/Z9ODb7TQqbIdkv/6oYgN0H4msa49z9i1xlwTZOrV06MUOgsq803Yy9++6Fo6b7yU9nqMRcRSEtZcTxb+9cOTf5cJLZyXfPHOyYgKEJyfnmZpwUHhv7g1xlwyBfAIBr+isN44mKn+Uo+an5TybmP/1t1SucgzG3FfrRpQTN3BybgXRBQPgiJgwZMlVQW54krZQ1iNplTGT5iMGuVSg1JrsTo9A5wiOKykLaMiHM0a5SqjttjhGExhFIa2UiJiUMAUs1T05R1CJ/eavT7sSo/EqVjNGlkGsvO52AJqxtUBbSgqkbq9lKSoOCpntL1+Nwuqj8StUbYopWmKfsAaDrAN1Ua2yXIBa1XKm1OEYAhc4RVatkedRgT9nhZtu9jHxu8Vafm3FPHN6fkTA+OwkAAoZrlfaEEvqt05+dj91z8tVvp81MndHbm3rGBqaik1O3v7IfLd5JAgCAsaHjH/SeHJya9EQl7Ug89D3WK2kzzf99XjUEwMCHWb3MM6+mpRDpLmK4VmlP+FFmiu36ydv3brmRnPwsBXczAgAIoDvTrDa+u5N7vjgRAHD11LmfmMGPy/NfSwUAjCpet1zlP//n7MeW1jeUA4EFRmtf/1vCQSZi6z13+/50PPWwKCNjwK74ePzWOEjOZKqKd6QEUw9YKdKfl5KDDPQpTt24dBcDsfFZnAzF955Igh167QMPge66XLSkaRAfbitnoUWN3d67hgoULW9z4ziO9zUWoWhBVYvB2m3taCzjpnMrOib8jAy3lrFYJTWthu5uq6G1pojFKm3qw3G8owLl1piDCJiruCirpM48jOP4cGs5Kx3lljV1u3Hc3V1fhHKrzMHtG6pYLG5RRUufG8fx4Y6KXLSosQ/H8eGWUrSgvtuN4/hgSynKKqlrNVithtaqIpRV1jocjI9bPQdq/u/1G0Ek7tQoTme/8WFN150rX07j+P0T753Nbrx64vPxnht3TpwwZSs+en8Yx/HJ9xtPZ//+sxOff3ml//b7/3v+O4rLF6ZxHL//x9+fPnB23I3jxLp+xZ3957c//eOwB8fxke5Pv3fM9PthQt1+o+k7v+npwXEcv/f+26cza9pfvHgPx3F8uOfAsfO/8TdO5MDt6mOddf1BBO7W/Pp0duNnH7twHL9/ovls5rFO6cVxN467b/W8eKyzpj+4fcJKLZLz5d8lx86K229cuPHlhU8vv3jsrPTT+zjEmkdMuJmJKlTIdYJauUagk9B97ls0mh56pf4NMR0AAJgNiF0gfa99pFDsM1CwqRssTJlJKaICAACTw8R6+GqtTSIPQwADHHHlXioAgMoXMMm2lHIJEwEAMAU8qqb/pgsASlD7k1RhpZiOAACohSI2Uml3AkBHvGMwBADgtDsAXSoR5dEA4DBpSXlOKhKMBzc2CZCU+OBkzSVmPqXkbgYAgMHrjQOUyn/PLE4AAAA0lYLdPt/08dhPikjJWWg9I23fVgAAyIodbe5x3XIDQIpe9G3QQaC7dWlxnqSsJ39EjQYAJDFpWTG2z8cAcBPoZm1LOjd6aQygseMXxynfz8TO9Y66sh+bHhi7FU/N9xvdEToQhoAHZHGffDYBABCbw6CQBx97OXszAgDYuf2Z+IG/j82ANFJQ+4EqRfUhZ9w1AOJfyU7dtxWAVEpKPPVmQjQcQGyMWdV8zhEpZDqhQq4VaMULN0f6e1xJbN5CDqJw8phAZXMAn4zj6u+/Od0l30uX+07VUkaw0AIUgCAJSQ/mXwhAAIU6PxlDECSkOgJAQjpjMUEiAPivRXFEIrpEKeC3CwSCPL5AIMyjBCcsBgEzd93Lf5h13Z9D4kgIAABEoakPcpJr5N4tz5fK+lNKX9+2YhjYmp+N3BwcPtN77/PB0U8GRm55tvjPVgl1wdKkGJO2YzEFkgGYDqKbuiMn9sbFwZlDsSPX4hMbONgnf/ry6kzydK8rIe3JjLAdCCVAAjFRCfGkeZeiQSySML90iMSEVI8KWKkloNGKkz5WNZw7w9iev4eaz0jeFwe788bKOADQxIpKnVAl0/LKgsr59WoEQcgJJequN/L8Rw/6UAJh7ZwTqxuBf+dcrsyRtZtEls7OTqNJXflGLUWg1KhFdEL5pK0ZMTc+GXSDnbG+t29+ZHlBT6p/jftCHAAgihzz4HmLxESRY2nHX2PtIy3b8PqfT5vG4p7Zsz2fkfb9zDiZ1uXvGpHu8pW25dUi1J19Pi3qtd6xz+PHQCozI9WTBa5dHBqdHgTPlmxBwjUyFEpgNKyGI1QfDlipJSBtPfpqfvHA0Dn7yEWTreED0vMHuQ1Px8MuvRH2qhZBl6gqaTaV/C835wc+6ekU1+Uux8JTz2a0AzqHtiSwGGw6dtlkX0hEDl21VGVxhS8QInBXoe6yaFVqC7JXJJW/pe3sahUjRnWnI4hC3PZDmaS/mexL9sJnxpo/Hien7Xx22WMW2bklzTN2cWjhbZ2pk7pLxwdmsN6BxsEttT/LaSj+djEzMY00t3xvnUg3LE4IdaOzGIlgwNk8gKF7tiJx23KSsEsfOT/xJD6fGh2pA6vxcJXqroEvjptGyWmprxQ93XS0oPnZqIumIfiG0IbLOADQJSoJzdZ5eX6Qu1cioTvUlbU6i91u06srZaeAoFxAW6ojkuaNaGXVGqPdbtNrqysVJsCkUyIQCOHTStRdzn6nC0OATfeGXK7WW+x2m1Gn7XJSGOlUAADA7DqVQmMc8deL3rc/61DMnaO/vaj46NaHA6Mf2r9QvPtpy9Q22f7UAHslVNrLe7A/6640X5+4Njj0J51N1QsykkhIApLkmbrYMzYw9tW16wOyk85Rz/2rg195s+bk+L2b92eJdMObAxPqUtK2Z0zdPjsUn5NKAiD22bS4z/92+9bO7cvTZWgHVuNh5Opzc3NuzD0+fPeLSYyMj53Uf6Y0DX1ye+LqdeefBu4n7IxPhB16Y82qvA8mZqVC3Pnie84H10ypVktRKNWVIidGpXOEjTpZIXXZsnNDO1DJ1XKxagShcQRyjVxIjUgg1LJ2ZOoUtiiPoqoWSOWdWrlaoVCqZZIGDKHQmAKlRlZIAQAArL9d854TiCTLNsvjnpCXZ2eZHGevXpfr70/Hxn0rjXb8X/bkbw1YVuwLP8oF+s+aPrAcn4pOTt0u+1fmCwkAJDypKryv0FsOeZC01O0v/zi3+KMrx88NXN3zT1kcaoL+SrGWefKV3YF1w0IsoW5CYv4OcGlqS9ZWAABIezIx8cK9ZEZiUkRGwhVYqZPLN1Xn5urqfv3mm2/OzM7lnnz1fHPt8QNAdeHK4XNzSGxcBuOpxsIdFNih1zw2refvHGMYQJAINTAkQpV1h5lZbH7Da61iFgMRejgze8s1nvGtb9nt9jt37uzfv99qte7YsSMmJgb24Y0+xllDiDx3bPh0Axb319cwIvYQj4mamZoCAKSmppJIJI/H89VXX83OzsKMAzPOBkdW7SlIwqMHjuMzE8OeuQfjccwzJ3zzryQKNYqEbIpasuB9VVkE6YKzKgiI1WacL774IjMzc3JycmhoKCUlhUqlkslkjUaTnZ0dPQ9I1NoH/D4OxHp7SG7a5F3HOXr06KFDh3bv3r179+6mpqbh4WEMw+bm5iBFMONAQKxqgOPxeKanpxcuDx48mJyc/NJLL1Gp1EuXLrW2tv785z/ftWtXZmbm6dOnp6en4cgdZhwIiBWiu7s7NTX1qaee2rRpk/dOXl4eACA5Obm4uHjXrl05OTmHDx92u911dXU//OEPe3t7Z2bgd0JgxoGAiByzs7NvvfXWT3/6U5vN5s04ZDI5PT3d++sPfvAD7x8HDhwAALz00ksIgoyNjXk8HkgdzDgQEBHD4/FYrVaBQLB582bvnW3bti1sij/33HPeP3JycnyTFJxVwYwDAbHCjDMyMpKcnIwgiHeMc/fu3f7+/tnZ2bGxsb6+PgzDpqament7IVfrAvB9HIg1DRzHMQyLi4vbtm3bhQsXcBz/4IMPoqOjd+3adeLEiZiYmJSUFJ1ORyKRUBSFdK19wPdxINY0JicnaTTa9evXExPD+j/NLVu2nDp16plnnnn88cche3CMAwGxkjHOzMyMyxX68yNzc3Ozs7PwVcC1jNDrOPojDPpyPDhmat0eOLVYuTXpv13BZ0h0rvUeXQ61kCHWjqwqQG+3PI4g586dc4WB5ubm5OTkhISEhX30lcOpEdHpIo2TWMJYzWZXGzdkWpjvFyFJcKiFjKAkrXCMwyhrUgiXfAoAoTL/kYy4dGKemq3rlDEBxIbmnJz4HVF+/s9ePQLwWRKJNDc3t7AOsPDHwnvGjz32WEVFxebNmx/Cf3hS2KKyMsCgfKODc+UkrDLjUJgcDgd+fGTD5A6nE9Bo66M9SYnPHm9p+Y87d/r6+iYnFz+UGBUV5R3IREVFLdzZsmVLcnLyE088QSKRVs0PRyznfNMjhfLwSXh4u+OYo10hEfLZDAZPIK7V2b1TAks1T6DQG1VSkYDP44uqdY4Ru/aISMjnsfmiWr0zhLqxmi1QGC2aI2KhgMfmCY9o7RhwaoQcWdd0/zsH6EKNE4ARi1oq5LMZDDZPKFEZAw/inXqVRMhjMxgMNl8kVS/7JimhEZddWy0W8NgMNl8oUemdgY4JdNm01SIBj8Fg80XVWrsreKEBKxWIUbv2iIjPZrD5QqnaMhKUqHD8MVazBQq9Tsrn5Um1jiCmArjtzzmRLubUKyRCHpvNE4hrdQ7X8oph7RIGX2FbvJTOXwZsgk2bTP/53HNv99P27cONx962xm25o//D797+lVypPjOavO+7383Pz8/PjO8/8dtf/eIXR+UNv/v4yn8dfPpw56ZIA2AZPz6TpgeeeSvVrhAwpPp5pUmLxttIBMHpg7D7QsCQi5C31YVKoJljCEmAOXRSHluoCPW535Dny3RUoOlF9QZr9xIMTsz/uC4OnOprKkFZpXWtBqvV3NFUUYCyqgxuH/8JjYRxGpe7u74IZZXUtZm7u80tFQXovAhRoUSVWnpKWDqK5pbWtZmt1o6migI0vaC+OwhR4fhjqGKhrNySqhaDdXCC2BSR2z6cE+m6zTW56aySulaz1WpoqShgoenppS1Lm8PdVobm1lkXL8u9l4RNYKhisaoMQXjrri9CWaX1beZuq6GpPBdNT0fLO8IMAF/48bNQLpF9QxUrHeWWVLWa+7rNbTUlaPqy4FyCMPsCQchFzNtqQmWhX8+TQCTZ11iEljQN4vhgazmXVVRnngiVT8LLOMswfzzevGfWulzUN7SGW0q8fJirWGhZ68R8XildJBa31uXO/0Sobqhipft0R0MFi1VhwHF8orUU9XZB3FzD9dYZx3Hc3WdoM3Qvr3VfR1OTYdD31D9vcfP+Exkx13B9y58wVHBRvy7kNlSwfO65zfWlpfVmd5BCiSrll3FYZW0LBfU1FqWzKgxuQqLC8cdQxXqQt4JyTuS2D+cEusMtpai/12FnHMJ29M04AXhzd1SwfJ4ybnMNN1DGIaiUX8bx4We+XGL7S+XdHeWo108fovwyTjh9gSjkIuVtVaHin3EIJb0Zx9xWnovmVhkmHtoJeTyVTSsKMu9f8wdO0QslVKfN2G7qt9u6urqMN6c54RgJ5zQuZ1cPRhPx5m8ge2XavSELDVUpAACZzmcvlELn81IaunquEZ/8hYT2BwBAZrDpoTjnhOCKWPca5gDMSt6i1zx2Crk/zFl5WO0YgDdH12WMJlmsL2cvh6yLOACW8bO4GxPMvo88gpBDftkwjL5AGHKiyHhzrTZUlk5Jg0hO2xuktQAA7Kb3vMqHsnIcmsm1feAUZlNLpGonbS9fIBCUCYUpldKeiI0sGFt+GdDFoIWu6MOgSDwhUWH484BpJATnIbki1rXUyv0lQy//zZ+3F14TIKHrS460LQLyE5595NF8xhaLnDdktaESQVDRxRq1sEsiUsl1Ao2I+ihWjtf4gVOYUdNg4yjbdWqlVFS4l45grvCMhHMaF41NRxxdlxfW6+xqsbBa7wpdaAhMO0yLRh2mrhEKm0ELgygif8LkPBy3iXTpHDqwm7pci8ODrpvTQdMMwOw2+3S47RgQdA4TOLouuxYMmuzLylxNW4Rj/yEiaMhFwBvy8EIlhCSZLhRzqEyJQkw1qRT6UMyGl3FcDpvNvhSOEd/EuxYPnPLpIVQqddph7LQ5nE67UVMp192ddtpsi9tOhEbCOI2LUnhETLOoKlV6m91ha1fI1XbqXg4ldKGhXkTBbIpKRbvFbjNqj0gbHMxK6V4kDKKI/AmT8+Buezkn0qUKygVIZ61E0W6x2y266kqNM2HZiANJSafe7XxHY3E4HRZttdKEkYM2QcgNXEG5mGpUSFV6m91u0VbLO11k/3HOatoiHPtEwbmSlEMUcpHy9hBDJSxJhFOpKEFOKVUW79YawXFvYIUrx+kPlswWVphw3D3YVldWlMtCUW5BaU3rg6V6cxV3cVl0orXMZ0mtu75gcSGNQH1h1XBxMc9rra+1vICLoqUtg/iEtaWqJJeFoijLqxpg/WrC2lhexEVRVm5RWV1bX19HTUlBUZ3ZveA/sZEJa0tVScG8bsegOwBHw+bG8pJcFurd6rBOBC+UsFI+C50tFWVNBnNjeVEuC2UVlFS0dAcnKhx//MolMkXkti/nhG64Bzvqyoq4LJRVUFLV2t1RV1rjv7eHT5gby7yEllS0WM1N5eUtfUGaYMleVWDehg31ZUVcFotbVN5oNtcXcKsMYQaA38qxv/2qYPb95SvmL5cQtWSvKry+QBByEfK2mlBZtldFJLmwV+X1sKOCm15QZ3Xj+ERbGZoeaP38H/ufnPDAqY1bqUfGm8tutAFmHvPBgMilk/A1PF27lP6w3pf8mu2vuC+sT/xjv48DD5zauJV6ZLy5Lr8jFcvUFocLw0ZsOlmDhSYUPMR08HXbX3FfWJ+AX6uAWPcYMapkSq2pfxKQE1I4olqVrJCGrCP73yjAjAMBAfFNmVVBQEDAjAMBAQEBMw4EBMR6x/8DL/vQa5I+2IsAAAAASUVORK5CYII="},404:function(A,t,e){A.exports=e.p+"assets/img/grid-create-add-cells-02.33f7733b.png"},405:function(A,t,e){A.exports=e.p+"assets/img/grid-create-add-cells-03.848222d7.png"},406:function(A,t){A.exports="data:image/png;base64,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"},407:function(A,t){A.exports="data:image/png;base64,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"},927:function(A,t,e){"use strict";e.r(t);var i=e(2),o=Object(i.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h1",{attrs:{id:"grid-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grid-creation"}},[A._v("#")]),A._v(" Grid Creation")]),A._v(" "),t("p",[A._v("In this tutorial you will learn how to create a simple grid.")]),A._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[A._v("Note")]),A._v(" "),t("p",[A._v("In case you need more detailed information, please check the "),t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[A._v("AsTeRICS Grid user manual")])],1),A._v(".")])]),A._v(" "),t("h2",{attrs:{id:"asterics-grid-web-application"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid-web-application"}},[A._v("#")]),A._v(" AsTeRICS Grid web application")]),A._v(" "),t("p",[A._v("AsTeRICS Grid is the web application to run and manage grids for AAC.")]),A._v(" "),t("p",[A._v("If you open the link "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[A._v("https://grid.asterics.eu"),t("OutboundLink")],1),A._v(", the default grid is opened in your browser and saved locally on your device in the browser cache. All modifications are also saved to your local version of the grid from now on.")]),A._v(" "),t("h2",{attrs:{id:"create-new-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-new-grid"}},[A._v("#")]),A._v(" Create New grid")]),A._v(" "),t("p",[A._v("To create a new grid do the following steps")]),A._v(" "),t("ol",[t("li",[A._v("Click on "),t("code",[A._v("Manage grids")])]),A._v(" "),t("li",[A._v("Click on "),t("code",[A._v("New Grid")])]),A._v(" "),t("li",[A._v("Enter the name of the new grid at the bottom of the page and click on the check mark button.\n"),t("img",{attrs:{src:e(402),alt:"Screenshot with textfield for new grid name"}})])]),A._v(" "),t("p",[A._v("The new grid is added to the bottom of the list of "),t("code",[A._v("Saved Grids")]),A._v(".")]),A._v(" "),t("h2",{attrs:{id:"add-cells"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-cells"}},[A._v("#")]),A._v(" Add cells")]),A._v(" "),t("p",[A._v("Now you must add cells to the newly created grid. You can do this by the following steps:")]),A._v(" "),t("ol",[t("li",[A._v("Clicking on the "),t("code",[A._v("Edit")]),A._v(" button of the new grid.")]),A._v(" "),t("li",[A._v("Click on the "),t("code",[A._v("Create new elements")]),A._v(" link.\n"),t("img",{attrs:{src:e(403),alt:"Screenshot with link to create new elements"}})]),A._v(" "),t("li",[A._v("Enter the labels of multiple cells in the textfield\n"),t("img",{attrs:{src:e(404),alt:"Screenshot with button Edit highlighted"}})]),A._v(" "),t("li",[A._v("Click on "),t("code",[A._v("Insert elements")])])]),A._v(" "),t("p",[A._v("Finally the grid should look like in the picture below.\n"),t("img",{attrs:{src:e(405),alt:"Screenshot with grid"}})]),A._v(" "),t("h2",{attrs:{id:"adapt-layout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adapt-layout"}},[A._v("#")]),A._v(" Adapt layout")]),A._v(" "),t("p",[A._v("Now you can change the size and layout of the cells.")]),A._v(" "),t("h3",{attrs:{id:"change-size"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-size"}},[A._v("#")]),A._v(" Change size")]),A._v(" "),t("p",[A._v("To change the size of the cell, click on the right bottom corner and drag it until the target size is reached.\n"),t("img",{attrs:{src:e(406),alt:"Screenshot with grid and resizing a cell"}})]),A._v(" "),t("h3",{attrs:{id:"change-position"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-position"}},[A._v("#")]),A._v(" Change position")]),A._v(" "),t("p",[A._v("To change the position of a cell, click on it and drag it to the new target position.")]),A._v(" "),t("h3",{attrs:{id:"more-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#more-options"}},[A._v("#")]),A._v(" More options")]),A._v(" "),t("p",[A._v("There are many more options to add or delete cells or to do automatic layout. The options can be found by clicking on the "),t("code",[A._v("More")]),A._v(" button.")]),A._v(" "),t("h3",{attrs:{id:"close-edit-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#close-edit-mode"}},[A._v("#")]),A._v(" Close Edit mode")]),A._v(" "),t("p",[A._v("After you have finished all changes, you must close the edit mode for being able to use the grid. You can do this by clicking on the button "),t("code",[A._v("Back")]),A._v(" in the top menu.")]),A._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[A._v("#")]),A._v(" Conclusion")]),A._v(" "),t("p",[A._v("Now you know how to create a new grid it should look like in the picture below.")]),A._v(" "),t("p",[t("img",{attrs:{src:e(407),alt:"Screenshot with final grid having 4 cells"}})])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{402:function(A,t){A.exports="data:image/png;base64,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"},403:function(A,t){A.exports="data:image/png;base64,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"},404:function(A,t,e){A.exports=e.p+"assets/img/grid-create-add-cells-02.33f7733b.png"},405:function(A,t,e){A.exports=e.p+"assets/img/grid-create-add-cells-03.848222d7.png"},406:function(A,t){A.exports="data:image/png;base64,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"},407:function(A,t){A.exports="data:image/png;base64,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"},931:function(A,t,e){"use strict";e.r(t);var i=e(2),o=Object(i.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h1",{attrs:{id:"grid-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grid-creation"}},[A._v("#")]),A._v(" Grid Creation")]),A._v(" "),t("p",[A._v("In this tutorial you will learn how to create a simple grid.")]),A._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[A._v("Note")]),A._v(" "),t("p",[A._v("In case you need more detailed information, please check the "),t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[A._v("AsTeRICS Grid user manual")])],1),A._v(".")])]),A._v(" "),t("h2",{attrs:{id:"asterics-grid-web-application"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid-web-application"}},[A._v("#")]),A._v(" AsTeRICS Grid web application")]),A._v(" "),t("p",[A._v("AsTeRICS Grid is the web application to run and manage grids for AAC.")]),A._v(" "),t("p",[A._v("If you open the link "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[A._v("https://grid.asterics.eu"),t("OutboundLink")],1),A._v(", the default grid is opened in your browser and saved locally on your device in the browser cache. All modifications are also saved to your local version of the grid from now on.")]),A._v(" "),t("h2",{attrs:{id:"create-new-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-new-grid"}},[A._v("#")]),A._v(" Create New grid")]),A._v(" "),t("p",[A._v("To create a new grid do the following steps")]),A._v(" "),t("ol",[t("li",[A._v("Click on "),t("code",[A._v("Manage grids")])]),A._v(" "),t("li",[A._v("Click on "),t("code",[A._v("New Grid")])]),A._v(" "),t("li",[A._v("Enter the name of the new grid at the bottom of the page and click on the check mark button.\n"),t("img",{attrs:{src:e(402),alt:"Screenshot with textfield for new grid name"}})])]),A._v(" "),t("p",[A._v("The new grid is added to the bottom of the list of "),t("code",[A._v("Saved Grids")]),A._v(".")]),A._v(" "),t("h2",{attrs:{id:"add-cells"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-cells"}},[A._v("#")]),A._v(" Add cells")]),A._v(" "),t("p",[A._v("Now you must add cells to the newly created grid. You can do this by the following steps:")]),A._v(" "),t("ol",[t("li",[A._v("Clicking on the "),t("code",[A._v("Edit")]),A._v(" button of the new grid.")]),A._v(" "),t("li",[A._v("Click on the "),t("code",[A._v("Create new elements")]),A._v(" link.\n"),t("img",{attrs:{src:e(403),alt:"Screenshot with link to create new elements"}})]),A._v(" "),t("li",[A._v("Enter the labels of multiple cells in the textfield\n"),t("img",{attrs:{src:e(404),alt:"Screenshot with button Edit highlighted"}})]),A._v(" "),t("li",[A._v("Click on "),t("code",[A._v("Insert elements")])])]),A._v(" "),t("p",[A._v("Finally the grid should look like in the picture below.\n"),t("img",{attrs:{src:e(405),alt:"Screenshot with grid"}})]),A._v(" "),t("h2",{attrs:{id:"adapt-layout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adapt-layout"}},[A._v("#")]),A._v(" Adapt layout")]),A._v(" "),t("p",[A._v("Now you can change the size and layout of the cells.")]),A._v(" "),t("h3",{attrs:{id:"change-size"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-size"}},[A._v("#")]),A._v(" Change size")]),A._v(" "),t("p",[A._v("To change the size of the cell, click on the right bottom corner and drag it until the target size is reached.\n"),t("img",{attrs:{src:e(406),alt:"Screenshot with grid and resizing a cell"}})]),A._v(" "),t("h3",{attrs:{id:"change-position"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-position"}},[A._v("#")]),A._v(" Change position")]),A._v(" "),t("p",[A._v("To change the position of a cell, click on it and drag it to the new target position.")]),A._v(" "),t("h3",{attrs:{id:"more-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#more-options"}},[A._v("#")]),A._v(" More options")]),A._v(" "),t("p",[A._v("There are many more options to add or delete cells or to do automatic layout. The options can be found by clicking on the "),t("code",[A._v("More")]),A._v(" button.")]),A._v(" "),t("h3",{attrs:{id:"close-edit-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#close-edit-mode"}},[A._v("#")]),A._v(" Close Edit mode")]),A._v(" "),t("p",[A._v("After you have finished all changes, you must close the edit mode for being able to use the grid. You can do this by clicking on the button "),t("code",[A._v("Back")]),A._v(" in the top menu.")]),A._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[A._v("#")]),A._v(" Conclusion")]),A._v(" "),t("p",[A._v("Now you know how to create a new grid it should look like in the picture below.")]),A._v(" "),t("p",[t("img",{attrs:{src:e(407),alt:"Screenshot with final grid having 4 cells"}})])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/219.f8437d97.js b/assets/js/220.5ddb3e93.js similarity index 96% rename from assets/js/219.f8437d97.js rename to assets/js/220.5ddb3e93.js index d361e152a9..02ebcdf039 100644 --- a/assets/js/219.f8437d97.js +++ b/assets/js/220.5ddb3e93.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[219],{1176:function(e,t,s){"use strict";s.r(t);var r=s(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"osc-gesture-follower"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#osc-gesture-follower"}},[e._v("#")]),e._v(" Osc Gesture Follower")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("The OscGestureFollower component copules the ARE with the external gesture recognition software GestureFollower. The program is copyrighted by IRCAM. GestureFollower is stored in the ARE subfolder tools/GestureFollower. Gesture data can be stored and loaded from files in this subdirectory, these files have the extension “.mubu”. The communication between GestureFollower and the ARE is based on the OpenSoundControl (OSC) protocol. This plugin utilizes the NetUtil java library (http://www.sciss.de/netutil/) for the OSC implementation, it is ©opyrighted 2004-2011 by Hanns Holger Rutz and released under the GNU Lesser General Public License.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(742),alt:"OscGestureFollower howto",title:"OscGestureFollower howto"}})]),e._v(" "),t("p",[e._v("OscGestureFollower howto")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("The plugin requires the gfOSC_v1.exe in subfolder tools/GestureFollower, which implements the actual gesture follower algorithms.")]),e._v(" "),t("li",[e._v("Check your firewall configuration and network settings to ensure that OSC messages are not blocked.")])]),e._v(" "),t("h2",{attrs:{id:"functional-principle"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-principle"}},[e._v("#")]),e._v(" Functional Principle")]),e._v(" "),t("p",[e._v("Input data is received through CH1 to CH4 e.g. from sensors like the acceleration measurement unit. Not all inputs must be connected, but the synchronized checkboxes have to be checked correct. The events must be connected like illustrated in the picture. First the gestures must be teached in. To teach in the first gesture, send an event into the ‘learn1’ eventListener. After finishing the first gesture, send an event to ‘learn2’ to teach in the second gesture, and so on. After all gestures are teached in, send the ‘stoplearn’ event. To clear all gestures send the ‘clear’ event. To start the gesture recognition process, send the ‘follow’ event. To stop the gesture following process, send the ‘stop’ event. The ‘load’ and ‘save’ events can be used to load or store the learned gesture data into the given filename.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CH1 - CH4 [double]:")]),e._v(" The input port which receive data values. "),t("strong",[e._v("These 4 input ports support synchronization")])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("likeliest [double]:")]),e._v(" While the gesturefollower is in ‘follwing mode’ the most likeliest gesture is indicated on the likeliest output port. Before it can sample the input data and recognize a gesture, some data must be teached in.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("InPort [integer]:")]),e._v(" This value specifies the Port where OscMessages form the gesture follower are received.")]),e._v(" "),t("li",[t("strong",[e._v("OutPort [integer]:")]),e._v(" This value specifies the Port where OscMessages are send to.")]),e._v(" "),t("li",[t("strong",[e._v("filename [string]:")]),e._v(" Filename for the gesture data (load or save, .mubu file stored in the ARE subfoler tools/GestureFollower/). "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")]),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-ports"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-ports"}},[e._v("#")]),e._v(" Event Listener Ports")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("stop:")]),e._v(" this event stops the gesture following")]),e._v(" "),t("li",[t("strong",[e._v("stoplearn:")]),e._v(" this event stops the gesture learning process")]),e._v(" "),t("li",[t("strong",[e._v("learn1 - learn5:")]),e._v(" these events select gestures 1 - 5 for learning")]),e._v(" "),t("li",[t("strong",[e._v("learn1 - learn5:")]),e._v(" these events select gestures 1 - 5 for learning")]),e._v(" "),t("li",[t("strong",[e._v("clear:")]),e._v(" this event clears learned gestures")]),e._v(" "),t("li",[t("strong",[e._v("follow:")]),e._v(" this event starts the gesture recognition phase")]),e._v(" "),t("li",[t("strong",[e._v("load:")]),e._v(" this event loads gesture data from file")]),e._v(" "),t("li",[t("strong",[e._v("save:")]),e._v(" this event saves gesture data to file")])]),e._v(" "),t("h2",{attrs:{id:"referred-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#referred-plugins"}},[e._v("#")]),e._v(" Referred Plugins")]),e._v(" "),t("ul",[t("li",[e._v("OscOutClient")]),e._v(" "),t("li",[e._v("OpenVibe")]),e._v(" "),t("li",[e._v("OscServer")])])])}),[],!1,null,null,null);t.default=o.exports},742:function(e,t,s){e.exports=s.p+"assets/img/oscgesturefollower.2b835bc5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[220],{1180:function(e,t,s){"use strict";s.r(t);var r=s(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"osc-gesture-follower"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#osc-gesture-follower"}},[e._v("#")]),e._v(" Osc Gesture Follower")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),e._v(" "),t("p",[e._v("The OscGestureFollower component copules the ARE with the external gesture recognition software GestureFollower. The program is copyrighted by IRCAM. GestureFollower is stored in the ARE subfolder tools/GestureFollower. Gesture data can be stored and loaded from files in this subdirectory, these files have the extension “.mubu”. The communication between GestureFollower and the ARE is based on the OpenSoundControl (OSC) protocol. This plugin utilizes the NetUtil java library (http://www.sciss.de/netutil/) for the OSC implementation, it is ©opyrighted 2004-2011 by Hanns Holger Rutz and released under the GNU Lesser General Public License.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(745),alt:"OscGestureFollower howto",title:"OscGestureFollower howto"}})]),e._v(" "),t("p",[e._v("OscGestureFollower howto")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("The plugin requires the gfOSC_v1.exe in subfolder tools/GestureFollower, which implements the actual gesture follower algorithms.")]),e._v(" "),t("li",[e._v("Check your firewall configuration and network settings to ensure that OSC messages are not blocked.")])]),e._v(" "),t("h2",{attrs:{id:"functional-principle"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functional-principle"}},[e._v("#")]),e._v(" Functional Principle")]),e._v(" "),t("p",[e._v("Input data is received through CH1 to CH4 e.g. from sensors like the acceleration measurement unit. Not all inputs must be connected, but the synchronized checkboxes have to be checked correct. The events must be connected like illustrated in the picture. First the gestures must be teached in. To teach in the first gesture, send an event into the ‘learn1’ eventListener. After finishing the first gesture, send an event to ‘learn2’ to teach in the second gesture, and so on. After all gestures are teached in, send the ‘stoplearn’ event. To clear all gestures send the ‘clear’ event. To start the gesture recognition process, send the ‘follow’ event. To stop the gesture following process, send the ‘stop’ event. The ‘load’ and ‘save’ events can be used to load or store the learned gesture data into the given filename.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CH1 - CH4 [double]:")]),e._v(" The input port which receive data values. "),t("strong",[e._v("These 4 input ports support synchronization")])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("likeliest [double]:")]),e._v(" While the gesturefollower is in ‘follwing mode’ the most likeliest gesture is indicated on the likeliest output port. Before it can sample the input data and recognize a gesture, some data must be teached in.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("InPort [integer]:")]),e._v(" This value specifies the Port where OscMessages form the gesture follower are received.")]),e._v(" "),t("li",[t("strong",[e._v("OutPort [integer]:")]),e._v(" This value specifies the Port where OscMessages are send to.")]),e._v(" "),t("li",[t("strong",[e._v("filename [string]:")]),e._v(" Filename for the gesture data (load or save, .mubu file stored in the ARE subfoler tools/GestureFollower/). "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")]),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-ports"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-ports"}},[e._v("#")]),e._v(" Event Listener Ports")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("stop:")]),e._v(" this event stops the gesture following")]),e._v(" "),t("li",[t("strong",[e._v("stoplearn:")]),e._v(" this event stops the gesture learning process")]),e._v(" "),t("li",[t("strong",[e._v("learn1 - learn5:")]),e._v(" these events select gestures 1 - 5 for learning")]),e._v(" "),t("li",[t("strong",[e._v("learn1 - learn5:")]),e._v(" these events select gestures 1 - 5 for learning")]),e._v(" "),t("li",[t("strong",[e._v("clear:")]),e._v(" this event clears learned gestures")]),e._v(" "),t("li",[t("strong",[e._v("follow:")]),e._v(" this event starts the gesture recognition phase")]),e._v(" "),t("li",[t("strong",[e._v("load:")]),e._v(" this event loads gesture data from file")]),e._v(" "),t("li",[t("strong",[e._v("save:")]),e._v(" this event saves gesture data to file")])]),e._v(" "),t("h2",{attrs:{id:"referred-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#referred-plugins"}},[e._v("#")]),e._v(" Referred Plugins")]),e._v(" "),t("ul",[t("li",[e._v("OscOutClient")]),e._v(" "),t("li",[e._v("OpenVibe")]),e._v(" "),t("li",[e._v("OscServer")])])])}),[],!1,null,null,null);t.default=o.exports},745:function(e,t,s){e.exports=s.p+"assets/img/oscgesturefollower.2b835bc5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/220.4862bde0.js b/assets/js/221.903a75e0.js similarity index 97% rename from assets/js/220.4862bde0.js rename to assets/js/221.903a75e0.js index 82caee694b..30cef9f943 100644 --- a/assets/js/220.4862bde0.js +++ b/assets/js/221.903a75e0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[220],{1178:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"oskaexternalscanning1d"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#oskaexternalscanning1d"}},[e._v("#")]),e._v(" OskaExternalScanning1D")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: OSKA)")]),e._v(" "),t("p",[e._v("This component interacts with the On Screen Keyboard Application (OSKA) and forwards key selections and command (action-) strings to other ARE plugins. The scanning function of OSKA can be controlled via this plugin, allowing 1-dimensional input values to be used for direct scanning position selection. This is done in a two-step fashion where first the columns are highlighted and then keys of a column are highlighted. Selection of columns and cells is performed upon incoming events. The event input ports allow switching from row- to column scanning, moving the cell highlighter and selecting a cell.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(744),alt:"Screenshot: OskaExternalScanning1D plugin",title:"Screenshot: OskaExternalScanning1D plugin"}})]),e._v(" "),t("p",[e._v("OskaExternalScanning1D plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v('This component requires Sensory Software’s OSKA keyboard. OSKA is automatically started by the plugin if it is located in the expected path ("…/OSKA/Start Keyboard.exe").')]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("posKey [double]:")]),e._v(" This port takes values for the selection of keys (respectively columns). Depending on the value of the property “inputRange”, the incoming values are expected to be in a range from 0 to 1 (where 0 represents the first selection and 1 the last) or they identifiy the absolute key/column position as integer values. The input moves either the highlighted column or the highlighted key in the selected column to the corresponding position. A selection of the currently highlighted item can be triggered by incoming events.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" This output sends the action strings (which have been added to a key in the OSKA editor) when this key is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("keycodes [string]:")]),e._v(" If a key is selected which contains the “@KDB: …” action string, the key codes are extracted from the action string and sent via this port, e.g. to the remoteKeyboard plugin’s corresponding input port for keyboard input emulation.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("switch:")]),e._v(" Incoming events will trigger a state change in the scanning state machine. On the first press highlighting will switch from column highlighting to cell highlighting. On the second press, the currently highlighted OSKA cell will be selected.")]),e._v(" "),t("li",[t("strong",[e._v("highlightNext:")]),e._v(" Incoming events highlight the next column (or cell in a column).")]),e._v(" "),t("li",[t("strong",[e._v("highlightPrev:")]),e._v(" Incoming events highlight the previous column (or cell in a column).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut10:")]),e._v(" These events can be triggered by selecting a cell which contains an @OSKA,event … action string, (for example @OSKA,event 3).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This property defines the TCP port that the component listens on for connections of the OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("title [string]:")]),e._v(" This property defines the caption to be displayed in OSKA?s title bar.")]),e._v(" "),t("li",[t("strong",[e._v("oskaPath [string]:")]),e._v(" The absolute path to the OSKA player as well as the program name is needed in order for the component to start OSKA by itself.")]),e._v(" "),t("li",[t("strong",[e._v("keyboardPath [string]:")]),e._v(" If this property does not hold an empty string, the component will ask OSKA to load the keyboard referred to by this property. When the ACS is synchronized with the ARE (connected and model deployed) available keyboards can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("highlightStyle [integer]:")]),e._v(" This property selects the style of highlighting used in OSKA, the value range is from 0 to 2.")]),e._v(" "),t("li",[t("strong",[e._v("settingsFile [string]:")]),e._v(" if this property is not empty OSKA will be started with this settings file as a command line parameter. When the ACS is synchronized with the ARE (connected and model deployed) available settings files can be selected from a drop-down listbox "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])]),e._v(" "),t("li",[t("strong",[e._v("windowDecorated [boolean]:")]),e._v(" if true, Oska will display a decorated window frame, otherwise only a lightweight frame.")]),e._v(" "),t("li",[t("strong",[e._v("eventScanningEnabled [boolean]:")]),e._v(" if true, incoming events can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("valueScanningEnabled [boolean]:")]),e._v(" if true, incoming values can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("inputRange [boolean] (combobox):")]),e._v(" the range of the incoming input port values: either float values between 0 and 1, or integer values or integer values from 0 to the maximum element (number of cells in a respective row or column of the grid).")]),e._v(" "),t("li",[t("strong",[e._v("resizeEnabled [boolean]:")]),e._v(" if true, the Oska will be resized to the dimensions specified in the GUI designer (slower).")])])])}),[],!1,null,null,null);t.default=o.exports},744:function(e,t,n){e.exports=n.p+"assets/img/oskaexternalscanning1d.cfe422d9.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[221],{1181:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"oskaexternalscanning1d"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#oskaexternalscanning1d"}},[e._v("#")]),e._v(" OskaExternalScanning1D")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: OSKA)")]),e._v(" "),t("p",[e._v("This component interacts with the On Screen Keyboard Application (OSKA) and forwards key selections and command (action-) strings to other ARE plugins. The scanning function of OSKA can be controlled via this plugin, allowing 1-dimensional input values to be used for direct scanning position selection. This is done in a two-step fashion where first the columns are highlighted and then keys of a column are highlighted. Selection of columns and cells is performed upon incoming events. The event input ports allow switching from row- to column scanning, moving the cell highlighter and selecting a cell.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(746),alt:"Screenshot: OskaExternalScanning1D plugin",title:"Screenshot: OskaExternalScanning1D plugin"}})]),e._v(" "),t("p",[e._v("OskaExternalScanning1D plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v('This component requires Sensory Software’s OSKA keyboard. OSKA is automatically started by the plugin if it is located in the expected path ("…/OSKA/Start Keyboard.exe").')]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("posKey [double]:")]),e._v(" This port takes values for the selection of keys (respectively columns). Depending on the value of the property “inputRange”, the incoming values are expected to be in a range from 0 to 1 (where 0 represents the first selection and 1 the last) or they identifiy the absolute key/column position as integer values. The input moves either the highlighted column or the highlighted key in the selected column to the corresponding position. A selection of the currently highlighted item can be triggered by incoming events.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" This output sends the action strings (which have been added to a key in the OSKA editor) when this key is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("keycodes [string]:")]),e._v(" If a key is selected which contains the “@KDB: …” action string, the key codes are extracted from the action string and sent via this port, e.g. to the remoteKeyboard plugin’s corresponding input port for keyboard input emulation.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("switch:")]),e._v(" Incoming events will trigger a state change in the scanning state machine. On the first press highlighting will switch from column highlighting to cell highlighting. On the second press, the currently highlighted OSKA cell will be selected.")]),e._v(" "),t("li",[t("strong",[e._v("highlightNext:")]),e._v(" Incoming events highlight the next column (or cell in a column).")]),e._v(" "),t("li",[t("strong",[e._v("highlightPrev:")]),e._v(" Incoming events highlight the previous column (or cell in a column).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut10:")]),e._v(" These events can be triggered by selecting a cell which contains an @OSKA,event … action string, (for example @OSKA,event 3).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This property defines the TCP port that the component listens on for connections of the OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("title [string]:")]),e._v(" This property defines the caption to be displayed in OSKA?s title bar.")]),e._v(" "),t("li",[t("strong",[e._v("oskaPath [string]:")]),e._v(" The absolute path to the OSKA player as well as the program name is needed in order for the component to start OSKA by itself.")]),e._v(" "),t("li",[t("strong",[e._v("keyboardPath [string]:")]),e._v(" If this property does not hold an empty string, the component will ask OSKA to load the keyboard referred to by this property. When the ACS is synchronized with the ARE (connected and model deployed) available keyboards can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("highlightStyle [integer]:")]),e._v(" This property selects the style of highlighting used in OSKA, the value range is from 0 to 2.")]),e._v(" "),t("li",[t("strong",[e._v("settingsFile [string]:")]),e._v(" if this property is not empty OSKA will be started with this settings file as a command line parameter. When the ACS is synchronized with the ARE (connected and model deployed) available settings files can be selected from a drop-down listbox "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])]),e._v(" "),t("li",[t("strong",[e._v("windowDecorated [boolean]:")]),e._v(" if true, Oska will display a decorated window frame, otherwise only a lightweight frame.")]),e._v(" "),t("li",[t("strong",[e._v("eventScanningEnabled [boolean]:")]),e._v(" if true, incoming events can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("valueScanningEnabled [boolean]:")]),e._v(" if true, incoming values can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("inputRange [boolean] (combobox):")]),e._v(" the range of the incoming input port values: either float values between 0 and 1, or integer values or integer values from 0 to the maximum element (number of cells in a respective row or column of the grid).")]),e._v(" "),t("li",[t("strong",[e._v("resizeEnabled [boolean]:")]),e._v(" if true, the Oska will be resized to the dimensions specified in the GUI designer (slower).")])])])}),[],!1,null,null,null);t.default=o.exports},746:function(e,t,n){e.exports=n.p+"assets/img/oskaexternalscanning1d.cfe422d9.jpg"}}]); \ No newline at end of file diff --git a/assets/js/221.c6a50e12.js b/assets/js/222.6bd54010.js similarity index 97% rename from assets/js/221.c6a50e12.js rename to assets/js/222.6bd54010.js index 7ea2fb4f44..d0ec33a146 100644 --- a/assets/js/221.c6a50e12.js +++ b/assets/js/222.6bd54010.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[221],{1179:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"oska-external-scanning2d"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#oska-external-scanning2d"}},[e._v("#")]),e._v(" Oska External Scanning2D")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: OSKA)")]),e._v(" "),t("p",[e._v("This component interacts with the On Screen Keyboard Application (OSKA) and forwards key selections and command (action-) strings to other ARE plugins. The scanning function of OSKA can be controlled via this plugin, allowing 1-dimensional input values to be used for direct scanning position selection. Scanning is operated using two float inputs which take inputs in a range defined by the according property (between 0.0 and 1.0. or integer values). The two inputs control the position of the highlighted cell in a grid with values being mapped to a corresponding position in the grid. An event input allows pressing selected cells in the grid.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(745),alt:"Screenshot: OskaExternalScanning2D plugin",title:"Screenshot: OskaExternalScanning2D plugin"}})]),e._v(" "),t("p",[e._v("OskaExternalScanning2D plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v('This component requires Sensory Software’s OSKA keyboard. OSKA is automatically started by the plugin if it is located in the expected path ("…/OSKA/Start Keyboard.exe").')]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("posColumn [double]:")]),e._v(" This port takes values for the selection of the X-position (column selection). Depending on the value of the property “inputRange”, the incoming values are expected to be in a range from 0 to 1 (where 0 represents the first column and 1 the last) or they identifiy the absolute column position as integer values. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("posRow [double]:")]),e._v(" This port takes values for the selection of the Y-position (row selection). Depending on the value of the property “inputRange”, the incoming values are expected to be in a range from 0 to 1 (where 0 represents the first row and 1 the last) or they identifiy the absolute row position as integer values. "),t("strong",[e._v("This input port supports synchronization")])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" This output sends the action strings (which have been added to a key in the OSKA editor) when this key is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("keycodes [string]:")]),e._v(" If a key is selected which contains the “@KDB: …” action string, the key codes are extracted from the action string and sent via this port, e.g. to the remoteKeyboard plugin’s corresponding input port for keyboard input emulation.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("press:")]),e._v(" Incoming events will trigger a press action on the selected key in OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("highlightNextX:")]),e._v(" Incoming events will highlight the next cell in the selected row.")]),e._v(" "),t("li",[t("strong",[e._v("highlightPrevX:")]),e._v(" Incoming events will highlight the previous cell in the selected row.")]),e._v(" "),t("li",[t("strong",[e._v("highlightNextY:")]),e._v(" Incoming events will highlight the next cell in the selected column.")]),e._v(" "),t("li",[t("strong",[e._v("highlightPrevY:")]),e._v(" Incoming events will highlight the previous cell in the selected column.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut10:")]),e._v(" These events can be triggered by selecting a cell which contains an @OSKA,event … action string, (for example @OSKA,event 3).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This property defines the TCP port that the component listens on for connections of the OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("title [string]:")]),e._v(" This property defines the caption to be displayed in OSKA?s title bar.")]),e._v(" "),t("li",[t("strong",[e._v("oskaPath [string]:")]),e._v(" The absolute path to the OSKA player as well as the program name is needed in order for the component to start OSKA by itself.")]),e._v(" "),t("li",[t("strong",[e._v("keyboardPath [string]:")]),e._v(" If this property does not hold an empty string, the component will ask OSKA to load the keyboard referred to by this property. When the ACS is synchronized with the ARE (connected and model deployed) available keyboards can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("highlightStyle [integer]:")]),e._v(" This property selects the style of highlighting used in OSKA, the value range is from 0 to 2.")]),e._v(" "),t("li",[t("strong",[e._v("highlightResetPosition [integer]:")]),e._v(" This property selects the behaviour of the highlighter after a key has been pressed (do nothing / got to top left / got to center / got to bottom right).")]),e._v(" "),t("li",[t("strong",[e._v("settingsFile [string]:")]),e._v(" if this property is not empty OSKA will be started with this settings file as a command line parameter. When the ACS is synchronized with the ARE (connected and model deployed) available settings files can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("windowDecorated [boolean]:")]),e._v(" if true Oska will display a decorated window frame, otherwise only a lightweight frame.")]),e._v(" "),t("li",[t("strong",[e._v("eventScanningEnabled [boolean]:")]),e._v(" if true, incoming events can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("valueScanningEnabled [boolean]:")]),e._v(" if true, incoming values can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("inputRange [boolean] (combobox):")]),e._v(" the range of the incoming input port values: either float values between 0 and 1, or integer values or integer values from 0 to the maximum element (number of cells in a respective row or column of the grid).")]),e._v(" "),t("li",[t("strong",[e._v("resizeEnabled [boolean]:")]),e._v(" if true, the Oska will be resized to the dimensions specified in the GUI designer (slower).")])])])}),[],!1,null,null,null);t.default=o.exports},745:function(e,t,n){e.exports=n.p+"assets/img/oskaexternalscanning2d.ffabad8e.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[222],{1185:function(e,t,n){"use strict";n.r(t);var i=n(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"oska-external-scanning2d"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#oska-external-scanning2d"}},[e._v("#")]),e._v(" Oska External Scanning2D")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: OSKA)")]),e._v(" "),t("p",[e._v("This component interacts with the On Screen Keyboard Application (OSKA) and forwards key selections and command (action-) strings to other ARE plugins. The scanning function of OSKA can be controlled via this plugin, allowing 1-dimensional input values to be used for direct scanning position selection. Scanning is operated using two float inputs which take inputs in a range defined by the according property (between 0.0 and 1.0. or integer values). The two inputs control the position of the highlighted cell in a grid with values being mapped to a corresponding position in the grid. An event input allows pressing selected cells in the grid.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(750),alt:"Screenshot: OskaExternalScanning2D plugin",title:"Screenshot: OskaExternalScanning2D plugin"}})]),e._v(" "),t("p",[e._v("OskaExternalScanning2D plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v('This component requires Sensory Software’s OSKA keyboard. OSKA is automatically started by the plugin if it is located in the expected path ("…/OSKA/Start Keyboard.exe").')]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("posColumn [double]:")]),e._v(" This port takes values for the selection of the X-position (column selection). Depending on the value of the property “inputRange”, the incoming values are expected to be in a range from 0 to 1 (where 0 represents the first column and 1 the last) or they identifiy the absolute column position as integer values. "),t("strong",[e._v("This input port supports synchronization")])]),e._v(" "),t("li",[t("strong",[e._v("posRow [double]:")]),e._v(" This port takes values for the selection of the Y-position (row selection). Depending on the value of the property “inputRange”, the incoming values are expected to be in a range from 0 to 1 (where 0 represents the first row and 1 the last) or they identifiy the absolute row position as integer values. "),t("strong",[e._v("This input port supports synchronization")])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" This output sends the action strings (which have been added to a key in the OSKA editor) when this key is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("keycodes [string]:")]),e._v(" If a key is selected which contains the “@KDB: …” action string, the key codes are extracted from the action string and sent via this port, e.g. to the remoteKeyboard plugin’s corresponding input port for keyboard input emulation.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("press:")]),e._v(" Incoming events will trigger a press action on the selected key in OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("highlightNextX:")]),e._v(" Incoming events will highlight the next cell in the selected row.")]),e._v(" "),t("li",[t("strong",[e._v("highlightPrevX:")]),e._v(" Incoming events will highlight the previous cell in the selected row.")]),e._v(" "),t("li",[t("strong",[e._v("highlightNextY:")]),e._v(" Incoming events will highlight the next cell in the selected column.")]),e._v(" "),t("li",[t("strong",[e._v("highlightPrevY:")]),e._v(" Incoming events will highlight the previous cell in the selected column.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut10:")]),e._v(" These events can be triggered by selecting a cell which contains an @OSKA,event … action string, (for example @OSKA,event 3).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This property defines the TCP port that the component listens on for connections of the OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("title [string]:")]),e._v(" This property defines the caption to be displayed in OSKA?s title bar.")]),e._v(" "),t("li",[t("strong",[e._v("oskaPath [string]:")]),e._v(" The absolute path to the OSKA player as well as the program name is needed in order for the component to start OSKA by itself.")]),e._v(" "),t("li",[t("strong",[e._v("keyboardPath [string]:")]),e._v(" If this property does not hold an empty string, the component will ask OSKA to load the keyboard referred to by this property. When the ACS is synchronized with the ARE (connected and model deployed) available keyboards can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("highlightStyle [integer]:")]),e._v(" This property selects the style of highlighting used in OSKA, the value range is from 0 to 2.")]),e._v(" "),t("li",[t("strong",[e._v("highlightResetPosition [integer]:")]),e._v(" This property selects the behaviour of the highlighter after a key has been pressed (do nothing / got to top left / got to center / got to bottom right).")]),e._v(" "),t("li",[t("strong",[e._v("settingsFile [string]:")]),e._v(" if this property is not empty OSKA will be started with this settings file as a command line parameter. When the ACS is synchronized with the ARE (connected and model deployed) available settings files can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("windowDecorated [boolean]:")]),e._v(" if true Oska will display a decorated window frame, otherwise only a lightweight frame.")]),e._v(" "),t("li",[t("strong",[e._v("eventScanningEnabled [boolean]:")]),e._v(" if true, incoming events can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("valueScanningEnabled [boolean]:")]),e._v(" if true, incoming values can move the highlighter.")]),e._v(" "),t("li",[t("strong",[e._v("inputRange [boolean] (combobox):")]),e._v(" the range of the incoming input port values: either float values between 0 and 1, or integer values or integer values from 0 to the maximum element (number of cells in a respective row or column of the grid).")]),e._v(" "),t("li",[t("strong",[e._v("resizeEnabled [boolean]:")]),e._v(" if true, the Oska will be resized to the dimensions specified in the GUI designer (slower).")])])])}),[],!1,null,null,null);t.default=o.exports},750:function(e,t,n){e.exports=n.p+"assets/img/oskaexternalscanning2d.ffabad8e.jpg"}}]); \ No newline at end of file diff --git a/assets/js/222.149b5db4.js b/assets/js/223.5574abe9.js similarity index 96% rename from assets/js/222.149b5db4.js rename to assets/js/223.5574abe9.js index 2b38ba1c90..d53e1a8f17 100644 --- a/assets/js/222.149b5db4.js +++ b/assets/js/223.5574abe9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[222],{1177:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"oska-internal-scanning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#oska-internal-scanning"}},[e._v("#")]),e._v(" Oska Internal Scanning")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: OSKA)")]),e._v(" "),t("p",[e._v("This component interacts with the On Screen Keyboard Application (OSKA) and forwards key selections and command (action-) strings to other ARE plugins. OSKA is set to use its internal scanning methods and the component exposes the two button input events that Oska can work with.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(743),alt:"Screenshot: OskaInternalScanning plugin",title:"Screenshot: OskaInternalScanning plugin"}})]),e._v(" "),t("p",[e._v("OskaInternalScanning plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v('This component requires Sensory Software’s OSKA keyboard. OSKA is automatically started by the plugin if it is located in the expected path ("…/OSKA/Start Keyboard.exe").')]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" This output sends the action string which is attached to a specific key on the keyboard to connected components.")]),e._v(" "),t("li",[t("strong",[e._v("keycodes [string]:")]),e._v(" This output sends the key codes which are attached to a key via the @KDB command.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("increaseScanspeed:")]),e._v(" Incoming events will increase the internal scanning speed of OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("decreaseScanspeed:")]),e._v(" Incoming events will decrease the internal scanning speed of OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("pressSwitch1:")]),e._v(" Incoming events start the automatic scanning or switch to the next selection (to speed up the scanning).")]),e._v(" "),t("li",[t("strong",[e._v("pressSwitch2:")]),e._v(" Incoming events switch from column- to row scanning (or in the next step select the cell). If the scanning is stopped, it will be started.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut10:")]),e._v(" These events can be triggered by selecting a cell which contains an @OSKA,event … action string, (for example @OSKA,event 3).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This property defines the TCP port that the component listens on for connections of the OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("title [string]:")]),e._v(" This property defines the caption to be displayed in OSKA?s title bar.")]),e._v(" "),t("li",[t("strong",[e._v("oskaPath [string]:")]),e._v(" The absolute path to the OSKA player as well as the program name is needed in order for the component to start OSKA by itself.")]),e._v(" "),t("li",[t("strong",[e._v("keyboardPath [string]:")]),e._v(" If this property does not hold an empty string, the component will ask OSKA to load the keyboard referred to by this property. When the ACS is synchronized with the ARE (connected and model deployed) available keyboards can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("scanSpeed [integer]:")]),e._v(" This property relates to the internal row column scanning method of OSKA and sets the speed of scanning, the value range is between 1 and 10.")]),e._v(" "),t("li",[t("strong",[e._v("highlightStyle [integer]:")]),e._v(" This property selects the style of highlighting used in OSKA, the value range is from 0 to 2.")]),e._v(" "),t("li",[t("strong",[e._v("settingsFile [string]:")]),e._v(" if this property is not empty OSKA will be started with this settings file as a command line parameter. When the ACS is synchronized with the ARE (connected and model deployed) available settings files can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("windowDecorated [boolean]:")]),e._v(" if true, Oska will display a decorated window frame, otherwise only a lightweight frame.")]),e._v(" "),t("li",[t("strong",[e._v("resizeEnabled [boolean]:")]),e._v(" if true, the Oska will be resized to the dimensions specified in the GUI designer (slower).")])])])}),[],!1,null,null,null);t.default=i.exports},743:function(e,t,n){e.exports=n.p+"assets/img/oskainternalscanning.bfba2e29.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[223],{1183:function(e,t,n){"use strict";n.r(t);var s=n(2),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"oska-internal-scanning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#oska-internal-scanning"}},[e._v("#")]),e._v(" Oska Internal Scanning")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: OSKA)")]),e._v(" "),t("p",[e._v("This component interacts with the On Screen Keyboard Application (OSKA) and forwards key selections and command (action-) strings to other ARE plugins. OSKA is set to use its internal scanning methods and the component exposes the two button input events that Oska can work with.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(748),alt:"Screenshot: OskaInternalScanning plugin",title:"Screenshot: OskaInternalScanning plugin"}})]),e._v(" "),t("p",[e._v("OskaInternalScanning plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v('This component requires Sensory Software’s OSKA keyboard. OSKA is automatically started by the plugin if it is located in the expected path ("…/OSKA/Start Keyboard.exe").')]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" This output sends the action string which is attached to a specific key on the keyboard to connected components.")]),e._v(" "),t("li",[t("strong",[e._v("keycodes [string]:")]),e._v(" This output sends the key codes which are attached to a key via the @KDB command.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("increaseScanspeed:")]),e._v(" Incoming events will increase the internal scanning speed of OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("decreaseScanspeed:")]),e._v(" Incoming events will decrease the internal scanning speed of OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("pressSwitch1:")]),e._v(" Incoming events start the automatic scanning or switch to the next selection (to speed up the scanning).")]),e._v(" "),t("li",[t("strong",[e._v("pressSwitch2:")]),e._v(" Incoming events switch from column- to row scanning (or in the next step select the cell). If the scanning is stopped, it will be started.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventOut1-eventOut10:")]),e._v(" These events can be triggered by selecting a cell which contains an @OSKA,event … action string, (for example @OSKA,event 3).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("port [integer]:")]),e._v(" This property defines the TCP port that the component listens on for connections of the OSKA.")]),e._v(" "),t("li",[t("strong",[e._v("title [string]:")]),e._v(" This property defines the caption to be displayed in OSKA?s title bar.")]),e._v(" "),t("li",[t("strong",[e._v("oskaPath [string]:")]),e._v(" The absolute path to the OSKA player as well as the program name is needed in order for the component to start OSKA by itself.")]),e._v(" "),t("li",[t("strong",[e._v("keyboardPath [string]:")]),e._v(" If this property does not hold an empty string, the component will ask OSKA to load the keyboard referred to by this property. When the ACS is synchronized with the ARE (connected and model deployed) available keyboards can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("scanSpeed [integer]:")]),e._v(" This property relates to the internal row column scanning method of OSKA and sets the speed of scanning, the value range is between 1 and 10.")]),e._v(" "),t("li",[t("strong",[e._v("highlightStyle [integer]:")]),e._v(" This property selects the style of highlighting used in OSKA, the value range is from 0 to 2.")]),e._v(" "),t("li",[t("strong",[e._v("settingsFile [string]:")]),e._v(" if this property is not empty OSKA will be started with this settings file as a command line parameter. When the ACS is synchronized with the ARE (connected and model deployed) available settings files can be selected from a drop-down listbox. (dynamic property)")]),e._v(" "),t("li",[t("strong",[e._v("windowDecorated [boolean]:")]),e._v(" if true, Oska will display a decorated window frame, otherwise only a lightweight frame.")]),e._v(" "),t("li",[t("strong",[e._v("resizeEnabled [boolean]:")]),e._v(" if true, the Oska will be resized to the dimensions specified in the GUI designer (slower).")])])])}),[],!1,null,null,null);t.default=i.exports},748:function(e,t,n){e.exports=n.p+"assets/img/oskainternalscanning.bfba2e29.jpg"}}]); \ No newline at end of file diff --git a/assets/js/223.59e11916.js b/assets/js/224.08c71da2.js similarity index 93% rename from assets/js/223.59e11916.js rename to assets/js/224.08c71da2.js index 981412a41c..966f53c53e 100644 --- a/assets/js/223.59e11916.js +++ b/assets/js/224.08c71da2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[223],{1180:function(t,e,r){"use strict";r.r(e);var s=r(2),o=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"path-multiplexer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#path-multiplexer"}},[t._v("#")]),t._v(" Path Multiplexer")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The Path Multiplexer component forwards signal from the selected input port to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(746),alt:"Screenshot: PathMultiplexer plugin",title:"Screenshot: PathMultiplexer plugin"}})]),t._v(" "),e("p",[t._v("PathMultiplexer plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1 to input4 [double]:")]),t._v(" The input ports for signals to be multiplexed 1…4.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v("[double]**")]),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("* The output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("passPort1 to passPort4:")]),t._v(" The event send to this port sets the forwarding signal from the appropriate input port:1…4 to the output port.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passNextPort:")]),t._v(" The event send to this port sets the forwarding signal from the next input port. If the current used is the port defined by the number property, the signal will be forward from the input port 1.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passPreviousPort:")]),t._v(" The event send to this port sets the forwarding signal from the previous input port. If the current used is the port 1, the signal will be forward from the input port defined by the number property.")])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("number [integer]:")]),t._v(" The maximum port number in use (can be 1 to 4).")])])])}),[],!1,null,null,null);e.default=o.exports},746:function(t,e,r){t.exports=r.p+"assets/img/pathmultiplexer.22710744.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[224],{1182:function(t,e,r){"use strict";r.r(e);var s=r(2),o=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"path-multiplexer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#path-multiplexer"}},[t._v("#")]),t._v(" Path Multiplexer")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The Path Multiplexer component forwards signal from the selected input port to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(747),alt:"Screenshot: PathMultiplexer plugin",title:"Screenshot: PathMultiplexer plugin"}})]),t._v(" "),e("p",[t._v("PathMultiplexer plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1 to input4 [double]:")]),t._v(" The input ports for signals to be multiplexed 1…4.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v("[double]**")]),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("* The output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("passPort1 to passPort4:")]),t._v(" The event send to this port sets the forwarding signal from the appropriate input port:1…4 to the output port.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passNextPort:")]),t._v(" The event send to this port sets the forwarding signal from the next input port. If the current used is the port defined by the number property, the signal will be forward from the input port 1.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passPreviousPort:")]),t._v(" The event send to this port sets the forwarding signal from the previous input port. If the current used is the port 1, the signal will be forward from the input port defined by the number property.")])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("number [integer]:")]),t._v(" The maximum port number in use (can be 1 to 4).")])])])}),[],!1,null,null,null);e.default=o.exports},747:function(t,e,r){t.exports=r.p+"assets/img/pathmultiplexer.22710744.jpg"}}]); \ No newline at end of file diff --git a/assets/js/224.2688ee02.js b/assets/js/225.a7c220a9.js similarity index 93% rename from assets/js/224.2688ee02.js rename to assets/js/225.a7c220a9.js index a896482f03..7b16a6bba6 100644 --- a/assets/js/224.2688ee02.js +++ b/assets/js/225.a7c220a9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[224],{1181:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"pathselector"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pathselector"}},[t._v("#")]),t._v(" Pathselector")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The pathselector component allows routing of an incoming numerical signal between up to 4 output ports. The desired output port can be directly selected by a dedicated event listener port, or the signal can be switched to the next or previous output port. This component can be used to utilize one particular signal for different purposes, e.g. controlling different actuators within a single model by sequentially switching between them.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(747),alt:"Screenshot: PathSelector plugin",title:"Screenshot: PathSelector plugin"}})]),t._v(" "),e("p",[t._v("PathSelector plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" The incoming signal to be routed.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1 to out4:")]),t._v(" Four output ports where the incoming signal can be routed to.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("select1 to select4:")]),t._v(" An incoming event at these ports directly activates the associated output path (e.g. as an event comes in at select 3, the input signal will be routed to out3.")]),t._v(" "),e("li",[e("strong",[t._v("selectNext:")]),t._v(" The next output port is selected for signal output. The maximum number of active ports is set via the active ports property. If the current number of active ports is already the maximum one, the select next event will wrap around the active port number and one port will be selected.")]),t._v(" "),e("li",[e("strong",[t._v("selectPrevious:")]),t._v(" The previous output port is selected for signal output. If the current port is out1, the select previous event will switch to the port with the maximum number given by the active ports property.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("activePorts [integer]:")]),t._v(" The maximum port number in use (can be 2 to 4).")])])])}),[],!1,null,null,null);e.default=s.exports},747:function(t,e,r){t.exports=r.p+"assets/img/pathselector.972367d5.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[225],{1186:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"pathselector"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pathselector"}},[t._v("#")]),t._v(" Pathselector")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The pathselector component allows routing of an incoming numerical signal between up to 4 output ports. The desired output port can be directly selected by a dedicated event listener port, or the signal can be switched to the next or previous output port. This component can be used to utilize one particular signal for different purposes, e.g. controlling different actuators within a single model by sequentially switching between them.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(751),alt:"Screenshot: PathSelector plugin",title:"Screenshot: PathSelector plugin"}})]),t._v(" "),e("p",[t._v("PathSelector plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" The incoming signal to be routed.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1 to out4:")]),t._v(" Four output ports where the incoming signal can be routed to.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("select1 to select4:")]),t._v(" An incoming event at these ports directly activates the associated output path (e.g. as an event comes in at select 3, the input signal will be routed to out3.")]),t._v(" "),e("li",[e("strong",[t._v("selectNext:")]),t._v(" The next output port is selected for signal output. The maximum number of active ports is set via the active ports property. If the current number of active ports is already the maximum one, the select next event will wrap around the active port number and one port will be selected.")]),t._v(" "),e("li",[e("strong",[t._v("selectPrevious:")]),t._v(" The previous output port is selected for signal output. If the current port is out1, the select previous event will switch to the port with the maximum number given by the active ports property.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("activePorts [integer]:")]),t._v(" The maximum port number in use (can be 2 to 4).")])])])}),[],!1,null,null,null);e.default=s.exports},751:function(t,e,r){t.exports=r.p+"assets/img/pathselector.972367d5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/225.5fb039ce.js b/assets/js/226.8dcc6292.js similarity index 98% rename from assets/js/225.5fb039ce.js rename to assets/js/226.8dcc6292.js index 557c8f8e66..c59a17cbdb 100644 --- a/assets/js/225.5fb039ce.js +++ b/assets/js/226.8dcc6292.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[225],{1183:function(e,t,a){"use strict";a.r(t);var o=a(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"peakdetector"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#peakdetector"}},[e._v("#")]),e._v(" PeakDetector")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Basic Math)")]),e._v(" "),t("p",[e._v("The Peakdetector component can be used to detect peaks (top values of the signal) and valleys (bottom values) in a signal. Additionally it can calculate the time between two peaks or two valleys or between a peak and a valley. Optionally, top and bottom values can be compared with an average of the most recent top / bottom values - this allows to detect only peaks which are for example greater than 150% of the last 5 averaged peak values.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(749),alt:"Screenshot: PeakDetector plugin",title:"Screenshot: PeakDetector plugin"}})]),e._v(" "),t("p",[e._v("PeakDetector plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in [double]:")]),e._v(" The incoming signal.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("top:")]),e._v(" The peak value of the signal.")]),e._v(" "),t("li",[t("strong",[e._v("bottom:")]),e._v(" The bottom value of the signal.")]),e._v(" "),t("li",[t("strong",[e._v("time:")]),e._v(" The time in ms or beats per minute (BPM) (depending on the property timeMode) between two peaks (Mode=detect tops), two valleys (Mode=detect bottoms) or a valley and a peak (Mode=detect both) depending on the selected mode in the properties.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("topDetected:")]),e._v(" The event gets fired if a new top value was detected in the input signal.")]),e._v(" "),t("li",[t("strong",[e._v("bottomDetected:")]),e._v(" The event gets fired if a new bottom value was detected in the input signal.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mode:")]),e._v(" Determines which time frame will be used for the time output signal (see description of the output port time).")]),e._v(" "),t("li",[e._v("**comparePeaks:**the number of top / bottom values which are taken into account for averaging (0 = disable)")]),e._v(" "),t("li",[e._v("**validTopPercentage:**the percentage of the recent averaged top values which constitutes a valid top value (0 = all top values are valid)")]),e._v(" "),t("li",[e._v("**validBottomPercentage:**the percentage of the recent averaged bottom values which constitutes a valid bottom value (0 = all bottom values are valid)")]),e._v(" "),t("li",[t("strong",[e._v("timeMode:")]),e._v(" Determines the unit for the measured time frame between top/bottom values. Options are beats per minute (BPM) or milliseconds.")])])])}),[],!1,null,null,null);t.default=r.exports},749:function(e,t,a){e.exports=a.p+"assets/img/peakdetector.696ec72f.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[226],{1184:function(e,t,a){"use strict";a.r(t);var o=a(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"peakdetector"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#peakdetector"}},[e._v("#")]),e._v(" PeakDetector")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Basic Math)")]),e._v(" "),t("p",[e._v("The Peakdetector component can be used to detect peaks (top values of the signal) and valleys (bottom values) in a signal. Additionally it can calculate the time between two peaks or two valleys or between a peak and a valley. Optionally, top and bottom values can be compared with an average of the most recent top / bottom values - this allows to detect only peaks which are for example greater than 150% of the last 5 averaged peak values.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(749),alt:"Screenshot: PeakDetector plugin",title:"Screenshot: PeakDetector plugin"}})]),e._v(" "),t("p",[e._v("PeakDetector plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in [double]:")]),e._v(" The incoming signal.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("top:")]),e._v(" The peak value of the signal.")]),e._v(" "),t("li",[t("strong",[e._v("bottom:")]),e._v(" The bottom value of the signal.")]),e._v(" "),t("li",[t("strong",[e._v("time:")]),e._v(" The time in ms or beats per minute (BPM) (depending on the property timeMode) between two peaks (Mode=detect tops), two valleys (Mode=detect bottoms) or a valley and a peak (Mode=detect both) depending on the selected mode in the properties.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("topDetected:")]),e._v(" The event gets fired if a new top value was detected in the input signal.")]),e._v(" "),t("li",[t("strong",[e._v("bottomDetected:")]),e._v(" The event gets fired if a new bottom value was detected in the input signal.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mode:")]),e._v(" Determines which time frame will be used for the time output signal (see description of the output port time).")]),e._v(" "),t("li",[e._v("**comparePeaks:**the number of top / bottom values which are taken into account for averaging (0 = disable)")]),e._v(" "),t("li",[e._v("**validTopPercentage:**the percentage of the recent averaged top values which constitutes a valid top value (0 = all top values are valid)")]),e._v(" "),t("li",[e._v("**validBottomPercentage:**the percentage of the recent averaged bottom values which constitutes a valid bottom value (0 = all bottom values are valid)")]),e._v(" "),t("li",[t("strong",[e._v("timeMode:")]),e._v(" Determines the unit for the measured time frame between top/bottom values. Options are beats per minute (BPM) or milliseconds.")])])])}),[],!1,null,null,null);t.default=r.exports},749:function(e,t,a){e.exports=a.p+"assets/img/peakdetector.696ec72f.png"}}]); \ No newline at end of file diff --git a/assets/js/226.d993e9ae.js b/assets/js/227.001f2481.js similarity index 96% rename from assets/js/226.d993e9ae.js rename to assets/js/227.001f2481.js index 0c8d1f8c26..211cbb4b70 100644 --- a/assets/js/226.d993e9ae.js +++ b/assets/js/227.001f2481.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[226],{1182:function(t,e,r){"use strict";r.r(e);var n=r(2),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"protocol-ssvep-train"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#protocol-ssvep-train"}},[t._v("#")]),t._v(" Protocol SSVEP Train")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feauture-extraction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feauture-extraction"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feauture extraction)")]),t._v(" "),e("p",[t._v("This component is in charge of managing and configuring the SSVEP training recording protocol. It sends out the corresponding SSVEP stimulation frequencies.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(748),alt:"Screenshot: ProtocolSSVEPTrain plugin",title:"Screenshot: ProtocolSSVEPTrain plugin"}})]),t._v(" "),e("p",[t._v("ProtocolSSVEPTrain plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This plugins must be connected to the FlickeringLightStimulator plugin (which triggers the external SSVEP stimulation panels) or to the SSVEPStiumlator plugin.")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StimFrequency [integer]:")]),t._v(" Current stimulation frequency in Hz under test.")]),t._v(" "),e("li",[e("strong",[t._v("Freq2 [integer]:")]),t._v(" Background stimulation frequency in Hz for panel 2.")]),t._v(" "),e("li",[e("strong",[t._v("Freq3 [integer]:")]),t._v(" Background Stimulation frequency in Hz for panel 3.")]),t._v(" "),e("li",[e("strong",[t._v("Freq4 [integer]:")]),t._v(" Background Stimulation frequency in Hz for panel 4.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartProt:")]),t._v(" Start protocol request.")]),t._v(" "),e("li",[e("strong",[t._v("StopProt:")]),t._v(" Stop protocol request.")]),t._v(" "),e("li",[e("strong",[t._v("Continue:")]),t._v(" Next Stimulation trial request")]),t._v(" "),e("li",[e("strong",[t._v("Repeat:")]),t._v(" Repeat last stimulation trial request.")]),t._v(" "),e("li",[e("strong",[t._v("Stop:")]),t._v(" Abort current stimulation trial request.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartTrial:")]),t._v(" Event sent when a stimulation trial starts.")]),t._v(" "),e("li",[e("strong",[t._v("StopTrial:")]),t._v(" Event sent when a stimulation trial ends.")]),t._v(" "),e("li",[e("strong",[t._v("StartStim:")]),t._v(" Event sent when a stimulation period starts.")]),t._v(" "),e("li",[e("strong",[t._v("StopStim:")]),t._v(" Event sent when a stimulation period ends.")]),t._v(" "),e("li",[e("strong",[t._v("ReadyStim:")]),t._v(" EEvent sent 1 second befor the stimulation periods starts.")]),t._v(" "),e("li",[e("strong",[t._v("UpdatePanelConfig:")]),t._v(" Event sent requesting a stimulation panels re-configuration.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("NumRepetitions [integer]:")]),t._v(" Number of stimulation periods per trial.")]),t._v(" "),e("li",[e("strong",[t._v("RepStimDuration [integer]:")]),t._v(" Stimulation period duration in seconds.")]),t._v(" "),e("li",[e("strong",[t._v("RepNonStimDuration [integer]:")]),t._v(" Non-Stimulation period duration in seconds.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim1 [integer]:")]),t._v(" Stimulation frequency number 1 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim2 [integer]:")]),t._v(" Stimulation frequency number 2 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim3 [integer]:")]),t._v(" Stimulation frequency number 3 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim4 [integer]:")]),t._v(" Stimulation frequency number 4 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim5 [integer]:")]),t._v(" Stimulation frequency number 5 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim6 [integer]:")]),t._v(" Stimulation frequency number 6 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim7 [integer]:")]),t._v(" Stimulation frequency number 7 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim8 [integer]:")]),t._v(" Stimulation frequency number 8 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim9 [integer]:")]),t._v(" Stimulation frequency number 9 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim10 [integer]:")]),t._v(" Stimulation frequency number 10 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("RandomizeFreq [boolean]:")]),t._v(" Randomize stimulation frequencies order.")])])])}),[],!1,null,null,null);e.default=i.exports},748:function(t,e,r){t.exports=r.p+"assets/img/protocolssveptrain.0fb67610.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[227],{1188:function(t,e,r){"use strict";r.r(e);var n=r(2),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"protocol-ssvep-train"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#protocol-ssvep-train"}},[t._v("#")]),t._v(" Protocol SSVEP Train")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feauture-extraction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feauture-extraction"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feauture extraction)")]),t._v(" "),e("p",[t._v("This component is in charge of managing and configuring the SSVEP training recording protocol. It sends out the corresponding SSVEP stimulation frequencies.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(753),alt:"Screenshot: ProtocolSSVEPTrain plugin",title:"Screenshot: ProtocolSSVEPTrain plugin"}})]),t._v(" "),e("p",[t._v("ProtocolSSVEPTrain plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This plugins must be connected to the FlickeringLightStimulator plugin (which triggers the external SSVEP stimulation panels) or to the SSVEPStiumlator plugin.")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StimFrequency [integer]:")]),t._v(" Current stimulation frequency in Hz under test.")]),t._v(" "),e("li",[e("strong",[t._v("Freq2 [integer]:")]),t._v(" Background stimulation frequency in Hz for panel 2.")]),t._v(" "),e("li",[e("strong",[t._v("Freq3 [integer]:")]),t._v(" Background Stimulation frequency in Hz for panel 3.")]),t._v(" "),e("li",[e("strong",[t._v("Freq4 [integer]:")]),t._v(" Background Stimulation frequency in Hz for panel 4.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartProt:")]),t._v(" Start protocol request.")]),t._v(" "),e("li",[e("strong",[t._v("StopProt:")]),t._v(" Stop protocol request.")]),t._v(" "),e("li",[e("strong",[t._v("Continue:")]),t._v(" Next Stimulation trial request")]),t._v(" "),e("li",[e("strong",[t._v("Repeat:")]),t._v(" Repeat last stimulation trial request.")]),t._v(" "),e("li",[e("strong",[t._v("Stop:")]),t._v(" Abort current stimulation trial request.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartTrial:")]),t._v(" Event sent when a stimulation trial starts.")]),t._v(" "),e("li",[e("strong",[t._v("StopTrial:")]),t._v(" Event sent when a stimulation trial ends.")]),t._v(" "),e("li",[e("strong",[t._v("StartStim:")]),t._v(" Event sent when a stimulation period starts.")]),t._v(" "),e("li",[e("strong",[t._v("StopStim:")]),t._v(" Event sent when a stimulation period ends.")]),t._v(" "),e("li",[e("strong",[t._v("ReadyStim:")]),t._v(" EEvent sent 1 second befor the stimulation periods starts.")]),t._v(" "),e("li",[e("strong",[t._v("UpdatePanelConfig:")]),t._v(" Event sent requesting a stimulation panels re-configuration.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("NumRepetitions [integer]:")]),t._v(" Number of stimulation periods per trial.")]),t._v(" "),e("li",[e("strong",[t._v("RepStimDuration [integer]:")]),t._v(" Stimulation period duration in seconds.")]),t._v(" "),e("li",[e("strong",[t._v("RepNonStimDuration [integer]:")]),t._v(" Non-Stimulation period duration in seconds.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim1 [integer]:")]),t._v(" Stimulation frequency number 1 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim2 [integer]:")]),t._v(" Stimulation frequency number 2 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim3 [integer]:")]),t._v(" Stimulation frequency number 3 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim4 [integer]:")]),t._v(" Stimulation frequency number 4 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim5 [integer]:")]),t._v(" Stimulation frequency number 5 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim6 [integer]:")]),t._v(" Stimulation frequency number 6 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim7 [integer]:")]),t._v(" Stimulation frequency number 7 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim8 [integer]:")]),t._v(" Stimulation frequency number 8 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim9 [integer]:")]),t._v(" Stimulation frequency number 9 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("freqStim10 [integer]:")]),t._v(" Stimulation frequency number 10 in Hz.")]),t._v(" "),e("li",[e("strong",[t._v("RandomizeFreq [boolean]:")]),t._v(" Randomize stimulation frequencies order.")])])])}),[],!1,null,null,null);e.default=i.exports},753:function(t,e,r){t.exports=r.p+"assets/img/protocolssveptrain.0fb67610.jpg"}}]); \ No newline at end of file diff --git a/assets/js/227.6ed51b2b.js b/assets/js/228.1e46df4d.js similarity index 89% rename from assets/js/227.6ed51b2b.js rename to assets/js/228.1e46df4d.js index 3d468f0ae2..6ce3f25954 100644 --- a/assets/js/227.6ed51b2b.js +++ b/assets/js/228.1e46df4d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[227],{1184:function(t,e,r){"use strict";r.r(e);var i=r(2),a=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"quantizer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#quantizer"}},[t._v("#")]),t._v(" Quantizer")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin performs a quantization of the input signal. The value of the output signal is the input value rounded to the nearest multiple of the quantizationStep property value.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(750),alt:"Screenshot: Quantizer plugin",title:"Screenshot: Quantizer plugin"}})]),t._v(" "),e("p",[t._v("Quantizer plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the values to be quantized.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port for the quantized values.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("quantizationStep [double]:")]),t._v(" The quantization step.")])])])}),[],!1,null,null,null);e.default=a.exports},750:function(t,e,r){t.exports=r.p+"assets/img/quantizer.e59f2f05.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[228],{1189:function(t,e,r){"use strict";r.r(e);var i=r(2),a=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"quantizer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#quantizer"}},[t._v("#")]),t._v(" Quantizer")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin performs a quantization of the input signal. The value of the output signal is the input value rounded to the nearest multiple of the quantizationStep property value.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(754),alt:"Screenshot: Quantizer plugin",title:"Screenshot: Quantizer plugin"}})]),t._v(" "),e("p",[t._v("Quantizer plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the values to be quantized.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [double]:")]),t._v(" Output port for the quantized values.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("quantizationStep [double]:")]),t._v(" The quantization step.")])])])}),[],!1,null,null,null);e.default=a.exports},754:function(t,e,r){t.exports=r.p+"assets/img/quantizer.e59f2f05.jpg"}}]); \ No newline at end of file diff --git a/assets/js/228.7e1392c3.js b/assets/js/229.8dac50c5.js similarity index 95% rename from assets/js/228.7e1392c3.js rename to assets/js/229.8dac50c5.js index 8ffc4a075b..0d6e6e1920 100644 --- a/assets/js/228.7e1392c3.js +++ b/assets/js/229.8dac50c5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[228],{1185:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component processes strings with regular expressions. It can work in two modes: match strings with the pattern or replace string parts with another string. The regular expression syntax is defined in the "),e("a",{attrs:{href:"https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java class Pattern"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("img",{attrs:{src:r(751),alt:"Screenshot: RegularExpression plugin",title:"Screenshot: RegularExpression plugin"}})]),t._v(" "),e("p",[t._v("RegularExpression plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" String to match against the regular expression.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" If property replace=false, sends out input string in case of a match. if property replace=true, sends out replaced string.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("match")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if the string matches the pattern.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("notMatch")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if the string doesn’t match the pattern.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("replace")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if parts of the string where replaced by the replaceString.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("notReplace")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if no replacement occurred.")])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("pattern [string]:")]),t._v(" Regular expression pattern, see "),e("a",{attrs:{href:"https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java class Pattern"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("li",[e("strong",[t._v("replace [boolean]:")]),t._v(" If the property is set to true, the component will search parts of the string which match the pattern and replace these parts with the replaceString, otherwise the component will match the whole string with the pattern.")]),t._v(" "),e("li",[e("strong",[t._v("replaceString [string]:")]),t._v(" The string which replaces expressions which matching the pattern.")])])])}),[],!1,null,null,null);e.default=n.exports},751:function(t,e,r){t.exports=r.p+"assets/img/regularexpression.6f50f3a3.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[229],{1190:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component processes strings with regular expressions. It can work in two modes: match strings with the pattern or replace string parts with another string. The regular expression syntax is defined in the "),e("a",{attrs:{href:"https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java class Pattern"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("img",{attrs:{src:r(755),alt:"Screenshot: RegularExpression plugin",title:"Screenshot: RegularExpression plugin"}})]),t._v(" "),e("p",[t._v("RegularExpression plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" String to match against the regular expression.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" If property replace=false, sends out input string in case of a match. if property replace=true, sends out replaced string.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("match")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if the string matches the pattern.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("notMatch")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if the string doesn’t match the pattern.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("replace")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if parts of the string where replaced by the replaceString.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("notReplace")]),t._v(" "),e("strong",[t._v(":")]),t._v(" This event is sent if no replacement occurred.")])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("pattern [string]:")]),t._v(" Regular expression pattern, see "),e("a",{attrs:{href:"https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java class Pattern"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("li",[e("strong",[t._v("replace [boolean]:")]),t._v(" If the property is set to true, the component will search parts of the string which match the pattern and replace these parts with the replaceString, otherwise the component will match the whole string with the pattern.")]),t._v(" "),e("li",[e("strong",[t._v("replaceString [string]:")]),t._v(" The string which replaces expressions which matching the pattern.")])])])}),[],!1,null,null,null);e.default=n.exports},755:function(t,e,r){t.exports=r.p+"assets/img/regularexpression.6f50f3a3.jpg"}}]); \ No newline at end of file diff --git a/assets/js/23.c25a6026.js b/assets/js/23.469b612e.js similarity index 97% rename from assets/js/23.c25a6026.js rename to assets/js/23.469b612e.js index ff6aa5aac3..c218bab992 100644 --- a/assets/js/23.c25a6026.js +++ b/assets/js/23.469b612e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{416:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-01.c458bb02.png"},417:function(A,t){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABtIAAAA2CAIAAADVm5rCAAAAA3NCSVQICAjb4U/gAAAAEHRFWHRTb2Z0d2FyZQBTaHV0dGVyY4LQCQAAIABJREFUeNrt3X18U9X9B/DvTXJTuQGSQlMgAdPOpkAKfdC2G61reSg4wFGcwBQYIFgmilIU+Kk8PxR8mKOogDKe5WGT7SfwEnDFSXG2bBRtRVu00V+DkqoN2FRItLltzu+PtGnaJm0CFWvzeb9e+rLJTdJ7/PScc0/OOZdjjBEAAAAAAAAAAABAx5GgCAAAAAAAAAAAAKBjyVAEAAAAAOBJufcjFAJ0KjUzhqIQAAAAfnYw2xEAAAAAAAAAAAA6GIYdAQAAAAAAAAAAoINhkTUAAAAAeIeVrfDTwnp/AACAnzUMOwIAAHRSjDGvD3p9HMAfHMdxHOf1cQQSkEZAIBFIQCABOjaQGHYEAADodBhjdru9qqrqm2++uXr1KmPM6XQ6nU7GmFQqRfnAjaivr+c4TiKRSCQSjuN69OgRHh7ep08fQRB89R0RSEAaAYFEIAGBBAQyoEC6cBjwBgAA6FQYYx999FFNTU2/fv169+4tCIKrdZdKpf58owjQbsBcfUfXxAe73X7lyhWz2axSqYYOHerKmHtla82MoQgk/IRp9IwiqkfoDNUj2mtAIAGB9CeQbpjtCAAA0LladNd31CNGjJBJpazx0Ybn8GUhdBCpREJExHFKpVKlVOp0ulOnTvXt21etVnt2HBFI+GnTiOoRUD0CAolAws8ukJ4w7AgAANC5fP311wMHDpRKpU70EeHHxhgRMSKpVBodHf3VV1+1GOhBIAFpBAQSgQQEEiDQQLph2BEAAKBTNeLMZrNFRkYSMSL0GuHm6dWrl9l8iTHWYvYEAgk/YRpRPQKqRwAEEn52gfSEYUcAAIDOpa6uTiqVMkb4rhpuJolEUldXj0AC0giAQAICCXCDgXTDsGMA2rgP/Y3cTRwAAKBFr1Emk+HLarjJpFJpXV0dAglIIwACCQgkwA0G0g3Djn7x5z701303cQAAAM8WRxRFqUSCTiPcZLxMJopi62WtCCQgjYBAIpCAQAL4H0hPGHb06wrQfR/6gQMHduvWzet96FvcTfz777+/cuXK+++/3+7dxAEAADxbk/r6eolUipsOwk3GSSSubgwCCUgjAAIJCCTAdQfSE4Yd27/8c9+HXiqVuu/X4362xfGuyY8ckZznlf7dTRwAAMDN6XRKJBJXG4O9eeDmdhs5iUTSom+DQALSCIBAAgIJEFAgPWHYsX2u+9BLJBLGnH5+c8BcZU9MKpW0ezdxAAAAr00J+oxwUzuNCCQgjQAIJCCQAB0XSMKwY/tXfY33oXctnQ7wpcRx1KtXr0uX2rqbOAAAgI9OI/qNcJNTh0AGyGFzyBVylAPS+KOGrNrm8PmsXBGKBCKQNyuLVRXlZqtIRESCOnpgfwWSgUDepOh9WlxhbV73hQ+J4Kvk/SORws4dSCIMO/qjcWfWwOcqO2yOkO4Sjquvr0cxAgBAYM03BnkAVzGd+yqo4p/Prt1WYhUi7n582eyEUJQI0vgjpOzjnYvWvWkW2zhEFT//meUjwpEZBPJHr/L2PfnUG6amMKpSl7z4xC8x5oNA3gTFr614rqB5Ragev/oPlnWvCQufefSXaIA7byCJ6DqHHcUfioo+3flB9SfW769SiCase9Ltt81L7h3m12sr5+UUfzdmxP4Uwevzn/wzf8q/pQsW/HpOi0XJVy/OfvbjiqRfncrs3d5n2Pe9cuq5brHvzRzQsyPKsL6+XiqTBTjbsaknOi776YFt3k0cAADAW6eRMQzzBMxWfuqNs/yI6XdqURYdfRUTZIF0VF8yWewOsdUsM14ero0O5yvezFmxqzx8+KwRlsNvPLuCLdswe8h1XH47Kt57/ZSYOntEJBKINHphLi4288kPLBkf4XVGo8NasGvjqf/+Hw33Yzun6uJ9u99TT3n0LlSPCOT1ZPGfr75pCh+/etlELU9E1rMbV27b9dqYhD8O6bDZtogoAumT6ONkLfkbn6SFGx5Nxshj5wykS+DDjmJ17qv/2fm1JEKvyby9e1id/RPjN0eO/ufIBwP3zYkaxHe5EnTdh14qafbXG1BP9PnV5rvHpWNXVwAACLQND5qmw2EuPpWXX1BaXmG22EXiBVW4NkKfPPyu4cnRoQFd0NjK3zx8Sp8wPRUXLQjkDV1gv7li0S6jt8scPmL8siX8fzev2F1qF2LGTLn7LlWMsPLp/bvyxvzpnv4Bf5Ct/M3DeeExs4cTUcW+RSvfi1j4wvwEBTmqK0rN8ughWswkCtY02qrKy83VZrONFGp9wpBo70dVVx2mU36Whr2iuKA0Zjy+z0IgA1G+77F1b1pEIlEUiShv3WN5jcMCItHJlTPyeSJSJC/ctPCGJz76E1HUjaghm58piZb8jU/Rwg3zO+fIIxJLdB3Djuaisp1fS1J/9+uttzdOV0yLmXf2zJSjxueK++9MvqWrJdl1H3qJ1Flf3/jXG0BP9DehQ7qvfOq1d89/OWNcBGpAAADwv/0Jkuk8topTu7bsyjfZeUETEZ2QrC4vKLPYrWZjidlYkv+6KmZM1iPTksNbjT06zAW7dr1eVF5ptfOCShsZP27u/BHahv1QMFH0+vvvwR7IBpc+Non6aTnzk1tcJ/C8wNsKclfsNoYPH6cuPb5t5Z+FuTHlFpGPUApN2/HY3luXlVvSrK/Ipz59cGGCjzJ3lS2v0Wq1WkFGjFHFG8/lFI/JffEeAWkMyjSa31i5eH/DclY1+d7piTVFyLN+rCrOO3Q4r6TCYrWToNZGx4+f+sAIOaF6RCADFhY/Jua93UV86tQxem/fApoLXj9pjkxN0fLuEDqKX37kuXyr6KoyVdrI6PjREyfe2f4WfMyPiKJuDM5AeqkDRQeLuDvrkWTXTzKbg6l8fk/tf6Pc4YIksR28t6N43vgd3dJn2tBmpaZNjh7xzn/eMlprk/uGUE1u7nv7+t1x7vd9G5+/tuPl01tD7yiY1jek4ZHaokLjzg+unLc6e4epRqYZ5hmEkAB/lVpLZW5eRcGX31XW8ZoBfaaPHDRlQKvJlmLlgpwP6Xcj5vxg3HrW0vBxI4dkR/s7PNpwH3rGPBZZX/rYJOqn+uiJFjbriSrmDimvEqU9FQJmOwIAQEDNdzB8WV1V8HLO5nyLKmZ01pTJY2JCicj8RkX2/koiIhIMo1Op6Njzi8on/s/SaTGera7t7OaVuWeFlCmzpkWoeJvFVGpRCMz//g8EehUTjHs7ypVqrabF5AlHxbGclbuN4eOWrn4gRlEVvXFVbm5OIa8ZveThEaEtyidi3JKsVJX7R5WWWJvFS9oR2etHeP6PCOb9NIM9jeZys6iflbsk4tjTq0raOl/WqrgcFW+sWrXfpIgfPnFuvEZBVrOxzGgT5Uwe7KFCIK9HaMzwpPDdJULK+LuTPQZ1HLZqGx8aKqfyqmMnbfr0ZC3vLgTRZrWJrgpQtFmrKovzj21enHdy6tKl90TL/Slq1hHHIJBdnTV/2zZrhKphBCgiPClB2/bSW/8b5R+pVx+cgSSiwIcdJSEyoh9sn1rpzmY7iPRevmDMEhnv59ChqbB43g/8yIRb58m+L/jo0s4D/z4/IXVncnf/f4/aLz+ZvuPziu7qzJRBkXSt4OyldTuufDozdXlk66w5P333P/PqQheMS1jQrfZc4Se5e9/79HcpTbM1A7j6a2rYeZVao1W16omuX7XbGD7u6VUPxCiq9BtXbdqYU8hr7xo7Mgp7DQAAQMc34z9rtpJXc3Lz7XFzc7KTTIeOWWpjQuVU9XGJpfEAu0lM2rZp+KF1OYfX5QjrV02MdF+vmEtKrULqw9n3NHxRHX+nR7fOVrTtsSKLxUoKjWH4rKzpCe57LdjK83bvOlxksogKjSF1WpZrGmXp5qyVpanrt8yKJiIyv7F4YZ5h3dYHoomIKvY/tiQ/ZtVf/hjTtZPGIZA+zpS16Omt3G1UjV68+gGDojFvvGb0klVZCaGthr0FjT5aH+rlbauK9+/Zn19isvLqiAiVlUjteqrqzcXzD+tXbp8b4zqy8kD2pANERPpZL28YHzy3DEEaG85OLgihgsD7dbJNB1Qcyt1vUo1fmvNA43c1CcnDXfVm88tf7/Uhka141/P7i8xV1hq7yKta1qLW0mO79+WVmix2hTZ+/NSsexJUCGRwVI+MqPpUTvbr6sVb58aYj61ccDx6/V+yor2cfvMKMCY+eUT6iP2rVh7I3RW98Y8xct9BYs0j6vOYVnVjUMUyOAPp7XTEytKiSnfVFDNrYozCUWW2h2tV3l/urVG2FecuWG+MX/Xc/BgFkfXsxsUbK8evf35iZGNNaLbWiCSotTGpU2dOSXCvvfFZf5a+sWVffrnJUiOSUj956YZ7unxr7lcgAx12lMYOVfe48M2mze8UJEROT+6T2q9hlmJIN97/6YpXr4UseORXc9RSIpqepln76n8O5ZW/k3D7yIYxw9qCs5+FhEo9X1J71VLZ9NO1fUc+/1QVse+RmFieiGj6sP7Pbi7cf+Ti9Oyo1jtyV14OWftEXGYPIqJBv+8pv3Z6XZ7xvaFxd/IBBd012bGpG9r8DjMO07ENq/YYVaMXrZxlEBqnRvKa0U+u/eO37/8Ll84AABBYq9PGsrquwHZ22+aTVkNWzuLRWnlFQdHhvxSURITbzEZL0yIYe5XVLsRPW/q0+PTqQ5tfj8+Z1nhXBaVOw58szS+4ZEjVyluVnTp+yuQkFW8rP77nwPOb1BtzxoQTEVUcXrXykD1+ctZSvaKq8NDu55dWL3p+YbIqKjGazzeWf0P6cCKrsdhMFt74DYsOJ6o2GS1CTHwUdfFFC1w71yhBEEhfnb+mnl7FsfWr9hhVoxevyooXGLGqgo2rNxXxoxevyopXtSocn6v9HeW71+ecpJSpC2ZFKGym/EOHGo70fFVDkEcvWjpOS0S8KjyICh9pbH6m1Lhmso1rcY+kleadqhTiF002KFq/hHkEzFd9SGQzl5ZVqadmP6yXi9byY7s9alFHxf6cdSflo2dlz9KIpuO7dz//vNBYwSKQXTiIrotgxhw2m92mFBkjRmLDjUtYs3T5qAAV+knTkvLWF+SVzTLEy30HySOivo9pWTcGWSwRyDZO/FrRtsW7+aycJcPDvdaVrRtlIT7r4fQl6zcfGP5clqb0L9uKwic/NzGCEWuoCTOzH45XiNby/EOH1i+taqgk26o/KwqKTKrM7KwkFdlFlYYxUxdvzdsLpEvAezuGxSbs+OHjte9UnisqO1dURrd0GxqpHjm0f+bg0DC/R/F66G+brG4cVezWe15aryP/+23BJRrZMGRYe+7Mp+e8vbDhJtbVlne+pqETbot1fyIfOidFtf/oNwXVUZGhrT8u8jc9mqKVOUz93AHLqa/pzgF+h5i5Bh1Zw7/J9Z/u4nWYjj+zeo9RlfHEygfjBMZYVeGmNS8W8RmLV2UlqAiDjgAAcN3Xm130BMuLSmpUqQuGa3kiptKqebHMZKxpfowyXK0kYoroSVMMJ3OLii3TdA13igkf/cgCU+6WTdlzD8Wnjh49Lj25Ya9uRkSKiMTUeAMRxUTYyuZuLSirHhOuIkfR4cMX1eOeXTIxgohiYqLk1vm5h05NSZ6ojUmM4beXGK+ND1c4yktMvCCYSoy2ceEKh7HIRPqZMfIg2ps9WAPZ9lk7Khq/XV6VFRdKjKoKNq529fQeTFAx7yVZtn3ulO2Njxiytq0coyKynT18sjJi8p8XjtcSEcVorIWndzdbFNe0FotXa7RaTfAVO9LYuhCYf0ElsppNNaQ16BTE2nq3NupD10RLbVRCjIGIYvSOkqZatOTQyUr91JcfGK4iouiImca5G/KLvhkTFFNxgzmQrNVpev5H63P3llu5LiaCCs1mK8WF+wySZ0R9HdOqbgzSWKKG9HriDhJriras3sivWJga7lejTELCrAeHL9mweYtDW16invrsPdqm0pNr45JdNWG8QWWbv8VVSbZXfyq0cckxes/fLAha8w7e25GIpIOS4/YnD7n81ZUCo6XA+O35ryyHKi5tOt572cw7pvST+vMWmgHde3r8GNYvVEPfVlaL1LBEuueCBb+eo27+mqsXZz/7cUVDg3qtkujK0X/FHm3xxorLP3j5uN5h3TxnYoaEdteQpbK6ngZI/S5Gxpzu7R2Z+xFXT9R0/Jk1r32mGvXEijlxSidjlsJNa146Jx+1aMWD8UpG2NURAACua7iDdeVOoyEjXZP/9p7XM9ZNi5CrEjNTlGWnm4868rpx4wzEGFlL9uz/kDc8mKLx+JpanZSV8+pk04eF+SdPbl546PWMhxdnJYU3fsnf0PYKWrVA5dU2xlRkNprsypi4iMZmWWGIi6A9ZRXXJmoU8Yl6OlBUVpsSZywqVaRMjv/w0NlyR4rBeLZc1E+OF7r6LRg4/65iunQgvZ91Q1pshbv3lCnSn1r1YLyKEasqyHV9u7wyK17pvaPHiEg39umHhzeu9RLUriOrLppFZUyUtsUUIfcMx2bz2oKyF4k0eklgm/eUIc8pPH4czxi1WR+2rEW1HrWo2S5Wbv/j5O1N76euqmEsHIHsyoH0CFXTXduaB6/FhFx3GlsPRjJGzGeQBM+I+jimVd0YZLFEIBu6iHEPPvdwiso9C000Hlg190GrvYaIyFK4aQ3Pr3skSdV+o0xEQvzMB9OzN5wu0WRuHOfROjcLtio+SUd7jBW1pKn0u/6krt+atx9IIgp42PH7K/vyKil20PRIPqxfeGa/8Mw01xP213ecXvc3Y2z2oEHeXne1rt23lpBM4u+vISMiSeKY5OzIFi+R9A7z6w0cREROovaHHSUSidPpdDKne9zRVaiMORlzunqie167IKQtWT5nqJI5meXMi2tfPsePemLZ7DilkzHOyZxOp5PjOAIAAAisp9+F96Dmo6c+NtW45sDqDYqnn5ioj8t6eo79T3uLGpdYC7qMhxdlRhCrKtq6ftNpR+Jj2aPVLUtDroxIGjsraezEgj8tfnHLHsNLi1NbXuDwchJ9zshwH6mMT9LtOVxU5lCWlJFhXlqKeDi30OhQFJbZdZlxStyCIQgC6fU6u/F8LWYrKePT41TEqKqwYczxqUzbgS35k+YND/fxcoUmIkKn8vKe5Gg5G4i1mivk9XEInjS2nlbm38iQEKYRqMhocpBa3tZ7tlEftlWLiiQkzVs7tWkej5xXoYYMkurR672uWBvJafago6LMREJ8P1VbQbJ4FqaPYy62/h0QyyAIZMtz4RVhWpXnvTp4stXU2N0/WoylVZSk9KNRJiKHucRo5wXeUpJvvHeaXu7jo+VEYoD1J6E1dwl0tmNtUfEX537oMzkyvPlOjkJs3xCqqD5/lQa5ljPXUS1RwzGivfKaa7fsBpVffvcdNU14vPxldSWFpIb6Pfewe08NOWtl3WIHNEWttrrm02vSHt4Weld+bfuOlJ4fd5n41FC/1oRzHCeRSJz1zoYl1u5F1u69HS1mKynjfh2rZIxZzry0bvM5fuTj/3P3tYOv5E96aHgfzul0SqVSDDsCAEAg3SvGXBt8dOHJTrwu86kn2QsvHFj2+NmM+2dNSlv00jBzWZnRIio0+ji9miwlx3L3HjpjUQx7aOW8YUrfZaGMS9TSuSpLNXPdqrVp/2WPJrtfVIRwtLSkghkiiIjI9nGJidQZOoExRurEdN2Bv+cfl5kccTOjhCiHQdyaf4wvs+ozk9QsSGactTGnMygC2fyMm3X2qq1W4quN+Xmmi0Un3i7jRy1aMSeucusDpysnT/JaJO78tXqyX5RGOGosKq816OXuC5LGzXw8XiTjeRItNhasi2aCPo3uBBKRzXy24Gy11ysX0VpmJRLIXRb84PQU5enTR45VxE6MkLd+T4fYbn3IfNaiYTodbzeZbGHpza7LgyGlQR3Ipg3GGDULB6PWefFeAdqMBw4W2cPSMwbzjDHfQWqKqM9jWtWNQRnL4Atky5OxF21/erXnlyvqpHnLV4jn9rxw4iKRetijT82M8igB340yka1sz6a3KWPFM/ojy7duOZj0zAy9nJq3yERkKy8xkTpDwzMWQP1JQdKasw5eZN2t18hIyamPPl47NGWd4Zamx69W7bvwPan6DOpBRNIeMnJUX6skcm3VePkj0zvN1z5fNX5+6Ks+c1wrsr+/svXdbx2qW8f29fvXCO09si9tKjS+lxB3ZzdXm1uzdc97O2UDj8yP6tnqcIfx851f9cl2f1zht47u/Uf4/XFSqbSurk4i4Txr26a/5OqaGuKtn50+efGL99965wI/cuHSB2K/2pb178p772XEmOgQeZ4nAACAgBpw1tZtBLoIQZ+5/BnD8b3b//HKsrd3qHWDo3RqhYKo9MzxrUZjZQ0po9If2jAjXStv0eU0Hd90osYQF6VVKchmKXn772UUNnawmrGaxp3vm0qy4Uc+acIE3fJ/vPC8csY4vdxy5u97zvGJj45tWLgdljg6au/Wg+8q054YzBM/OD1OfObg23zcQ4lKFjTfULOgD6S3syYi0uj1wrvnDu4oUypVmownHpsRpyRmariU8V4mjMhWWV5apnA/wit1eq2Cj5s0Qbf8ry9soPsnJGoUVGm0ewztNH2oJkonHCn6++HYTL3cauUNKQZVsNWBSCMxYv0SE3VvHz360oc+D+LVw+6Laqqm5Ib75qWXvXBwzVPGjLHpBo2CbFbzhQ/FxDmZGkHga8pOn72kSdK2VR/6rEWFxMwMzZoTL/6JnzQ2TiMXrRaL3JARp0Ygu3Ygm9Y187Km8+XJ27JrjwrQVF5apiDRZjF9ePrt0xfs+vuenDFY3maQFB4R9XVM67oxKGOJGlK8/FnZZc8Hhj1qMPAWFU/WuIdWPJaibtF589UoO8oObHmXz1h+f5RaPmdO4ZMvbTk4zDXwyIhqSo7sz7cZ1PKac0cOnKO4hzJ0jBgfSP0ZJK15By+yplsyJwx569XzRw+cOhfZJ7GvECmrr7R+V2T81lSnmDw1OpaIqFvSgG5UZFzwN5ozWKj98tLO4tqBYfSpx7touotbdxR+mtA/tse1grOXCqzdfjNVHxvA0Fz36eMj3tpjyt5cm5ncZ+At358/e/GoVTFtpi7S29HyW+z7dhRWJvWP7WYv+OCLgsshqb/T+38ba6lUWutw3HJLSMu9HV1p6ndblPDv9/+2+4JSqew3IvuR6bFKxi42fClERHV1dVKplAAAAAJuw4NhUYZSP+7RZzPuKztzpvDDMtPFsosi8bxKHTXs/vvSUuIiVHIv3RkHr1TZz5zYe6KyRiReUOvi7n/yvrF63vfKREZEEZnLVvA795x4ZcNrIq8ZnP7o8vtT3OuwlIljY4ULnyWlD5ITI/mg0YnKM+eiMhKxfjDYAtn6lInUo57a8WsHyeVe+tfMZwf84okX1p7wGB2647HtT6TI+YjMZWsVf9174uALJ2pEXlCqo+IMPVstrOaT7n8oY+veI39eaxfCojIeTTQo5chg0KWRkTxq6jPbJzkcLa+4P3vtybVliWvW3K9TyFtUkorYeWtWx/3jH8cLD7541C7yglKtM6TdYSdlyqR7z2w9uv1oYty8ON/1YRu1KK+fseypsNcOnNj7wlG7yCs1gyfoMmLVyGMXD6Q7CcrRa3enk5yIaccueyWdVzWduOe5y3iVwJ//1wtr/0XEC2GaCP2weRsmpEQoGg/zFaRmEfVxTOu6UY9Yor1uOGvFrSn3zp8xNkVNzM9GWXdi72lx2BP3RsmJkSpx5qSox/fufXvUmnFaRkS8XPzs6CsnKkU+TJc0Z9mM9LD2+pOtl1SjNSe6nlvKhA7Y+kToO2fK953/rqD4m7fq+DBVt8ihQ5aP7J/UwzW4Jo0dl7yWPtpxwbjWGDJwgHr2nIRIY/FOCgkhIgoZGKlOTBsy8MtPdn7w+dZrpOnXZ8nvh04fENh8wJDImH2P9Hzu+BdFhWVH6nhNP82yOYOm+HiTyLTk5bd8kVv4+VYr9e6rnj1jSHb0LQGUkUxWXycSkzfsK9ow9Mga9nYMG774lVQH8Y3pcTatkiFGxOrq62QyDDsCAEBAXSfmFhQnzIcNTvvt4LTfti4JrwXAa4bNeHyYt2PDxm7YP7bpZVEzXtzv8S5C1Nj5a8d6f3sh8fEdB9yP8YMf2nLQ9y/Qha8sEUjXGfNEVUUnjtmUPg+5aBJJ7qNIhGFP7h7m7W0ZIyJBN2r28lGzWz3RPL1hd8xZfsecdv4UkMZgTWDlRRsRLwg8760YBN2wPzw+7A8t00eDf7v8xd82xslXfdh2Laoc7LsWRSC76snLSKw8c+KYxet2Zp/ZiKhZDvnEh7bsfajt5tx7kIRmEfURNi91Y9DFMvgC6ce5MMaYLm2Cztv/fp+NMk1Yv3eCR/U3atneUeQe8xEG/275HIO3XPlZf1KQtObtnpHset6V7z4y7faRaW0dkJk5LDPT45F+yUkNT/XOntmbiCjy9ju9vcOgu4afv8vbe/bQ7Vyn83wgRD1g+cwB3g4Vpj80fnrzXyg2OW5n8nUWYlhY2OUr33bv3p2Ic82XlRN98X7eW230RL/4QiSeiCPiLl++3K2bgEtoAAAIqAFv3JkHU+3g5uDa6jcGXSAHjRp1W9m7b/31fFsd4rBfPZAYhr9RpPEnSSAfdsfv0/ohfgjkj08YmjHq1h3v/u9fzyGKCORPRdmvn8B/JfqsEJX9wrp17Bkz8thhF64/kER0ncOOwUQikWi12pMnT/bXaqRSGeM4xgyjRt524d95r3/UTk/0l32k9fX1paVlKSkpEokEhQkAAADwc6Aw/GH11j+gHAAJBFAlzl6fOBvlAD+hqPs3bLsfxfCzFdiwY+yyYz/Ls8w7HZvn5eHz68a3+1KO4xQKhU6nyzv5dt++fdXqMJVS9YvJT+XeJ5FKJJxEIpVIOY4Yo3pnPXM6651OZ72TMVZttX5R/MF/v/q6f//+ffr0wZ2sAQDAf8xjmQxKA24QD48hAAADk0lEQVQGjrU5eQKBBKQREEgEEhDIIBH2m/Wv/QazHW84kC6BDTv6M07XuYiVC3KKK0emH0rrft3vIZVKExISfvGLX5w/f/7ChU9qa2vtdnttba1nBDmOk0gkEomE4ziZTMZxXK9eoQMG3DpkyNCePXviljIAABCgps15UBZwUzqNjPm3WxTKCpBGQCARSEAgAfwIJFHXX2TNazat0txoOXKcTCYLDQ1NS0tz/fW2+zfsmtvIcZxrOBJZBACAwDBy7c1D6DXCTYpcO1cxCCQgjYBAIpCAQAIEEEgiwt6O/sPoIQAA3Jzmxul0OpmTNayUAbgpnUYiJ2NOp7PFtjAIJCCNgEAikIBAAgQUSE8YdgQAAOhEXNPknfVO3MkabmqvkZHTWS+VSlv0GhFIQBoBgUQgAYEECCiQnjDsCAAA0LlIpdK6ujqOI6yRgZuGI1YnijKZDIEEpBEAgQQEEuAGA+mGYUcAAIDORSqVOkRHiFzOONxBD25Ch5HjOGIc1Yl1MpkUgQSkEQCBBAQS4AYD6YZhRwAAgM5FJpPV1dWHyF0b83BE6DvCj9hjJEaMOCKurr5eKpUhkIA0AiCQgEAC3GAgm5KJ8gIAAOhUwsLCvr1ypYfiVsY5nUTEGBGHzcHhR+k0EhHHSTiScNyVy1cEQUAgAWkEQCABgQS4wUC6YdgRAACgE5FIJFqt9uTJk1qtRiqTck5n47bgjf8A3Hhv0d1r5IjjOE4iqa+vLy0rS0lJkUgkCCQgjYBAIpCAQAJcdyA9YdgRAACgMzXnHKdQKHQ63cm3/9W3bx91mFqpUkokEqmkkVTCEYeCguvDiDnrnS71TidjzGq1Vn1T9dXXX/fv379Pnz6t74yJQALSCAgkAgkIJCCQ/geyWTix2h8AAKBzteuM1dfX19TUnD9/3mq11tbW2u322tpaNNlw4ziOc119cBwnk8k4jusVGjrg1ltvvfXWnj17SqVSV69Rufcj1/E1M4YikPATptEziqgeoTNUj2ivAYEEBNKfQDa9FhEEAADohJwNq2MYYUdw+DE7ka5/u3qT7sdbjPUgkPBTpbF1FJFG+GmrR7TXgEAC+B9IwiJrAACAzqndJhzgJnAP+gCgegRAIAGBBAg4kygCAAAAAAAAAAAA6FgYdgQAAAAAAAAAAIAOhr0dAQAAAAAAAAAAoINhtiMAAAAAAAAAAAB0MAw7AgAAAAAAAAAAQAf7f4VZwZTGHz/iAAAAAElFTkSuQmCC"},418:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-edit-cell-01.91cf0c1f.png"},419:function(A,t){A.exports="data:image/png;base64,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"},420:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-edit-cell-02b.953a85e4.png"},421:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-edit-cell-03.ac0a8311.png"},930:function(A,t,e){"use strict";e.r(t);var r=e(2),i=Object(r.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h1",{attrs:{id:"grid-customization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grid-customization"}},[A._v("#")]),A._v(" Grid Customization")]),A._v(" "),t("p",[A._v("In this tutorial you will learn how to do simple modifications to a grid like changing the cell text or image.")]),A._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[A._v("Note")]),A._v(" "),t("p",[A._v("In case you need more detailed information, please check the "),t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[A._v("AsTeRICS Grid user manual")])],1),A._v(".")])]),A._v(" "),t("h2",{attrs:{id:"asterics-grid-web-application"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid-web-application"}},[A._v("#")]),A._v(" AsTeRICS Grid web application")]),A._v(" "),t("p",[A._v("AsTeRICS Grid is the web application to run and manage grids for AAC.")]),A._v(" "),t("p",[A._v("If you open the link "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[A._v("https://grid.asterics.eu"),t("OutboundLink")],1),A._v(", the default grid is opened in your browser and saved locally on your device in the browser cache. All modifications are also saved to your local version of the grid from now on.")]),A._v(" "),t("h2",{attrs:{id:"open-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#open-grid"}},[A._v("#")]),A._v(" Open grid")]),A._v(" "),t("p",[A._v("First you have to open the grid you want to change.")]),A._v(" "),t("h3",{attrs:{id:"saved-grids"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#saved-grids"}},[A._v("#")]),A._v(" Saved Grids")]),A._v(" "),t("p",[A._v("If you click the button "),t("code",[A._v("Manage Grids")]),A._v(", you can open other grids from the list of "),t("code",[A._v("Saved Grids")]),A._v(" by clicking on the "),t("code",[A._v("Edit")]),A._v(" button.")]),A._v(" "),t("ol",[t("li",[t("img",{attrs:{src:e(416),alt:"Screenshot with button Manage Grids highlighted"}})]),A._v(" "),t("li",[t("img",{attrs:{src:e(417),alt:"Screenshot with button Edit highlighted"}})])]),A._v(" "),t("h3",{attrs:{id:"import-grid-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#import-grid-file"}},[A._v("#")]),A._v(" Import Grid file")]),A._v(" "),t("p",[A._v("You can also import and open a grid from a file. To do so, click on "),t("code",[A._v("More/Import grid(s) from file")]),A._v(".")]),A._v(" "),t("h2",{attrs:{id:"change-cell"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-cell"}},[A._v("#")]),A._v(" Change cell")]),A._v(" "),t("p",[A._v("You can change the cell text, image and spoken text of a cell. In order for that you must change to the edit mode of the grid by clicking on "),t("code",[A._v("Edit grid")]),A._v(".")]),A._v(" "),t("h3",{attrs:{id:"cell-text-and-image"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cell-text-and-image"}},[A._v("#")]),A._v(" Cell text and image")]),A._v(" "),t("ol",[t("li",[A._v("Move the mouse cursor to the cell you want to edit and click the right mouse button.")]),A._v(" "),t("li",[A._v("Select the menu entry "),t("code",[A._v("Edit")])]),A._v(" "),t("li",[A._v("Now you can change the label in the text field and select a new image by clicking on "),t("code",[A._v("Choose file")]),A._v(". To clear the image click on "),t("code",[A._v("Clear image")]),A._v(".")])]),A._v(" "),t("p",[t("img",{attrs:{src:e(418),alt:"Screenshot of edit cell dialog"}})]),A._v(" "),t("h3",{attrs:{id:"spoken-text"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spoken-text"}},[A._v("#")]),A._v(" Spoken text")]),A._v(" "),t("p",[A._v("You can also change the spoken text of a grid by the following steps")]),A._v(" "),t("ol",[t("li",[A._v("Move the mouse cursor to the cell you want to edit and click the right mouse button.")]),A._v(" "),t("li",[A._v("Select the menu entry "),t("code",[A._v("Actions")])]),A._v(" "),t("li",[A._v("Delete "),t("code",[A._v("Speak label")]),A._v(" action\n"),t("img",{attrs:{src:e(419),alt:"Screenshot of edit actions dialog"}})]),A._v(" "),t("li",[A._v("Add "),t("code",[A._v("Speak custom text")]),A._v(" action")]),A._v(" "),t("li",[A._v("Enter text and click on "),t("code",[A._v("Test")])]),A._v(" "),t("li",[A._v("Finally, save the custom text by clicking on "),t("code",[A._v("OK")])])]),A._v(" "),t("p",[t("img",{attrs:{src:e(420),alt:"Screenshot of edit actions dialog"}}),A._v(" "),t("img",{attrs:{src:e(421),alt:"Screenshot of edit actions dialog"}})]),A._v(" "),t("h3",{attrs:{id:"close-edit-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#close-edit-mode"}},[A._v("#")]),A._v(" Close Edit mode")]),A._v(" "),t("p",[A._v("After you have finished all changes, you must close the edit mode for being able to use the grid. You can do this by clicking on the button "),t("code",[A._v("Back")]),A._v(" in the top menu.")]),A._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[A._v("#")]),A._v(" Conclusion")]),A._v(" "),t("p",[A._v("Now you know how to change a cell text, image or spoken text, to learn how to create a new grid, try the "),t("a",{attrs:{href:"./Grid-Creation"}},[A._v("grid creation tutorial")]),A._v(".")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{408:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-01.c458bb02.png"},409:function(A,t){A.exports="data:image/png;base64,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"},410:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-edit-cell-01.91cf0c1f.png"},411:function(A,t){A.exports="data:image/png;base64,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"},412:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-edit-cell-02b.953a85e4.png"},413:function(A,t,e){A.exports=e.p+"assets/img/grid-customize-edit-cell-03.ac0a8311.png"},932:function(A,t,e){"use strict";e.r(t);var r=e(2),i=Object(r.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h1",{attrs:{id:"grid-customization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grid-customization"}},[A._v("#")]),A._v(" Grid Customization")]),A._v(" "),t("p",[A._v("In this tutorial you will learn how to do simple modifications to a grid like changing the cell text or image.")]),A._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[A._v("Note")]),A._v(" "),t("p",[A._v("In case you need more detailed information, please check the "),t("strong",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[A._v("AsTeRICS Grid user manual")])],1),A._v(".")])]),A._v(" "),t("h2",{attrs:{id:"asterics-grid-web-application"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid-web-application"}},[A._v("#")]),A._v(" AsTeRICS Grid web application")]),A._v(" "),t("p",[A._v("AsTeRICS Grid is the web application to run and manage grids for AAC.")]),A._v(" "),t("p",[A._v("If you open the link "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[A._v("https://grid.asterics.eu"),t("OutboundLink")],1),A._v(", the default grid is opened in your browser and saved locally on your device in the browser cache. All modifications are also saved to your local version of the grid from now on.")]),A._v(" "),t("h2",{attrs:{id:"open-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#open-grid"}},[A._v("#")]),A._v(" Open grid")]),A._v(" "),t("p",[A._v("First you have to open the grid you want to change.")]),A._v(" "),t("h3",{attrs:{id:"saved-grids"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#saved-grids"}},[A._v("#")]),A._v(" Saved Grids")]),A._v(" "),t("p",[A._v("If you click the button "),t("code",[A._v("Manage Grids")]),A._v(", you can open other grids from the list of "),t("code",[A._v("Saved Grids")]),A._v(" by clicking on the "),t("code",[A._v("Edit")]),A._v(" button.")]),A._v(" "),t("ol",[t("li",[t("img",{attrs:{src:e(408),alt:"Screenshot with button Manage Grids highlighted"}})]),A._v(" "),t("li",[t("img",{attrs:{src:e(409),alt:"Screenshot with button Edit highlighted"}})])]),A._v(" "),t("h3",{attrs:{id:"import-grid-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#import-grid-file"}},[A._v("#")]),A._v(" Import Grid file")]),A._v(" "),t("p",[A._v("You can also import and open a grid from a file. To do so, click on "),t("code",[A._v("More/Import grid(s) from file")]),A._v(".")]),A._v(" "),t("h2",{attrs:{id:"change-cell"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-cell"}},[A._v("#")]),A._v(" Change cell")]),A._v(" "),t("p",[A._v("You can change the cell text, image and spoken text of a cell. In order for that you must change to the edit mode of the grid by clicking on "),t("code",[A._v("Edit grid")]),A._v(".")]),A._v(" "),t("h3",{attrs:{id:"cell-text-and-image"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cell-text-and-image"}},[A._v("#")]),A._v(" Cell text and image")]),A._v(" "),t("ol",[t("li",[A._v("Move the mouse cursor to the cell you want to edit and click the right mouse button.")]),A._v(" "),t("li",[A._v("Select the menu entry "),t("code",[A._v("Edit")])]),A._v(" "),t("li",[A._v("Now you can change the label in the text field and select a new image by clicking on "),t("code",[A._v("Choose file")]),A._v(". To clear the image click on "),t("code",[A._v("Clear image")]),A._v(".")])]),A._v(" "),t("p",[t("img",{attrs:{src:e(410),alt:"Screenshot of edit cell dialog"}})]),A._v(" "),t("h3",{attrs:{id:"spoken-text"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spoken-text"}},[A._v("#")]),A._v(" Spoken text")]),A._v(" "),t("p",[A._v("You can also change the spoken text of a grid by the following steps")]),A._v(" "),t("ol",[t("li",[A._v("Move the mouse cursor to the cell you want to edit and click the right mouse button.")]),A._v(" "),t("li",[A._v("Select the menu entry "),t("code",[A._v("Actions")])]),A._v(" "),t("li",[A._v("Delete "),t("code",[A._v("Speak label")]),A._v(" action\n"),t("img",{attrs:{src:e(411),alt:"Screenshot of edit actions dialog"}})]),A._v(" "),t("li",[A._v("Add "),t("code",[A._v("Speak custom text")]),A._v(" action")]),A._v(" "),t("li",[A._v("Enter text and click on "),t("code",[A._v("Test")])]),A._v(" "),t("li",[A._v("Finally, save the custom text by clicking on "),t("code",[A._v("OK")])])]),A._v(" "),t("p",[t("img",{attrs:{src:e(412),alt:"Screenshot of edit actions dialog"}}),A._v(" "),t("img",{attrs:{src:e(413),alt:"Screenshot of edit actions dialog"}})]),A._v(" "),t("h3",{attrs:{id:"close-edit-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#close-edit-mode"}},[A._v("#")]),A._v(" Close Edit mode")]),A._v(" "),t("p",[A._v("After you have finished all changes, you must close the edit mode for being able to use the grid. You can do this by clicking on the button "),t("code",[A._v("Back")]),A._v(" in the top menu.")]),A._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[A._v("#")]),A._v(" Conclusion")]),A._v(" "),t("p",[A._v("Now you know how to change a cell text, image or spoken text, to learn how to create a new grid, try the "),t("a",{attrs:{href:"./Grid-Creation"}},[A._v("grid creation tutorial")]),A._v(".")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/229.c1beb764.js b/assets/js/230.19d3ff21.js similarity index 92% rename from assets/js/229.c1beb764.js rename to assets/js/230.19d3ff21.js index 08596c29f0..d07460a55b 100644 --- a/assets/js/229.c1beb764.js +++ b/assets/js/230.19d3ff21.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[229],{1187:function(t,e,r){"use strict";r.r(e);var s=r(2),o=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"relative-move-sampler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#relative-move-sampler"}},[t._v("#")]),t._v(" Relative Move Sampler")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin was developed for models where a constant rate of value updates is needed. The plugin sums incoming relative position packages for three coordinates. The sums are sent to the output ports according to sampling rate. When the sums are sent, the accumulation values are reset to zero.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(753),alt:"Screenshot: Relative Move Sampler",title:"Screenshot: Relative Move Sampler"}})]),t._v(" "),e("p",[t._v("Relative Move Sampler")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputX [integer]:")]),t._v(" Input X position.")]),t._v(" "),e("li",[e("strong",[t._v("inputY [integer]:")]),t._v(" Input Y position.")]),t._v(" "),e("li",[e("strong",[t._v("inputZ [integer]:")]),t._v(" Input Z position.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputX [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output X position.")]),t._v(" "),e("li",[e("strong",[t._v("outputY [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output Y position.")]),t._v(" "),e("li",[e("strong",[t._v("outputZ [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output Z position.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("samplingRate [integer]:")]),t._v(" Defines the rate of the sampling (in Hz).")])])])}),[],!1,null,null,null);e.default=o.exports},753:function(t,e,r){t.exports=r.p+"assets/img/relativemovesampler.314a4078.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[230],{1187:function(t,e,r){"use strict";r.r(e);var s=r(2),o=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"relative-move-sampler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#relative-move-sampler"}},[t._v("#")]),t._v(" Relative Move Sampler")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin was developed for models where a constant rate of value updates is needed. The plugin sums incoming relative position packages for three coordinates. The sums are sent to the output ports according to sampling rate. When the sums are sent, the accumulation values are reset to zero.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(752),alt:"Screenshot: Relative Move Sampler",title:"Screenshot: Relative Move Sampler"}})]),t._v(" "),e("p",[t._v("Relative Move Sampler")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inputX [integer]:")]),t._v(" Input X position.")]),t._v(" "),e("li",[e("strong",[t._v("inputY [integer]:")]),t._v(" Input Y position.")]),t._v(" "),e("li",[e("strong",[t._v("inputZ [integer]:")]),t._v(" Input Z position.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("outputX [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output X position.")]),t._v(" "),e("li",[e("strong",[t._v("outputY [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output Y position.")]),t._v(" "),e("li",[e("strong",[t._v("outputZ [**"),e("strong",[t._v("integer*")]),t._v("*]:")]),t._v(" Output Z position.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("samplingRate [integer]:")]),t._v(" Defines the rate of the sampling (in Hz).")])])])}),[],!1,null,null,null);e.default=o.exports},752:function(t,e,r){t.exports=r.p+"assets/img/relativemovesampler.314a4078.jpg"}}]); \ No newline at end of file diff --git a/assets/js/230.5ebc6d34.js b/assets/js/231.eb6e6089.js similarity index 97% rename from assets/js/230.5ebc6d34.js rename to assets/js/231.eb6e6089.js index c0b3bd8733..8e568d2025 100644 --- a/assets/js/230.5ebc6d34.js +++ b/assets/js/231.eb6e6089.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[230],{1188:function(t,e,i){"use strict";i.r(e);var n=i(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ssvep-detect"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssvep-detect"}},[t._v("#")]),t._v(" SSVEP Detect")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This component is in charge of evaluating the SSVEP response (up to 4 different frequencies) among the frequencies defined by the user. It also calculates the config file based on previously recorded training files that will be used to evaluate the detection, and is also in charge of updating its parameters according to the config file Component Type: Processor (Subcategory: DSP and Feauture extraction)")]),t._v(" "),e("p",[e("img",{attrs:{src:i(754),alt:"Screenshot: SSVEPDetect plugin",title:"Screenshot: SSVEPDetect plugin"}})]),t._v(" "),e("p",[t._v("SSVEPDetect plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("SSVEPTrainFunction.exe and Matlab 2008B runtime engine")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("O1 [double]:")]),t._v(" Input port for the EEG channel O1. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("Oz [double]:")]),t._v(" Input port for the EEG channel Oz. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("O2 [double]:")]),t._v(" Input port for the EEG channel O2. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("UserName [string]:")]),t._v(" Name Identifying current the user.")]),t._v(" "),e("li",[e("strong",[t._v("NumberOfPanels [string]:")]),t._v(" Number of stimulation panels.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP1 [string]:")]),t._v(" Stimulation frequency of panel 1.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP2 [string]:")]),t._v(" Stimulation frequency of panel 2.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP3 [string]:")]),t._v(" Stimulation frequency of panel 3.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP4 [string]:")]),t._v(" Stimulation frequency of panel 4.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FreqP1 [integer]:")]),t._v(" Stimulation frequency of panel 1.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP2 [integer]:")]),t._v(" Stimulation frequency of panel 2.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP3 [integer]:")]),t._v(" Stimulation frequency of panel 3.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP4 [integer]:")]),t._v(" Stimulation frequency of panel 4.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartStim:")]),t._v(" Event Informing that the stimulation period has started.")]),t._v(" "),e("li",[e("strong",[t._v("StopStim:")]),t._v(" Event Informing that the stimulation period has finished.")]),t._v(" "),e("li",[e("strong",[t._v("CalculateConfigFile:")]),t._v(" Event requesting the calculation of the configuration file")]),t._v(" "),e("li",[e("strong",[t._v("UpdateFromConfigFile:")]),t._v(" Event requested an update of the properties according to the configuration file.")]),t._v(" "),e("li",[e("strong",[t._v("UpdatePanelsConfig:")]),t._v(" Event reporting the stimulation panels plugin to update the stimulation frequencies.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("UpdatePanelsConfig:")]),t._v(" Event reporting the stimulation panels plugin to update the stimulation frequencies.")]),t._v(" "),e("li",[e("strong",[t._v("NonStimFreqD:")]),t._v(" Event reporting that none stimulation frequency could be detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq1D:")]),t._v(" Event reporting that stimulation frequency number 1 was detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq2D:")]),t._v(" Event reporting that stimulation frequency number 2 was detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq3D:")]),t._v(" Event reporting that stimulation frequency number 3 was detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq4D:")]),t._v(" Event reporting that stimulation frequency number 4 was detected.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("SF1GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 1 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF1GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 1 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF1GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 1 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("SF2GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 2 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF2GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 2 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF2GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 2 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("SF3GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 3 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF3GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 3 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF3GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 3 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("SF4GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 4 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF4GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 4 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF4GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 4 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq1 [integer]:")]),t._v(" Stimulation frequency number 2 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection…")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq2 [integer]:")]),t._v(" Stimulation frequency number 2 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq3 [integer]:")]),t._v(" Stimulation frequency number 3 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq4 [integer]:")]),t._v(" Stimulation frequency number 4 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm1 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 1.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm2 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 2.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm3 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 3.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm4 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 4.")])])])}),[],!1,null,null,null);e.default=r.exports},754:function(t,e,i){t.exports=i.p+"assets/img/ssvepdetect.a71b1d1d.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[231],{1191:function(t,e,i){"use strict";i.r(e);var n=i(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ssvep-detect"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssvep-detect"}},[t._v("#")]),t._v(" SSVEP Detect")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-dsp-and-feature-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-dsp-and-feature-detection"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: DSP and Feature Detection)")]),t._v(" "),e("p",[t._v("This component is in charge of evaluating the SSVEP response (up to 4 different frequencies) among the frequencies defined by the user. It also calculates the config file based on previously recorded training files that will be used to evaluate the detection, and is also in charge of updating its parameters according to the config file Component Type: Processor (Subcategory: DSP and Feauture extraction)")]),t._v(" "),e("p",[e("img",{attrs:{src:i(756),alt:"Screenshot: SSVEPDetect plugin",title:"Screenshot: SSVEPDetect plugin"}})]),t._v(" "),e("p",[t._v("SSVEPDetect plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("SSVEPTrainFunction.exe and Matlab 2008B runtime engine")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("O1 [double]:")]),t._v(" Input port for the EEG channel O1. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("Oz [double]:")]),t._v(" Input port for the EEG channel Oz. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("O2 [double]:")]),t._v(" Input port for the EEG channel O2. "),e("strong",[t._v("This input port supports synchronization")])]),t._v(" "),e("li",[e("strong",[t._v("UserName [string]:")]),t._v(" Name Identifying current the user.")]),t._v(" "),e("li",[e("strong",[t._v("NumberOfPanels [string]:")]),t._v(" Number of stimulation panels.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP1 [string]:")]),t._v(" Stimulation frequency of panel 1.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP2 [string]:")]),t._v(" Stimulation frequency of panel 2.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP3 [string]:")]),t._v(" Stimulation frequency of panel 3.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP4 [string]:")]),t._v(" Stimulation frequency of panel 4.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FreqP1 [integer]:")]),t._v(" Stimulation frequency of panel 1.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP2 [integer]:")]),t._v(" Stimulation frequency of panel 2.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP3 [integer]:")]),t._v(" Stimulation frequency of panel 3.")]),t._v(" "),e("li",[e("strong",[t._v("FreqP4 [integer]:")]),t._v(" Stimulation frequency of panel 4.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("StartStim:")]),t._v(" Event Informing that the stimulation period has started.")]),t._v(" "),e("li",[e("strong",[t._v("StopStim:")]),t._v(" Event Informing that the stimulation period has finished.")]),t._v(" "),e("li",[e("strong",[t._v("CalculateConfigFile:")]),t._v(" Event requesting the calculation of the configuration file")]),t._v(" "),e("li",[e("strong",[t._v("UpdateFromConfigFile:")]),t._v(" Event requested an update of the properties according to the configuration file.")]),t._v(" "),e("li",[e("strong",[t._v("UpdatePanelsConfig:")]),t._v(" Event reporting the stimulation panels plugin to update the stimulation frequencies.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("UpdatePanelsConfig:")]),t._v(" Event reporting the stimulation panels plugin to update the stimulation frequencies.")]),t._v(" "),e("li",[e("strong",[t._v("NonStimFreqD:")]),t._v(" Event reporting that none stimulation frequency could be detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq1D:")]),t._v(" Event reporting that stimulation frequency number 1 was detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq2D:")]),t._v(" Event reporting that stimulation frequency number 2 was detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq3D:")]),t._v(" Event reporting that stimulation frequency number 3 was detected.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq4D:")]),t._v(" Event reporting that stimulation frequency number 4 was detected.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("SF1GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 1 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF1GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 1 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF1GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 1 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("SF2GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 2 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF2GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 2 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF2GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 2 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("SF3GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 3 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF3GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 3 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF3GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 3 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("SF4GO1 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 4 and electrode O1.")]),t._v(" "),e("li",[e("strong",[t._v("SF4GOz [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 4 and electrode Oz.")]),t._v(" "),e("li",[e("strong",[t._v("SF4GO2 [double]:")]),t._v(" Spatial filter coefficient for stimulation frequency 4 and electrode O2.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq1 [integer]:")]),t._v(" Stimulation frequency number 2 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection…")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq2 [integer]:")]),t._v(" Stimulation frequency number 2 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq3 [integer]:")]),t._v(" Stimulation frequency number 3 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection.")]),t._v(" "),e("li",[e("strong",[t._v("StimFreq4 [integer]:")]),t._v(" Stimulation frequency number 4 in Hz. If its value is 0 it will not be evaluated in the SSVEP detection.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm1 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 1.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm2 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 2.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm3 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 3.")]),t._v(" "),e("li",[e("strong",[t._v("BestHarm4 [integer]:")]),t._v(" Best harmonic to detect stimulation frequency 4.")])])])}),[],!1,null,null,null);e.default=r.exports},756:function(t,e,i){t.exports=i.p+"assets/img/ssvepdetect.a71b1d1d.jpg"}}]); \ No newline at end of file diff --git a/assets/js/231.6fd462a1.js b/assets/js/232.82ad1927.js similarity index 90% rename from assets/js/231.6fd462a1.js rename to assets/js/232.82ad1927.js index 3044577a4b..4acfb1e777 100644 --- a/assets/js/231.6fd462a1.js +++ b/assets/js/232.82ad1927.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[231],{1190:function(t,e,s){"use strict";s.r(e);var o=s(2),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"sample-and-hold"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sample-and-hold"}},[t._v("#")]),t._v(" Sample and Hold")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component provides a sample-and-hold function for up to 4 input signals. This can be useful for storing a particular sensor values (e.g. for sensor calibration purpose).")]),t._v(" "),e("p",[e("img",{attrs:{src:s(755),alt:"Screenshot: SampleAndHold plugin",title:"Screenshot: SampleAndHold plugin"}})]),t._v(" "),e("p",[t._v("SampleAndHold plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in1 - in4 [double]:")]),t._v(" four input ports for double values to be captured on demand.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1 - out4 [double]:")]),t._v(" last captured values.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sampleNow:")]),t._v(" When an event comes in, the signal values of the input ports are captured and sent to the output ports.")])])])}),[],!1,null,null,null);e.default=n.exports},755:function(t,e,s){t.exports=s.p+"assets/img/sampleandhold.5e355178.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[232],{1192:function(t,e,s){"use strict";s.r(e);var o=s(2),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"sample-and-hold"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sample-and-hold"}},[t._v("#")]),t._v(" Sample and Hold")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This component provides a sample-and-hold function for up to 4 input signals. This can be useful for storing a particular sensor values (e.g. for sensor calibration purpose).")]),t._v(" "),e("p",[e("img",{attrs:{src:s(757),alt:"Screenshot: SampleAndHold plugin",title:"Screenshot: SampleAndHold plugin"}})]),t._v(" "),e("p",[t._v("SampleAndHold plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in1 - in4 [double]:")]),t._v(" four input ports for double values to be captured on demand.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1 - out4 [double]:")]),t._v(" last captured values.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sampleNow:")]),t._v(" When an event comes in, the signal values of the input ports are captured and sent to the output ports.")])])])}),[],!1,null,null,null);e.default=n.exports},757:function(t,e,s){t.exports=s.p+"assets/img/sampleandhold.5e355178.jpg"}}]); \ No newline at end of file diff --git a/assets/js/232.16263fb5.js b/assets/js/233.1d140d71.js similarity index 91% rename from assets/js/232.16263fb5.js rename to assets/js/233.1d140d71.js index 0556536ce0..136f94d37e 100644 --- a/assets/js/232.16263fb5.js +++ b/assets/js/233.1d140d71.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[232],{1186:function(t,e,s){"use strict";s.r(e);var r=s(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"sampler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sampler"}},[t._v("#")]),t._v(" Sampler")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin generates a constant rate of sampling for the input port signal.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(752),alt:"Screenshot: Sampler plugin",title:"Screenshot: Sampler plugin"}})]),t._v(" "),e("p",[t._v("Sampler plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [**"),e("strong",[t._v("double*")]),t._v("*]:")]),t._v(" Output port for signal with constant rate of the sampling.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("samplingRate [double]:")]),t._v(" The rate of sampling, which defines the data generation frequency at the output port.")]),t._v(" "),e("li",[e("strong",[t._v("responseTime [integer]:")]),t._v(" Response time in milliseconds. If the time from arrival of the last input data exceeds the response time, the plugin stops sending the output data. If the responseTime is set to 0, it is not used.")]),t._v(" "),e("li",[e("strong",[t._v("sendNullSamples [boolean]:")]),t._v(" If this property is set to true and there is no input data or the response time is exceeded the plugin sends samples equal to zero.")])])])}),[],!1,null,null,null);e.default=o.exports},752:function(t,e,s){t.exports=s.p+"assets/img/sampler.03599c8c.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[233],{1193:function(t,e,s){"use strict";s.r(e);var r=s(2),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"sampler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sampler"}},[t._v("#")]),t._v(" Sampler")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Basic Math)")]),t._v(" "),e("p",[t._v("This plugin generates a constant rate of sampling for the input port signal.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(758),alt:"Screenshot: Sampler plugin",title:"Screenshot: Sampler plugin"}})]),t._v(" "),e("p",[t._v("Sampler plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [double]:")]),t._v(" Input port for the signal.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [**"),e("strong",[t._v("double*")]),t._v("*]:")]),t._v(" Output port for signal with constant rate of the sampling.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("samplingRate [double]:")]),t._v(" The rate of sampling, which defines the data generation frequency at the output port.")]),t._v(" "),e("li",[e("strong",[t._v("responseTime [integer]:")]),t._v(" Response time in milliseconds. If the time from arrival of the last input data exceeds the response time, the plugin stops sending the output data. If the responseTime is set to 0, it is not used.")]),t._v(" "),e("li",[e("strong",[t._v("sendNullSamples [boolean]:")]),t._v(" If this property is set to true and there is no input data or the response time is exceeded the plugin sends samples equal to zero.")])])])}),[],!1,null,null,null);e.default=o.exports},758:function(t,e,s){t.exports=s.p+"assets/img/sampler.03599c8c.jpg"}}]); \ No newline at end of file diff --git a/assets/js/233.94fdb3e0.js b/assets/js/234.bd49a24a.js similarity index 92% rename from assets/js/233.94fdb3e0.js rename to assets/js/234.bd49a24a.js index b889d956ae..5b47fce32d 100644 --- a/assets/js/233.94fdb3e0.js +++ b/assets/js/234.bd49a24a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[233],{1191:function(e,t,s){"use strict";s.r(t);var a=s(2),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"serialsender"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#serialsender"}},[e._v("#")]),e._v(" SerialSender")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Serial Communication)")]),e._v(" "),t("p",[e._v("The Serialsender can be used to send structured data to Serial devices. It has 16 data slots. Whenever a send event occurs the plugin sends every slot which is active to the device, beginning with slot0")]),e._v(" "),t("p",[t("img",{attrs:{src:s(756),alt:"Screenshot: SerialSender plugin",title:"Screenshot: SerialSender plugin"}})]),e._v(" "),t("p",[e._v("SerialSender plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("slot0 - slot15 [int]:")]),e._v(" Input data for each slot. The lower 8 Bit of the input will be sent when the slot is set Active and a send event occurs")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [string]:")]),e._v(" Defines the COM Port of the target serial device. e.g. COM0")]),e._v(" "),t("li",[t("strong",[e._v("BaudRate [integer]:")]),e._v(" Defines the Baudrate for the communication. It must match the baudrate of the target device")]),e._v(" "),t("li",[e._v("**Slot[0-15] [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the default value of a slot. This value will be overridden if there is data available at the corresponding input slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Active [boolean]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Activate a Slot. Whenever a send event occurs the SerialSender will iterate over all Slots beginning with slot 0 and send the data of every Active Slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Delay [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the delay the plugin should wait before sending data to a slot.")])])])}),[],!1,null,null,null);t.default=i.exports},756:function(e,t,s){e.exports=s.p+"assets/img/serialsender.58f95c8a.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[234],{1195:function(e,t,s){"use strict";s.r(t);var a=s(2),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"serialsender"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#serialsender"}},[e._v("#")]),e._v(" SerialSender")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Serial Communication)")]),e._v(" "),t("p",[e._v("The Serialsender can be used to send structured data to Serial devices. It has 16 data slots. Whenever a send event occurs the plugin sends every slot which is active to the device, beginning with slot0")]),e._v(" "),t("p",[t("img",{attrs:{src:s(759),alt:"Screenshot: SerialSender plugin",title:"Screenshot: SerialSender plugin"}})]),e._v(" "),t("p",[e._v("SerialSender plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("slot0 - slot15 [int]:")]),e._v(" Input data for each slot. The lower 8 Bit of the input will be sent when the slot is set Active and a send event occurs")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [string]:")]),e._v(" Defines the COM Port of the target serial device. e.g. COM0")]),e._v(" "),t("li",[t("strong",[e._v("BaudRate [integer]:")]),e._v(" Defines the Baudrate for the communication. It must match the baudrate of the target device")]),e._v(" "),t("li",[e._v("**Slot[0-15] [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the default value of a slot. This value will be overridden if there is data available at the corresponding input slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Active [boolean]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Activate a Slot. Whenever a send event occurs the SerialSender will iterate over all Slots beginning with slot 0 and send the data of every Active Slot")]),e._v(" "),t("li",[e._v("**Slot[0-15]Delay [int]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Defines the delay the plugin should wait before sending data to a slot.")])])])}),[],!1,null,null,null);t.default=i.exports},759:function(e,t,s){e.exports=s.p+"assets/img/serialsender.58f95c8a.png"}}]); \ No newline at end of file diff --git a/assets/js/234.dc777e79.js b/assets/js/235.151eefac.js similarity index 95% rename from assets/js/234.dc777e79.js rename to assets/js/235.151eefac.js index b05ac5d57b..85a864b35a 100644 --- a/assets/js/234.dc777e79.js +++ b/assets/js/235.151eefac.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[234],{1192:function(t,e,n){"use strict";n.r(e);var i=n(2),a=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"signal-translation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signal-translation"}},[t._v("#")]),t._v(" Signal Translation")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Shaping)")]),t._v(" "),e("p",[t._v("The signal translation component is used to translate an input value which resides in a certain value range to a given output range. Interpolation of the position in the output range is done linearly. The component provides two inputs which allow other components to set the minimum and maximum value of the input range.")]),t._v(" "),e("p",[e("img",{attrs:{src:n(757),alt:"Screenshot: SignalTranslation plugin",title:"Screenshot: SignalTranslation plugin"}})]),t._v(" "),e("p",[t._v("SignalTranslation plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" This port receives the input values which will be translated to the new range.")]),t._v(" "),e("li",[e("strong",[t._v("setMax [double]:")]),t._v(" This port sets the value of the input maximum property (inMax) in the component.")]),t._v(" "),e("li",[e("strong",[t._v("setMin [double]:")]),t._v(" This port sets the value of the input minimum property (inMin) in the component.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" This port sends the translated values corresponding to the output range.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("enterRange:")]),t._v(" This event is generated if the defined input range was entered by the last input value and now inMin < value < inMax holds. It is also fired if inMin or inMax is changed using the corresponding input ports and after this change now inMin < value < inMax newly holds.")]),t._v(" "),e("li",[e("strong",[t._v("exitRangeBelow:")]),t._v(" This event is generated if value < inMin holds and value >= inMin was true for the last value. It is also fired if inMin is changed using the corresponding input port and after this change value < inMin newly holds.")]),t._v(" "),e("li",[e("strong",[t._v("exitRangeAbove:")]),t._v(" This event is generated if value > inMax holds and value <= inMax was true for the last value. It is also fired if inMax is changed using the corresponding input port and after this change value > inMax newly holds.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inMin [double]:")]),t._v(" Sets the minimum value of the input range, input values below this value will be clipped to the minimum.")]),t._v(" "),e("li",[e("strong",[t._v("inMax [double]:")]),t._v(" Sets the maximum value of the input range, input values above this value will be clipped to the maximum.")]),t._v(" "),e("li",[e("strong",[t._v("outMin [double]:")]),t._v(" Sets the minimum value of the output range.")]),t._v(" "),e("li",[e("strong",[t._v("outMax [double]:")]),t._v(" Sets the maximum value of the output range.")])])])}),[],!1,null,null,null);e.default=a.exports},757:function(t,e,n){t.exports=n.p+"assets/img/signaltranslation.77320c23.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[235],{1196:function(t,e,n){"use strict";n.r(e);var i=n(2),a=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"signal-translation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signal-translation"}},[t._v("#")]),t._v(" Signal Translation")]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Shaping)")]),t._v(" "),e("p",[t._v("The signal translation component is used to translate an input value which resides in a certain value range to a given output range. Interpolation of the position in the output range is done linearly. The component provides two inputs which allow other components to set the minimum and maximum value of the input range.")]),t._v(" "),e("p",[e("img",{attrs:{src:n(760),alt:"Screenshot: SignalTranslation plugin",title:"Screenshot: SignalTranslation plugin"}})]),t._v(" "),e("p",[t._v("SignalTranslation plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [double]:")]),t._v(" This port receives the input values which will be translated to the new range.")]),t._v(" "),e("li",[e("strong",[t._v("setMax [double]:")]),t._v(" This port sets the value of the input maximum property (inMax) in the component.")]),t._v(" "),e("li",[e("strong",[t._v("setMin [double]:")]),t._v(" This port sets the value of the input minimum property (inMin) in the component.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [double]:")]),t._v(" This port sends the translated values corresponding to the output range.")])]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("enterRange:")]),t._v(" This event is generated if the defined input range was entered by the last input value and now inMin < value < inMax holds. It is also fired if inMin or inMax is changed using the corresponding input ports and after this change now inMin < value < inMax newly holds.")]),t._v(" "),e("li",[e("strong",[t._v("exitRangeBelow:")]),t._v(" This event is generated if value < inMin holds and value >= inMin was true for the last value. It is also fired if inMin is changed using the corresponding input port and after this change value < inMin newly holds.")]),t._v(" "),e("li",[e("strong",[t._v("exitRangeAbove:")]),t._v(" This event is generated if value > inMax holds and value <= inMax was true for the last value. It is also fired if inMax is changed using the corresponding input port and after this change value > inMax newly holds.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inMin [double]:")]),t._v(" Sets the minimum value of the input range, input values below this value will be clipped to the minimum.")]),t._v(" "),e("li",[e("strong",[t._v("inMax [double]:")]),t._v(" Sets the maximum value of the input range, input values above this value will be clipped to the maximum.")]),t._v(" "),e("li",[e("strong",[t._v("outMin [double]:")]),t._v(" Sets the minimum value of the output range.")]),t._v(" "),e("li",[e("strong",[t._v("outMax [double]:")]),t._v(" Sets the maximum value of the output range.")])])])}),[],!1,null,null,null);e.default=a.exports},760:function(t,e,n){t.exports=n.p+"assets/img/signaltranslation.77320c23.jpg"}}]); \ No newline at end of file diff --git a/assets/js/235.8c5a65f1.js b/assets/js/236.b9acf641.js similarity index 97% rename from assets/js/235.8c5a65f1.js rename to assets/js/236.b9acf641.js index f25b378736..4ad9f512dd 100644 --- a/assets/js/235.8c5a65f1.js +++ b/assets/js/236.b9acf641.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[235],{1193:function(e,t,n){"use strict";n.r(t);var o=n(2),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"speech-processor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#speech-processor"}},[e._v("#")]),e._v(" Speech Processor")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("The SpeechProcessor component provides methods to use a speech recognition engine and a speech synthesizer, provided via the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/download/v4.1.0/SpeechPlatformRuntime11_including_ge-en-es-Language-Packs.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("Microsoft Speech Platform Runtime 11"),t("OutboundLink")],1),e._v(".\nOriginally the download was available through "),t("a",{attrs:{href:"http://www.microsoft.com/en-us/download/details.aspx?id=27225",target:"_blank",rel:"noopener noreferrer"}},[e._v("Microsoft Download"),t("OutboundLink")],1),e._v(" but is now provided with the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/download/v4.1.0/SpeechPlatformRuntime11_including_ge-en-es-Language-Packs.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS 4.1 release"),t("OutboundLink")],1),e._v(", as the official download was closed. The Microsoft Speech Platform provides recognition of spoken words and generation of synthesized speech (text-to-speech, TTS). Engines and language packs for 26 languages can be downloaded for free (see above link). The language (culture) of speech recognition and synthesis can be adjusted as a plugin property (currently English, German, Spanish and Polish are supported by the plugin, if the language packs are installed.) The supported voice commands can be set by the plugin properties. Recognized commands trigger events and are put to an output port as stings. Moreover, the component can receive strings which are spoken via the selected speech synthesizer. The component features special commands for activation, deactivation and speaking all supported commands")]),e._v(" "),t("p",[t("img",{attrs:{src:n(758),alt:"Screenshot: SpeechProcessor plugin",title:"Screenshot: SpeechProcessor plugin"}})]),e._v(" "),t("p",[e._v("SpeechProcessor plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("This component requires Microsoft’s Speech Platform version 11 Runtime and the desired language packs to be installed on the platform running the plugin.")])]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("speak [string]:")]),e._v(" This port receives strings containing sentences or words that should be spoken via a speech synthesizer which fits the selected language (text-to-speech).")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("command [string]:")]),e._v(" This output sends strings which have been recognized by the speech recognition engine (matching one of the commands defined by property values).")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("help:")]),e._v(" and incoming event starts the help mode where all supported voice commands will be spoken.")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activated:")]),e._v(" triggered when the recognition is activated via the defined activation command.")]),e._v(" "),t("li",[t("strong",[e._v("deActivated:")]),e._v(" triggered when the recognition is deactivated via the defined command.")]),e._v(" "),t("li",[t("strong",[e._v("recognizedCommand1 - recognizedCommand10:")]),e._v(" If an incoming word matches a command defined in the plugin properties, the corresponding event will fire.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("language [integer] (combobox selection):")]),e._v(" A combobox which defines which speech pack is to be used (currently: English, German, Spanish, Polish) - these language packs need to be installed !")]),e._v(" "),t("li",[t("strong",[e._v("recognitionConfidence [double]:")]),e._v(" This value defines the needed confidence for a valid recognition. The value can range from 0 to 1. A higher value results in a more precise pronunciation needed to detect a command, a lower level could lead to more false-positive recognition results.")]),e._v(" "),t("li",[t("strong",[e._v("speechLoopDelay [integer]:")]),e._v(" This value defines the minimal time between two speech commands. It is used to avoid recognition-loops")]),e._v(" "),t("li",[t("strong",[e._v("activationCommand [string]:")]),e._v(" a speech command to start the recognition of the other commands.")]),e._v(" "),t("li",[t("strong",[e._v("deactivationCommand [string]:")]),e._v(" a speech command to stop the recognition of the other commands.")]),e._v(" "),t("li",[t("strong",[e._v("helpCommand [string]:")]),e._v(" a speech command to speak out all supported voice commands.")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer] (combobox selection):")]),e._v(" This property selects one out of three operating modes for the speech recognition:\n"),t("ul",[t("li",[e._v("“always active”: the command recognition is always running")]),e._v(" "),t("li",[e._v("“voice-triggered activation and deactivation”: the command recognition is started by the recognition of the activation command and stopped by the deactivation command (these commands are defined in the according properties).")]),e._v(" "),t("li",[e._v("“automatic deactivation after command recognition”: after a recognized command, the speech recognition will be bypassed until another activation command has been recognized.")]),e._v(" "),t("li",[e._v("“speech recognition disabled (TTS only)”: In this mode, the speech recognition engine is not used whichs saved CPU power in text-to-speech-only applications.")])])]),e._v(" "),t("li",[t("strong",[e._v("command1 to command10:")]),e._v(" The command strings which are checked by the speech recognition engines (these build the recognition grammar).")])])])}),[],!1,null,null,null);t.default=i.exports},758:function(e,t,n){e.exports=n.p+"assets/img/speechprocessor.69f52c9f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[236],{1198:function(e,t,n){"use strict";n.r(t);var o=n(2),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"speech-processor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#speech-processor"}},[e._v("#")]),e._v(" Speech Processor")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Audio and Voice)")]),e._v(" "),t("p",[e._v("The SpeechProcessor component provides methods to use a speech recognition engine and a speech synthesizer, provided via the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/download/v4.1.0/SpeechPlatformRuntime11_including_ge-en-es-Language-Packs.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("Microsoft Speech Platform Runtime 11"),t("OutboundLink")],1),e._v(".\nOriginally the download was available through "),t("a",{attrs:{href:"http://www.microsoft.com/en-us/download/details.aspx?id=27225",target:"_blank",rel:"noopener noreferrer"}},[e._v("Microsoft Download"),t("OutboundLink")],1),e._v(" but is now provided with the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/download/v4.1.0/SpeechPlatformRuntime11_including_ge-en-es-Language-Packs.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS 4.1 release"),t("OutboundLink")],1),e._v(", as the official download was closed. The Microsoft Speech Platform provides recognition of spoken words and generation of synthesized speech (text-to-speech, TTS). Engines and language packs for 26 languages can be downloaded for free (see above link). The language (culture) of speech recognition and synthesis can be adjusted as a plugin property (currently English, German, Spanish and Polish are supported by the plugin, if the language packs are installed.) The supported voice commands can be set by the plugin properties. Recognized commands trigger events and are put to an output port as stings. Moreover, the component can receive strings which are spoken via the selected speech synthesizer. The component features special commands for activation, deactivation and speaking all supported commands")]),e._v(" "),t("p",[t("img",{attrs:{src:n(762),alt:"Screenshot: SpeechProcessor plugin",title:"Screenshot: SpeechProcessor plugin"}})]),e._v(" "),t("p",[e._v("SpeechProcessor plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("This component requires Microsoft’s Speech Platform version 11 Runtime and the desired language packs to be installed on the platform running the plugin.")])]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("speak [string]:")]),e._v(" This port receives strings containing sentences or words that should be spoken via a speech synthesizer which fits the selected language (text-to-speech).")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("command [string]:")]),e._v(" This output sends strings which have been recognized by the speech recognition engine (matching one of the commands defined by property values).")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("help:")]),e._v(" and incoming event starts the help mode where all supported voice commands will be spoken.")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activated:")]),e._v(" triggered when the recognition is activated via the defined activation command.")]),e._v(" "),t("li",[t("strong",[e._v("deActivated:")]),e._v(" triggered when the recognition is deactivated via the defined command.")]),e._v(" "),t("li",[t("strong",[e._v("recognizedCommand1 - recognizedCommand10:")]),e._v(" If an incoming word matches a command defined in the plugin properties, the corresponding event will fire.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("language [integer] (combobox selection):")]),e._v(" A combobox which defines which speech pack is to be used (currently: English, German, Spanish, Polish) - these language packs need to be installed !")]),e._v(" "),t("li",[t("strong",[e._v("recognitionConfidence [double]:")]),e._v(" This value defines the needed confidence for a valid recognition. The value can range from 0 to 1. A higher value results in a more precise pronunciation needed to detect a command, a lower level could lead to more false-positive recognition results.")]),e._v(" "),t("li",[t("strong",[e._v("speechLoopDelay [integer]:")]),e._v(" This value defines the minimal time between two speech commands. It is used to avoid recognition-loops")]),e._v(" "),t("li",[t("strong",[e._v("activationCommand [string]:")]),e._v(" a speech command to start the recognition of the other commands.")]),e._v(" "),t("li",[t("strong",[e._v("deactivationCommand [string]:")]),e._v(" a speech command to stop the recognition of the other commands.")]),e._v(" "),t("li",[t("strong",[e._v("helpCommand [string]:")]),e._v(" a speech command to speak out all supported voice commands.")]),e._v(" "),t("li",[t("strong",[e._v("mode [integer] (combobox selection):")]),e._v(" This property selects one out of three operating modes for the speech recognition:\n"),t("ul",[t("li",[e._v("“always active”: the command recognition is always running")]),e._v(" "),t("li",[e._v("“voice-triggered activation and deactivation”: the command recognition is started by the recognition of the activation command and stopped by the deactivation command (these commands are defined in the according properties).")]),e._v(" "),t("li",[e._v("“automatic deactivation after command recognition”: after a recognized command, the speech recognition will be bypassed until another activation command has been recognized.")]),e._v(" "),t("li",[e._v("“speech recognition disabled (TTS only)”: In this mode, the speech recognition engine is not used whichs saved CPU power in text-to-speech-only applications.")])])]),e._v(" "),t("li",[t("strong",[e._v("command1 to command10:")]),e._v(" The command strings which are checked by the speech recognition engines (these build the recognition grammar).")])])])}),[],!1,null,null,null);t.default=i.exports},762:function(e,t,n){e.exports=n.p+"assets/img/speechprocessor.69f52c9f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/236.f9306633.js b/assets/js/237.f9bb538f.js similarity index 94% rename from assets/js/236.f9306633.js rename to assets/js/237.f9bb538f.js index a5f7713ef4..82d426c509 100644 --- a/assets/js/236.f9306633.js +++ b/assets/js/237.f9bb538f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[236],{1194:function(t,e,r){"use strict";r.r(e);var n=r(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"string-append"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#string-append"}},[t._v("#")]),t._v(" String Append")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("Appends an incoming string or ASCII character to a stringbuffer, the updated stringbuffer is sent to an output port. Incoming events are available to send the final string to a dedicated output port and to clear the stringbuffer (or set it to a default value respectively).")]),t._v(" "),e("p",[e("img",{attrs:{src:r(759),alt:"Screenshot: StringAppend plugin",title:"Screenshot: StringAppend plugin"}})]),t._v(" "),e("p",[t._v("StringAppend plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inStr [string]:")]),t._v(" String input port.")]),t._v(" "),e("li",[e("strong",[t._v("inChar [integer]:")]),t._v(" ASCII code input port.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("actResult [string]:")]),t._v(" String output port for current stringbuffer content.")]),t._v(" "),e("li",[e("strong",[t._v("finalResult [string]:")]),t._v(" String output port for final stringbuffer content (triggered by event or enter).")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-ports"}},[t._v("#")]),t._v(" Event Listener Ports")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sendNow:")]),t._v(" sends the current content of the stringbuffer to the “finalResult” output port.")]),t._v(" "),e("li",[e("strong",[t._v("sendNowAndClear:")]),t._v(" sends the current content of the stringbuffer to the “finalResult” output port and sets the stringbuffer to the default value.")]),t._v(" "),e("li",[e("strong",[t._v("deleteCharacter:")]),t._v(" deletes the last character of the stringbuffer.")]),t._v(" "),e("li",[e("strong",[t._v("clear:")]),t._v(" sets the stringbuffer to the default value.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("autoSendAtEnter [boolean]:")]),t._v(" If true, the stringbuffer is sent and cleared when the ASCII value for Enter/Return is received by the inChar input port.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("defaultValue [string]:")]),t._v(" An optional string text which is used a initial value for the stringbuffer.")])])])])}),[],!1,null,null,null);e.default=s.exports},759:function(t,e,r){t.exports=r.p+"assets/img/stringappend.ffa6ba12.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[237],{1197:function(t,e,r){"use strict";r.r(e);var n=r(2),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"string-append"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#string-append"}},[t._v("#")]),t._v(" String Append")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("Appends an incoming string or ASCII character to a stringbuffer, the updated stringbuffer is sent to an output port. Incoming events are available to send the final string to a dedicated output port and to clear the stringbuffer (or set it to a default value respectively).")]),t._v(" "),e("p",[e("img",{attrs:{src:r(761),alt:"Screenshot: StringAppend plugin",title:"Screenshot: StringAppend plugin"}})]),t._v(" "),e("p",[t._v("StringAppend plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("inStr [string]:")]),t._v(" String input port.")]),t._v(" "),e("li",[e("strong",[t._v("inChar [integer]:")]),t._v(" ASCII code input port.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("actResult [string]:")]),t._v(" String output port for current stringbuffer content.")]),t._v(" "),e("li",[e("strong",[t._v("finalResult [string]:")]),t._v(" String output port for final stringbuffer content (triggered by event or enter).")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-ports"}},[t._v("#")]),t._v(" Event Listener Ports")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sendNow:")]),t._v(" sends the current content of the stringbuffer to the “finalResult” output port.")]),t._v(" "),e("li",[e("strong",[t._v("sendNowAndClear:")]),t._v(" sends the current content of the stringbuffer to the “finalResult” output port and sets the stringbuffer to the default value.")]),t._v(" "),e("li",[e("strong",[t._v("deleteCharacter:")]),t._v(" deletes the last character of the stringbuffer.")]),t._v(" "),e("li",[e("strong",[t._v("clear:")]),t._v(" sets the stringbuffer to the default value.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("autoSendAtEnter [boolean]:")]),t._v(" If true, the stringbuffer is sent and cleared when the ASCII value for Enter/Return is received by the inChar input port.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("defaultValue [string]:")]),t._v(" An optional string text which is used a initial value for the stringbuffer.")])])])])}),[],!1,null,null,null);e.default=s.exports},761:function(t,e,r){t.exports=r.p+"assets/img/stringappend.ffa6ba12.jpg"}}]); \ No newline at end of file diff --git a/assets/js/237.37fd95a7.js b/assets/js/238.c54341d0.js similarity index 90% rename from assets/js/237.37fd95a7.js rename to assets/js/238.c54341d0.js index 7d7ac4d772..dae0bf9710 100644 --- a/assets/js/237.37fd95a7.js +++ b/assets/js/238.c54341d0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[237],{1196:function(t,r,e){"use strict";e.r(r);var s=e(2),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"stringdelay"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#stringdelay"}},[t._v("#")]),t._v(" StringDelay")]),t._v(" "),r("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),r("p",[t._v("This plugin passes received string values after a defined delay.")]),t._v(" "),r("p",[r("img",{attrs:{src:e(761),alt:"Screenshot: StringDelay plugin",title:"Screenshot: StringDelay plugin"}})]),t._v(" "),r("p",[t._v("StringDelay plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("in (string):")]),t._v(" Input port for the incoming string.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("out (string):")]),t._v(" Output port for the delayed string.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("delay [integer]:")]),t._v(" Delay between input and output of the string (in milliseconds).")])])])}),[],!1,null,null,null);r.default=n.exports},761:function(t,r,e){t.exports=e.p+"assets/img/stringdelay.f660f62d.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[238],{1200:function(t,r,e){"use strict";e.r(r);var s=e(2),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"stringdelay"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#stringdelay"}},[t._v("#")]),t._v(" StringDelay")]),t._v(" "),r("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),r("p",[t._v("This plugin passes received string values after a defined delay.")]),t._v(" "),r("p",[r("img",{attrs:{src:e(764),alt:"Screenshot: StringDelay plugin",title:"Screenshot: StringDelay plugin"}})]),t._v(" "),r("p",[t._v("StringDelay plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("in (string):")]),t._v(" Input port for the incoming string.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("out (string):")]),t._v(" Output port for the delayed string.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("delay [integer]:")]),t._v(" Delay between input and output of the string (in milliseconds).")])])])}),[],!1,null,null,null);r.default=n.exports},764:function(t,r,e){t.exports=e.p+"assets/img/stringdelay.f660f62d.jpg"}}]); \ No newline at end of file diff --git a/assets/js/238.cfc5d3bd.js b/assets/js/239.41dc01af.js similarity index 94% rename from assets/js/238.cfc5d3bd.js rename to assets/js/239.41dc01af.js index be62c05288..61abadfb95 100644 --- a/assets/js/238.cfc5d3bd.js +++ b/assets/js/239.41dc01af.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[238],{1195:function(t,e,s){"use strict";s.r(e);var r=s(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component has twenty slots for text strings. These strings can be sent to the output port via incoming events or by directly addressing a slot number using the input port.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(760),alt:"Screenshot: StringDispatcher plugin",title:"Screenshot: StringDispatcher plugin"}})]),t._v(" "),e("p",[t._v("StringDispatcher plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("slotDispatch [integer]:")]),t._v(" Sends the string from the slot defined by number.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("dispatchSlot1…dispatchSlot20:")]),t._v(" These events cause text from the slot: 1…20 to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchNextSlot:")]),t._v(" This event causes text from the next (not empty) slot to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchCurrentSlot:")]),t._v(" This event causes text from the current slot to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchPreviousSlot:")]),t._v(" This event causes text from the previous (not empty) slot to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("resetToFirstSlot:")]),t._v(" This event resets the internal slot counter (for next/previous) to the first slot.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchSlotSeries:")]),t._v(" This event causes text in sequence from all not empty slots to be sent, with a delay defined by the delay property.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" The interval (in milliseconds) which will be used for sending strings sequentially from all slots.")]),t._v(" "),e("li",[e("strong",[t._v("slot1…slot20 [string]:")]),t._v(" 20 slots which contains the text to be sent")])])])}),[],!1,null,null,null);e.default=n.exports},760:function(t,e,s){t.exports=s.p+"assets/img/stringdispatcher.9540c871.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[239],{1199:function(t,e,s){"use strict";s.r(e);var r=s(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component has twenty slots for text strings. These strings can be sent to the output port via incoming events or by directly addressing a slot number using the input port.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(763),alt:"Screenshot: StringDispatcher plugin",title:"Screenshot: StringDispatcher plugin"}})]),t._v(" "),e("p",[t._v("StringDispatcher plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("slotDispatch [integer]:")]),t._v(" Sends the string from the slot defined by number.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("dispatchSlot1…dispatchSlot20:")]),t._v(" These events cause text from the slot: 1…20 to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchNextSlot:")]),t._v(" This event causes text from the next (not empty) slot to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchCurrentSlot:")]),t._v(" This event causes text from the current slot to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchPreviousSlot:")]),t._v(" This event causes text from the previous (not empty) slot to be sent.")]),t._v(" "),e("li",[e("strong",[t._v("resetToFirstSlot:")]),t._v(" This event resets the internal slot counter (for next/previous) to the first slot.")]),t._v(" "),e("li",[e("strong",[t._v("dispatchSlotSeries:")]),t._v(" This event causes text in sequence from all not empty slots to be sent, with a delay defined by the delay property.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("delay [integer]:")]),t._v(" The interval (in milliseconds) which will be used for sending strings sequentially from all slots.")]),t._v(" "),e("li",[e("strong",[t._v("slot1…slot20 [string]:")]),t._v(" 20 slots which contains the text to be sent")])])])}),[],!1,null,null,null);e.default=n.exports},763:function(t,e,s){t.exports=s.p+"assets/img/stringdispatcher.9540c871.jpg"}}]); \ No newline at end of file diff --git a/assets/js/24.1cfbba75.js b/assets/js/24.dab81b7d.js similarity index 99% rename from assets/js/24.1cfbba75.js rename to assets/js/24.dab81b7d.js index c901773d9c..6db2c58f18 100644 --- a/assets/js/24.1cfbba75.js +++ b/assets/js/24.dab81b7d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{290:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_c0991ef32ae9b458.424ba3f3.png"},291:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_4dfe72317ab9f571.6b0975c3.jpg"},292:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_b6693a1cbcd9178a.03fc763d.png"},293:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_f1a0b4f36dd370ba.c1a39a2a.jpg"},294:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_fb7627584ba9d5d7.45a2067d.png"},295:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_3e993efbc73f2910.c6357005.png"},941:function(t,e,a){"use strict";a.r(e);var s=a(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"are-development-manual"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-development-manual"}},[t._v("#")]),t._v(" ARE Development Manual")]),t._v(" "),e("p",[t._v("The AsTeRICS source code repository is hosted at github and located at")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS",target:"_blank",rel:"noopener noreferrer"}},[e("strong",[t._v("https://github.com/asterics/AsTeRICS")]),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("The source code contains open source software modules in JAVA, C++ and C, and proprietary modules by AsTeRICS partners which are available in binary from (.dll or .exe).")]),t._v(" "),e("p",[t._v("The licenses of the utilized software packages and 3rd party products can be viewed in the file "),e("em",[t._v("/documentation/licenses.doc")])]),t._v(" "),e("p",[t._v("Currently, the editor for OSKA (the on-screen keyboard application) is the only commercial software package within the AsTeRICS framework – and not included in the free downloads. The OSKA editor is only needed if you want to design custom on-screen keyboard layouts for OSKA (see AsTeRICS User Manual).")]),t._v(" "),e("h2",{attrs:{id:"understanding-the-component-build-scripts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-component-build-scripts"}},[t._v("#")]),t._v(" Understanding the component build-scripts")]),t._v(" "),e("p",[t._v("A typical ANT build script for an ARE component looks like the following:")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("component.id"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("processor.MyComponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- set global properties for this build --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("build"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../out/production/${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src.java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("dist"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("runtime"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../../examples/ARE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("path")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${osgi}/org.eclipse.osgi_3.6.0.v20100517.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${middleware}/asterics.ARE.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the time stamp --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("tstamp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the build directory structure used by compile --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile the source "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("javac")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("srcdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${src.java}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("destdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("verbose")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("debug")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${debug}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("classpath")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${classpath}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("classpath")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("refid")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("generate the OSGi bundle"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("jarfile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("manifest")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}/META-INF/MANIFEST.MF"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("fileset")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("copy")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("file")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("tofile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${runtime}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[t._v("In the first section of the build script, folder locations for the build intermediates, the final build products (.jar file) and the classpath are defined. The classpath usually points to the “bin” folder, the middleware “asterics.ARE.jar” and the osgi distribution. If a component needs additional resources, their location has to be defined here.")]),t._v(" "),e("p",[t._v("Subsequently the build script defines two build targets: the compilation of the Java source code and the creation of the .jar file. If the .jar file shall contain additional .dlls with native code, they have to be specified in the Manifest file as shows in section 5.14.1.")]),t._v(" "),e("p",[t._v("After the .jar file has been created in the distribution folder, it is copied to the runtime folder (/bin/ARE).")]),t._v(" "),e("h2",{attrs:{id:"starting-the-are-middleware-and-component-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#starting-the-are-middleware-and-component-deployments"}},[t._v("#")]),t._v(" Starting the ARE middleware and component deployments")]),t._v(" "),e("p",[t._v("To test the ARE and component bundles, open the folder “/bin/ARE”, and use ARE.exe, start.bat or start_debug.bat.")]),t._v(" "),e("h2",{attrs:{id:"structure-of-the-runtime-folder-bin-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-the-runtime-folder-bin-are"}},[t._v("#")]),t._v(" Structure of the runtime folder “./bin/ARE”:")]),t._v(" "),e("p",[t._v("This folder contains dependencies for running the ARE middleware and the .jars resulting from ANT builds, it has the following structure:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("/\n+- bin/\n +- ARE/\n +- data/ folder for plugin working data\n +- models/ stored models (configurations)\n +- profile/\n +- config.ini system bundles to be started\n +- services.ini general service bundles to be started\n +- services-windows.ini windows-specific service bundles\n +- services-linux.ini linux-specific service bundles\n +- services-macosx.ini macosx-specific service bundles\n +- org.eclipse.osgi/ osgi bundle cache folder\n +- 1238790741.log system log messages, stack trace\n +- tools/ plugin helper apps and dlls\n +- .logger stores console logging settings\n +- ARE.exe starts the ARE without console output\n +- areProperties stores recent window/GUI properties\n +- component bundle(s)\n +- asterics.ARE.jar ARE middleware\n +- asterics.mw.services.cimcommunication.jar CIM port manager\n +- grizzly-httpservice-bundle-2.3.23.jar http service for webservice feature\n +- javacv-*-linux|windows|macosx.jar platform specific javacv service\n +- tmp/*.log application log files\n +- jtester.exe helper app for checking Java version\n +- logging.properties configuration of loglevel etc.\n +- org.eclipse.osgi.*.jar osgi distribution\n +- sleeper.exe helper app for launcher timing\n +- start.bat starts ARE with console output\n +- findjava.bat searches for the newest 32bit JRE\n +- start_debug.bat starts ARE with Eclipse debug support\n +- start.sh starts ARE without console on Linux\n +- start_debug.sh starts ARE with debugging on Linux\n +- VCChecker.jar helper jar for checking VC redist dependency\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Important Note: The osgi configuration folder “org.eclipse.osgi” in the “profile” subdirectory has to be deleted if .dlls in .jar bundles are updated or changed. (This folder is automatically created when starting the ARE and holds working data for the OSGI-bundles.) The One-Click build.xml script described in chapter 2.4.2 deletes the folder automatically.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-services"}},[t._v("#")]),t._v(" AsteRICS services")]),t._v(" "),e("p",[t._v("An AsteRICS service is a bundle that provides ARE-wide functionality usable by other services or plugins. The service can be optionally disabled which means that the service bundle is not installed and not activated. The file services.ini contains a list of general services to be loaded. Whereas the services-windows.ini, services-linux.ini and services-macosx.ini files contain platform dependent service names. You can also create your own use-case specific services ini file and edit the start script to load it.")]),t._v(" "),e("h2",{attrs:{id:"running-a-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-a-deployment"}},[t._v("#")]),t._v(" Running a deployment")]),t._v(" "),e("p",[t._v("The “ARE.exe” starter application launches the ARE without console output and without debugging instrumentation.")]),t._v(" "),e("p",[t._v("Alternatively, the commandline batch script “start_debug.bat” which is provided in the folder “.bin/ARE” runs Java with additional configuration parameters including:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the location of the OSGi distribution")])]),t._v(" "),e("li",[e("p",[t._v("the profile subfolder which contains the config.ini file: “./bin/ARE/profile”")])]),t._v(" "),e("li",[e("p",[t._v("debugging instrumentation for the remote debugging server connection")])])]),t._v(" "),e("p",[t._v("After starting the ARE middleware, bundles are loaded and started on-demand if they are needed for the deployment of a model. If everything is properly configured, the ARE window comes up with a GUI and provides ASAPI server functionalities for connection of the ACS or other client applications.")]),t._v(" "),e("h2",{attrs:{id:"are-webserver-including-rest-api-websocket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver-including-rest-api-websocket"}},[t._v("#")]),t._v(" ARE webserver (including REST API, websocket)")]),t._v(" "),e("p",[t._v("The ARE contains a service that creates several web-based services. These include")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a webserver with document root "),e("em",[t._v("ARE/web")]),t._v(" and URL: "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a websocket at URL "),e("a",{attrs:{href:"http://localhost:8082/ws/astericsData",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8082/ws/astericsData"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a REST API at URL "),e("a",{attrs:{href:"http://localhost:8081/rest",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/rest"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a javascript REST API client implementation example at "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])])]),t._v(" "),e("h2",{attrs:{id:"define-autostart-model-per-command-line"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#define-autostart-model-per-command-line"}},[t._v("#")]),t._v(" Define autostart model per command line")]),t._v(" "),e("p",[t._v("By starting the ARE with the name of a model as first command line parameter a model that should be started automatically can be defined. The model must exist in the sub-folder “models”.")]),t._v(" "),e("p",[t._v("‘ARE.exe CameraMouse.acs’")]),t._v(" "),e("p",[t._v("or")]),t._v(" "),e("p",[t._v("‘start_debug.bat CameraMouse.acs’")]),t._v(" "),e("h2",{attrs:{id:"change-model-task-submit-timeout"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-model-task-submit-timeout"}},[t._v("#")]),t._v(" Change model task submit timeout")]),t._v(" "),e("p",[t._v("The file “areProperties” contains properties to configure ARE features and to configure the internal model execution behaviour. The following internal model execution properties exist:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("ThreadPoolTasks.submitTimeout=20000")]),t._v(" "),e("ul",[e("li",[t._v("When submitting a task to be executed in the ModelExecutor thread a submit timeout can be configured. After the time elapsed a TimeoutException is thrown. The timeout value must be specified in milliseconds."),e("br"),t._v("\nThe submit timeout is used for starting, stopping, pausing and resuming a model.")])])])]),t._v(" "),e("h2",{attrs:{id:"debugging-the-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#debugging-the-are"}},[t._v("#")]),t._v(" Debugging the ARE")]),t._v(" "),e("p",[t._v("If the ARE is started using the “start_debug.bat” script and source-level debug information was added during the compilation (see section 2.3), debugging with Eclipse is supported via a remote debugging connection. This is a convenient way for dimagesebugging an OSGI-based java framework with a lot of plugins. To enable the debugging support in Eclipse, a Debug Configuration is created via the dedicated menu entry:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(290),alt:""}})]),t._v(" "),e("p",[t._v("Create a “Remote Java Application” Debug Configuration and assign a name for it, e.g. “ARE”. Then, specify the connection properties of the Debug Configuration to use the Host “localhost” and the Socket/Port “1044” (this port is given in the ARE build scripts for the remote debug server to listen for incoming client connections):")]),t._v(" "),e("p",[e("img",{attrs:{src:a(291),alt:""}})]),t._v(" "),e("p",[t._v("Now launch the ARE using “start_debug.bat”. The messages in the console window should indicate the establishment of the listening socket 1044 for the debugging connection:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(292),alt:""}})]),t._v(" "),e("p",[t._v("Now, the usual debugging support of Eclipse can be used, including breakpoints in middleware or components, variable and context watch windows, single stepping etc. All these operations are performed in the Eclipse “Debug” perspective.")]),t._v(" "),e("p",[t._v("The following screenshot shows a program execution of the ARE which ran into a breakpoint (here: the OSKA plugin was halted as a command was selected in the OSKA-application and transferred to the ARE plugin’s command handler:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(293),alt:""}})]),t._v(" "),e("p",[e("img",{attrs:{src:a(294),alt:""}})]),t._v(" "),e("p",[t._v("If the source-level debug information is missing (due to compilation without debugging support) an error message indicates a problem, e.g. the missing line number for breakpoint installation:")]),t._v(" "),e("h2",{attrs:{id:"services-and-utils-infrastructure-for-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#services-and-utils-infrastructure-for-plugins"}},[t._v("#")]),t._v(" Services and Utils: Infrastructure for plugins")]),t._v(" "),e("p",[t._v("The ARE Services are a set of classes that enable the direct interaction between AsTeRICS plugins and other software to directly interact with the runtime environment. The most significant ARE Services are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIM Communication Service: the ARE CIM Communication service layer is a unified approach to allow plugins of the ARE to communicate with their associated hardware modules attached to the AsTeRICS platform via a COM port. A range of hardware modules are provided which implement the dedicated Communication Interface Module (CIM) protocol. Further details on this communication protocol and implementation details for the ARE CIM Communication Service can be found in chapter 5.15.")])]),t._v(" "),e("li",[e("p",[t._v("Remote Connection Service: the remote connection services allows external software that cannot be integrated into the standard plugin inter communication system used by the ARE, for example because of programming language incompatibilities, to work with the AsTeRICS system. For example, the interconnection of OSKA (the On-Screen Keyboard Application developed by AsTeRICS partner SENSORY) and the ARE uses the Remote Connection Service to send key selection information to the ARE. On the other hand, the ARE can reply with cell selection commands or other information. The actual communication is done via a protocol that can be understood by the Java ServerSocket implementation. The port number that the external software component connects to identifies the connecting component.")])]),t._v(" "),e("li",[e("p",[t._v("Local Storage Service: The Local Storage Service will allow plugins to store individual working data “per model” and “per plugin-instance”. This is necessary when plugins need to store own calibration data, pattern recognition samples or similar data. In course of the architectural refinements for the final prototype, a service class will be provided which generates an according folder and respective file read- and write methods.")])]),t._v(" "),e("li",[e("p",[t._v("Native Hook Services for systemwide keyboard and mouse capturing")])]),t._v(" "),e("li",[e("p",[t._v("Computer Vision services to support a unified way for frame grabbing, computer vision processing and video frame rendering.")])]),t._v(" "),e("li",[e("p",[t._v("Logging service")])]),t._v(" "),e("li",[e("p",[t._v("ConversionUtils: Helper class to convert port data streams into Java data types and vice versa.")])]),t._v(" "),e("li",[e("p",[t._v("Class "),e("strong",[t._v("ResourceRegistry")]),t._v(" to fetch resource URIs. If a plugin needs access to a config, data or a multimedia file, the class ResourceRegistry must be used.")])])]),t._v(" "),e("h2",{attrs:{id:"communicating-with-peripherals-cim-communication-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communicating-with-peripherals-cim-communication-service"}},[t._v("#")]),t._v(" Communicating with peripherals: CIM Communication service")]),t._v(" "),e("p",[t._v("Communication between actuator and sensor components in the ARE and peripheral devices is currently defined to use a serial communication i.e. a COM port or a virtual COM port. Messaging via this interface can either adhere to the CIM protocol (see section 5.15) or use any other protocol using the raw port implementation of the CIM communication services.")]),t._v(" "),e("p",[t._v("All the communication with peripheral devices is done through a service in the ARE service layer called CIM Communication. The service is provided as a separate OSGi bundle which places its classes in the package "),e("code",[t._v("$1")]),t._v(". Access to the classes is done by exporting the entire package in the bundle.")]),t._v(" "),e("p",[t._v("Four classes of the CIM Communication service are important to the component programmer:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMPortManager")])]),t._v(" "),e("li",[e("p",[t._v("CIMController")])]),t._v(" "),e("li",[e("p",[t._v("CIMProtocolPacket")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventHandler")])])]),t._v(" "),e("h2",{attrs:{id:"cimportcontroller"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportcontroller"}},[t._v("#")]),t._v(" CIMPortController")]),t._v(" "),e("p",[t._v("CIMPortController is an abstract class which hides the actual implementation of the port controller. The port controller provides the same methods for sending packets using the CIM protocol, for raw port implementations and for future uses such as a port controller handling Zigbee connections.")]),t._v(" "),e("h2",{attrs:{id:"cimportmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportmanager"}},[t._v("#")]),t._v(" CIMPortManager")]),t._v(" "),e("p",[t._v("All CIM ports and other COM ports are access through the main class of the package CIMPortManager. This is implemented as a singleton with a public access method getInstance(). Thus all calls to the CIM communication service have to be done through:")]),t._v(" "),e("p",[e("code",[t._v("CIMPortManager.getInstance()")])]),t._v(" "),e("p",[t._v("Upon creation the CIMPortManager detects all the connected CIMs and registers them in a HashMap. CIMs are identified and stored by the combination of their CIM Id and their unique number. Therefore multiple CIMs of the same CIM Id can be used on the AsTeRICS platform.")]),t._v(" "),e("p",[t._v("On some computers there exist certain serial ports which do not work correctly and behave strangely. An example of such a port is a loopback port which echoes everything written to it or ports created by Bluetooth dongles. Since the CIMPortManager iterates through all serial ports, these ports can cause problems in the auto detection of attached CIMs and even lock up the runtime. Therefore a file "),e("em",[t._v("ignore_ports.txt")]),t._v(" in the directory "),e("em",[t._v("data/cimcommunication")]),t._v(" is parsed upon start of the auto detection. This file should be filled with the name of the COM ports behaving erratically one name per line.")]),t._v(" "),e("p",[t._v("To be able to communicate with a CIM, the CIM port manager provides several methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" uniqueNumber"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("These methods return a CIMPortController (read on for details) instance of the requested CIM. The method using two parameters will return the instance to the port controller which works with the CIM of the exact CIM ID and unique number. If the CIM cannot be found, null will be returned.")]),t._v(" "),e("p",[t._v("Requesting a connection without naming a unique number will return the first port controller connected to a CIM of the correct ID found in the HashMap holding all the port controllers.")]),t._v(" "),e("p",[t._v("Sending data to the connected peripheral can be done in several ways using the following methods of CIMPortManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMUniqueIdentifier")]),t._v(" cuid"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" ctrl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Basically these three methods do the same thing, however they do it at different speeds as the first two methods will look up the port controller that the packet should be sent to. Again the method taking only the CIM ID as a parameter will look up the first correct port controller. The third method which is passed the CIMPortController instance returned on getConnection() is the fastest method and should be used whenever possible.")]),t._v(" "),e("p",[t._v("Sending a CIM packet is done by providing the feature address and request code for a certain packet. The feature addresses and request codes can be found in the CIM protocol specification and the basic addresses and requests are also provided as static fields in the CIMProtocolPacket class. If data has to be attached to a CIM protocol packet a byte array holding said data has to be passed to the method, otherwise the data parameter of the method has to be set to null. The caller can also decide whether a CRC checksum should be added to the packet although this is currently unimplemented.")]),t._v(" "),e("h2",{attrs:{id:"cimeventhandler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimeventhandler"}},[t._v("#")]),t._v(" CIMEventHandler")]),t._v(" "),e("p",[t._v("Receiving a packet is done through use of the CIMEventHandler interface. This interface should be implemented by plugins that wish to communicate with CIMs (or raw ports). The interface contains two methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("These methods are called upon correct reception of a packet or upon discovery of an error (timeout of a reply, packet transmission errors, incorrect order of incoming packets …) respectively by the port controller.")]),t._v(" "),e("p",[t._v("Upon correct reception of a CIM protocol based packet the method handlePacketReceived() is called with an instance of CIMEventPacketReceived as parameter. After conversion of the CIMEvent to this class, the packet can be extracted from the event and processed further.")]),t._v(" "),e("p",[t._v("All detected errors lead to a call of handlePacketError() with an appropriate CIMEvent implementation. The possible implemenations are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMEventErrorPacketFault: holds information to error in packet and the broken packet itself")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventErrorPacketLost: holds information on serial number of lost packet")])])]),t._v(" "),e("p",[t._v("To register the event handler with a specific CIM port controller, the CIMPortController class exposes the following methods:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("addEventHandler(CIMEventHandler hdlr)")])]),t._v(" "),e("li",[e("p",[t._v("removeEventHandler(CIMEventHandler hdlr)")])])]),t._v(" "),e("p",[t._v("A port controller can handle multiple attached event handlers and remove each one separately.")]),t._v(" "),e("h2",{attrs:{id:"cimprotocolpacket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimprotocolpacket"}},[t._v("#")]),t._v(" CIMProtocolPacket")]),t._v(" "),e("p",[t._v("This class holds all the information given in a packet transferred to or from a CIM. There are two ways the developer has to use this class. Upon sending packets the sending component has to set the feature address and the request code. The CIMProtocolPacket class provides the constants as static field to facilitate setting commands.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x00")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x01")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_EVENT_REPLY")]),t._v(" \t\t\t "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Furthermore the class contains constants for the global features that every CIM has to provide.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FEATURE_UNIQUE_SERIAL_NUMBER")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Upon reception of an incoming packet the component associated with the CIM sending the packet is notified and a reference to the packet is passed as an instance of CIMProtocolPacket wrapped in a CIMEvent instance. The developer can access all the fields of the packet via the getter methods the class provides:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAreCimID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSerialNumber")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFeatureAddress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequestReplyCode")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getCrc")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[t._v("#")]),t._v(" Serial ports not adhering to CIM Protocol (Raw Ports)")]),t._v(" "),e("p",[t._v("Some peripherals use a proprietary protocol to transfer their data. If this is the case the user can open a raw port through the CIMPortManager method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will open the port with the name specified in the parameter portName and set the communication to the specified Baud rate.")]),t._v(" "),e("p",[t._v("Data can be sent to peripheral using the sendPacket() method for the returned CIMPortController. The packet will simply transfer the byte array passed in the data parameter and ignore the values giving the in the other parameter fields.")]),t._v(" "),e("p",[t._v("Received data will be forwarded to the event handler through calls to handlePacketReceived() with a CIMEventRawPacket as parameter. This class holds a public member variable b which holds the value of the received byte. The event handler has to handle the reconstruction of the proprietary packet itself.")]),t._v(" "),e("p",[e("strong",[t._v("HighSpeed Raw Ports:")])]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" highSpeed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("A second variant opf the getRawConnection method allows specification of a “highSpeed” parameter. If highSpeed is true, the CIMPortController does not apply any connection handling or callbacks for received data to avoid performance problems in higher bandwidth streaming use cases. In this case, the CIMPortController can return the JAVA InputStream for the openend COM port connection and the plug developer can use it as desired:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("portController "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COM12")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("115200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" portController"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputStream")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("available")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" myHandlePacket "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h2",{attrs:{id:"communication-through-a-socket-interface-remote-connection-manager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communication-through-a-socket-interface-remote-connection-manager"}},[t._v("#")]),t._v(" Communication through a socket interface: Remote Connection Manager")]),t._v(" "),e("p",[t._v("When using third party software that runs on the same platform (as for example the prominently used On Screen Keyboard Application OSKA), it becomes necessary to establish a communication between ARE and the third party application. This is managed by the RemoteConnectionManager found in the package eu.asterics.mw.services. The main interface to this manager are the classes RemoteConnectionManager and IRemoteConnectionListener.")]),t._v(" "),e("h2",{attrs:{id:"iremoteconnectionlistener"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#iremoteconnectionlistener"}},[t._v("#")]),t._v(" IRemoteConnectionListener")]),t._v(" "),e("p",[t._v("This interface is implemented by plugins that need to communicate via a socket communication. The interface contains the following methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionEstablished")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("dataReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionLost")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionClosed")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("connectionEstablished() is called whenever a plugin requests a connection and the connection has been established. This can either happen if a connection has already been established before or if the new connection has finished its setup and connection process.")]),t._v(" "),e("p",[t._v("dataReceived() is called whenever new data arrives from the other end of the connection. Data is transferred in a byte array and has to be processed by the event listener.")]),t._v(" "),e("p",[t._v("connectionLost() is called when the connection management cannot read from or write to the socket.")]),t._v(" "),e("p",[t._v("connectionClosed() is called after the connection has been closed.")]),t._v(" "),e("h2",{attrs:{id:"remoteconnectionmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#remoteconnectionmanager"}},[t._v("#")]),t._v(" RemoteConnectionManager")]),t._v(" "),e("p",[t._v("The RemoteConnectionManager is implemented as a singleton and can be accessed via a public static member of the class. Thus access is always achieved through:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RemoteConnectionManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance\n")])])]),e("p",[t._v("A connection is opened by calling the RemoteConnectionManager’s method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" requestConnection "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRemoteConnectionListener")]),t._v(" l"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This call will try to access a connection on the specified port. Although the port is actually an integer it is passed as a String here. The method will return true if a connection on this port has already been established and attach the remote connection listener passed in the second argument to the connection. If there is no active connection on the specified port, the requestConnection method will initiate the setup of the connection and return false. With this return value the user can decide whether he needs to perform setup actions or will be able to do this in the connectionEstablished() callback.")]),t._v(" "),e("p",[t._v("The socket connection handling is implemented using two threads, one for sending, one for receiving data. The receiver thread will continuously read data from the socket and forward it to the registered listener calling the dataReceived() method. Since incoming data is handled in another thread than the plugin which will use the socket connection, access to the methods handling this data or the way of passing data should be done in a synchronised code block.")]),t._v(" "),e("p",[t._v("Sending data is done calling the method sendData of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is called using a String holding the port number of the connection socket and an array of bytes to be sent. The call to this method will place the data in an outgoing queue and return true if this was successful. Thus it is not guaranteed that the data has already been sent when the method returns. The sender thread will grab data from the outgoing queue and transfer it via the socket or call the connectionLost() method of the registered listener if there are problems while sending.")]),t._v(" "),e("p",[t._v("Once the connection to a socket is not needed anymore, the user has to close the connection, calling the following method of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("closeConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will close the socket connection, end all threads and return.")]),t._v(" "),e("h2",{attrs:{id:"local-storage-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#local-storage-service"}},[t._v("#")]),t._v(" Local Storage Service")]),t._v(" "),e("p",[t._v("If a model needs to save its own calibration data, training data or other private data that can be different in every model and every instance, the local storage service provides a method to save different data to the same file name on a per plugin instance per model basis.")]),t._v(" "),e("p",[t._v("The service uses a directory tree structure that is placed in the directory the OSGi is run from. Data is saved in a directory called “storage”. In this directory, directories for every model name of a model that uses at least one plugin that accesses local storage can be found. In the third directory layer, directories with the plugin instance name of every plugin that accesses local storage can be found. Thus if a model named “timertest” uses a plugin instance named “timer1” that saves local data this data can be found at the path location “storage/timertest/timer1”.")]),t._v(" "),e("p",[t._v("The service practically consists of only one method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLocalStorageFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fileName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method located in the AREServices class will return a File object pointing to the requested file name or null if the file could not be opened or the model name could not be retrieved. After opening the file the standard JAVA ways to manipulate files apply.")]),t._v(" "),e("h2",{attrs:{id:"keyboard-mouse-native-hook-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-mouse-native-hook-services"}},[t._v("#")]),t._v(" Keyboard/Mouse Native Hook Services")]),t._v(" "),e("p",[t._v("The AsTeRICS service jnativehook (if enabled) provides access to the library "),e("a",{attrs:{href:"https://github.com/kwhat/jnativehook",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/kwhat/jnativehook"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Additionally, the service contains the singleton NativeHookServices that initializes the library to be usable in plugins. A plugin that wants to be a keaboard/mouse listener only has to add the listener to the GlobalScreen instance of the library.")]),t._v(" "),e("h2",{attrs:{id:"computer-vision-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#computer-vision-services"}},[t._v("#")]),t._v(" Computer Vision Services")]),t._v(" "),e("p",[t._v("The AsTeRICS services javacv and computervision (if enabled) provide access to the library "),e("a",{attrs:{href:"https://github.com/bytedeco/javacv",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/bytedeco/javacv"),e("OutboundLink")],1),t._v(", which again provides access to numerous libs in the field of computer vision (e.g. OpenCV), frame grabbing and frame rendering. Additionally, some helper classes are provided for face detection.")]),t._v(" "),e("h2",{attrs:{id:"data-conversion-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-conversion-utilities"}},[t._v("#")]),t._v(" Data Conversion Utilities")]),t._v(" "),e("p",[t._v("The middleware provides the class “ConversionUtils” that provide static helper methods to convert model data types to byte arrays and vice versa. The conversion is needed to convert incoming data of input ports or outgoing data to output ports. There are methods for each type of conversion. If two connected ports (output to input) have different data types the data is automatically converted to the data type of the input port.")]),t._v(" "),e("p",[t._v("Check the class ConversionUtils for a full list of supported methods: "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"fetching-resource-uris-with-resourceregistry-class"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fetching-resource-uris-with-resourceregistry-class"}},[t._v("#")]),t._v(" Fetching resource URIs with ResourceRegistry class")]),t._v(" "),e("p",[t._v("If a plugin needs resources like data files (images, keyboard files, haarcascade definitions,…), the class "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("ResourceRegistry"),e("OutboundLink")],1),t._v(" must be used to fetch the resource URI.")]),t._v(" "),e("p",[t._v("This can be done by using the method:")]),t._v(" "),e("p",[e("code",[t._v("public URI getResource(String resourcePath, RES_TYPE type) throws URISyntaxException")])]),t._v(" "),e("p",[t._v("Returns the URI according to the given resourcePath string and the given resource type RES_TYPE.")]),t._v(" "),e("p",[t._v("Please refer to the Javadoc of the class and to the "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Fetching-resources-with-class-ResourceRegistry",target:"_blank",rel:"noopener noreferrer"}},[t._v("wiki page"),e("OutboundLink")],1),t._v(" for further examples.")]),t._v(" "),e("h2",{attrs:{id:"error-reporting-astericserrorhandling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-astericserrorhandling"}},[t._v("#")]),t._v(" Error Reporting (AstericsErrorHandling)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("AstericsErrorHandling")]),t._v(" provides a unified logging and error reporting mechanism. It contains methods for reporting an error of a component or even the ARE.")]),t._v(" "),e("h3",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),e("p",[t._v("The Logging support provides a uniform way of error reporting in the runtime environment so we have utilized the Java logging libraries and the various severity levels supported. The AsTeRICS error handling mechanism is used extensively from the runtime core classes but also utilized by the AsTeRICS components via the AstericsErrorHandling interface.")]),t._v(" "),e("p",[t._v("Each component is allowed to report an error message, a debug information or a simple information to be displayed on the screen. The ARE maintains four separate log files and updates them whenever a new error occurs. In particular there are different loggers for reporting severe errors, warnings, fine errors and one logger that contains them all.")]),t._v(" "),e("p",[t._v("ARE also maintains a status object for the current status of the runtime environment. Whenever a fatal error occurs (either internally or caused by one of the deployed components) the status changes to fatal error. Other possible statuses are unknown, OK, deployed, running and paused.")]),t._v(" "),e("p",[t._v("The ACS can request the current status of the runtime environment and update its own state accordingly. For example the ACS user can be informed about the current ARE status while the ACS will terminate a connection (or refuse to establish a new one) with a non-working ARE.")]),t._v(" "),e("p",[t._v("Using a Logger is the recommended way to report notifications or error descriptions to the user. In the ARE framework, using the Java logging service is recommended. The Java logger can be configured using the file “logging.properties” (see section 2.3.3.1) and used as follows:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("…"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsErrorHandling")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"error-reporting-of-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-of-components"}},[t._v("#")]),t._v(" Error Reporting of components")]),t._v(" "),e("p",[t._v("If a component wants to notify an error it should use the following method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_warning.log” file. Additionally the status of the component is set to error with the given error message and an error dialog is shown in the ARE gui, if enabled.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportInfo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" info"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_fine.log” file.")]),t._v(" "),e("h3",{attrs:{id:"status-checking"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#status-checking"}},[t._v("#")]),t._v(" Status checking")]),t._v(" "),e("p",[t._v("The status checking mechanism is responsible for recording the current status of the ARE or the error state of a component. The status is recorded by creating and storing objects called "),e("em",[t._v("statusObjects")]),t._v(". A statusObject stores the status of its creator as a string, its creator (the ARE or the specific component) and the error message.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" status"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The status of the ARE can be one of the following strings:")]),t._v(" "),e("p",[t._v("UNKNOWN: initial state for the ARE")]),t._v(" "),e("p",[t._v("OK: ARE is running and ready to deploy a model")]),t._v(" "),e("p",[t._v("DEPLOYED: A model has been deployed and the ARE is now ready to run the model")]),t._v(" "),e("p",[t._v("RUNNING: A model is running on the ARE")]),t._v(" "),e("p",[t._v("PAUSED: A model has been deployed and the ARE is in paused mode")]),t._v(" "),e("p",[t._v("ERROR: An error occurred")]),t._v(" "),e("p",[t._v("FATAL_ERROR: A fatal error occurred, model or deployment aborted")]),t._v(" "),e("p",[t._v("The status of a component can only be the ERROR state because this is the only state of a component that we are interested in recording for later use. An ERROR statusObject is automatically created when a component calls the reportError method as described above.")]),t._v(" "),e("p",[t._v("For retrieving the statusObjects, the following method is used:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("queryStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" fullList"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is particularly useful for the ACS to determine the current status of the runtime environment and of the deployed components. If the ARE or one of the components are in a problematic state it can be reflected in the ACS.")]),t._v(" "),e("p",[t._v("The boolean "),e("em",[t._v("fullList")]),t._v(" argument specifies whether the error list to be returned will include all statusObjects generated since the ARE startup or just those that have not been requested by the ACS before.")]),t._v(" "),e("h2",{attrs:{id:"the-are-thread-pool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-thread-pool"}},[t._v("#")]),t._v(" The ARE Thread Pool")]),t._v(" "),e("p",[t._v("In order to avoid resource greedy threads and to achieve best thread handling, ARE uses one of the Thread Pool implementations provided by Java since JRE 1.5. In particular, we have utilized the java.util.concurrent.Executors library for creating a CachedThreadPool.")]),t._v(" "),e("p",[t._v("A cached thread pool will create threads as needed but will reuse previously instantiated threads when they are available and inactive. A cached thread pool is particularly useful for many short-lived asynchronous tasks and improves the performance of the runtime environment.")]),t._v(" "),e("p",[t._v("Developers are expected to use the ARE thread pool for executing their tasks that require a new Thread. You will need to import the middleware services package in order to get access to the "),e("strong",[t._v("AstericsThreadPool")]),t._v(" class.")]),t._v(" "),e("h2",{attrs:{id:"the-are-gui-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-gui-support"}},[t._v("#")]),t._v(" The ARE GUI support")]),t._v(" "),e("p",[t._v("The ARE provides a panel area (“ARE Desktop”) where plugins can display their graphical elements using the ARE GUI support classes. The ACS provides a dedicated canvas editor that allows end users positioning and resizing graphical elements of the plugins. Based on this information, the ARE displays plugins on the local device, maintaining the correct screen position and aspect ratio of graphical elements with respect to the screen resolution of the deployment device. (For more information about the usage of the ACS GUI editor and the ARE GUI control panel refer to the User Manual.)")]),t._v(" "),e("p",[e("img",{attrs:{src:a(295),alt:""}})]),t._v(" "),e("p",[e("strong",[t._v("GUI composition using the ACS GUI designer (right), resulting ARE GUI (left)")])]),t._v(" "),e("p",[t._v("In order to be recognized as GUI-plugin by ACS and ARE, the bundle descriptor of the plugin has to be extended with a dedicated "),e("code",[t._v("")]),t._v(" entry, which specifies the default size in a virtual coordinate system of 10000/10000 pixels. In the deployment model, the ACS will create position and size information according to the area defined in the ACS GUI designer.")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("gui")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("width")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("5000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("height")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[e("strong",[t._v("The gui element addition to the bundle descriptor")])]),t._v(" "),e("p",[t._v("The AsTeRICS middleware provides some services to the plugin developers in order to allow them displaying their GUI element onto the ARE Desktop. The middleware services encapsulate the complexity of dealing with positioning and allow displaying all GUI elements onto the same container: the ARE Desktop.")]),t._v(" "),e("p",[t._v("All GUI services are defined in eu.asterics.mw.services.AREServices so developers need to import this class in order to get access to the following methods:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void displayPanel (JPanel panel, IRuntimeComponentInstance componentInstance, boolean display)")])])]),t._v(" "),e("p",[t._v("This method is used for displaying (or hiding) a plugin’s panel at/from the ARE desktop. Developers need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the panel they want to be displayed (or removed)")])]),t._v(" "),e("li",[e("p",[t._v("the plugin object, in order to help the middleware finding the desired position and dimensions from the deployment model")])]),t._v(" "),e("li",[e("p",[t._v("a boolean argument specifying if they wish to hide or show the given panel.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("Dimension getAvailableSpace(IRuntimeComponentInstance componentInstance)")])])])]),t._v(" "),e("p",[t._v("The space that each plugin will occupy on the ARE desktop is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the available space for their graphical elements by calling the getAvailableSpace method which will return the space occupied for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Point getComponentPosition (IRuntimeComponentInstance componentInstance)")])])]),t._v(" "),e("p",[t._v("The positioning of plugin’s GUI elements is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the position of their graphical elements by calling the getComponentPosition which will return the position on screen for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void adjustFonts(JPanel panel, int maxFontSize, int minFontSize, int offset)")])])]),t._v(" "),e("p",[t._v("This service can be used by plugin developers interested in auto-adjusting the fonts of their GUI components depending on the space occupied for their plugins on the ARE desktop. They need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a panel to which all the internal fonts will be auto-adjusted")])]),t._v(" "),e("li",[e("p",[t._v("the maximum font size (in case there is more space available than needed)")])]),t._v(" "),e("li",[e("p",[t._v("the minimum font size, in case there is too little space which causes the text to become non-readable. Finally, the offset argument is used in case we want to occupy a percentage of the available space.")])])]),t._v(" "),e("p",[t._v("A good approach to GUI plugin development is to analyse existing plugins which provide GUI elements, e.g. the BarDisplay or Oscilloscope actuators, or the Slider or Cellboard sensor components.")]),t._v(" "),e("p",[t._v("If the plugin uses "),e("strong",[t._v("Swing to implement a GUI-widget")]),t._v(" (e.g. Slider,…), please check the following guidelines as well 4.2.8")]),t._v(" "),e("h2",{attrs:{id:"are-core-events-notification-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-core-events-notification-services"}},[t._v("#")]),t._v(" ARE core events notification services")]),t._v(" "),e("p",[t._v("The ARE core events notification service allows plugins to register/unregister to the ARE middleware in order to receive notifications of ARE core events.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void registerAREEventListener(IAREEventListener clazz)")])])]),t._v(" "),e("p",[t._v("It is sometimes necessary that plugins can be notified of various ARE events so they can react as needed. This method can be called by component instances that wish to be notified of such ARE events. Currently, the core events supported are:")]),t._v(" "),e("ul",[e("li",[e("p",[e("em",[t._v("preDeployModel:")]),t._v(" registered ARE event listeners will be notified just before the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postDeployModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStartModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStartModel:")]),t._v(" registered ARE event listeners will be notified immediately after the currently deployed model has been started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStopModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStopModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("prePauseModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postPauseModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preResumeModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postResumeModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified just before the bundles are is installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified immediately after the bundles have been installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("void unregisterAREEventListener(IAREEventListener clazz)")])])])]),t._v(" "),e("p",[t._v("Plugins already registered for receiving ARE core events can un-register using this method.")]),t._v(" "),e("h2",{attrs:{id:"dynamic-properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-properties"}},[t._v("#")]),t._v(" Dynamic Properties")]),t._v(" "),e("p",[t._v("In some applications, the ACS should be able to provide several options for property values which are not known in advance but depend on the current state of the ARE (see AsTeRUCS User Manual, section “Dynamic Properties”)… A typical example is the selection of a file which is available in the ARE file system (e.g. a .wav-file for the wave player plugin). This feature is particularly useful for plugins that are hardware dependent (selecting e.g. a soundcard or a midi player), or depend on the file system.")]),t._v(" "),e("p",[t._v("If a plugin is implementing a dynamic property, the values will be requested from the ARE, as soon as the ACS is synchronized with the ARE, via the ASAPI function:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])]),e("p",[t._v("The ARE middleware will forward the request for valid property values to the component instance with the given ID. The "),e("code",[t._v("List getRuntimePropertyList(String key)")]),t._v(" method has to be implemented in the "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" class which every AsTeRICS component extends.\nThe method implementation creates the list of valid properties and returns it to the middleware and the latter forwards the string list to the ACS via ASAPI. The ACS will dynamically update the property list in the properties window.")]),t._v(" "),e("p",[t._v("For an example of the dynamic property implementation, see the WaveFilePlayer plugin.")]),t._v(" "),e("h2",{attrs:{id:"data-synchronization"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-synchronization"}},[t._v("#")]),t._v(" Data Synchronization")]),t._v(" "),e("p",[t._v("Some plugins need data of multiple input ports to be able to start processing. Without data synchronization it is possible that one input port of a plugin receives multiple values before another port gets one value, although both signal channels deliver values at the same sampling rate.")]),t._v(" "),e("p",[t._v("The synchronization service provides a buffering mechanism at the middleware level that can be utilized by plugin developers in order to make sure that incoming data of selected input ports arrives synchronized.")]),t._v(" "),e("p",[t._v("To use the synchronization service in the plugin code, plugin developers are expected to extend the "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" instead of implementing the "),e("em",[t._v("IRuntimeInputPort.")]),t._v(" Basically, "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" provides a default implementation for the necessary buffering methods, as shown in the table below.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DefaultRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("receiveData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" startBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" stopBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" isBuffered "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("The designer can define that a plugin’s input port should be synchronized with some other input ports via the ACS. This will cause an argument change of the inputPort element on the deployment model file (e.g.,"),e("code",[t._v('')]),t._v(").")]),t._v(" "),e("p",[t._v("As soon as a model is deployed on the ARE, the middleware collects per component every port noted as synchronized port. When the model is successfully deployed and started, the ARE will buffer data which enters synchronized input ports until data on all synchronized ports has arrived. At that point, the ARE will call a new "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" callback method.")]),t._v(" "),e("p",[t._v("Developers that wish to support data synchronization need to implement the following method at their component instances.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncedValuesReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Where dataRow is a HashMap between Input Port ID and byte[]. For synchronized input ports, instead of implementing the regular "),e("em",[t._v("void receiveData(byte[] data)")]),t._v(" method which delivers incoming data of a single port, developers need to implement the "),e("em",[t._v("syncedValuesReceived")]),t._v(" method which will be called from the ARE with synchronized data from all the input ports that have been selected.")]),t._v(" "),e("h2",{attrs:{id:"interfacing-native-c-c-code-via-jni"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#interfacing-native-c-c-code-via-jni"}},[t._v("#")]),t._v(" Interfacing Native C/C++ Code via JNI")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("## Specifying native libraries in the Manifest\n")])])]),e("p",[t._v("The Manifest file of a bundle which includes native libraries has to specify these .dlls as shown in the following example:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-sensors.mycomponent\nBundle-SymbolicName: org.asterics.mycomponent\nBundle-Version: 0.1.0\nBundle-NativeCode: lib/native/mylib1.dll;\n lib/native/mylib2.dll;\n lib/native/mylib3.dll;\n osname=win32;processor=x86;\n osname=win;processor=x86-64;\n osname=win8;processor=x86;\n osname=win8;processor=x86-64;\n osname=windows 8;processor=x86;\n osname=windows 8;processor=x86-64;\n osname=windows8;processor=x86;\n osname=windows8;processor=x86-64;\n osname=Windows 8.1;processor=x86;\n osname=Windows 8.1;processor=x86-64\nDynamicImport-Package: *\n")])])]),e("p",[t._v("Components which interface native code via JNI and their respective manifest files can be found in the SVN, e.g. the “webcamera” component or the signal processing plugins by Starlab.")]),t._v(" "),e("p",[t._v("Note that the .jar containing the .dlls can be built manually using the command:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("jar "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-cvfm")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/mybundle.jar META-INF/MANIFEST.MF "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n")])])]),e("h2",{attrs:{id:"java-implementation-jni-bridge"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java-implementation-jni-bridge"}},[t._v("#")]),t._v(" Java-Implementation: JNI-Bridge")]),t._v(" "),e("p",[t._v("The recommended way to interface Java code of an ARE component with native code in a .dll is a bridge class which encapsulates the JNI functions and callbacks and maps the functions of the ARE component’s lifecycle-, port- and property-management to the corresponding functions in the native code. Here is a simple example which comprises one component property and receives data callbacks from a thread implemented in C. The received values are transferred to the component’s output port:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jni")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mycomponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Statically load the native library */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib1.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib2.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib3.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAnonymousLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("my_outport "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Activates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("activate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Deactivates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("deactivate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Gets the value of the named property.\n *\n * @param key the name of the property to be accessed\n * @return the value of the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Sets the named property to the defined value.\n *\n * @param key the name of the property to be accessed\n * @param value the value to be assigned to the named property\n * @return the value previously assigned to the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code on demand to signify \n * an internal error. The first argument corresponds to an error code \n * and the second argument corresponds to a textual description \n * of the error.\n * @param errorCode an error code\n * @param message a textual description of the error\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorReport_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" errorCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n logger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("severe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorCode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('": "')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code to send data\n * to the component’s output port.\n *\n * @param data1 (range is [0, Short.MAX_VALUE])\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("newData_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"c-implementation-callbacks-and-jni-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#c-implementation-callbacks-and-jni-code"}},[t._v("#")]),t._v(" C-Implementation: Callbacks and JNI code")]),t._v(" "),e("p",[t._v("The native C-code needs to be compiled into a .dll and include the JNI header files and libraries. An example for the Microsoft Visual Studio compiler looks as follows:")]),t._v(" "),e("p",[t._v("The following C-example shows how to implement a JNI-callback from a C-thread and an ARE-compliant exchange of a component property:")]),t._v(" "),e("div",{staticClass:"language-c extra-class"},[e("pre",{pre:!0,attrs:{class:"language-c"}},[e("code",[e("span",{pre:!0,attrs:{class:"token macro property"}},[e("span",{pre:!0,attrs:{class:"token directive-hash"}},[t._v("#")]),e("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("")])]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" JavaVM "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" jobject g_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myProperty"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_activate")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\terror_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetJavaVM")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tjclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newData_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// explicitly ask for a global reference")]),t._v("\n\tg_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_init")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_deactivate")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_exit")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tenv"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeleteGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_getProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\t\t\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_setProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n\t strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown */")]),t._v("\n\t strValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tpollingIntervalValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prepare JNI callback")]),t._v("\n JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n g_jvm"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("AttachCurrentThread")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newCoordinates_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// perform JNI callback")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("CallVoidMethod")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("my_new_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("This native C-code needs to be compiled into a .dll, the JNI header files and libraries have to be specified to the compiler and linker respectively. An example for the Microsoft Visual Studio build tools looks as follows:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('cl -c -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include" -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include\\win32" -I ".\\3rdparylib" my_c_file.cpp /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue \nlink my_c_file.obj /DLL /OUT:".\\my_c_file.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"libmsvc" /LIBPATH:"3rdparylib" "odbc32.lib" "odbccp32.lib" "comctl32.lib" "winmm.lib" "opengl32.lib" "ole32.lib" "strmiids.lib" "uuid.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "oleaut32.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"atlthunk" /NODEFAULTLIB:"LIBCMT" /MANIFESTUAC:"level=\'asInvoker\' uiAccess=\'false\'" /DEBUG /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:QUEUE\n')])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The compiler and linker switches may differ depending on the nature of your dependency libraries and setup.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-packaging-environment-ape"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-packaging-environment-ape"}},[t._v("#")]),t._v(" AsTeRICS Packaging Environment (APE)")]),t._v(" "),e("p",[t._v("The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using "),e("a",{attrs:{href:"http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGIBBCI",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaFX packaging technology"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("See "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/AsTeRICS-Packaging-Environment-(APE)",target:"_blank",rel:"noopener noreferrer"}},[t._v("APE documentation"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{289:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_c0991ef32ae9b458.424ba3f3.png"},290:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_4dfe72317ab9f571.6b0975c3.jpg"},291:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_b6693a1cbcd9178a.03fc763d.png"},292:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_f1a0b4f36dd370ba.c1a39a2a.jpg"},293:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_fb7627584ba9d5d7.45a2067d.png"},294:function(t,e,a){t.exports=a.p+"assets/img/DeveloperManual_html_3e993efbc73f2910.c6357005.png"},942:function(t,e,a){"use strict";a.r(e);var s=a(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"are-development-manual"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-development-manual"}},[t._v("#")]),t._v(" ARE Development Manual")]),t._v(" "),e("p",[t._v("The AsTeRICS source code repository is hosted at github and located at")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS",target:"_blank",rel:"noopener noreferrer"}},[e("strong",[t._v("https://github.com/asterics/AsTeRICS")]),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("The source code contains open source software modules in JAVA, C++ and C, and proprietary modules by AsTeRICS partners which are available in binary from (.dll or .exe).")]),t._v(" "),e("p",[t._v("The licenses of the utilized software packages and 3rd party products can be viewed in the file "),e("em",[t._v("/documentation/licenses.doc")])]),t._v(" "),e("p",[t._v("Currently, the editor for OSKA (the on-screen keyboard application) is the only commercial software package within the AsTeRICS framework – and not included in the free downloads. The OSKA editor is only needed if you want to design custom on-screen keyboard layouts for OSKA (see AsTeRICS User Manual).")]),t._v(" "),e("h2",{attrs:{id:"understanding-the-component-build-scripts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-component-build-scripts"}},[t._v("#")]),t._v(" Understanding the component build-scripts")]),t._v(" "),e("p",[t._v("A typical ANT build script for an ARE component looks like the following:")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("component.id"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("processor.MyComponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- set global properties for this build --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("build"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../out/production/${component.id}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src.java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("dist"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("runtime"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../../examples/ARE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../osgi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../middleware"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("../../services"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v(".."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("path")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${osgi}/org.eclipse.osgi_3.6.0.v20100517.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("pathelement")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${middleware}/asterics.ARE.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("location")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("src/main/resources"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the time stamp --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("tstamp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Create the build directory structure used by compile --\x3e")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("init"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile the source "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("javac")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("srcdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${src.java}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("destdir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("verbose")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("debug")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${debug}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("classpath")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${classpath}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("classpath")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("refid")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("asterics.classpath"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("target")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("depends")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("compile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("description")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("generate the OSGi bundle"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("jarfile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("basedir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${build}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("manifest")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}/META-INF/MANIFEST.MF"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("fileset")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dir")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${resources}"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("copy")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("file")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${dist}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("tofile")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${runtime}/asterics.${component.id}.jar"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[t._v("In the first section of the build script, folder locations for the build intermediates, the final build products (.jar file) and the classpath are defined. The classpath usually points to the “bin” folder, the middleware “asterics.ARE.jar” and the osgi distribution. If a component needs additional resources, their location has to be defined here.")]),t._v(" "),e("p",[t._v("Subsequently the build script defines two build targets: the compilation of the Java source code and the creation of the .jar file. If the .jar file shall contain additional .dlls with native code, they have to be specified in the Manifest file as shows in section 5.14.1.")]),t._v(" "),e("p",[t._v("After the .jar file has been created in the distribution folder, it is copied to the runtime folder (/bin/ARE).")]),t._v(" "),e("h2",{attrs:{id:"starting-the-are-middleware-and-component-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#starting-the-are-middleware-and-component-deployments"}},[t._v("#")]),t._v(" Starting the ARE middleware and component deployments")]),t._v(" "),e("p",[t._v("To test the ARE and component bundles, open the folder “/bin/ARE”, and use ARE.exe, start.bat or start_debug.bat.")]),t._v(" "),e("h2",{attrs:{id:"structure-of-the-runtime-folder-bin-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#structure-of-the-runtime-folder-bin-are"}},[t._v("#")]),t._v(" Structure of the runtime folder “./bin/ARE”:")]),t._v(" "),e("p",[t._v("This folder contains dependencies for running the ARE middleware and the .jars resulting from ANT builds, it has the following structure:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("/\n+- bin/\n +- ARE/\n +- data/ folder for plugin working data\n +- models/ stored models (configurations)\n +- profile/\n +- config.ini system bundles to be started\n +- services.ini general service bundles to be started\n +- services-windows.ini windows-specific service bundles\n +- services-linux.ini linux-specific service bundles\n +- services-macosx.ini macosx-specific service bundles\n +- org.eclipse.osgi/ osgi bundle cache folder\n +- 1238790741.log system log messages, stack trace\n +- tools/ plugin helper apps and dlls\n +- .logger stores console logging settings\n +- ARE.exe starts the ARE without console output\n +- areProperties stores recent window/GUI properties\n +- component bundle(s)\n +- asterics.ARE.jar ARE middleware\n +- asterics.mw.services.cimcommunication.jar CIM port manager\n +- grizzly-httpservice-bundle-2.3.23.jar http service for webservice feature\n +- javacv-*-linux|windows|macosx.jar platform specific javacv service\n +- tmp/*.log application log files\n +- jtester.exe helper app for checking Java version\n +- logging.properties configuration of loglevel etc.\n +- org.eclipse.osgi.*.jar osgi distribution\n +- sleeper.exe helper app for launcher timing\n +- start.bat starts ARE with console output\n +- findjava.bat searches for the newest 32bit JRE\n +- start_debug.bat starts ARE with Eclipse debug support\n +- start.sh starts ARE without console on Linux\n +- start_debug.sh starts ARE with debugging on Linux\n +- VCChecker.jar helper jar for checking VC redist dependency\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Important Note: The osgi configuration folder “org.eclipse.osgi” in the “profile” subdirectory has to be deleted if .dlls in .jar bundles are updated or changed. (This folder is automatically created when starting the ARE and holds working data for the OSGI-bundles.) The One-Click build.xml script described in chapter 2.4.2 deletes the folder automatically.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-services"}},[t._v("#")]),t._v(" AsteRICS services")]),t._v(" "),e("p",[t._v("An AsteRICS service is a bundle that provides ARE-wide functionality usable by other services or plugins. The service can be optionally disabled which means that the service bundle is not installed and not activated. The file services.ini contains a list of general services to be loaded. Whereas the services-windows.ini, services-linux.ini and services-macosx.ini files contain platform dependent service names. You can also create your own use-case specific services ini file and edit the start script to load it.")]),t._v(" "),e("h2",{attrs:{id:"running-a-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-a-deployment"}},[t._v("#")]),t._v(" Running a deployment")]),t._v(" "),e("p",[t._v("The “ARE.exe” starter application launches the ARE without console output and without debugging instrumentation.")]),t._v(" "),e("p",[t._v("Alternatively, the commandline batch script “start_debug.bat” which is provided in the folder “.bin/ARE” runs Java with additional configuration parameters including:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the location of the OSGi distribution")])]),t._v(" "),e("li",[e("p",[t._v("the profile subfolder which contains the config.ini file: “./bin/ARE/profile”")])]),t._v(" "),e("li",[e("p",[t._v("debugging instrumentation for the remote debugging server connection")])])]),t._v(" "),e("p",[t._v("After starting the ARE middleware, bundles are loaded and started on-demand if they are needed for the deployment of a model. If everything is properly configured, the ARE window comes up with a GUI and provides ASAPI server functionalities for connection of the ACS or other client applications.")]),t._v(" "),e("h2",{attrs:{id:"are-webserver-including-rest-api-websocket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver-including-rest-api-websocket"}},[t._v("#")]),t._v(" ARE webserver (including REST API, websocket)")]),t._v(" "),e("p",[t._v("The ARE contains a service that creates several web-based services. These include")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a webserver with document root "),e("em",[t._v("ARE/web")]),t._v(" and URL: "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a websocket at URL "),e("a",{attrs:{href:"http://localhost:8082/ws/astericsData",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8082/ws/astericsData"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a REST API at URL "),e("a",{attrs:{href:"http://localhost:8081/rest",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/rest"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("a javascript REST API client implementation example at "),e("a",{attrs:{href:"http://localhost:8081/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8081/"),e("OutboundLink")],1)])])]),t._v(" "),e("h2",{attrs:{id:"define-autostart-model-per-command-line"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#define-autostart-model-per-command-line"}},[t._v("#")]),t._v(" Define autostart model per command line")]),t._v(" "),e("p",[t._v("By starting the ARE with the name of a model as first command line parameter a model that should be started automatically can be defined. The model must exist in the sub-folder “models”.")]),t._v(" "),e("p",[t._v("‘ARE.exe CameraMouse.acs’")]),t._v(" "),e("p",[t._v("or")]),t._v(" "),e("p",[t._v("‘start_debug.bat CameraMouse.acs’")]),t._v(" "),e("h2",{attrs:{id:"change-model-task-submit-timeout"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-model-task-submit-timeout"}},[t._v("#")]),t._v(" Change model task submit timeout")]),t._v(" "),e("p",[t._v("The file “areProperties” contains properties to configure ARE features and to configure the internal model execution behaviour. The following internal model execution properties exist:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("ThreadPoolTasks.submitTimeout=20000")]),t._v(" "),e("ul",[e("li",[t._v("When submitting a task to be executed in the ModelExecutor thread a submit timeout can be configured. After the time elapsed a TimeoutException is thrown. The timeout value must be specified in milliseconds."),e("br"),t._v("\nThe submit timeout is used for starting, stopping, pausing and resuming a model.")])])])]),t._v(" "),e("h2",{attrs:{id:"debugging-the-are"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#debugging-the-are"}},[t._v("#")]),t._v(" Debugging the ARE")]),t._v(" "),e("p",[t._v("If the ARE is started using the “start_debug.bat” script and source-level debug information was added during the compilation (see section 2.3), debugging with Eclipse is supported via a remote debugging connection. This is a convenient way for dimagesebugging an OSGI-based java framework with a lot of plugins. To enable the debugging support in Eclipse, a Debug Configuration is created via the dedicated menu entry:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(289),alt:""}})]),t._v(" "),e("p",[t._v("Create a “Remote Java Application” Debug Configuration and assign a name for it, e.g. “ARE”. Then, specify the connection properties of the Debug Configuration to use the Host “localhost” and the Socket/Port “1044” (this port is given in the ARE build scripts for the remote debug server to listen for incoming client connections):")]),t._v(" "),e("p",[e("img",{attrs:{src:a(290),alt:""}})]),t._v(" "),e("p",[t._v("Now launch the ARE using “start_debug.bat”. The messages in the console window should indicate the establishment of the listening socket 1044 for the debugging connection:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(291),alt:""}})]),t._v(" "),e("p",[t._v("Now, the usual debugging support of Eclipse can be used, including breakpoints in middleware or components, variable and context watch windows, single stepping etc. All these operations are performed in the Eclipse “Debug” perspective.")]),t._v(" "),e("p",[t._v("The following screenshot shows a program execution of the ARE which ran into a breakpoint (here: the OSKA plugin was halted as a command was selected in the OSKA-application and transferred to the ARE plugin’s command handler:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(292),alt:""}})]),t._v(" "),e("p",[e("img",{attrs:{src:a(293),alt:""}})]),t._v(" "),e("p",[t._v("If the source-level debug information is missing (due to compilation without debugging support) an error message indicates a problem, e.g. the missing line number for breakpoint installation:")]),t._v(" "),e("h2",{attrs:{id:"services-and-utils-infrastructure-for-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#services-and-utils-infrastructure-for-plugins"}},[t._v("#")]),t._v(" Services and Utils: Infrastructure for plugins")]),t._v(" "),e("p",[t._v("The ARE Services are a set of classes that enable the direct interaction between AsTeRICS plugins and other software to directly interact with the runtime environment. The most significant ARE Services are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIM Communication Service: the ARE CIM Communication service layer is a unified approach to allow plugins of the ARE to communicate with their associated hardware modules attached to the AsTeRICS platform via a COM port. A range of hardware modules are provided which implement the dedicated Communication Interface Module (CIM) protocol. Further details on this communication protocol and implementation details for the ARE CIM Communication Service can be found in chapter 5.15.")])]),t._v(" "),e("li",[e("p",[t._v("Remote Connection Service: the remote connection services allows external software that cannot be integrated into the standard plugin inter communication system used by the ARE, for example because of programming language incompatibilities, to work with the AsTeRICS system. For example, the interconnection of OSKA (the On-Screen Keyboard Application developed by AsTeRICS partner SENSORY) and the ARE uses the Remote Connection Service to send key selection information to the ARE. On the other hand, the ARE can reply with cell selection commands or other information. The actual communication is done via a protocol that can be understood by the Java ServerSocket implementation. The port number that the external software component connects to identifies the connecting component.")])]),t._v(" "),e("li",[e("p",[t._v("Local Storage Service: The Local Storage Service will allow plugins to store individual working data “per model” and “per plugin-instance”. This is necessary when plugins need to store own calibration data, pattern recognition samples or similar data. In course of the architectural refinements for the final prototype, a service class will be provided which generates an according folder and respective file read- and write methods.")])]),t._v(" "),e("li",[e("p",[t._v("Native Hook Services for systemwide keyboard and mouse capturing")])]),t._v(" "),e("li",[e("p",[t._v("Computer Vision services to support a unified way for frame grabbing, computer vision processing and video frame rendering.")])]),t._v(" "),e("li",[e("p",[t._v("Logging service")])]),t._v(" "),e("li",[e("p",[t._v("ConversionUtils: Helper class to convert port data streams into Java data types and vice versa.")])]),t._v(" "),e("li",[e("p",[t._v("Class "),e("strong",[t._v("ResourceRegistry")]),t._v(" to fetch resource URIs. If a plugin needs access to a config, data or a multimedia file, the class ResourceRegistry must be used.")])])]),t._v(" "),e("h2",{attrs:{id:"communicating-with-peripherals-cim-communication-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communicating-with-peripherals-cim-communication-service"}},[t._v("#")]),t._v(" Communicating with peripherals: CIM Communication service")]),t._v(" "),e("p",[t._v("Communication between actuator and sensor components in the ARE and peripheral devices is currently defined to use a serial communication i.e. a COM port or a virtual COM port. Messaging via this interface can either adhere to the CIM protocol (see section 5.15) or use any other protocol using the raw port implementation of the CIM communication services.")]),t._v(" "),e("p",[t._v("All the communication with peripheral devices is done through a service in the ARE service layer called CIM Communication. The service is provided as a separate OSGi bundle which places its classes in the package "),e("code",[t._v("$1")]),t._v(". Access to the classes is done by exporting the entire package in the bundle.")]),t._v(" "),e("p",[t._v("Four classes of the CIM Communication service are important to the component programmer:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMPortManager")])]),t._v(" "),e("li",[e("p",[t._v("CIMController")])]),t._v(" "),e("li",[e("p",[t._v("CIMProtocolPacket")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventHandler")])])]),t._v(" "),e("h2",{attrs:{id:"cimportcontroller"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportcontroller"}},[t._v("#")]),t._v(" CIMPortController")]),t._v(" "),e("p",[t._v("CIMPortController is an abstract class which hides the actual implementation of the port controller. The port controller provides the same methods for sending packets using the CIM protocol, for raw port implementations and for future uses such as a port controller handling Zigbee connections.")]),t._v(" "),e("h2",{attrs:{id:"cimportmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimportmanager"}},[t._v("#")]),t._v(" CIMPortManager")]),t._v(" "),e("p",[t._v("All CIM ports and other COM ports are access through the main class of the package CIMPortManager. This is implemented as a singleton with a public access method getInstance(). Thus all calls to the CIM communication service have to be done through:")]),t._v(" "),e("p",[e("code",[t._v("CIMPortManager.getInstance()")])]),t._v(" "),e("p",[t._v("Upon creation the CIMPortManager detects all the connected CIMs and registers them in a HashMap. CIMs are identified and stored by the combination of their CIM Id and their unique number. Therefore multiple CIMs of the same CIM Id can be used on the AsTeRICS platform.")]),t._v(" "),e("p",[t._v("On some computers there exist certain serial ports which do not work correctly and behave strangely. An example of such a port is a loopback port which echoes everything written to it or ports created by Bluetooth dongles. Since the CIMPortManager iterates through all serial ports, these ports can cause problems in the auto detection of attached CIMs and even lock up the runtime. Therefore a file "),e("em",[t._v("ignore_ports.txt")]),t._v(" in the directory "),e("em",[t._v("data/cimcommunication")]),t._v(" is parsed upon start of the auto detection. This file should be filled with the name of the COM ports behaving erratically one name per line.")]),t._v(" "),e("p",[t._v("To be able to communicate with a CIM, the CIM port manager provides several methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" uniqueNumber"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("These methods return a CIMPortController (read on for details) instance of the requested CIM. The method using two parameters will return the instance to the port controller which works with the CIM of the exact CIM ID and unique number. If the CIM cannot be found, null will be returned.")]),t._v(" "),e("p",[t._v("Requesting a connection without naming a unique number will return the first port controller connected to a CIM of the correct ID found in the HashMap holding all the port controllers.")]),t._v(" "),e("p",[t._v("Sending data to the connected peripheral can be done in several ways using the following methods of CIMPortManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" cimId"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMUniqueIdentifier")]),t._v(" cuid"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendPacket")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" ctrl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" featureAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" requestCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" crc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Basically these three methods do the same thing, however they do it at different speeds as the first two methods will look up the port controller that the packet should be sent to. Again the method taking only the CIM ID as a parameter will look up the first correct port controller. The third method which is passed the CIMPortController instance returned on getConnection() is the fastest method and should be used whenever possible.")]),t._v(" "),e("p",[t._v("Sending a CIM packet is done by providing the feature address and request code for a certain packet. The feature addresses and request codes can be found in the CIM protocol specification and the basic addresses and requests are also provided as static fields in the CIMProtocolPacket class. If data has to be attached to a CIM protocol packet a byte array holding said data has to be passed to the method, otherwise the data parameter of the method has to be set to null. The caller can also decide whether a CRC checksum should be added to the packet although this is currently unimplemented.")]),t._v(" "),e("h2",{attrs:{id:"cimeventhandler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimeventhandler"}},[t._v("#")]),t._v(" CIMEventHandler")]),t._v(" "),e("p",[t._v("Receiving a packet is done through use of the CIMEventHandler interface. This interface should be implemented by plugins that wish to communicate with CIMs (or raw ports). The interface contains two methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("handlePacketError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMEvent")]),t._v(" e"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("These methods are called upon correct reception of a packet or upon discovery of an error (timeout of a reply, packet transmission errors, incorrect order of incoming packets …) respectively by the port controller.")]),t._v(" "),e("p",[t._v("Upon correct reception of a CIM protocol based packet the method handlePacketReceived() is called with an instance of CIMEventPacketReceived as parameter. After conversion of the CIMEvent to this class, the packet can be extracted from the event and processed further.")]),t._v(" "),e("p",[t._v("All detected errors lead to a call of handlePacketError() with an appropriate CIMEvent implementation. The possible implemenations are:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("CIMEventErrorPacketFault: holds information to error in packet and the broken packet itself")])]),t._v(" "),e("li",[e("p",[t._v("CIMEventErrorPacketLost: holds information on serial number of lost packet")])])]),t._v(" "),e("p",[t._v("To register the event handler with a specific CIM port controller, the CIMPortController class exposes the following methods:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("addEventHandler(CIMEventHandler hdlr)")])]),t._v(" "),e("li",[e("p",[t._v("removeEventHandler(CIMEventHandler hdlr)")])])]),t._v(" "),e("p",[t._v("A port controller can handle multiple attached event handlers and remove each one separately.")]),t._v(" "),e("h2",{attrs:{id:"cimprotocolpacket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cimprotocolpacket"}},[t._v("#")]),t._v(" CIMProtocolPacket")]),t._v(" "),e("p",[t._v("This class holds all the information given in a packet transferred to or from a CIM. There are two ways the developer has to use this class. Upon sending packets the sending component has to set the feature address and the request code. The CIMProtocolPacket class provides the constants as static field to facilitate setting commands.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x00")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_FEATURE_LIST")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x01")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_WRITE_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_READ_FEATURE")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x11")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_EVENT_REPLY")]),t._v(" \t\t\t "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_RESET_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x80")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_START_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x81")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REQUEST_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COMMAND_REPLY_STOP_CIM")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0x82")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Furthermore the class contains constants for the global features that every CIM has to provide.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FEATURE_UNIQUE_SERIAL_NUMBER")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Upon reception of an incoming packet the component associated with the CIM sending the packet is notified and a reference to the packet is passed as an instance of CIMProtocolPacket wrapped in a CIMEvent instance. The developer can access all the fields of the packet via the getter methods the class provides:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAreCimID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSerialNumber")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFeatureAddress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("short")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequestReplyCode")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getCrc")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-ports-not-adhering-to-cim-protocol-raw-ports"}},[t._v("#")]),t._v(" Serial ports not adhering to CIM Protocol (Raw Ports)")]),t._v(" "),e("p",[t._v("Some peripherals use a proprietary protocol to transfer their data. If this is the case the user can open a raw port through the CIMPortManager method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will open the port with the name specified in the parameter portName and set the communication to the specified Baud rate.")]),t._v(" "),e("p",[t._v("Data can be sent to peripheral using the sendPacket() method for the returned CIMPortController. The packet will simply transfer the byte array passed in the data parameter and ignore the values giving the in the other parameter fields.")]),t._v(" "),e("p",[t._v("Received data will be forwarded to the event handler through calls to handlePacketReceived() with a CIMEventRawPacket as parameter. This class holds a public member variable b which holds the value of the received byte. The event handler has to handle the reconstruction of the proprietary packet itself.")]),t._v(" "),e("p",[e("strong",[t._v("HighSpeed Raw Ports:")])]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortController")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" baudRate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" highSpeed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("A second variant opf the getRawConnection method allows specification of a “highSpeed” parameter. If highSpeed is true, the CIMPortController does not apply any connection handling or callbacks for received data to avoid performance problems in higher bandwidth streaming use cases. In this case, the CIMPortController can return the JAVA InputStream for the openend COM port connection and the plug developer can use it as desired:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("portController "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CIMPortManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInstance")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRawConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COM12")]),t._v("”"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("115200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" portController"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputStream")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("available")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" myHandlePacket "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" in"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h2",{attrs:{id:"communication-through-a-socket-interface-remote-connection-manager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#communication-through-a-socket-interface-remote-connection-manager"}},[t._v("#")]),t._v(" Communication through a socket interface: Remote Connection Manager")]),t._v(" "),e("p",[t._v("When using third party software that runs on the same platform (as for example the prominently used On Screen Keyboard Application OSKA), it becomes necessary to establish a communication between ARE and the third party application. This is managed by the RemoteConnectionManager found in the package eu.asterics.mw.services. The main interface to this manager are the classes RemoteConnectionManager and IRemoteConnectionListener.")]),t._v(" "),e("h2",{attrs:{id:"iremoteconnectionlistener"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#iremoteconnectionlistener"}},[t._v("#")]),t._v(" IRemoteConnectionListener")]),t._v(" "),e("p",[t._v("This interface is implemented by plugins that need to communicate via a socket communication. The interface contains the following methods:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[t._v("\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionEstablished")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("dataReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionLost")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connectionClosed")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("connectionEstablished() is called whenever a plugin requests a connection and the connection has been established. This can either happen if a connection has already been established before or if the new connection has finished its setup and connection process.")]),t._v(" "),e("p",[t._v("dataReceived() is called whenever new data arrives from the other end of the connection. Data is transferred in a byte array and has to be processed by the event listener.")]),t._v(" "),e("p",[t._v("connectionLost() is called when the connection management cannot read from or write to the socket.")]),t._v(" "),e("p",[t._v("connectionClosed() is called after the connection has been closed.")]),t._v(" "),e("h2",{attrs:{id:"remoteconnectionmanager"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#remoteconnectionmanager"}},[t._v("#")]),t._v(" RemoteConnectionManager")]),t._v(" "),e("p",[t._v("The RemoteConnectionManager is implemented as a singleton and can be accessed via a public static member of the class. Thus access is always achieved through:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RemoteConnectionManager")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance\n")])])]),e("p",[t._v("A connection is opened by calling the RemoteConnectionManager’s method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" requestConnection "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRemoteConnectionListener")]),t._v(" l"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This call will try to access a connection on the specified port. Although the port is actually an integer it is passed as a String here. The method will return true if a connection on this port has already been established and attach the remote connection listener passed in the second argument to the connection. If there is no active connection on the specified port, the requestConnection method will initiate the setup of the connection and return false. With this return value the user can decide whether he needs to perform setup actions or will be able to do this in the connectionEstablished() callback.")]),t._v(" "),e("p",[t._v("The socket connection handling is implemented using two threads, one for sending, one for receiving data. The receiver thread will continuously read data from the socket and forward it to the registered listener calling the dataReceived() method. Since incoming data is handled in another thread than the plugin which will use the socket connection, access to the methods handling this data or the way of passing data should be done in a synchronised code block.")]),t._v(" "),e("p",[t._v("Sending data is done calling the method sendData of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is called using a String holding the port number of the connection socket and an array of bytes to be sent. The call to this method will place the data in an outgoing queue and return true if this was successful. Thus it is not guaranteed that the data has already been sent when the method returns. The sender thread will grab data from the outgoing queue and transfer it via the socket or call the connectionLost() method of the registered listener if there are problems while sending.")]),t._v(" "),e("p",[t._v("Once the connection to a socket is not needed anymore, the user has to close the connection, calling the following method of RemoteConnectionManager:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("closeConnection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" port"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This will close the socket connection, end all threads and return.")]),t._v(" "),e("h2",{attrs:{id:"local-storage-service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#local-storage-service"}},[t._v("#")]),t._v(" Local Storage Service")]),t._v(" "),e("p",[t._v("If a model needs to save its own calibration data, training data or other private data that can be different in every model and every instance, the local storage service provides a method to save different data to the same file name on a per plugin instance per model basis.")]),t._v(" "),e("p",[t._v("The service uses a directory tree structure that is placed in the directory the OSGi is run from. Data is saved in a directory called “storage”. In this directory, directories for every model name of a model that uses at least one plugin that accesses local storage can be found. In the third directory layer, directories with the plugin instance name of every plugin that accesses local storage can be found. Thus if a model named “timertest” uses a plugin instance named “timer1” that saves local data this data can be found at the path location “storage/timertest/timer1”.")]),t._v(" "),e("p",[t._v("The service practically consists of only one method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLocalStorageFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fileName"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method located in the AREServices class will return a File object pointing to the requested file name or null if the file could not be opened or the model name could not be retrieved. After opening the file the standard JAVA ways to manipulate files apply.")]),t._v(" "),e("h2",{attrs:{id:"keyboard-mouse-native-hook-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-mouse-native-hook-services"}},[t._v("#")]),t._v(" Keyboard/Mouse Native Hook Services")]),t._v(" "),e("p",[t._v("The AsTeRICS service jnativehook (if enabled) provides access to the library "),e("a",{attrs:{href:"https://github.com/kwhat/jnativehook",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/kwhat/jnativehook"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Additionally, the service contains the singleton NativeHookServices that initializes the library to be usable in plugins. A plugin that wants to be a keaboard/mouse listener only has to add the listener to the GlobalScreen instance of the library.")]),t._v(" "),e("h2",{attrs:{id:"computer-vision-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#computer-vision-services"}},[t._v("#")]),t._v(" Computer Vision Services")]),t._v(" "),e("p",[t._v("The AsTeRICS services javacv and computervision (if enabled) provide access to the library "),e("a",{attrs:{href:"https://github.com/bytedeco/javacv",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/bytedeco/javacv"),e("OutboundLink")],1),t._v(", which again provides access to numerous libs in the field of computer vision (e.g. OpenCV), frame grabbing and frame rendering. Additionally, some helper classes are provided for face detection.")]),t._v(" "),e("h2",{attrs:{id:"data-conversion-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-conversion-utilities"}},[t._v("#")]),t._v(" Data Conversion Utilities")]),t._v(" "),e("p",[t._v("The middleware provides the class “ConversionUtils” that provide static helper methods to convert model data types to byte arrays and vice versa. The conversion is needed to convert incoming data of input ports or outgoing data to output ports. There are methods for each type of conversion. If two connected ports (output to input) have different data types the data is automatically converted to the data type of the input port.")]),t._v(" "),e("p",[t._v("Check the class ConversionUtils for a full list of supported methods: "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/data/ConversionUtils.java"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"fetching-resource-uris-with-resourceregistry-class"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fetching-resource-uris-with-resourceregistry-class"}},[t._v("#")]),t._v(" Fetching resource URIs with ResourceRegistry class")]),t._v(" "),e("p",[t._v("If a plugin needs resources like data files (images, keyboard files, haarcascade definitions,…), the class "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE/middleware/src/main/java/eu/asterics/mw/services/ResourceRegistry.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("ResourceRegistry"),e("OutboundLink")],1),t._v(" must be used to fetch the resource URI.")]),t._v(" "),e("p",[t._v("This can be done by using the method:")]),t._v(" "),e("p",[e("code",[t._v("public URI getResource(String resourcePath, RES_TYPE type) throws URISyntaxException")])]),t._v(" "),e("p",[t._v("Returns the URI according to the given resourcePath string and the given resource type RES_TYPE.")]),t._v(" "),e("p",[t._v("Please refer to the Javadoc of the class and to the "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/Fetching-resources-with-class-ResourceRegistry",target:"_blank",rel:"noopener noreferrer"}},[t._v("wiki page"),e("OutboundLink")],1),t._v(" for further examples.")]),t._v(" "),e("h2",{attrs:{id:"error-reporting-astericserrorhandling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-astericserrorhandling"}},[t._v("#")]),t._v(" Error Reporting (AstericsErrorHandling)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("AstericsErrorHandling")]),t._v(" provides a unified logging and error reporting mechanism. It contains methods for reporting an error of a component or even the ARE.")]),t._v(" "),e("h3",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),e("p",[t._v("The Logging support provides a uniform way of error reporting in the runtime environment so we have utilized the Java logging libraries and the various severity levels supported. The AsTeRICS error handling mechanism is used extensively from the runtime core classes but also utilized by the AsTeRICS components via the AstericsErrorHandling interface.")]),t._v(" "),e("p",[t._v("Each component is allowed to report an error message, a debug information or a simple information to be displayed on the screen. The ARE maintains four separate log files and updates them whenever a new error occurs. In particular there are different loggers for reporting severe errors, warnings, fine errors and one logger that contains them all.")]),t._v(" "),e("p",[t._v("ARE also maintains a status object for the current status of the runtime environment. Whenever a fatal error occurs (either internally or caused by one of the deployed components) the status changes to fatal error. Other possible statuses are unknown, OK, deployed, running and paused.")]),t._v(" "),e("p",[t._v("The ACS can request the current status of the runtime environment and update its own state accordingly. For example the ACS user can be informed about the current ARE status while the ACS will terminate a connection (or refuse to establish a new one) with a non-working ARE.")]),t._v(" "),e("p",[t._v("Using a Logger is the recommended way to report notifications or error descriptions to the user. In the ARE framework, using the Java logging service is recommended. The Java logger can be configured using the file “logging.properties” (see section 2.3.3.1) and used as follows:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("…"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsErrorHandling")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"error-reporting-of-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-reporting-of-components"}},[t._v("#")]),t._v(" Error Reporting of components")]),t._v(" "),e("p",[t._v("If a component wants to notify an error it should use the following method:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_warning.log” file. Additionally the status of the component is set to error with the given error message and an error dialog is shown in the ARE gui, if enabled.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportInfo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeComponentInstance")]),t._v(" component"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" info"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The messages will be written in the “asterics_logger_fine.log” file.")]),t._v(" "),e("h3",{attrs:{id:"status-checking"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#status-checking"}},[t._v("#")]),t._v(" Status checking")]),t._v(" "),e("p",[t._v("The status checking mechanism is responsible for recording the current status of the ARE or the error state of a component. The status is recorded by creating and storing objects called "),e("em",[t._v("statusObjects")]),t._v(". A statusObject stores the status of its creator as a string, its creator (the ARE or the specific component) and the error message.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" status"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" errorMsg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The status of the ARE can be one of the following strings:")]),t._v(" "),e("p",[t._v("UNKNOWN: initial state for the ARE")]),t._v(" "),e("p",[t._v("OK: ARE is running and ready to deploy a model")]),t._v(" "),e("p",[t._v("DEPLOYED: A model has been deployed and the ARE is now ready to run the model")]),t._v(" "),e("p",[t._v("RUNNING: A model is running on the ARE")]),t._v(" "),e("p",[t._v("PAUSED: A model has been deployed and the ARE is in paused mode")]),t._v(" "),e("p",[t._v("ERROR: An error occurred")]),t._v(" "),e("p",[t._v("FATAL_ERROR: A fatal error occurred, model or deployment aborted")]),t._v(" "),e("p",[t._v("The status of a component can only be the ERROR state because this is the only state of a component that we are interested in recording for later use. An ERROR statusObject is automatically created when a component calls the reportError method as described above.")]),t._v(" "),e("p",[t._v("For retrieving the statusObjects, the following method is used:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusObject")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("queryStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" fullList"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This method is particularly useful for the ACS to determine the current status of the runtime environment and of the deployed components. If the ARE or one of the components are in a problematic state it can be reflected in the ACS.")]),t._v(" "),e("p",[t._v("The boolean "),e("em",[t._v("fullList")]),t._v(" argument specifies whether the error list to be returned will include all statusObjects generated since the ARE startup or just those that have not been requested by the ACS before.")]),t._v(" "),e("h2",{attrs:{id:"the-are-thread-pool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-thread-pool"}},[t._v("#")]),t._v(" The ARE Thread Pool")]),t._v(" "),e("p",[t._v("In order to avoid resource greedy threads and to achieve best thread handling, ARE uses one of the Thread Pool implementations provided by Java since JRE 1.5. In particular, we have utilized the java.util.concurrent.Executors library for creating a CachedThreadPool.")]),t._v(" "),e("p",[t._v("A cached thread pool will create threads as needed but will reuse previously instantiated threads when they are available and inactive. A cached thread pool is particularly useful for many short-lived asynchronous tasks and improves the performance of the runtime environment.")]),t._v(" "),e("p",[t._v("Developers are expected to use the ARE thread pool for executing their tasks that require a new Thread. You will need to import the middleware services package in order to get access to the "),e("strong",[t._v("AstericsThreadPool")]),t._v(" class.")]),t._v(" "),e("h2",{attrs:{id:"the-are-gui-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-are-gui-support"}},[t._v("#")]),t._v(" The ARE GUI support")]),t._v(" "),e("p",[t._v("The ARE provides a panel area (“ARE Desktop”) where plugins can display their graphical elements using the ARE GUI support classes. The ACS provides a dedicated canvas editor that allows end users positioning and resizing graphical elements of the plugins. Based on this information, the ARE displays plugins on the local device, maintaining the correct screen position and aspect ratio of graphical elements with respect to the screen resolution of the deployment device. (For more information about the usage of the ACS GUI editor and the ARE GUI control panel refer to the User Manual.)")]),t._v(" "),e("p",[e("img",{attrs:{src:a(294),alt:""}})]),t._v(" "),e("p",[e("strong",[t._v("GUI composition using the ACS GUI designer (right), resulting ARE GUI (left)")])]),t._v(" "),e("p",[t._v("In order to be recognized as GUI-plugin by ACS and ARE, the bundle descriptor of the plugin has to be extended with a dedicated "),e("code",[t._v("")]),t._v(" entry, which specifies the default size in a virtual coordinate system of 10000/10000 pixels. In the deployment model, the ACS will create position and size information according to the area defined in the ACS GUI designer.")]),t._v(" "),e("div",{staticClass:"language-xml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[t._v(" "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("gui")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("width")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("5000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("height")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3000"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[e("strong",[t._v("The gui element addition to the bundle descriptor")])]),t._v(" "),e("p",[t._v("The AsTeRICS middleware provides some services to the plugin developers in order to allow them displaying their GUI element onto the ARE Desktop. The middleware services encapsulate the complexity of dealing with positioning and allow displaying all GUI elements onto the same container: the ARE Desktop.")]),t._v(" "),e("p",[t._v("All GUI services are defined in eu.asterics.mw.services.AREServices so developers need to import this class in order to get access to the following methods:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void displayPanel (JPanel panel, IRuntimeComponentInstance componentInstance, boolean display)")])])]),t._v(" "),e("p",[t._v("This method is used for displaying (or hiding) a plugin’s panel at/from the ARE desktop. Developers need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("the panel they want to be displayed (or removed)")])]),t._v(" "),e("li",[e("p",[t._v("the plugin object, in order to help the middleware finding the desired position and dimensions from the deployment model")])]),t._v(" "),e("li",[e("p",[t._v("a boolean argument specifying if they wish to hide or show the given panel.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("Dimension getAvailableSpace(IRuntimeComponentInstance componentInstance)")])])])]),t._v(" "),e("p",[t._v("The space that each plugin will occupy on the ARE desktop is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the available space for their graphical elements by calling the getAvailableSpace method which will return the space occupied for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Point getComponentPosition (IRuntimeComponentInstance componentInstance)")])])]),t._v(" "),e("p",[t._v("The positioning of plugin’s GUI elements is defined by the designer on the ACS and passed to the ARE via ASAPI. Plugin developers can get the position of their graphical elements by calling the getComponentPosition which will return the position on screen for the plugin object passed as argument.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void adjustFonts(JPanel panel, int maxFontSize, int minFontSize, int offset)")])])]),t._v(" "),e("p",[t._v("This service can be used by plugin developers interested in auto-adjusting the fonts of their GUI components depending on the space occupied for their plugins on the ARE desktop. They need to pass")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("a panel to which all the internal fonts will be auto-adjusted")])]),t._v(" "),e("li",[e("p",[t._v("the maximum font size (in case there is more space available than needed)")])]),t._v(" "),e("li",[e("p",[t._v("the minimum font size, in case there is too little space which causes the text to become non-readable. Finally, the offset argument is used in case we want to occupy a percentage of the available space.")])])]),t._v(" "),e("p",[t._v("A good approach to GUI plugin development is to analyse existing plugins which provide GUI elements, e.g. the BarDisplay or Oscilloscope actuators, or the Slider or Cellboard sensor components.")]),t._v(" "),e("p",[t._v("If the plugin uses "),e("strong",[t._v("Swing to implement a GUI-widget")]),t._v(" (e.g. Slider,…), please check the following guidelines as well 4.2.8")]),t._v(" "),e("h2",{attrs:{id:"are-core-events-notification-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-core-events-notification-services"}},[t._v("#")]),t._v(" ARE core events notification services")]),t._v(" "),e("p",[t._v("The ARE core events notification service allows plugins to register/unregister to the ARE middleware in order to receive notifications of ARE core events.")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("void registerAREEventListener(IAREEventListener clazz)")])])]),t._v(" "),e("p",[t._v("It is sometimes necessary that plugins can be notified of various ARE events so they can react as needed. This method can be called by component instances that wish to be notified of such ARE events. Currently, the core events supported are:")]),t._v(" "),e("ul",[e("li",[e("p",[e("em",[t._v("preDeployModel:")]),t._v(" registered ARE event listeners will be notified just before the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postDeployModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployment of a model.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStartModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStartModel:")]),t._v(" registered ARE event listeners will be notified immediately after the currently deployed model has been started.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preStopModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postStopModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been stopped.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("prePauseModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postPauseModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been paused.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preResumeModel:")]),t._v(" registered ARE event listeners will be notified just before the currently deployed model is resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postResumeModel:")]),t._v(" registered ARE event listeners will be notified immediately after the deployed model has been resumed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("preBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified just before the bundles are is installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("postBundlesInstalled:")]),t._v(" registered ARE event listeners will be notified immediately after the bundles have been installed.")])]),t._v(" "),e("li",[e("p",[e("em",[t._v("void unregisterAREEventListener(IAREEventListener clazz)")])])])]),t._v(" "),e("p",[t._v("Plugins already registered for receiving ARE core events can un-register using this method.")]),t._v(" "),e("h2",{attrs:{id:"dynamic-properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-properties"}},[t._v("#")]),t._v(" Dynamic Properties")]),t._v(" "),e("p",[t._v("In some applications, the ACS should be able to provide several options for property values which are not known in advance but depend on the current state of the ARE (see AsTeRUCS User Manual, section “Dynamic Properties”)… A typical example is the selection of a file which is available in the ARE file system (e.g. a .wav-file for the wave player plugin). This feature is particularly useful for plugins that are hardware dependent (selecting e.g. a soundcard or a midi player), or depend on the file system.")]),t._v(" "),e("p",[t._v("If a plugin is implementing a dynamic property, the values will be requested from the ARE, as soon as the ACS is synchronized with the ARE, via the ASAPI function:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRuntimePropertyList")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" componentID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])]),e("p",[t._v("The ARE middleware will forward the request for valid property values to the component instance with the given ID. The "),e("code",[t._v("List getRuntimePropertyList(String key)")]),t._v(" method has to be implemented in the "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" class which every AsTeRICS component extends.\nThe method implementation creates the list of valid properties and returns it to the middleware and the latter forwards the string list to the ACS via ASAPI. The ACS will dynamically update the property list in the properties window.")]),t._v(" "),e("p",[t._v("For an example of the dynamic property implementation, see the WaveFilePlayer plugin.")]),t._v(" "),e("h2",{attrs:{id:"data-synchronization"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-synchronization"}},[t._v("#")]),t._v(" Data Synchronization")]),t._v(" "),e("p",[t._v("Some plugins need data of multiple input ports to be able to start processing. Without data synchronization it is possible that one input port of a plugin receives multiple values before another port gets one value, although both signal channels deliver values at the same sampling rate.")]),t._v(" "),e("p",[t._v("The synchronization service provides a buffering mechanism at the middleware level that can be utilized by plugin developers in order to make sure that incoming data of selected input ports arrives synchronized.")]),t._v(" "),e("p",[t._v("To use the synchronization service in the plugin code, plugin developers are expected to extend the "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" instead of implementing the "),e("em",[t._v("IRuntimeInputPort.")]),t._v(" Basically, "),e("em",[t._v("DefaultRuntimeInputPort")]),t._v(" provides a default implementation for the necessary buffering methods, as shown in the table below.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DefaultRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("receiveData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" startBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" stopBuffering "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbstractRuntimeComponentInstance")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n\t\t\t"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" portID"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" isBuffered "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("buffering"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("The designer can define that a plugin’s input port should be synchronized with some other input ports via the ACS. This will cause an argument change of the inputPort element on the deployment model file (e.g.,"),e("code",[t._v('')]),t._v(").")]),t._v(" "),e("p",[t._v("As soon as a model is deployed on the ARE, the middleware collects per component every port noted as synchronized port. When the model is successfully deployed and started, the ARE will buffer data which enters synchronized input ports until data on all synchronized ports has arrived. At that point, the ARE will call a new "),e("em",[t._v("AbstractRuntimeComponentInstance")]),t._v(" callback method.")]),t._v(" "),e("p",[t._v("Developers that wish to support data synchronization need to implement the following method at their component instances.")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncedValuesReceived")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" dataRow"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Where dataRow is a HashMap between Input Port ID and byte[]. For synchronized input ports, instead of implementing the regular "),e("em",[t._v("void receiveData(byte[] data)")]),t._v(" method which delivers incoming data of a single port, developers need to implement the "),e("em",[t._v("syncedValuesReceived")]),t._v(" method which will be called from the ARE with synchronized data from all the input ports that have been selected.")]),t._v(" "),e("h2",{attrs:{id:"interfacing-native-c-c-code-via-jni"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#interfacing-native-c-c-code-via-jni"}},[t._v("#")]),t._v(" Interfacing Native C/C++ Code via JNI")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("## Specifying native libraries in the Manifest\n")])])]),e("p",[t._v("The Manifest file of a bundle which includes native libraries has to specify these .dlls as shown in the following example:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("Manifest-Version: 1.0\nBundle-ManifestVersion: 2\nBundle-Name: asterics-sensors.mycomponent\nBundle-SymbolicName: org.asterics.mycomponent\nBundle-Version: 0.1.0\nBundle-NativeCode: lib/native/mylib1.dll;\n lib/native/mylib2.dll;\n lib/native/mylib3.dll;\n osname=win32;processor=x86;\n osname=win;processor=x86-64;\n osname=win8;processor=x86;\n osname=win8;processor=x86-64;\n osname=windows 8;processor=x86;\n osname=windows 8;processor=x86-64;\n osname=windows8;processor=x86;\n osname=windows8;processor=x86-64;\n osname=Windows 8.1;processor=x86;\n osname=Windows 8.1;processor=x86-64\nDynamicImport-Package: *\n")])])]),e("p",[t._v("Components which interface native code via JNI and their respective manifest files can be found in the SVN, e.g. the “webcamera” component or the signal processing plugins by Starlab.")]),t._v(" "),e("p",[t._v("Note that the .jar containing the .dlls can be built manually using the command:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("jar "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-cvfm")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/mybundle.jar META-INF/MANIFEST.MF "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n")])])]),e("h2",{attrs:{id:"java-implementation-jni-bridge"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java-implementation-jni-bridge"}},[t._v("#")]),t._v(" Java-Implementation: JNI-Bridge")]),t._v(" "),e("p",[t._v("The recommended way to interface Java code of an ARE component with native code in a .dll is a bridge class which encapsulates the JNI functions and callbacks and maps the functions of the ARE component’s lifecycle-, port- and property-management to the corresponding functions in the native code. Here is a simple example which comprises one component property and receives data callbacks from a thread implemented in C. The received values are transferred to the component’s output port:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jni")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("asterics"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mycomponent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("logging"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Statically load the native library */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib1.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib2.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadLibrary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mylib3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// loads mylib3.dll ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" logger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAnonymousLogger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bridge")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyComponentInstance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OutputPort")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("my_outport "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Activates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("activate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Deactivates the underlying native code/hardware.\n *\n * @return 0 if everything was OK, a negative number otherwise\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("deactivate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Gets the value of the named property.\n *\n * @param key the name of the property to be accessed\n * @return the value of the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Sets the named property to the defined value.\n *\n * @param key the name of the property to be accessed\n * @param value the value to be assigned to the named property\n * @return the value previously assigned to the named property\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("native")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setProperty")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code on demand to signify \n * an internal error. The first argument corresponds to an error code \n * and the second argument corresponds to a textual description \n * of the error.\n * @param errorCode an error code\n * @param message a textual description of the error\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorReport_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" errorCode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n logger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("severe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorCode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('": "')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * This method is called back from the native code to send data\n * to the component’s output port.\n *\n * @param data1 (range is [0, Short.MAX_VALUE])\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("newData_callback")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n my_outport"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"c-implementation-callbacks-and-jni-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#c-implementation-callbacks-and-jni-code"}},[t._v("#")]),t._v(" C-Implementation: Callbacks and JNI code")]),t._v(" "),e("p",[t._v("The native C-code needs to be compiled into a .dll and include the JNI header files and libraries. An example for the Microsoft Visual Studio compiler looks as follows:")]),t._v(" "),e("p",[t._v("The following C-example shows how to implement a JNI-callback from a C-thread and an ARE-compliant exchange of a component property:")]),t._v(" "),e("div",{staticClass:"language-c extra-class"},[e("pre",{pre:!0,attrs:{class:"language-c"}},[e("code",[e("span",{pre:!0,attrs:{class:"token macro property"}},[e("span",{pre:!0,attrs:{class:"token directive-hash"}},[t._v("#")]),e("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("")])]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" JavaVM "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" jobject g_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myProperty"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" propertyValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_activate")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\terror_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetJavaVM")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("g_jvm"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tjclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newData_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// explicitly ask for a global reference")]),t._v("\n\tg_obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_init")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jint JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_deactivate")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tjint error_code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("my_c_thread_exit")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tenv"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeleteGlobalRef")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" error_code"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_getProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\t\t\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nJNIEXPORT jstring JNICALL "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Java_org_asterics_jni_Bridge_setProperty")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobject obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jstring value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tjstring result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown*/")]),t._v("\n\t strKey "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* OutOfMemoryError already thrown */")]),t._v("\n\t strValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("strcmp")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NewStringUTF")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tpollingIntervalValue "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* property was not found */")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReleaseStringUTFChars")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strValue"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prepare JNI callback")]),t._v("\n JNIEnv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n g_jvm"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("AttachCurrentThread")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("env"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("NULL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jclass cls "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectClass")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("g_obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jmethodID mid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMethodID")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cls"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newCoordinates_callback"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(IIII)V"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// perform JNI callback")]),t._v("\n env"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("CallVoidMethod")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("my_new_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("This native C-code needs to be compiled into a .dll, the JNI header files and libraries have to be specified to the compiler and linker respectively. An example for the Microsoft Visual Studio build tools looks as follows:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('cl -c -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include" -I "C:\\Program Files (x86)\\java\\jdk1.6.0_21\\include\\win32" -I ".\\3rdparylib" my_c_file.cpp /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue \nlink my_c_file.obj /DLL /OUT:".\\my_c_file.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"libmsvc" /LIBPATH:"3rdparylib" "odbc32.lib" "odbccp32.lib" "comctl32.lib" "winmm.lib" "opengl32.lib" "ole32.lib" "strmiids.lib" "uuid.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "oleaut32.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"atlthunk" /NODEFAULTLIB:"LIBCMT" /MANIFESTUAC:"level=\'asInvoker\' uiAccess=\'false\'" /DEBUG /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:QUEUE\n')])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The compiler and linker switches may differ depending on the nature of your dependency libraries and setup.")])]),t._v(" "),e("h2",{attrs:{id:"asterics-packaging-environment-ape"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#asterics-packaging-environment-ape"}},[t._v("#")]),t._v(" AsTeRICS Packaging Environment (APE)")]),t._v(" "),e("p",[t._v("The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using "),e("a",{attrs:{href:"http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGIBBCI",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaFX packaging technology"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("See "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/wiki/AsTeRICS-Packaging-Environment-(APE)",target:"_blank",rel:"noopener noreferrer"}},[t._v("APE documentation"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/239.61d9e6b9.js b/assets/js/240.71117bdc.js similarity index 92% rename from assets/js/239.61d9e6b9.js rename to assets/js/240.71117bdc.js index 2c8b6e9132..8b3cc8fa3b 100644 --- a/assets/js/239.61d9e6b9.js +++ b/assets/js/240.71117bdc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[239],{1197:function(t,r,n){"use strict";n.r(r);var e=n(2),i=Object(e.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"frontmatter-title"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),r("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),r("p",[t._v("Adds the preString and postString strings to the incoming string and sends the new string to the output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:n(762),alt:"Screenshot: StringExpander plugin",title:"Screenshot: StringExpander plugin"}})]),t._v(" "),r("p",[t._v("StringExpander plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input [string]:")]),t._v(" String input port.")]),t._v(" "),r("li",[r("strong",[t._v("preString [string]:")]),t._v(" String which will be placed before the input string (as leading string).")]),t._v(" "),r("li",[r("strong",[t._v("postString [string]:")]),t._v(" String which will be placed after the input string (as trailing string).")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("p",[r("strong",[t._v("preString [string]:")]),t._v(" default leading String.")])]),t._v(" "),r("li",[r("p",[r("strong",[t._v("postString [string]:")]),t._v(" default trailing String.")])]),t._v(" "),r("li",[r("p",[r("strong",[t._v("trim [boolean]:")]),t._v(" if selected, all leading and trailing white-space characters will be removed from the input string.")])])])])}),[],!1,null,null,null);r.default=i.exports},762:function(t,r,n){t.exports=n.p+"assets/img/stringexpander.35b2aef0.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[240],{1202:function(t,r,n){"use strict";n.r(r);var e=n(2),i=Object(e.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"frontmatter-title"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),r("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),r("p",[t._v("Adds the preString and postString strings to the incoming string and sends the new string to the output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:n(765),alt:"Screenshot: StringExpander plugin",title:"Screenshot: StringExpander plugin"}})]),t._v(" "),r("p",[t._v("StringExpander plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input [string]:")]),t._v(" String input port.")]),t._v(" "),r("li",[r("strong",[t._v("preString [string]:")]),t._v(" String which will be placed before the input string (as leading string).")]),t._v(" "),r("li",[r("strong",[t._v("postString [string]:")]),t._v(" String which will be placed after the input string (as trailing string).")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("p",[r("strong",[t._v("preString [string]:")]),t._v(" default leading String.")])]),t._v(" "),r("li",[r("p",[r("strong",[t._v("postString [string]:")]),t._v(" default trailing String.")])]),t._v(" "),r("li",[r("p",[r("strong",[t._v("trim [boolean]:")]),t._v(" if selected, all leading and trailing white-space characters will be removed from the input string.")])])])])}),[],!1,null,null,null);r.default=i.exports},765:function(t,r,n){t.exports=n.p+"assets/img/stringexpander.35b2aef0.jpg"}}]); \ No newline at end of file diff --git a/assets/js/240.60e6ac38.js b/assets/js/241.58692ba9.js similarity index 92% rename from assets/js/240.60e6ac38.js rename to assets/js/241.58692ba9.js index e1976b6d58..e89add9a0c 100644 --- a/assets/js/240.60e6ac38.js +++ b/assets/js/241.58692ba9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[240],{1200:function(t,e,r){"use strict";r.r(e);var s=r(2),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("Applies a given filter text to the incoming string. It can be selected if only strings that contain the filter text are passed to the output port, and/or if the filter text shall be removed from the incoming string. Please note that the filter text is applied case sensitive.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(763),alt:"Screenshot: StringFilter plugin",title:"Screenshot: StringFilter plugin"}})]),t._v(" "),e("p",[t._v("StringFilter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [string]:")]),t._v(" String input port.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [string]:")]),t._v(" String output port for processed/filtered string.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("filterText [string]:")]),t._v(" The filter text.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passOnlyIfContains [boolean]:")]),t._v(" If selected, only strings containing the filter text will be passed.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("cropFilterText [boolean]:")]),t._v(" If selected, the filter will be removed before the input string is passed to the output port.")])])])])}),[],!1,null,null,null);e.default=i.exports},763:function(t,e,r){t.exports=r.p+"assets/img/stringfilter.e949de40.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[241],{1203:function(t,e,r){"use strict";r.r(e);var s=r(2),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("Applies a given filter text to the incoming string. It can be selected if only strings that contain the filter text are passed to the output port, and/or if the filter text shall be removed from the incoming string. Please note that the filter text is applied case sensitive.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(766),alt:"Screenshot: StringFilter plugin",title:"Screenshot: StringFilter plugin"}})]),t._v(" "),e("p",[t._v("StringFilter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [string]:")]),t._v(" String input port.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out [string]:")]),t._v(" String output port for processed/filtered string.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("filterText [string]:")]),t._v(" The filter text.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passOnlyIfContains [boolean]:")]),t._v(" If selected, only strings containing the filter text will be passed.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("cropFilterText [boolean]:")]),t._v(" If selected, the filter will be removed before the input string is passed to the output port.")])])])])}),[],!1,null,null,null);e.default=i.exports},766:function(t,e,r){t.exports=r.p+"assets/img/stringfilter.e949de40.jpg"}}]); \ No newline at end of file diff --git a/assets/js/241.e3a32749.js b/assets/js/242.b169a92a.js similarity index 93% rename from assets/js/241.e3a32749.js rename to assets/js/242.b169a92a.js index 85e954754d..3b2b082100 100644 --- a/assets/js/241.e3a32749.js +++ b/assets/js/242.b169a92a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[241],{1201:function(t,e,r){"use strict";r.r(e);var s=r(2),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The String Path Multiplexer component forwards strings from the selected input port to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(764),alt:"Screenshot: StringPathMultiplexer plugin",title:"Screenshot: StringPathMultiplexer plugin"}})]),t._v(" "),e("p",[t._v("StringPathMultiplexer plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1 to input4 [string]:")]),t._v(" The input ports for strings to be multiplexed.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v("[string]**")]),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("* The string output, which sends data of the selected input port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("passPort1 to passPort4:")]),t._v(" The string output, which sends data of the selected input port.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passNextPort:")]),t._v(" selets the next input port. If the currently used port is the maximum port (defined by the number property), input port 1 will be selected.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passPreviousPort:")]),t._v(" selects the previous input port. If the currently used port is port 1, the maximum port (defined by the number property) will be selected.")])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("number [integer]:")]),t._v(" The maximum port number (can be 1 to 4).")])])])}),[],!1,null,null,null);e.default=i.exports},764:function(t,e,r){t.exports=r.p+"assets/img/stringpathmultiplexer.cefdc2b2.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[242],{1205:function(t,e,r){"use strict";r.r(e);var s=r(2),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The String Path Multiplexer component forwards strings from the selected input port to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(767),alt:"Screenshot: StringPathMultiplexer plugin",title:"Screenshot: StringPathMultiplexer plugin"}})]),t._v(" "),e("p",[t._v("StringPathMultiplexer plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input1 to input4 [string]:")]),t._v(" The input ports for strings to be multiplexed.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" "),e("strong",[t._v("[string]**")]),e("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),t._v("* The string output, which sends data of the selected input port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("passPort1 to passPort4:")]),t._v(" The string output, which sends data of the selected input port.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passNextPort:")]),t._v(" selets the next input port. If the currently used port is the maximum port (defined by the number property), input port 1 will be selected.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("passPreviousPort:")]),t._v(" selects the previous input port. If the currently used port is port 1, the maximum port (defined by the number property) will be selected.")])])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("number [integer]:")]),t._v(" The maximum port number (can be 1 to 4).")])])])}),[],!1,null,null,null);e.default=i.exports},767:function(t,e,r){t.exports=r.p+"assets/img/stringpathmultiplexer.cefdc2b2.jpg"}}]); \ No newline at end of file diff --git a/assets/js/242.a1ab0c8c.js b/assets/js/243.03e56ba4.js similarity index 93% rename from assets/js/242.a1ab0c8c.js rename to assets/js/243.03e56ba4.js index b277c292fa..bc67be390d 100644 --- a/assets/js/242.a1ab0c8c.js +++ b/assets/js/243.03e56ba4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[242],{1202:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The StringPathSelector component allows routing of incoming strings between up to 4 output ports. The desired output port can be directly selected by a dedicated event listener port, or the strings can be switched to the next or previous output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(765),alt:"Screenshot: StringPathSelector plugin",title:"Screenshot: StringPathSelector plugin"}})]),t._v(" "),e("p",[t._v("StringPathSelector plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [string]:")]),t._v(" The incoming string port to be routed.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1 to out4:")]),t._v(" Four output ports where the incoming strings can be routed to.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("select1 to select4:")]),t._v(" An incoming event at these ports directly activates the associated output path (e.g. as an event comes in at select 3, the input string port will be routed to out3.")]),t._v(" "),e("li",[e("strong",[t._v("selectNext:")]),t._v(" The next output port is selected for string output. The maximum number of active ports is set via the activePorts property. If the current number is already the maximum one, the select next event will wrap around the active port number and port 1 will be selected.")]),t._v(" "),e("li",[e("strong",[t._v("selectPrevious:")]),t._v(" The previous output port is selected for string output. If the current port is out1, the maximum port number (given by the activePorts property) will be selected.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("activePorts [integer]:")]),t._v(" The maximum port number in use (can be 1 to 4).")])])])}),[],!1,null,null,null);e.default=s.exports},765:function(t,e,r){t.exports=r.p+"assets/img/stringpathselector.ab8e1a6f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[243],{1206:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Processor (Subcategory: Signal Pathways)")]),t._v(" "),e("p",[t._v("The StringPathSelector component allows routing of incoming strings between up to 4 output ports. The desired output port can be directly selected by a dedicated event listener port, or the strings can be switched to the next or previous output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(768),alt:"Screenshot: StringPathSelector plugin",title:"Screenshot: StringPathSelector plugin"}})]),t._v(" "),e("p",[t._v("StringPathSelector plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in [string]:")]),t._v(" The incoming string port to be routed.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("out1 to out4:")]),t._v(" Four output ports where the incoming strings can be routed to.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("select1 to select4:")]),t._v(" An incoming event at these ports directly activates the associated output path (e.g. as an event comes in at select 3, the input string port will be routed to out3.")]),t._v(" "),e("li",[e("strong",[t._v("selectNext:")]),t._v(" The next output port is selected for string output. The maximum number of active ports is set via the activePorts property. If the current number is already the maximum one, the select next event will wrap around the active port number and port 1 will be selected.")]),t._v(" "),e("li",[e("strong",[t._v("selectPrevious:")]),t._v(" The previous output port is selected for string output. If the current port is out1, the maximum port number (given by the activePorts property) will be selected.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("activePorts [integer]:")]),t._v(" The maximum port number in use (can be 1 to 4).")])])])}),[],!1,null,null,null);e.default=s.exports},768:function(t,e,r){t.exports=r.p+"assets/img/stringpathselector.ab8e1a6f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/243.4054c5a8.js b/assets/js/244.6e685ff0.js similarity index 93% rename from assets/js/243.4054c5a8.js rename to assets/js/244.6e685ff0.js index 90396d0f46..36d53454cc 100644 --- a/assets/js/243.4054c5a8.js +++ b/assets/js/244.6e685ff0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[243],{1203:function(t,e,r){"use strict";r.r(e);var s=r(2),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("Splits a string with separators in up to 16 outputports.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(766),alt:"Screenshot: StringSplitter plugin",title:"Screenshot: StringSplitter plugin"}})]),t._v(" "),e("p",[t._v("StringSplitter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" String input port. The string which has to be splitted.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output 1 to 16[string]:")]),t._v(" String output ports. Sending the seperated Data.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Seperator [string]:")]),t._v(" Defines the separator. The separator itself will not be part of the result strings. Please note that "),e("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum",target:"_blank",rel:"noopener noreferrer"}},[t._v("regular expressions"),e("OutboundLink")],1),t._v(" can be use for the separator. This also means that special characters for the regular expressions are not allowed in the separator string, unless they are introduced with the escape character (backslash). These special characters are: the backslash \\\\, the caret ^, the dollar sign $, the period or dot ., the vertical bar or pipe symbol |, the question mark ?, the asterisk or star *, the plus sign +, the opening parenthesis (, the closing parenthesis ), and the opening square bracket [, the opening curly brace {. For example: for using the dot as separator, use \\. as separator string.")])])])}),[],!1,null,null,null);e.default=a.exports},766:function(t,e,r){t.exports=r.p+"assets/img/stringsplitter.c64848ba.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[244],{1207:function(t,e,r){"use strict";r.r(e);var s=r(2),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("Splits a string with separators in up to 16 outputports.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(769),alt:"Screenshot: StringSplitter plugin",title:"Screenshot: StringSplitter plugin"}})]),t._v(" "),e("p",[t._v("StringSplitter plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("input [string]:")]),t._v(" String input port. The string which has to be splitted.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output 1 to 16[string]:")]),t._v(" String output ports. Sending the seperated Data.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Seperator [string]:")]),t._v(" Defines the separator. The separator itself will not be part of the result strings. Please note that "),e("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum",target:"_blank",rel:"noopener noreferrer"}},[t._v("regular expressions"),e("OutboundLink")],1),t._v(" can be use for the separator. This also means that special characters for the regular expressions are not allowed in the separator string, unless they are introduced with the escape character (backslash). These special characters are: the backslash \\\\, the caret ^, the dollar sign $, the period or dot ., the vertical bar or pipe symbol |, the question mark ?, the asterisk or star *, the plus sign +, the opening parenthesis (, the closing parenthesis ), and the opening square bracket [, the opening curly brace {. For example: for using the dot as separator, use \\. as separator string.")])])])}),[],!1,null,null,null);e.default=a.exports},769:function(t,e,r){t.exports=r.p+"assets/img/stringsplitter.c64848ba.png"}}]); \ No newline at end of file diff --git a/assets/js/244.ab449790.js b/assets/js/245.1ac3a5a1.js similarity index 87% rename from assets/js/244.ab449790.js rename to assets/js/245.1ac3a5a1.js index ea68babebc..28e358b5af 100644 --- a/assets/js/244.ab449790.js +++ b/assets/js/245.1ac3a5a1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[244],{1204:function(t,o,r){"use strict";r.r(o);var e=r(2),n=Object(e.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"string-to-double"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#string-to-double"}},[t._v("#")]),t._v(" String To Double")]),t._v(" "),o("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),o("p",[t._v("This component converts the incoming string values into the integer values at the output port.")]),t._v(" "),o("p",[o("img",{attrs:{src:r(767),alt:"Screenshot: StringToDouble plugin",title:"Screenshot: StringToDouble plugin"}})]),t._v(" "),o("p",[t._v("StringToDouble plugin")]),t._v(" "),o("h2",{attrs:{id:"input-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("input [string]:")]),t._v(" Input port for the string values to be converted.")])]),t._v(" "),o("h2",{attrs:{id:"output-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("output [double]:")]),t._v(" Output port for the converted double values.")])])])}),[],!1,null,null,null);o.default=n.exports},767:function(t,o,r){t.exports=r.p+"assets/img/stringtodouble.9dd0d127.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[245],{1208:function(t,o,r){"use strict";r.r(o);var e=r(2),n=Object(e.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"string-to-double"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#string-to-double"}},[t._v("#")]),t._v(" String To Double")]),t._v(" "),o("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),o("p",[t._v("This component converts the incoming string values into the integer values at the output port.")]),t._v(" "),o("p",[o("img",{attrs:{src:r(770),alt:"Screenshot: StringToDouble plugin",title:"Screenshot: StringToDouble plugin"}})]),t._v(" "),o("p",[t._v("StringToDouble plugin")]),t._v(" "),o("h2",{attrs:{id:"input-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("input [string]:")]),t._v(" Input port for the string values to be converted.")])]),t._v(" "),o("h2",{attrs:{id:"output-port-description"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),o("ul",[o("li",[o("strong",[t._v("output [double]:")]),t._v(" Output port for the converted double values.")])])])}),[],!1,null,null,null);o.default=n.exports},770:function(t,o,r){t.exports=r.p+"assets/img/stringtodouble.9dd0d127.jpg"}}]); \ No newline at end of file diff --git a/assets/js/245.cc84e67c.js b/assets/js/246.8f17c746.js similarity index 89% rename from assets/js/245.cc84e67c.js rename to assets/js/246.8f17c746.js index 3aaac52e58..b660b96de1 100644 --- a/assets/js/245.cc84e67c.js +++ b/assets/js/246.8f17c746.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[245],{1207:function(t,r,e){"use strict";e.r(r);var n=e(2),s=Object(n.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"string-to-int"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#string-to-int"}},[t._v("#")]),t._v(" String To Int")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),r("p",[t._v("This component converts the incoming string values into the integer values at the output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:e(770),alt:"Screenshot: StringToInt plugin",title:"Screenshot: StringToInt plugin"}})]),t._v(" "),r("p",[t._v("StringToInt plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input [string]:")]),t._v(" Input port for the string values to be converted.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [integer]:")]),t._v(" Output port for the converted integer values.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("hexadecimalInput [boolean]:")]),t._v(" If this property is set, the input string data are regarded as the hexadecimal data string.")])])])}),[],!1,null,null,null);r.default=s.exports},770:function(t,r,e){t.exports=e.p+"assets/img/stringtoint.3fa07379.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[246],{1210:function(t,r,e){"use strict";e.r(r);var n=e(2),s=Object(n.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"string-to-int"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#string-to-int"}},[t._v("#")]),t._v(" String To Int")]),t._v(" "),r("p",[t._v("Component Type: Processor (Subcategory: Data Converters)")]),t._v(" "),r("p",[t._v("This component converts the incoming string values into the integer values at the output port.")]),t._v(" "),r("p",[r("img",{attrs:{src:e(772),alt:"Screenshot: StringToInt plugin",title:"Screenshot: StringToInt plugin"}})]),t._v(" "),r("p",[t._v("StringToInt plugin")]),t._v(" "),r("h2",{attrs:{id:"input-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("input [string]:")]),t._v(" Input port for the string values to be converted.")])]),t._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("output [integer]:")]),t._v(" Output port for the converted integer values.")])]),t._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),r("ul",[r("li",[r("strong",[t._v("hexadecimalInput [boolean]:")]),t._v(" If this property is set, the input string data are regarded as the hexadecimal data string.")])])])}),[],!1,null,null,null);r.default=s.exports},772:function(t,r,e){t.exports=e.p+"assets/img/stringtoint.3fa07379.jpg"}}]); \ No newline at end of file diff --git a/assets/js/246.d37fd246.js b/assets/js/247.ea3c0519.js similarity index 91% rename from assets/js/246.d37fd246.js rename to assets/js/247.ea3c0519.js index 5dda4a72eb..63bb04280f 100644 --- a/assets/js/246.d37fd246.js +++ b/assets/js/247.ea3c0519.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[246],{1206:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"text-sender"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#text-sender"}},[t._v("#")]),t._v(" Text Sender")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component sends the string data through the output port when it receives the trigger event.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(769),alt:"Screenshot: TextSender plugin",title:"Screenshot: TextSender plugin"}})]),t._v(" "),e("p",[t._v("TextSender plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setText [string]:")]),t._v(" Updates the text with the incoming string.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sendText:")]),t._v(" This event causes text to be sent.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("text [string]:")]),t._v(" The default text to be sent.")])])])}),[],!1,null,null,null);e.default=n.exports},769:function(t,e,r){t.exports=r.p+"assets/img/textsender.7fb85a38.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[247],{1209:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"text-sender"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#text-sender"}},[t._v("#")]),t._v(" Text Sender")]),t._v(" "),e("h2",{attrs:{id:"component-type-processor-subcategory-event-and-string-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-event-and-string-processing"}},[t._v("#")]),t._v(" Component Type: Processor (Subcategory: Event and String Processing)")]),t._v(" "),e("p",[t._v("This component sends the string data through the output port when it receives the trigger event.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(771),alt:"Screenshot: TextSender plugin",title:"Screenshot: TextSender plugin"}})]),t._v(" "),e("p",[t._v("TextSender plugin")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("setText [string]:")]),t._v(" Updates the text with the incoming string.")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("sendText:")]),t._v(" This event causes text to be sent.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("text [string]:")]),t._v(" The default text to be sent.")])])])}),[],!1,null,null,null);e.default=n.exports},771:function(t,e,r){t.exports=r.p+"assets/img/textsender.7fb85a38.jpg"}}]); \ No newline at end of file diff --git a/assets/js/247.b801c51d.js b/assets/js/248.d0258422.js similarity index 96% rename from assets/js/247.b801c51d.js rename to assets/js/248.d0258422.js index 28e00d9734..dbe9cb5f90 100644 --- a/assets/js/247.b801c51d.js +++ b/assets/js/248.d0258422.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[247],{1205:function(e,t,o){"use strict";o.r(t);var s=o(2),h=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"threshold"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#threshold"}},[e._v("#")]),e._v(" Threshold")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Basic Math)")]),e._v(" "),t("p",[e._v("This component takes an input and compares it to a given threshold and generates an according output value dependent on the operation mode. The component allows three operation modes: binary, deadzone and cut off which are described in the property section. The component allows operating with a hysteresis by setting the thresholds for transition from below to above and vice versa differently. Transitions over the thresholds are always evaluated arithmetically thus a below threshold to above transition always happens when the new value is mathematically greater than the threshold while the last input was less than threshold. Respectively the transition from above to below happens when the last value was greater than the threshold value and the new value is less than it. This statement also holds for negative values in the threshold."),t("br"),e._v("\nThe component provides the possibility to raise events on threshold transitions either on below to above, above to below or on both.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(768),alt:"Screenshot: Threshold plugin",title:"Screenshot: Threshold plugin"}})]),e._v(" "),t("p",[e._v("Threshold plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in [double]:")]),e._v(" the input to be evaluated.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("out[double]:")]),e._v(" the value that the threshold passes on for the given input.")])]),e._v(" "),t("h2",{attrs:{id:"event-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-port-description"}},[e._v("#")]),e._v(" Event Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventPosEdge:")]),e._v(" This event port will trigger an event when the value crosses the thresholdHigh property from below.")]),e._v(" "),t("li",[t("strong",[e._v("eventNegEdge:")]),e._v(" This event port will trigger an event when the value crosses the thresholdLow property from above.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("thresholdHigh [double]:")]),e._v(" The threshold that is checked for transitions from below the threshold to above.")]),e._v(" "),t("li",[t("strong",[e._v("thresholdLow [double]:")]),e._v(" The threshold that is checked for transitions from above the threshold to below. Setting it to the same value as threshold_high will remove the hysteresis from the threshold system.")]),e._v(" "),t("li",[t("strong",[e._v("outputHigh [double]:")]),e._v(" The value to be sent to the output if the input is above the threshold in certain operation modes.")]),e._v(" "),t("li",[t("strong",[e._v("outputLow [double]:")]),e._v(" The value to be sent to the output if the input is below the threshold in certain operation modes (see below).")]),e._v(" "),t("li",[t("strong",[e._v("operationMode [integer]:")]),e._v(" There are three operation modes for the threshold component:\n"),t("ul",[t("li",[t("em",[e._v("binary:")]),e._v(" the output will only generate two different values, the value of output_high if the input is in the range above the threshold and the value of output_low if the input is below the threshold.")]),e._v(" "),t("li",[t("em",[e._v("cutoff:")]),e._v(" the input value will be passed through to the output as long as the value is below the threshold. If the input passes the threshold the output will take on the value set in output_high.v")]),e._v(" "),t("li",[t("em",[e._v("deadzone:")]),e._v(" the input value will be passed through to the output as long as the value is above the threshold. If the input falls below the threshold the output will take on the value set in output_low.")])])]),e._v(" "),t("li",[t("strong",[e._v("eventCondition [integer]:")]),e._v(" This property declares on which types of transitions an event will be raised:\n"),t("ul",[t("li",[t("em",[e._v("Below->above:")]),e._v(" only transitions from below to above threshold raise events.")]),e._v(" "),t("li",[t("em",[e._v("Above->below:")]),e._v(" only transitions from above to below threshold raise events.")]),e._v(" "),t("li",[t("em",[e._v("Both:")]),e._v(" both types of transitions raise events.")])])])])])}),[],!1,null,null,null);t.default=h.exports},768:function(e,t,o){e.exports=o.p+"assets/img/threshold.5ccba1f1.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[248],{1212:function(e,t,o){"use strict";o.r(t);var s=o(2),h=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"threshold"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#threshold"}},[e._v("#")]),e._v(" Threshold")]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Basic Math)")]),e._v(" "),t("p",[e._v("This component takes an input and compares it to a given threshold and generates an according output value dependent on the operation mode. The component allows three operation modes: binary, deadzone and cut off which are described in the property section. The component allows operating with a hysteresis by setting the thresholds for transition from below to above and vice versa differently. Transitions over the thresholds are always evaluated arithmetically thus a below threshold to above transition always happens when the new value is mathematically greater than the threshold while the last input was less than threshold. Respectively the transition from above to below happens when the last value was greater than the threshold value and the new value is less than it. This statement also holds for negative values in the threshold."),t("br"),e._v("\nThe component provides the possibility to raise events on threshold transitions either on below to above, above to below or on both.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(773),alt:"Screenshot: Threshold plugin",title:"Screenshot: Threshold plugin"}})]),e._v(" "),t("p",[e._v("Threshold plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in [double]:")]),e._v(" the input to be evaluated.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("out[double]:")]),e._v(" the value that the threshold passes on for the given input.")])]),e._v(" "),t("h2",{attrs:{id:"event-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-port-description"}},[e._v("#")]),e._v(" Event Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("eventPosEdge:")]),e._v(" This event port will trigger an event when the value crosses the thresholdHigh property from below.")]),e._v(" "),t("li",[t("strong",[e._v("eventNegEdge:")]),e._v(" This event port will trigger an event when the value crosses the thresholdLow property from above.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("thresholdHigh [double]:")]),e._v(" The threshold that is checked for transitions from below the threshold to above.")]),e._v(" "),t("li",[t("strong",[e._v("thresholdLow [double]:")]),e._v(" The threshold that is checked for transitions from above the threshold to below. Setting it to the same value as threshold_high will remove the hysteresis from the threshold system.")]),e._v(" "),t("li",[t("strong",[e._v("outputHigh [double]:")]),e._v(" The value to be sent to the output if the input is above the threshold in certain operation modes.")]),e._v(" "),t("li",[t("strong",[e._v("outputLow [double]:")]),e._v(" The value to be sent to the output if the input is below the threshold in certain operation modes (see below).")]),e._v(" "),t("li",[t("strong",[e._v("operationMode [integer]:")]),e._v(" There are three operation modes for the threshold component:\n"),t("ul",[t("li",[t("em",[e._v("binary:")]),e._v(" the output will only generate two different values, the value of output_high if the input is in the range above the threshold and the value of output_low if the input is below the threshold.")]),e._v(" "),t("li",[t("em",[e._v("cutoff:")]),e._v(" the input value will be passed through to the output as long as the value is below the threshold. If the input passes the threshold the output will take on the value set in output_high.v")]),e._v(" "),t("li",[t("em",[e._v("deadzone:")]),e._v(" the input value will be passed through to the output as long as the value is above the threshold. If the input falls below the threshold the output will take on the value set in output_low.")])])]),e._v(" "),t("li",[t("strong",[e._v("eventCondition [integer]:")]),e._v(" This property declares on which types of transitions an event will be raised:\n"),t("ul",[t("li",[t("em",[e._v("Below->above:")]),e._v(" only transitions from below to above threshold raise events.")]),e._v(" "),t("li",[t("em",[e._v("Above->below:")]),e._v(" only transitions from above to below threshold raise events.")]),e._v(" "),t("li",[t("em",[e._v("Both:")]),e._v(" both types of transitions raise events.")])])])])])}),[],!1,null,null,null);t.default=h.exports},773:function(e,t,o){e.exports=o.p+"assets/img/threshold.5ccba1f1.jpg"}}]); \ No newline at end of file diff --git a/assets/js/248.c8761c95.js b/assets/js/249.6a6b73c1.js similarity index 96% rename from assets/js/248.c8761c95.js rename to assets/js/249.6a6b73c1.js index e20d8b2b65..5710a65a9a 100644 --- a/assets/js/248.c8761c95.js +++ b/assets/js/249.6a6b73c1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[248],{1208:function(e,t,a){"use strict";a.r(t);var o=a(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Microcontroller Interface)")]),e._v(" "),t("p",[e._v("The Universal Remote Control (RC) enables the possibility to control all electronic devices in a household which are controlled remotely through infrared (IR) commands. THe necessary IR codes can be recorded with the RC itself and stored on a database on the computer. By choosing the manufacturer, name and function the IR code is deposed in this database and can be selected in order to send the code to the universal RC and therefore control electronic devices. The universal RC can also be used as a handheld gadget due to its built in battery and user interface. THe IR code database can be stored on an SD card.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(771),alt:"Screenshot: UniversalRemoteControl plugin",title:"Screenshot: Universal Remote Control plugin"}})]),e._v(" "),t("p",[e._v("The Universal Remote Control sensor plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("For the use of the universal RC with a computer, it has to be be connected to a USB port. The firmware of the universal RC can be found in the AsTeRICS folder under /CIMs/UniversalInfraredRemoteControl/. A database will be automatically generated if there is not found one. For the usage of the universal RC as a handheld gadget, the SD card has to be formatted as a FAT16 volume and contain a database as well as the configuration file.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("DeviceType [string]:")]),e._v(" Type of the device to be controlled via IR (e.g.: TV)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceName [string]:")]),e._v(" Name of the device to be controlled via IR (e.g.: Sony, Samsung, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceFunction [string]:")]),e._v(" Name of function of the device (e.g.: On, Off, VolumeUp, etc.)")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("SendIRCode:")]),e._v(" Send an IR Code to the Universal Remote Control")]),e._v(" "),t("li",[t("strong",[e._v("RecordIRCode:")]),e._v(" Record an IR Code through the Universal Remote Control")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("StartRecord:")]),e._v(" will be triggered when Universal Remote Control is recording")]),e._v(" "),t("li",[t("strong",[e._v("StopRecord:")]),e._v(" will be triggered when Universal Remote Control has finished recording")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("IRCodeFilePath [string]:")]),e._v(" Filepath to the file, where the IR Codes are stored.")])]),e._v(" "),t("h2",{attrs:{id:"ir-code-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ir-code-database"}},[e._v("#")]),e._v(" IR Code Database")]),e._v(" "),t("p",[e._v("The database which contains the IR codes as well as the information about the type and name of the device and the specific function is a comma separated value file. The first value is the type, the second one is the name and the third one is the function. The following 512 values are the IR code. This database is automatically generated and maintained if new IR codes are recorded with the Universal Remote Control with IR functions.")]),e._v(" "),t("h2",{attrs:{id:"configuration-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration-file"}},[e._v("#")]),e._v(" Configuration File")]),e._v(" "),t("p",[e._v("The settings of the universal RC can be stored in the config.csv file. This is a comma separated value file and contains configurations such as the speed and sensibility of the rotary encoder and external buttons as well as the name of the file that contains the IR codes. The content of the default config.csv file is:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("\t\tJoystickSpeed,120\n\t\tJoystickSensibility,3\n\t\tFile,IRCODES.CSV\n\t\tSort,2\n")])])])])}),[],!1,null,null,null);t.default=r.exports},771:function(e,t,a){e.exports=a.p+"assets/img/universalremotecontrol.c9a71d59.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[249],{1214:function(e,t,a){"use strict";a.r(t);var o=a(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Processor (Subcategory: Microcontroller Interface)")]),e._v(" "),t("p",[e._v("The Universal Remote Control (RC) enables the possibility to control all electronic devices in a household which are controlled remotely through infrared (IR) commands. THe necessary IR codes can be recorded with the RC itself and stored on a database on the computer. By choosing the manufacturer, name and function the IR code is deposed in this database and can be selected in order to send the code to the universal RC and therefore control electronic devices. The universal RC can also be used as a handheld gadget due to its built in battery and user interface. THe IR code database can be stored on an SD card.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(774),alt:"Screenshot: UniversalRemoteControl plugin",title:"Screenshot: Universal Remote Control plugin"}})]),e._v(" "),t("p",[e._v("The Universal Remote Control sensor plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("For the use of the universal RC with a computer, it has to be be connected to a USB port. The firmware of the universal RC can be found in the AsTeRICS folder under /CIMs/UniversalInfraredRemoteControl/. A database will be automatically generated if there is not found one. For the usage of the universal RC as a handheld gadget, the SD card has to be formatted as a FAT16 volume and contain a database as well as the configuration file.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("DeviceType [string]:")]),e._v(" Type of the device to be controlled via IR (e.g.: TV)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceName [string]:")]),e._v(" Name of the device to be controlled via IR (e.g.: Sony, Samsung, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceFunction [string]:")]),e._v(" Name of function of the device (e.g.: On, Off, VolumeUp, etc.)")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("SendIRCode:")]),e._v(" Send an IR Code to the Universal Remote Control")]),e._v(" "),t("li",[t("strong",[e._v("RecordIRCode:")]),e._v(" Record an IR Code through the Universal Remote Control")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("StartRecord:")]),e._v(" will be triggered when Universal Remote Control is recording")]),e._v(" "),t("li",[t("strong",[e._v("StopRecord:")]),e._v(" will be triggered when Universal Remote Control has finished recording")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("IRCodeFilePath [string]:")]),e._v(" Filepath to the file, where the IR Codes are stored.")])]),e._v(" "),t("h2",{attrs:{id:"ir-code-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ir-code-database"}},[e._v("#")]),e._v(" IR Code Database")]),e._v(" "),t("p",[e._v("The database which contains the IR codes as well as the information about the type and name of the device and the specific function is a comma separated value file. The first value is the type, the second one is the name and the third one is the function. The following 512 values are the IR code. This database is automatically generated and maintained if new IR codes are recorded with the Universal Remote Control with IR functions.")]),e._v(" "),t("h2",{attrs:{id:"configuration-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration-file"}},[e._v("#")]),e._v(" Configuration File")]),e._v(" "),t("p",[e._v("The settings of the universal RC can be stored in the config.csv file. This is a comma separated value file and contains configurations such as the speed and sensibility of the rotary encoder and external buttons as well as the name of the file that contains the IR codes. The content of the default config.csv file is:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("\t\tJoystickSpeed,120\n\t\tJoystickSensibility,3\n\t\tFile,IRCODES.CSV\n\t\tSort,2\n")])])])])}),[],!1,null,null,null);t.default=r.exports},774:function(e,t,a){e.exports=a.p+"assets/img/universalremotecontrol.c9a71d59.png"}}]); \ No newline at end of file diff --git a/assets/js/25.873d628d.js b/assets/js/25.4765299b.js similarity index 99% rename from assets/js/25.873d628d.js rename to assets/js/25.4765299b.js index 287e3fa67f..8e29df5cb4 100644 --- a/assets/js/25.873d628d.js +++ b/assets/js/25.4765299b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{296:function(e,t){e.exports="data:image/png;base64,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"},297:function(e,t){e.exports="data:image/png;base64,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"},298:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_33ee9963708d1fff.70ac87d7.png"},299:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_f830b9b181946728.4be74a14.png"},300:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_d5be58f6ea0f5f1.b4ff3013.png"},301:function(e,t,a){e.exports=a.p+"assets/img/eclipse-ant-buildtarget.a52616ed.png"},945:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"development-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#development-environment"}},[e._v("#")]),e._v(" Development Environment")]),e._v(" "),t("h2",{attrs:{id:"repository-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#repository-overview"}},[e._v("#")]),e._v(" Repository Overview")]),e._v(" "),t("p",[e._v("The source code repository is organised in the following subfolders:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(296),alt:""}})]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ACS")])]),e._v(" folder contains the AsTeRICS Configuration Suite source code.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Android")])]),e._v(" folder contains a server application for Android phones which allows interfacing with the AsTeRICS Android plugin to use phone functions in AsTeRICS models.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ARE")])]),e._v(" folder contains the middleware and service layers and ARE components.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("bin")])]),e._v(" folder contains subfolders where ARE and ACS executable files are placed during the build flow. These folders contain additional configuration files or dependencies, for example the config.ini and loader.ini files which specify the modules which are loaded by the ARE at startup.")]),e._v(" "),t("p",[e._v("Additionally, the bin folder contains several resources which are useful, e.g. a pre-built ACS with demo models (in the ACS\\models folder) and the OSKA application.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("BNCIevaluationSuite")])]),e._v(" is a collection of matlab files for analysis and comparison of algorithms for Brain Computer Interfaces (contributed by Starlab).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("CIM")])]),e._v(" folder contains firmware for the microcontroller modules used to interface the system to the environment (maintained by IMA and FHTW).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Documentation")])]),e._v(" folder contains the User- and the Developer Manual, and OSKA manual and the licence information for the developed and all utilized source code and libraries.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("NativeASAPI")])]),e._v(" folder contains C++ libraries for mobile-phone and GSM modem access, 3d-mouse and tremor reduction from own C++ projects.")]),e._v(" "),t("h2",{attrs:{id:"clone-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-repository"}},[e._v("#")]),e._v(" Clone Repository")]),e._v(" "),t("p",[e._v("Install a "),t("a",{attrs:{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("git"),t("OutboundLink")],1),e._v(" command line client and clone the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS.git",target:"_blank",rel:"noopener noreferrer"}},[e._v("repository"),t("OutboundLink")],1),e._v(" by entering:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/asterics/AsTeRICS.git\n")])])]),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("You need:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java Development Kit 8"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"http://ant.apache.org/bindownload.cgi",target:"_blank",rel:"noopener noreferrer"}},[e._v("apache ant build framework (version >= 1.9.1)"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Set "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment Variables")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment Variables")]),e._v(" "),t("ul",[t("li",[e._v("Ensure to set "),t("code",[e._v("JAVA_HOME")]),e._v(" to the folder where you installed the Java JDK and add the JDK bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")]),e._v(" "),t("li",[e._v("Ensure to set "),t("code",[e._v("ANT_HOME")]),e._v(" to the folder where you installed ant and add the ant bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")])]),e._v(" "),t("p",[e._v("See below an example of how to set the environment variable "),t("code",[e._v("JAVA_HOME")]),e._v(" on Windows 7.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(297),alt:"Setting Environment Variable JAVA_HOME on Windows 7"}})]),e._v(" "),t("h2",{attrs:{id:"build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),t("p",[e._v("AsTeRICS uses the build system "),t("code",[e._v("ant")]),e._v(".\nYou can simply build the framework from the command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h3",{attrs:{id:"building-are-middleware-services-and-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#building-are-middleware-services-and-plugins"}},[e._v("#")]),e._v(" Building ARE Middleware, Services and Plugins")]),e._v(" "),t("p",[e._v("In the "),t("code",[e._v("ARE")]),e._v(" subfolder the source code of the ARE middleware ("),t("code",[e._v("ARE/middleware")]),e._v("), ARE services ("),t("code",[e._v("ARE/services")]),e._v(") and plugins ("),t("code",[e._v("ARE/components")]),e._v(") can be found.")]),e._v(" "),t("p",[e._v("The middleware, the services and the components have separate ant build files ("),t("code",[e._v("build.xml")]),e._v("). The middleware and services are required for building the plugins (components). To build everything, a top-level build script is available in the "),t("code",[e._v("ARE")]),e._v(" folder.\nAlternatively, individual services or components can be built by selecting their associated "),t("code",[e._v("build.xml")]),e._v(" script from the corresponding subfolders.")]),e._v(" "),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" the ARE (plugins, services), enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE with "),t("strong",[e._v("remote debugging enabled")]),e._v(", enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run-debug\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h2",{attrs:{id:"eclipse-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eclipse-setup"}},[e._v("#")]),e._v(" Eclipse Setup")]),e._v(" "),t("p",[e._v("The AsTeRICS framework is not bound to a specific IDE, but "),t("a",{attrs:{href:"https://www.eclipse.org/downloads/packages/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Eclipse IDE for Enterprise Java Developers"),t("OutboundLink")],1),e._v(" is recommended. This will provide editing support for diverse file types (java, html, Js, CSS, xml). Alternately you can install "),t("em",[e._v("Eclipse IDE for Java Developers")]),e._v(" and later install addons for web development.")]),e._v(" "),t("h3",{attrs:{id:"java-project"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#java-project"}},[e._v("#")]),e._v(" Java Project")]),e._v(" "),t("p",[e._v("You must create a "),t("code",[e._v("Java Project")]),e._v(" first:")]),e._v(" "),t("p",[e._v("Choose "),t("em",[e._v("File -> New -> JavaProject")]),e._v(" in the Eclipse main menu, disable the option "),t("em",[e._v("“Use default location”")]),e._v(" and browse to the "),t("em",[e._v("ARE")]),e._v(" subfolder:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(298),alt:""}})]),e._v(" "),t("p",[e._v("Then you should see something like this:\n"),t("img",{attrs:{src:a(299),alt:""}})]),e._v(" "),t("p",[e._v("Eclipse provides different views ("),t("em",[e._v("Window -> Show View")]),e._v("), where the "),t("em",[e._v("Navigator")]),e._v(" and the "),t("em",[e._v("Package Explorer")]),e._v(" are most useful for Java source code development.")]),e._v(" "),t("p",[e._v("Note that the “"),t("em",[e._v("Refresh")]),e._v("” command ("),t("em",[e._v("F5")]),e._v(") synchronizes the Navigator view with changes in the local file system.")]),e._v(" "),t("h3",{attrs:{id:"character-encoding"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#character-encoding"}},[e._v("#")]),e._v(" Character encoding")]),e._v(" "),t("p",[e._v("Incorrect character encoding settings can cause problems with ANT-based builds in eclipse, especially if special characters like ö, ä, etc. are used in the source code. Be sure to use ISO-8859-1 as character encoding in "),t("em",[e._v("Configuations and Lauch")]),e._v(" settings (in the "),t("em",[e._v("Common")]),e._v(" tab) as shown in the screenshot (note that this is not the default setting in some versions of eclipse):")]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:""}})]),e._v(" "),t("h3",{attrs:{id:"editing-model-files-windows-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-model-files-windows-only"}},[e._v("#")]),e._v(" Editing Model Files (windows-only)")]),e._v(" "),t("p",[e._v("You can configure the Eclipse editor to open the "),t("em",[e._v("ACS")]),e._v(" editor for AsTeRICS model files ("),t("code",[e._v(".acs")]),e._v(").")]),e._v(" "),t("ol",[t("li",[e._v("Right click on a model file, select "),t("code",[e._v("Open with/Other")])]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("External programs")]),e._v(" and browse to "),t("code",[e._v("C:\\Program Files (x86)\\AsTeRICS\\ACS\\ACS.bat")]),e._v(" (Note: "),t("strong",[e._v("ACS.bat")]),e._v(")")]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("Use it for all `*.acs file")])]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Ok")])])]),e._v(" "),t("h3",{attrs:{id:"ant-within-eclipse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ant-within-eclipse"}},[e._v("#")]),e._v(" Ant within Eclipse")]),e._v(" "),t("p",[e._v("You can run the "),t("em",[e._v("ant")]),e._v(" targets of the AsTeRICS build system from within Eclipse.")]),e._v(" "),t("h4",{attrs:{id:"run-default-target"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-default-target"}},[e._v("#")]),e._v(" Run default target")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build")]),e._v(" (first entry)")])]),e._v(" "),t("h4",{attrs:{id:"run-selected-targets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-selected-targets"}},[e._v("#")]),e._v(" Run selected targets")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build...")]),e._v(" (second entry)")]),e._v(" "),t("li",[e._v("Click onto targets to run")]),e._v(" "),t("li",[e._v("Select order of execution at the bottom")]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Apply")]),e._v(" and "),t("code",[e._v("Run")])])]),e._v(" "),t("p",[e._v("The screenshot below shows the dialog for build target selection:\n"),t("img",{attrs:{src:a(301),alt:"Screenshot of ant build target selection"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{296:function(e,t){e.exports="data:image/png;base64,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"},297:function(e,t){e.exports="data:image/png;base64,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"},298:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_33ee9963708d1fff.70ac87d7.png"},299:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_f830b9b181946728.4be74a14.png"},300:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_d5be58f6ea0f5f1.b4ff3013.png"},301:function(e,t,a){e.exports=a.p+"assets/img/eclipse-ant-buildtarget.a52616ed.png"},948:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"development-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#development-environment"}},[e._v("#")]),e._v(" Development Environment")]),e._v(" "),t("h2",{attrs:{id:"repository-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#repository-overview"}},[e._v("#")]),e._v(" Repository Overview")]),e._v(" "),t("p",[e._v("The source code repository is organised in the following subfolders:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(296),alt:""}})]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ACS")])]),e._v(" folder contains the AsTeRICS Configuration Suite source code.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Android")])]),e._v(" folder contains a server application for Android phones which allows interfacing with the AsTeRICS Android plugin to use phone functions in AsTeRICS models.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ARE")])]),e._v(" folder contains the middleware and service layers and ARE components.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("bin")])]),e._v(" folder contains subfolders where ARE and ACS executable files are placed during the build flow. These folders contain additional configuration files or dependencies, for example the config.ini and loader.ini files which specify the modules which are loaded by the ARE at startup.")]),e._v(" "),t("p",[e._v("Additionally, the bin folder contains several resources which are useful, e.g. a pre-built ACS with demo models (in the ACS\\models folder) and the OSKA application.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("BNCIevaluationSuite")])]),e._v(" is a collection of matlab files for analysis and comparison of algorithms for Brain Computer Interfaces (contributed by Starlab).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("CIM")])]),e._v(" folder contains firmware for the microcontroller modules used to interface the system to the environment (maintained by IMA and FHTW).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Documentation")])]),e._v(" folder contains the User- and the Developer Manual, and OSKA manual and the licence information for the developed and all utilized source code and libraries.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("NativeASAPI")])]),e._v(" folder contains C++ libraries for mobile-phone and GSM modem access, 3d-mouse and tremor reduction from own C++ projects.")]),e._v(" "),t("h2",{attrs:{id:"clone-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-repository"}},[e._v("#")]),e._v(" Clone Repository")]),e._v(" "),t("p",[e._v("Install a "),t("a",{attrs:{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("git"),t("OutboundLink")],1),e._v(" command line client and clone the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS.git",target:"_blank",rel:"noopener noreferrer"}},[e._v("repository"),t("OutboundLink")],1),e._v(" by entering:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/asterics/AsTeRICS.git\n")])])]),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("You need:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java Development Kit 8"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"http://ant.apache.org/bindownload.cgi",target:"_blank",rel:"noopener noreferrer"}},[e._v("apache ant build framework (version >= 1.9.1)"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Set "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment Variables")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment Variables")]),e._v(" "),t("ul",[t("li",[e._v("Ensure to set "),t("code",[e._v("JAVA_HOME")]),e._v(" to the folder where you installed the Java JDK and add the JDK bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")]),e._v(" "),t("li",[e._v("Ensure to set "),t("code",[e._v("ANT_HOME")]),e._v(" to the folder where you installed ant and add the ant bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")])]),e._v(" "),t("p",[e._v("See below an example of how to set the environment variable "),t("code",[e._v("JAVA_HOME")]),e._v(" on Windows 7.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(297),alt:"Setting Environment Variable JAVA_HOME on Windows 7"}})]),e._v(" "),t("h2",{attrs:{id:"build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),t("p",[e._v("AsTeRICS uses the build system "),t("code",[e._v("ant")]),e._v(".\nYou can simply build the framework from the command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h3",{attrs:{id:"building-are-middleware-services-and-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#building-are-middleware-services-and-plugins"}},[e._v("#")]),e._v(" Building ARE Middleware, Services and Plugins")]),e._v(" "),t("p",[e._v("In the "),t("code",[e._v("ARE")]),e._v(" subfolder the source code of the ARE middleware ("),t("code",[e._v("ARE/middleware")]),e._v("), ARE services ("),t("code",[e._v("ARE/services")]),e._v(") and plugins ("),t("code",[e._v("ARE/components")]),e._v(") can be found.")]),e._v(" "),t("p",[e._v("The middleware, the services and the components have separate ant build files ("),t("code",[e._v("build.xml")]),e._v("). The middleware and services are required for building the plugins (components). To build everything, a top-level build script is available in the "),t("code",[e._v("ARE")]),e._v(" folder.\nAlternatively, individual services or components can be built by selecting their associated "),t("code",[e._v("build.xml")]),e._v(" script from the corresponding subfolders.")]),e._v(" "),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" the ARE (plugins, services), enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE with "),t("strong",[e._v("remote debugging enabled")]),e._v(", enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run-debug\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h2",{attrs:{id:"eclipse-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eclipse-setup"}},[e._v("#")]),e._v(" Eclipse Setup")]),e._v(" "),t("p",[e._v("The AsTeRICS framework is not bound to a specific IDE, but "),t("a",{attrs:{href:"https://www.eclipse.org/downloads/packages/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Eclipse IDE for Enterprise Java Developers"),t("OutboundLink")],1),e._v(" is recommended. This will provide editing support for diverse file types (java, html, Js, CSS, xml). Alternately you can install "),t("em",[e._v("Eclipse IDE for Java Developers")]),e._v(" and later install addons for web development.")]),e._v(" "),t("h3",{attrs:{id:"java-project"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#java-project"}},[e._v("#")]),e._v(" Java Project")]),e._v(" "),t("p",[e._v("You must create a "),t("code",[e._v("Java Project")]),e._v(" first:")]),e._v(" "),t("p",[e._v("Choose "),t("em",[e._v("File -> New -> JavaProject")]),e._v(" in the Eclipse main menu, disable the option "),t("em",[e._v("“Use default location”")]),e._v(" and browse to the "),t("em",[e._v("ARE")]),e._v(" subfolder:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(298),alt:""}})]),e._v(" "),t("p",[e._v("Then you should see something like this:\n"),t("img",{attrs:{src:a(299),alt:""}})]),e._v(" "),t("p",[e._v("Eclipse provides different views ("),t("em",[e._v("Window -> Show View")]),e._v("), where the "),t("em",[e._v("Navigator")]),e._v(" and the "),t("em",[e._v("Package Explorer")]),e._v(" are most useful for Java source code development.")]),e._v(" "),t("p",[e._v("Note that the “"),t("em",[e._v("Refresh")]),e._v("” command ("),t("em",[e._v("F5")]),e._v(") synchronizes the Navigator view with changes in the local file system.")]),e._v(" "),t("h3",{attrs:{id:"character-encoding"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#character-encoding"}},[e._v("#")]),e._v(" Character encoding")]),e._v(" "),t("p",[e._v("Incorrect character encoding settings can cause problems with ANT-based builds in eclipse, especially if special characters like ö, ä, etc. are used in the source code. Be sure to use ISO-8859-1 as character encoding in "),t("em",[e._v("Configuations and Lauch")]),e._v(" settings (in the "),t("em",[e._v("Common")]),e._v(" tab) as shown in the screenshot (note that this is not the default setting in some versions of eclipse):")]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:""}})]),e._v(" "),t("h3",{attrs:{id:"editing-model-files-windows-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-model-files-windows-only"}},[e._v("#")]),e._v(" Editing Model Files (windows-only)")]),e._v(" "),t("p",[e._v("You can configure the Eclipse editor to open the "),t("em",[e._v("ACS")]),e._v(" editor for AsTeRICS model files ("),t("code",[e._v(".acs")]),e._v(").")]),e._v(" "),t("ol",[t("li",[e._v("Right click on a model file, select "),t("code",[e._v("Open with/Other")])]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("External programs")]),e._v(" and browse to "),t("code",[e._v("C:\\Program Files (x86)\\AsTeRICS\\ACS\\ACS.bat")]),e._v(" (Note: "),t("strong",[e._v("ACS.bat")]),e._v(")")]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("Use it for all `*.acs file")])]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Ok")])])]),e._v(" "),t("h3",{attrs:{id:"ant-within-eclipse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ant-within-eclipse"}},[e._v("#")]),e._v(" Ant within Eclipse")]),e._v(" "),t("p",[e._v("You can run the "),t("em",[e._v("ant")]),e._v(" targets of the AsTeRICS build system from within Eclipse.")]),e._v(" "),t("h4",{attrs:{id:"run-default-target"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-default-target"}},[e._v("#")]),e._v(" Run default target")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build")]),e._v(" (first entry)")])]),e._v(" "),t("h4",{attrs:{id:"run-selected-targets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-selected-targets"}},[e._v("#")]),e._v(" Run selected targets")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build...")]),e._v(" (second entry)")]),e._v(" "),t("li",[e._v("Click onto targets to run")]),e._v(" "),t("li",[e._v("Select order of execution at the bottom")]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Apply")]),e._v(" and "),t("code",[e._v("Run")])])]),e._v(" "),t("p",[e._v("The screenshot below shows the dialog for build target selection:\n"),t("img",{attrs:{src:a(301),alt:"Screenshot of ant build target selection"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/249.8d604bcc.js b/assets/js/250.340ee7ea.js similarity index 91% rename from assets/js/249.8d604bcc.js rename to assets/js/250.340ee7ea.js index ad90f479bc..82149fc31c 100644 --- a/assets/js/249.8d604bcc.js +++ b/assets/js/250.340ee7ea.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[249],{1211:function(e,t,a){"use strict";a.r(t);var r=a(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"yaak"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#yaak"}},[e._v("#")]),e._v(" Yaak")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-phone-interface"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-phone-interface"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Phone Interface)")]),e._v(" "),t("p",[e._v("Yaak is a flexible on-screen-keyboard for the Android operating system. More information can be found in the pdf documentation in the Android/Yaak folder within the release package.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(772),alt:"Yaak plugin in the ACS",title:"Yaak plugin in the ACS"}})]),e._v(" "),t("p",[e._v("Yaak plugin in the ACS")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("The Android based mobile device running Yaak must be connected to the AsTeRICS system over a TCP/IP connection and the used port must not be blocked by a firewall")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" gives the action string whenever a button of the keyboard gets triggered. The string for each button can be stored in the xml layout for the keyboards.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("hostname [string]:")]),e._v(" The hostname of the mobile device (IP or hostname is valid)")]),e._v(" "),t("li",[t("strong",[e._v("port [integer]:")]),e._v(" The port Yaak listens for incoming messages. This can be set in the xml file of a keyboard.")])])])}),[],!1,null,null,null);t.default=o.exports},772:function(e,t,a){e.exports=a.p+"assets/img/yaak.228d9dc7.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[250],{1215:function(e,t,a){"use strict";a.r(t);var r=a(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"yaak"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#yaak"}},[e._v("#")]),e._v(" Yaak")]),e._v(" "),t("h2",{attrs:{id:"component-type-processor-subcategory-phone-interface"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-processor-subcategory-phone-interface"}},[e._v("#")]),e._v(" Component Type: Processor (Subcategory: Phone Interface)")]),e._v(" "),t("p",[e._v("Yaak is a flexible on-screen-keyboard for the Android operating system. More information can be found in the pdf documentation in the Android/Yaak folder within the release package.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(775),alt:"Yaak plugin in the ACS",title:"Yaak plugin in the ACS"}})]),e._v(" "),t("p",[e._v("Yaak plugin in the ACS")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("The Android based mobile device running Yaak must be connected to the AsTeRICS system over a TCP/IP connection and the used port must not be blocked by a firewall")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("action [string]:")]),e._v(" gives the action string whenever a button of the keyboard gets triggered. The string for each button can be stored in the xml layout for the keyboards.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("hostname [string]:")]),e._v(" The hostname of the mobile device (IP or hostname is valid)")]),e._v(" "),t("li",[t("strong",[e._v("port [integer]:")]),e._v(" The port Yaak listens for incoming messages. This can be set in the xml file of a keyboard.")])])])}),[],!1,null,null,null);t.default=o.exports},775:function(e,t,a){e.exports=a.p+"assets/img/yaak.228d9dc7.png"}}]); \ No newline at end of file diff --git a/assets/js/250.0b7d9013.js b/assets/js/251.6b59ec3e.js similarity index 98% rename from assets/js/250.0b7d9013.js rename to assets/js/251.6b59ec3e.js index f548afe383..ee2f3e1aeb 100644 --- a/assets/js/250.0b7d9013.js +++ b/assets/js/251.6b59ec3e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[250],{1215:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"analog-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#analog-in"}},[e._v("#")]),e._v(" Analog In")]),e._v(" "),t("h3",{attrs:{id:"component-type-sensor-subcategory-generic-control-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-sensor-subcategory-generic-control-input"}},[e._v("#")]),e._v(" Component Type: Sensor (Subcategory: Generic Control Input)")]),e._v(" "),t("p",[e._v("The AnalogIn component is a sensor which is used in combination with the ADC CIM. The component provides two output ports which correlate to the inputs IN1 and IN2 of the CIM. The component can be set up to sample the inputs periodically or upon an incoming event. Both inputs can be used for voltage and resistance measurement.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(778),alt:"Screenshot: AnalogIn plugin",title:"Screenshot: AnalogIn plugin"}})]),e._v(" "),t("p",[e._v("AnalogIn plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an ADC CIM (CIM ID: 0x0901) connected to a USB port.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1 to in2 [integer]:")]),e._v(" Each of these output port corresponds to one input of the ADC CIM. The measured values are forwarded directly from the CIM thus corresponding to the description given in the CIM specification. Depending on the type of connected sensor the values either correspond to a voltage or a resistive value.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("adcSampleTrigger:")]),e._v(" An incoming event on this port will cause the ADC CIM to sample data on its inputs. This event will only take effect if the periodic_update property is set to 0.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("periodicUpdate [integer]:")]),e._v(" This property defines the time between data sampling requests to the ADC CIM (in milliseconds). The software component will send requests to the CIM in the given intervals. Due to current limitations of the ADC CIM it is recommended to use time intervals not lower than 50 milliseconds (20 samples per second).")]),e._v(" "),t("li",[t("strong",[e._v("activateInput1 to activateInput2 [Boolean]:")]),e._v(" These properties correspond the CIM’s ADC inputs IN1 to IN8, if the property is true, the corresponding output port of the software component will send the sampled data.")]),e._v(" "),t("li",[t("strong",[e._v("uniqueId:")]),e._v(" unique number of the CIM - if more than one CIMs of the same type are used. The module flashes a LED for identification when the ID is selected. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);t.default=s.exports},778:function(e,t,n){e.exports=n.p+"assets/img/analogin.1a43205a.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[251],{1217:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"analog-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#analog-in"}},[e._v("#")]),e._v(" Analog In")]),e._v(" "),t("h3",{attrs:{id:"component-type-sensor-subcategory-generic-control-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-sensor-subcategory-generic-control-input"}},[e._v("#")]),e._v(" Component Type: Sensor (Subcategory: Generic Control Input)")]),e._v(" "),t("p",[e._v("The AnalogIn component is a sensor which is used in combination with the ADC CIM. The component provides two output ports which correlate to the inputs IN1 and IN2 of the CIM. The component can be set up to sample the inputs periodically or upon an incoming event. Both inputs can be used for voltage and resistance measurement.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(778),alt:"Screenshot: AnalogIn plugin",title:"Screenshot: AnalogIn plugin"}})]),e._v(" "),t("p",[e._v("AnalogIn plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an ADC CIM (CIM ID: 0x0901) connected to a USB port.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1 to in2 [integer]:")]),e._v(" Each of these output port corresponds to one input of the ADC CIM. The measured values are forwarded directly from the CIM thus corresponding to the description given in the CIM specification. Depending on the type of connected sensor the values either correspond to a voltage or a resistive value.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("adcSampleTrigger:")]),e._v(" An incoming event on this port will cause the ADC CIM to sample data on its inputs. This event will only take effect if the periodic_update property is set to 0.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("periodicUpdate [integer]:")]),e._v(" This property defines the time between data sampling requests to the ADC CIM (in milliseconds). The software component will send requests to the CIM in the given intervals. Due to current limitations of the ADC CIM it is recommended to use time intervals not lower than 50 milliseconds (20 samples per second).")]),e._v(" "),t("li",[t("strong",[e._v("activateInput1 to activateInput2 [Boolean]:")]),e._v(" These properties correspond the CIM’s ADC inputs IN1 to IN8, if the property is true, the corresponding output port of the software component will send the sampled data.")]),e._v(" "),t("li",[t("strong",[e._v("uniqueId:")]),e._v(" unique number of the CIM - if more than one CIMs of the same type are used. The module flashes a LED for identification when the ID is selected. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);t.default=s.exports},778:function(e,t,n){e.exports=n.p+"assets/img/analogin.1a43205a.jpg"}}]); \ No newline at end of file diff --git a/assets/js/251.40127275.js b/assets/js/252.f00a49ef.js similarity index 86% rename from assets/js/251.40127275.js rename to assets/js/252.f00a49ef.js index f978fd2937..e057b19448 100644 --- a/assets/js/251.40127275.js +++ b/assets/js/252.f00a49ef.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[251],{1214:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Simulation)")]),t._v(" "),e("p",[t._v("The AutostartEvent component sends an event after model start, with a delay defined by the Delay property.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(777),alt:"Screenshot: AutostartEvent plugin",title:"Screenshot: AutostartEvent plugin"}})]),t._v(" "),e("p",[t._v("AutostartEvent plugin")]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" The output event.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Delay [integer]:")]),t._v(" The event delay[ms].")])])])}),[],!1,null,null,null);e.default=n.exports},777:function(t,e,r){t.exports=r.p+"assets/img/autostartevent.7ca8c939.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[252],{1218:function(t,e,r){"use strict";r.r(e);var s=r(2),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Simulation)")]),t._v(" "),e("p",[t._v("The AutostartEvent component sends an event after model start, with a delay defined by the Delay property.")]),t._v(" "),e("p",[e("img",{attrs:{src:r(779),alt:"Screenshot: AutostartEvent plugin",title:"Screenshot: AutostartEvent plugin"}})]),t._v(" "),e("p",[t._v("AutostartEvent plugin")]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output")]),t._v(" The output event.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Delay [integer]:")]),t._v(" The event delay[ms].")])])])}),[],!1,null,null,null);e.default=n.exports},779:function(t,e,r){t.exports=r.p+"assets/img/autostartevent.7ca8c939.jpg"}}]); \ No newline at end of file diff --git a/assets/js/252.368be8e1.js b/assets/js/253.9567c38e.js similarity index 94% rename from assets/js/252.368be8e1.js rename to assets/js/253.9567c38e.js index 2b32cc7eb4..76bc83033f 100644 --- a/assets/js/252.368be8e1.js +++ b/assets/js/253.9567c38e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[252],{1216:function(t,e,o){"use strict";o.r(e);var n=o(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("The Button Grid component is a simple GUI on-screen keyboard. It sends events after buttons have been pressed.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(779),alt:"Screenshot: ButtonGrid plugin",title:"Screenshot: ButtonGrid plugin"}})]),t._v(" "),e("p",[t._v("ButtonGrid plugin")]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("button1…button20:")]),t._v(" These events are fired as the corresponding buttons are pressed.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("caption [string]:")]),t._v(" The text shown on the component caption.")]),t._v(" "),e("li",[e("strong",[t._v("horizontalOrientation [boolean]:")]),t._v(" If selected, the keyboard will be placed horizontally, otherwise the keyboard will be placed vertically.")]),t._v(" "),e("li",[e("strong",[t._v("textColor [integer, combobox selection]:")]),t._v(" The color of the caption text (“default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("backgroundColor [integer, combobox selection]:")]),t._v(" The color of the button background (“default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("borderColor [integer, combobox selection]:")]),t._v(" The color of the button frame (“default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("borderThickness [integer]:")]),t._v(" The size of the button frame")]),t._v(" "),e("li",[e("strong",[t._v("selectionFrameColor [integer, combobox selection]:")]),t._v(" The color of the selection frame (active button, “default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("selectionFrameThickness [integer]:")]),t._v(" The size of the selection frame")]),t._v(" "),e("li",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")]),t._v(" "),e("li",[e("strong",[t._v("buttonCaption1…buttonCaption20 [string]:")]),t._v(" The text shown on the buttons:1…20. If the text is empty, the button will not be displayed at all.")]),t._v(" "),e("li",[e("strong",[t._v("toolTip1…toolTip20 [string]:")]),t._v(" The text shown as tooltip when the mouse hovers over a corresponding button. If the text is empty, no tooltip will be displayed.")])])])}),[],!1,null,null,null);e.default=r.exports},779:function(t,e,o){t.exports=o.p+"assets/img/buttongrid.5b8ad03c.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[253],{1220:function(t,e,o){"use strict";o.r(e);var n=o(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("The Button Grid component is a simple GUI on-screen keyboard. It sends events after buttons have been pressed.")]),t._v(" "),e("p",[e("img",{attrs:{src:o(782),alt:"Screenshot: ButtonGrid plugin",title:"Screenshot: ButtonGrid plugin"}})]),t._v(" "),e("p",[t._v("ButtonGrid plugin")]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("button1…button20:")]),t._v(" These events are fired as the corresponding buttons are pressed.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("caption [string]:")]),t._v(" The text shown on the component caption.")]),t._v(" "),e("li",[e("strong",[t._v("horizontalOrientation [boolean]:")]),t._v(" If selected, the keyboard will be placed horizontally, otherwise the keyboard will be placed vertically.")]),t._v(" "),e("li",[e("strong",[t._v("textColor [integer, combobox selection]:")]),t._v(" The color of the caption text (“default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("backgroundColor [integer, combobox selection]:")]),t._v(" The color of the button background (“default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("borderColor [integer, combobox selection]:")]),t._v(" The color of the button frame (“default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("borderThickness [integer]:")]),t._v(" The size of the button frame")]),t._v(" "),e("li",[e("strong",[t._v("selectionFrameColor [integer, combobox selection]:")]),t._v(" The color of the selection frame (active button, “default” keeps the standard setting)")]),t._v(" "),e("li",[e("strong",[t._v("selectionFrameThickness [integer]:")]),t._v(" The size of the selection frame")]),t._v(" "),e("li",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")]),t._v(" "),e("li",[e("strong",[t._v("buttonCaption1…buttonCaption20 [string]:")]),t._v(" The text shown on the buttons:1…20. If the text is empty, the button will not be displayed at all.")]),t._v(" "),e("li",[e("strong",[t._v("toolTip1…toolTip20 [string]:")]),t._v(" The text shown as tooltip when the mouse hovers over a corresponding button. If the text is empty, no tooltip will be displayed.")])])])}),[],!1,null,null,null);e.default=r.exports},782:function(t,e,o){t.exports=o.p+"assets/img/buttongrid.5b8ad03c.jpg"}}]); \ No newline at end of file diff --git a/assets/js/253.539c5bb6.js b/assets/js/254.284f0016.js similarity index 94% rename from assets/js/253.539c5bb6.js rename to assets/js/254.284f0016.js index c41ef5cf90..c4d8bffa89 100644 --- a/assets/js/253.539c5bb6.js +++ b/assets/js/254.284f0016.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[253],{1218:function(e,t,i){"use strict";i.r(t);var n=i(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Generic Control Input)")]),e._v(" "),t("p",[e._v("The DigitalIn component provides an interface to read the digital inputs of the GPIO CIM. On state changes of the connected signals (transitions to high or low level), the component generates corresponding trigger-events.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(782),alt:"Screenshot: DigitalIn plugin",title:"Screenshot: DigitalIn plugin"}})]),e._v(" "),t("p",[e._v("DigitalIn plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This component requires the DigitalIn (GPO) CIM (CIM Id: 0x0701) connected to an USB port.")]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1High to in6High:")]),e._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to high level, an event will be raised on the corresponding port.")]),e._v(" "),t("li",[t("strong",[e._v("in1Low to in6Low:")]),e._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to low level, an event will be raised on the corresponding port.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activateEventIn1 to activateEventIn6 [Boolean]:")]),e._v(" These properties declare for each port whether or not a signal transition on the actual input port should result in an event being triggered in the ARE. If a property is set true for one input, it will raise events on signal transitions, if it is set to false it will not.")]),e._v(" "),t("li",[t("strong",[e._v("periodicUpdate:")]),e._v(" Period in milliseconds for update messages about state of device inputs. If the property is set to zero, the plugin will receive messages from the CIM on signal transitions, if the property is non-zero, the CIM will send status messages in the defined intervals without extra event messages on signal changes. Both modes will have the same effect on the software plugin, it will raise events on its trigger ports.")]),e._v(" "),t("li",[t("strong",[e._v("uniqueId:")]),e._v(" unique number of the CIM - if more than one CIMs of the same type are used. The module flashes a LED for identification when the ID is selected. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);t.default=s.exports},782:function(e,t,i){e.exports=i.p+"assets/img/digitalin.83464356.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[254],{1222:function(e,t,i){"use strict";i.r(t);var n=i(2),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Generic Control Input)")]),e._v(" "),t("p",[e._v("The DigitalIn component provides an interface to read the digital inputs of the GPIO CIM. On state changes of the connected signals (transitions to high or low level), the component generates corresponding trigger-events.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(785),alt:"Screenshot: DigitalIn plugin",title:"Screenshot: DigitalIn plugin"}})]),e._v(" "),t("p",[e._v("DigitalIn plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This component requires the DigitalIn (GPO) CIM (CIM Id: 0x0701) connected to an USB port.")]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1High to in6High:")]),e._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to high level, an event will be raised on the corresponding port.")]),e._v(" "),t("li",[t("strong",[e._v("in1Low to in6Low:")]),e._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to low level, an event will be raised on the corresponding port.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activateEventIn1 to activateEventIn6 [Boolean]:")]),e._v(" These properties declare for each port whether or not a signal transition on the actual input port should result in an event being triggered in the ARE. If a property is set true for one input, it will raise events on signal transitions, if it is set to false it will not.")]),e._v(" "),t("li",[t("strong",[e._v("periodicUpdate:")]),e._v(" Period in milliseconds for update messages about state of device inputs. If the property is set to zero, the plugin will receive messages from the CIM on signal transitions, if the property is non-zero, the CIM will send status messages in the defined intervals without extra event messages on signal changes. Both modes will have the same effect on the software plugin, it will raise events on its trigger ports.")]),e._v(" "),t("li",[t("strong",[e._v("uniqueId:")]),e._v(" unique number of the CIM - if more than one CIMs of the same type are used. The module flashes a LED for identification when the ID is selected. "),t("strong",[e._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);t.default=s.exports},785:function(e,t,i){e.exports=i.p+"assets/img/digitalin.83464356.jpg"}}]); \ No newline at end of file diff --git a/assets/js/254.54d582c0.js b/assets/js/255.5f2442a0.js similarity index 93% rename from assets/js/254.54d582c0.js rename to assets/js/255.5f2442a0.js index b989396760..8755cea873 100644 --- a/assets/js/254.54d582c0.js +++ b/assets/js/255.5f2442a0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[254],{1220:function(t,e,o){"use strict";o.r(e);var r=o(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("This component creates a GUI edit field which can send the text to other components. The text will be sent to the output port when enter is pressed or when the edit box looses the input focus (when the cursor is removed from the edit field).")]),t._v(" "),e("p",[e("img",{attrs:{src:o(785),alt:"Screenshot: EditBox plugin",title:"Screenshot: EditBox plugin"}})]),t._v(" "),e("p",[t._v("EditBox plugin")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clear:")]),t._v(" Removes the text from the component.")]),t._v(" "),e("li",[e("strong",[t._v("send:")]),t._v(" Send the text value to the String output port.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("caption [string]:")]),t._v(" Caption of the component.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("default [string]:")]),t._v(" The default text, which is set at startup.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("textColor [integer]:")]),t._v(" Defines color of the text.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("backgroundColor [integer]:")]),t._v(" Defines background color.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("insertAction [integer]:")]),t._v(" Defines behaviour of the component after the text has been sent to the output port. The text in the component can be selected or removed.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("sendDefaultValue [boolean]:")]),t._v(" When this checkbox is checked the default String value is sent to the String output port when the model gets started.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])])}),[],!1,null,null,null);e.default=n.exports},785:function(t,e,o){t.exports=o.p+"assets/img/editbox.54fb1779.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[255],{1226:function(t,e,o){"use strict";o.r(e);var r=o(2),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),t._v(" "),e("p",[t._v("This component creates a GUI edit field which can send the text to other components. The text will be sent to the output port when enter is pressed or when the edit box looses the input focus (when the cursor is removed from the edit field).")]),t._v(" "),e("p",[e("img",{attrs:{src:o(793),alt:"Screenshot: EditBox plugin",title:"Screenshot: EditBox plugin"}})]),t._v(" "),e("p",[t._v("EditBox plugin")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("output [string]:")]),t._v(" String output port.")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("clear:")]),t._v(" Removes the text from the component.")]),t._v(" "),e("li",[e("strong",[t._v("send:")]),t._v(" Send the text value to the String output port.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("caption [string]:")]),t._v(" Caption of the component.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("default [string]:")]),t._v(" The default text, which is set at startup.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("textColor [integer]:")]),t._v(" Defines color of the text.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("backgroundColor [integer]:")]),t._v(" Defines background color.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("insertAction [integer]:")]),t._v(" Defines behaviour of the component after the text has been sent to the output port. The text in the component can be selected or removed.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("sendDefaultValue [boolean]:")]),t._v(" When this checkbox is checked the default String value is sent to the String output port when the model gets started.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("displayGUI [boolean]:")]),t._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])])}),[],!1,null,null,null);e.default=n.exports},793:function(t,e,o){t.exports=o.p+"assets/img/editbox.54fb1779.jpg"}}]); \ No newline at end of file diff --git a/assets/js/255.f9930cf2.js b/assets/js/256.c9672fc2.js similarity index 97% rename from assets/js/255.f9930cf2.js rename to assets/js/256.c9672fc2.js index 3e59bc5e56..e9ecb4c676 100644 --- a/assets/js/255.f9930cf2.js +++ b/assets/js/256.c9672fc2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[255],{1227:function(e,t,o){"use strict";o.r(t);var i=o(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("The FacetrackerCLM component is one of the vision based plugin. At this stage of development it offers the same functionalities for mouse emulation as the other sensor plugin named "),t("strong",[t("a",{attrs:{href:"FacetrackerLK.htm"}},[e._v("facetrackerLK")])]),e._v(" .")]),e._v(" "),t("p",[e._v("The underlying mechanism is based on the tracking of facial features detected in a first initialization stage by fitting a deformable face model on the image as soon as the region of interest is identified thanks to the OpenCV implementation of the Viola-Jones classifier.")]),e._v(" "),t("p",[e._v("The plugin outputs at each frame the relative offsets of a series of measures based on the tracked points with respect to the previous frame. These offsets may be integrated or used directly as inputs for the mouse emulator actuators. Usually it is a good idea to use the relative displacement of the centre of the face (PosX and PosY) to guide the mouse movements and reserve the other measurements or events to implement other optional functionalities (the head roll, pitch and yaw angles and relative scale of the face).")]),e._v(" "),t("p",[e._v("The FacetrackerCLM also introduces the detection of facial gestures that can be then exploited in the ACS models to directly perform actions or trigger events. In this version an event is sent for the detection of the raising of both eyebrows.")]),e._v(" "),t("p",[e._v("For a closer explaination of the EyeTrackerCLM functions and the training algorithm for eye states please refer to the document FacetrackerCLM.pdf in the folder /documentation.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(797),alt:"Screenshot: FacetrackerCLM plugin",title:"Screenshot: FacetrackerCLM plugin"}})]),e._v(" "),t("p",[e._v("FacetrackerCLM plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A camera has to be available in the operating system (preferably a consumer USB camera).")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("p",[e._v("There are no input ports for this plugin.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Roll[double]:")]),e._v(" The output port Roll outputs the relative change of the roll angle of the head pose (degrees).")]),e._v(" "),t("li",[t("strong",[e._v("Pitch[double]:")]),e._v(" The output port Pitch outputs the relative change of the pitch angle of the head pose (degrees).")]),e._v(" "),t("li",[t("strong",[e._v("Yaw[double]:")]),e._v(" The output port Yaw outputs the relative change of the yaw angle of the head pose (degrees).")]),e._v(" "),t("li",[t("strong",[e._v("PosX[double]:")]),e._v(" The output port PosX outputs the relative displacement of the x coordinate (image coordinates) of the tracked point (approximatively located around the nose).")]),e._v(" "),t("li",[t("strong",[e._v("PosY[double]:")]),e._v(" The output port PosX outputs the relative displacement of the y coordinate (image coordinates) of the tracked point (approximatively located around the nose).")]),e._v(" "),t("li",[t("strong",[e._v("Scale[double]:")]),e._v(" The output port Scale outputs the relative change in scale of the apparent size of the fitted face model in the current image.")]),e._v(" "),t("li",[t("strong",[e._v("EyeLeft[int]:")]),e._v(" The output port EyeLeft outputs 0 if the left eye is opened, 1 if closed in the current image.")]),e._v(" "),t("li",[t("strong",[e._v("EyeRight[int]:")]),e._v(" The output port EyeRight outputs 0 if the right eye is opened, 1 if closed in the current image.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("reset:")]),e._v(" Forces reinit of the fitting of deformable model for the face in order to reset the tracking points.")]),e._v(" "),t("li",[t("strong",[e._v("showCameraSettings:")]),e._v(" Displays the camera settings dialog on screen")]),e._v(" "),t("li",[t("strong",[e._v("setReferencePose:")]),e._v(" sets the reference pose")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("EyebrowsRaised:")]),e._v(" this event gets raised everytime the plugin detects a specific configuration of the facial landmarks corresponding to a "),t("em",[e._v("surprise")]),e._v(" expression.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("cameraSelection [string, combobox selection]:")]),e._v(" this property determines the index of the input camera. Possible values range from “first camera” to “fifth camera”. If only one camera is available in the system, “first camera” is the correct choice.")]),e._v(" "),t("li",[t("strong",[e._v("cameraResolution [string, combobox selection]:")]),e._v(" this selection box provides several standard camera resolutions. Changing the resolution affects accuracy and performance (CPU load of the runtime system). Provided selections include “160x120”, “320x240”, “640x480” and “800x600”. If the selected resolution cannot be delivered by the image acquisition device, the closest matching resolution is chosen automatically by the plugin.")]),e._v(" "),t("li",[t("strong",[e._v("cameraDisplayUpdate [integer]:")]),e._v(" this property allows to select the update rate for the camera display in milliseconds. If “0” milliseconds is chosen, no window for the live-video will be displayed. If “100” is chosen, the live image window will be updated 10 times a second. Please note that this property does not influence the frame rate of the camera nor the processing interval for new camera frames, only the display in the GUI is adjusted.")]),e._v(" "),t("li",[t("strong",[e._v("modelName [string]:")]),e._v(" this property informs the plugin about which is the trained model to load. The file is searched in the the FacetrackerCLM/EyeStateModels folder inside the plugin “data” folder. Specify the name without .yml extension.")])])])}),[],!1,null,null,null);t.default=r.exports},797:function(e,t,o){e.exports=o.p+"assets/img/facetrackerclm.45de8d83.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[256],{1232:function(e,t,o){"use strict";o.r(t);var i=o(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("The FacetrackerCLM component is one of the vision based plugin. At this stage of development it offers the same functionalities for mouse emulation as the other sensor plugin named "),t("strong",[t("a",{attrs:{href:"FacetrackerLK.htm"}},[e._v("facetrackerLK")])]),e._v(" .")]),e._v(" "),t("p",[e._v("The underlying mechanism is based on the tracking of facial features detected in a first initialization stage by fitting a deformable face model on the image as soon as the region of interest is identified thanks to the OpenCV implementation of the Viola-Jones classifier.")]),e._v(" "),t("p",[e._v("The plugin outputs at each frame the relative offsets of a series of measures based on the tracked points with respect to the previous frame. These offsets may be integrated or used directly as inputs for the mouse emulator actuators. Usually it is a good idea to use the relative displacement of the centre of the face (PosX and PosY) to guide the mouse movements and reserve the other measurements or events to implement other optional functionalities (the head roll, pitch and yaw angles and relative scale of the face).")]),e._v(" "),t("p",[e._v("The FacetrackerCLM also introduces the detection of facial gestures that can be then exploited in the ACS models to directly perform actions or trigger events. In this version an event is sent for the detection of the raising of both eyebrows.")]),e._v(" "),t("p",[e._v("For a closer explaination of the EyeTrackerCLM functions and the training algorithm for eye states please refer to the document FacetrackerCLM.pdf in the folder /documentation.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(802),alt:"Screenshot: FacetrackerCLM plugin",title:"Screenshot: FacetrackerCLM plugin"}})]),e._v(" "),t("p",[e._v("FacetrackerCLM plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A camera has to be available in the operating system (preferably a consumer USB camera).")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("p",[e._v("There are no input ports for this plugin.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Roll[double]:")]),e._v(" The output port Roll outputs the relative change of the roll angle of the head pose (degrees).")]),e._v(" "),t("li",[t("strong",[e._v("Pitch[double]:")]),e._v(" The output port Pitch outputs the relative change of the pitch angle of the head pose (degrees).")]),e._v(" "),t("li",[t("strong",[e._v("Yaw[double]:")]),e._v(" The output port Yaw outputs the relative change of the yaw angle of the head pose (degrees).")]),e._v(" "),t("li",[t("strong",[e._v("PosX[double]:")]),e._v(" The output port PosX outputs the relative displacement of the x coordinate (image coordinates) of the tracked point (approximatively located around the nose).")]),e._v(" "),t("li",[t("strong",[e._v("PosY[double]:")]),e._v(" The output port PosX outputs the relative displacement of the y coordinate (image coordinates) of the tracked point (approximatively located around the nose).")]),e._v(" "),t("li",[t("strong",[e._v("Scale[double]:")]),e._v(" The output port Scale outputs the relative change in scale of the apparent size of the fitted face model in the current image.")]),e._v(" "),t("li",[t("strong",[e._v("EyeLeft[int]:")]),e._v(" The output port EyeLeft outputs 0 if the left eye is opened, 1 if closed in the current image.")]),e._v(" "),t("li",[t("strong",[e._v("EyeRight[int]:")]),e._v(" The output port EyeRight outputs 0 if the right eye is opened, 1 if closed in the current image.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("reset:")]),e._v(" Forces reinit of the fitting of deformable model for the face in order to reset the tracking points.")]),e._v(" "),t("li",[t("strong",[e._v("showCameraSettings:")]),e._v(" Displays the camera settings dialog on screen")]),e._v(" "),t("li",[t("strong",[e._v("setReferencePose:")]),e._v(" sets the reference pose")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("EyebrowsRaised:")]),e._v(" this event gets raised everytime the plugin detects a specific configuration of the facial landmarks corresponding to a "),t("em",[e._v("surprise")]),e._v(" expression.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("cameraSelection [string, combobox selection]:")]),e._v(" this property determines the index of the input camera. Possible values range from “first camera” to “fifth camera”. If only one camera is available in the system, “first camera” is the correct choice.")]),e._v(" "),t("li",[t("strong",[e._v("cameraResolution [string, combobox selection]:")]),e._v(" this selection box provides several standard camera resolutions. Changing the resolution affects accuracy and performance (CPU load of the runtime system). Provided selections include “160x120”, “320x240”, “640x480” and “800x600”. If the selected resolution cannot be delivered by the image acquisition device, the closest matching resolution is chosen automatically by the plugin.")]),e._v(" "),t("li",[t("strong",[e._v("cameraDisplayUpdate [integer]:")]),e._v(" this property allows to select the update rate for the camera display in milliseconds. If “0” milliseconds is chosen, no window for the live-video will be displayed. If “100” is chosen, the live image window will be updated 10 times a second. Please note that this property does not influence the frame rate of the camera nor the processing interval for new camera frames, only the display in the GUI is adjusted.")]),e._v(" "),t("li",[t("strong",[e._v("modelName [string]:")]),e._v(" this property informs the plugin about which is the trained model to load. The file is searched in the the FacetrackerCLM/EyeStateModels folder inside the plugin “data” folder. Specify the name without .yml extension.")])])])}),[],!1,null,null,null);t.default=r.exports},802:function(e,t,o){e.exports=o.p+"assets/img/facetrackerclm.45de8d83.jpg"}}]); \ No newline at end of file diff --git a/assets/js/256.29ff536d.js b/assets/js/257.21ddbded.js similarity index 94% rename from assets/js/256.29ff536d.js rename to assets/js/257.21ddbded.js index ea2b41a3a0..ad035f12da 100644 --- a/assets/js/256.29ff536d.js +++ b/assets/js/257.21ddbded.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[256],{1230:function(e,t,r){"use strict";r.r(t);var o=r(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"folderbrowser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#folderbrowser"}},[e._v("#")]),e._v(" FolderBrowser")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: File System)")]),e._v(" "),t("p",[e._v("The "),t("strong",[e._v("FolderBrowser")]),e._v(" component allows to browse and select files in a given folder or subfolders of it. The navigation can be controlled by events.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(801),alt:"Screenshot: FolderBrowser plugin",title:"Screenshot: FolderBrowser plugin"}})]),e._v(" "),t("p",[e._v("The FolderBrowser plugin block element of the ACS.")]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("initialFolder [string]")]),e._v(": The initial folder to start browsing.")]),e._v(" "),t("li",[t("strong",[e._v("wrapAround [boolean]")]),e._v(": If true, the browsing is wrapped around after the last entry.")]),e._v(" "),t("li",[t("strong",[e._v("exitInitialFolder [boolean]")]),e._v(": If true, the initial folder may be exited.")]),e._v(" "),t("li",[t("strong",[e._v("autoListFiles [boolean]")]),e._v(": Automatically output files when entering the folder.")]),e._v(" "),t("li",[t("strong",[e._v("noFolderMessage [string]")]),e._v(": Message to be sent to the folderName port if no subfolder is available.")]),e._v(" "),t("li",[t("strong",[e._v("noFileMessage [string]")]),e._v(": The message to be sent to the fileNames port, if no file is available.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("next")]),e._v(": Got to the next folder in current directory")]),e._v(" "),t("li",[t("strong",[e._v("previous")]),e._v(": Go to the previous folder in current directory")]),e._v(" "),t("li",[t("strong",[e._v("enter")]),e._v(": Enter current folder")]),e._v(" "),t("li",[t("strong",[e._v("exit")]),e._v(": Exit current folder")]),e._v(" "),t("li",[t("strong",[e._v("current")]),e._v(": Output current folder")]),e._v(" "),t("li",[t("strong",[e._v("listFiles")]),e._v(": Lists files in current folder")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("folderName [string]")]),e._v(": The name of the current folder (without path).")]),e._v(" "),t("li",[t("strong",[e._v("folderPath [boolean]")]),e._v(": The name of the current folder (including path)")]),e._v(" "),t("li",[t("strong",[e._v("fileNames [boolean]")]),e._v(": The names of the files in current folder.")]),e._v(" "),t("li",[t("strong",[e._v("filePaths [boolean]")]),e._v(": The names of the files in current folder (including path)")])])])}),[],!1,null,null,null);t.default=s.exports},801:function(e,t,r){e.exports=r.p+"assets/img/folderbrowser.b4608102.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[257],{1235:function(e,t,r){"use strict";r.r(t);var o=r(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"folderbrowser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#folderbrowser"}},[e._v("#")]),e._v(" FolderBrowser")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: File System)")]),e._v(" "),t("p",[e._v("The "),t("strong",[e._v("FolderBrowser")]),e._v(" component allows to browse and select files in a given folder or subfolders of it. The navigation can be controlled by events.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(806),alt:"Screenshot: FolderBrowser plugin",title:"Screenshot: FolderBrowser plugin"}})]),e._v(" "),t("p",[e._v("The FolderBrowser plugin block element of the ACS.")]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("initialFolder [string]")]),e._v(": The initial folder to start browsing.")]),e._v(" "),t("li",[t("strong",[e._v("wrapAround [boolean]")]),e._v(": If true, the browsing is wrapped around after the last entry.")]),e._v(" "),t("li",[t("strong",[e._v("exitInitialFolder [boolean]")]),e._v(": If true, the initial folder may be exited.")]),e._v(" "),t("li",[t("strong",[e._v("autoListFiles [boolean]")]),e._v(": Automatically output files when entering the folder.")]),e._v(" "),t("li",[t("strong",[e._v("noFolderMessage [string]")]),e._v(": Message to be sent to the folderName port if no subfolder is available.")]),e._v(" "),t("li",[t("strong",[e._v("noFileMessage [string]")]),e._v(": The message to be sent to the fileNames port, if no file is available.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("next")]),e._v(": Got to the next folder in current directory")]),e._v(" "),t("li",[t("strong",[e._v("previous")]),e._v(": Go to the previous folder in current directory")]),e._v(" "),t("li",[t("strong",[e._v("enter")]),e._v(": Enter current folder")]),e._v(" "),t("li",[t("strong",[e._v("exit")]),e._v(": Exit current folder")]),e._v(" "),t("li",[t("strong",[e._v("current")]),e._v(": Output current folder")]),e._v(" "),t("li",[t("strong",[e._v("listFiles")]),e._v(": Lists files in current folder")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("folderName [string]")]),e._v(": The name of the current folder (without path).")]),e._v(" "),t("li",[t("strong",[e._v("folderPath [boolean]")]),e._v(": The name of the current folder (including path)")]),e._v(" "),t("li",[t("strong",[e._v("fileNames [boolean]")]),e._v(": The names of the files in current folder.")]),e._v(" "),t("li",[t("strong",[e._v("filePaths [boolean]")]),e._v(": The names of the files in current folder (including path)")])])])}),[],!1,null,null,null);t.default=s.exports},806:function(e,t,r){e.exports=r.p+"assets/img/folderbrowser.b4608102.jpg"}}]); \ No newline at end of file diff --git a/assets/js/257.d14d3dbc.js b/assets/js/258.f0d32ff3.js similarity index 96% rename from assets/js/257.d14d3dbc.js rename to assets/js/258.f0d32ff3.js index 2554ac76c6..9d65314c0c 100644 --- a/assets/js/257.d14d3dbc.js +++ b/assets/js/258.f0d32ff3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[257],{1228:function(e,t,h){"use strict";h.r(t);var i=h(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"headpositionhc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#headpositionhc"}},[e._v("#")]),e._v(" HeadPositionHC")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("This plug-in provides a selection of up to 12 choices via the head. A choice can be selected through looking to the side. The angle of the head is calculated with the position of the ear and the mouth. The detection of the features is realised with HaarCascade.")]),e._v(" "),t("p",[t("img",{attrs:{src:h(798),alt:"Screenshot: HeadPositionHC plug-in",title:"Screenshot: HeadPositionHC plugin"}})]),e._v(" "),t("p",[e._v("The HeadPositionHC sensor plug-in")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A webcam or an other camera has to be connected to the computer.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CellNumber:")]),e._v(" the number of the current selected Choice")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select:")]),e._v(" will be triggered when the position is held for an amount of time")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("ChoiceEachSide [integer]:")]),e._v(" sets the choices, which are visible and selectable for each side. (1-6 Choices each side are possible)")]),e._v(" "),t("li",[t("strong",[e._v("Angle1LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the first choice on the left side. Every value lower than this value and higher than the value of Angle2LeftSide selects the first choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle2LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the second choice on the left side. Every value lower than this value and higher than the value of Angle3LeftSide selects the second choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle3LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the third choice on the left side. Every value lower than this value and higher than the value of Angle4LeftSide selects the third choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle4LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the fourth choice on the left side. Every value lower than this value and higher than the value of Angle5LeftSide selects the fourth choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle5LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the fifth choice on the left side. Every value lower than this value and higher than the value of Angle6LeftSide selects the fifth choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle6LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the sixth choice on the left side. Every value lower than this value selects the sixth choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle1RightSide [integer]:")]),e._v(" sets the lower value of the angle for the first choice on the right side. Every value higher than this value and lower than the value of Angle2RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle2RightSide [integer]:")]),e._v(" sets the lower value of the angle for the second choice on the right side. Every value higher than this value and lower than the value of Angle3RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle3RightSide [integer]:")]),e._v(" sets the lower value of the angle for the third choice on the right side. Every value higher than this value and lower than the value of Angle4RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle4RightSide [integer]:")]),e._v(" sets the lower value of the angle for the fourth choice on the right side. Every value higher than this value and lower than the value of Angle5RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle5RightSide [integer]:")]),e._v(" sets the lower value of the angle for the fifth choice on the right side. Every value higher than this value and lower than the value of Angle6RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle6RightSide [integer]:")]),e._v(" sets the lower value of the angle for the sixth choice on the right side. Every value higher than this value selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("PathForHaarCascade [string]:")]),e._v(" Filepath to the folder, where the HaarCascade-files are stored.")]),e._v(" "),t("li",[t("strong",[e._v("CameraID [integer]:")]),e._v(" the ID of the Camera.")]),e._v(" "),t("li",[t("strong",[e._v("CounterResettingROI [integer]:")]),e._v(" the number of frames to wait before resetting the ROI (finding the face) when no feature is found.")]),e._v(" "),t("li",[t("strong",[e._v("CounterToSendSelectEvent [integer]:")]),e._v(" the number of frames, which the person has to hold the position until the select event is triggered.")])])])}),[],!1,null,null,null);t.default=r.exports},798:function(e,t,h){e.exports=h.p+"assets/img/headpositionhc.38072afc.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[258],{1236:function(e,t,h){"use strict";h.r(t);var i=h(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"headpositionhc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#headpositionhc"}},[e._v("#")]),e._v(" HeadPositionHC")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("This plug-in provides a selection of up to 12 choices via the head. A choice can be selected through looking to the side. The angle of the head is calculated with the position of the ear and the mouth. The detection of the features is realised with HaarCascade.")]),e._v(" "),t("p",[t("img",{attrs:{src:h(807),alt:"Screenshot: HeadPositionHC plug-in",title:"Screenshot: HeadPositionHC plugin"}})]),e._v(" "),t("p",[e._v("The HeadPositionHC sensor plug-in")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A webcam or an other camera has to be connected to the computer.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CellNumber:")]),e._v(" the number of the current selected Choice")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Select:")]),e._v(" will be triggered when the position is held for an amount of time")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("ChoiceEachSide [integer]:")]),e._v(" sets the choices, which are visible and selectable for each side. (1-6 Choices each side are possible)")]),e._v(" "),t("li",[t("strong",[e._v("Angle1LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the first choice on the left side. Every value lower than this value and higher than the value of Angle2LeftSide selects the first choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle2LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the second choice on the left side. Every value lower than this value and higher than the value of Angle3LeftSide selects the second choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle3LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the third choice on the left side. Every value lower than this value and higher than the value of Angle4LeftSide selects the third choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle4LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the fourth choice on the left side. Every value lower than this value and higher than the value of Angle5LeftSide selects the fourth choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle5LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the fifth choice on the left side. Every value lower than this value and higher than the value of Angle6LeftSide selects the fifth choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle6LeftSide [integer]:")]),e._v(" sets the upper value of the angle for the sixth choice on the left side. Every value lower than this value selects the sixth choice of the left side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle1RightSide [integer]:")]),e._v(" sets the lower value of the angle for the first choice on the right side. Every value higher than this value and lower than the value of Angle2RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle2RightSide [integer]:")]),e._v(" sets the lower value of the angle for the second choice on the right side. Every value higher than this value and lower than the value of Angle3RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle3RightSide [integer]:")]),e._v(" sets the lower value of the angle for the third choice on the right side. Every value higher than this value and lower than the value of Angle4RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle4RightSide [integer]:")]),e._v(" sets the lower value of the angle for the fourth choice on the right side. Every value higher than this value and lower than the value of Angle5RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle5RightSide [integer]:")]),e._v(" sets the lower value of the angle for the fifth choice on the right side. Every value higher than this value and lower than the value of Angle6RightSide selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("Angle6RightSide [integer]:")]),e._v(" sets the lower value of the angle for the sixth choice on the right side. Every value higher than this value selects the first choice of the right side.")]),e._v(" "),t("li",[t("strong",[e._v("PathForHaarCascade [string]:")]),e._v(" Filepath to the folder, where the HaarCascade-files are stored.")]),e._v(" "),t("li",[t("strong",[e._v("CameraID [integer]:")]),e._v(" the ID of the Camera.")]),e._v(" "),t("li",[t("strong",[e._v("CounterResettingROI [integer]:")]),e._v(" the number of frames to wait before resetting the ROI (finding the face) when no feature is found.")]),e._v(" "),t("li",[t("strong",[e._v("CounterToSendSelectEvent [integer]:")]),e._v(" the number of frames, which the person has to hold the position until the select event is triggered.")])])])}),[],!1,null,null,null);t.default=r.exports},807:function(e,t,h){e.exports=h.p+"assets/img/headpositionhc.38072afc.png"}}]); \ No newline at end of file diff --git a/assets/js/258.1991e442.js b/assets/js/259.4b0709ff.js similarity index 97% rename from assets/js/258.1991e442.js rename to assets/js/259.4b0709ff.js index 2ca97cf80f..7f8ee527b6 100644 --- a/assets/js/258.1991e442.js +++ b/assets/js/259.4b0709ff.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[258],{1231:function(e,r,t){"use strict";t.r(r);var s=t(2),o=Object(s.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"intelrealsense"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#intelrealsense"}},[e._v("#")]),e._v(" IntelRealSense")]),e._v(" "),r("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),r("p",[e._v("OS: >= Windows 8.1, 64 bit")]),e._v(" "),r("p",[e._v("This component interfaces the Intel Real Sense F200 (SR300) 3D camera and provides head tracking and facial gesture recognition functionality. The head tracking could be used for camera mouse applications and provides 3D absolute coordinates. The facial gestures could be used for simple actions like mouse click or key emulation. Each facial gesture has a recognition score. The user can define the threshold that triggers an event when the score exceeds the threshold.")]),e._v(" "),r("h2",{attrs:{id:"requirements"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),r("p",[e._v("You need an "),r("a",{attrs:{href:"https://software.intel.com/de-de/realsense/sr300camera",target:"_blank",rel:"noopener noreferrer"}},[e._v("Intel Real Sense F200 (SR300)"),r("OutboundLink")],1),e._v(" camera plugged in and the SDK installed and running. The camera only supports Windows (>= 8.1, 64 Bit).")]),e._v(" "),r("p",[r("img",{attrs:{src:t(802),alt:"Intel Real Sense 3D camera",title:"Intel Real Sense F200 (SR300) camera"}})]),e._v(" "),r("p",[e._v("Intel Real Sense F200 (SR300) camera")]),e._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("h [integer]:")]),e._v(" The face rectangle height in pixels.")]),e._v(" "),r("li",[r("strong",[e._v("w [integer]:")]),e._v(" The face rectangle width in pixels.")]),e._v(" "),r("li",[r("strong",[e._v("x [integer]:")]),e._v(" The x coordinate of the top left corner of the face rectangle.")]),e._v(" "),r("li",[r("strong",[e._v("y [integer]:")]),e._v(" The y coordinate of the top left corner of the face rectangle.")]),e._v(" "),r("li",[r("strong",[e._v("roll [integer]:")]),e._v(" Degree of head roll.")]),e._v(" "),r("li",[r("strong",[e._v("yaw [integer]:")]),e._v(" Degree of head yaw (left - right).")]),e._v(" "),r("li",[r("strong",[e._v("pitch [integer]:")]),e._v(" Degree of head pitch (up - down).")])]),e._v(" "),r("h2",{attrs:{id:"event-trigger-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("browRaiserLeft:")]),e._v(" browRaiserLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("browRaiserRight:")]),e._v(" browRaiserRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("browLowererLeft:")]),e._v(" browLowererLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("browLowererRight:")]),e._v(" browLowererRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("smile:")]),e._v(" smile expression happened")]),e._v(" "),r("li",[r("strong",[e._v("kiss:")]),e._v(" kiss expression happened")]),e._v(" "),r("li",[r("strong",[e._v("mouthOpen:")]),e._v(" mouthOpen expression happened")]),e._v(" "),r("li",[r("strong",[e._v("tongueOut:")]),e._v(" tongueOut expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesClosedLeft:")]),e._v(" eyesClosedLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesClosedRight:")]),e._v(" eyesClosedRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesTurnLeft:")]),e._v(" eyesTurnLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesTurnRight:")]),e._v(" eyesTurnRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesUp:")]),e._v(" eyesUp expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesDown:")]),e._v(" eyesDown expression happened")]),e._v(" "),r("li",[r("strong",[e._v("puffLeft:")]),e._v(" puffLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("puffRight:")]),e._v(" puffRight expression happened")])]),e._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("deviceModel [combobox selection]:")]),e._v(" Camera model, one of: F200, R200, R200_Enhanced, SR300")]),e._v(" "),r("li",[r("strong",[e._v("enableExpressions:")]),e._v(" Enable,Disable facial expressions")]),e._v(" "),r("li",[r("strong",[e._v("displayGUI:")]),e._v(" Enable, Disable camera gui.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowRaiserLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowRaiserRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowLowererLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowLowererRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreSmile:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreKiss:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreMouthOpen:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreThongueOut:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesClosedLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesClosedRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesTurnLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesTurnRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesUp:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesDown:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scorePuffLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scorePuffRight:")]),e._v(" Set score threshold value of expression to trigger event.")])])])}),[],!1,null,null,null);r.default=o.exports},802:function(e,r,t){e.exports=t.p+"assets/img/realsense_f200_camera.1ced686a.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[259],{1238:function(e,r,t){"use strict";t.r(r);var s=t(2),o=Object(s.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"intelrealsense"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#intelrealsense"}},[e._v("#")]),e._v(" IntelRealSense")]),e._v(" "),r("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),r("p",[e._v("OS: >= Windows 8.1, 64 bit")]),e._v(" "),r("p",[e._v("This component interfaces the Intel Real Sense F200 (SR300) 3D camera and provides head tracking and facial gesture recognition functionality. The head tracking could be used for camera mouse applications and provides 3D absolute coordinates. The facial gestures could be used for simple actions like mouse click or key emulation. Each facial gesture has a recognition score. The user can define the threshold that triggers an event when the score exceeds the threshold.")]),e._v(" "),r("h2",{attrs:{id:"requirements"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),r("p",[e._v("You need an "),r("a",{attrs:{href:"https://software.intel.com/de-de/realsense/sr300camera",target:"_blank",rel:"noopener noreferrer"}},[e._v("Intel Real Sense F200 (SR300)"),r("OutboundLink")],1),e._v(" camera plugged in and the SDK installed and running. The camera only supports Windows (>= 8.1, 64 Bit).")]),e._v(" "),r("p",[r("img",{attrs:{src:t(810),alt:"Intel Real Sense 3D camera",title:"Intel Real Sense F200 (SR300) camera"}})]),e._v(" "),r("p",[e._v("Intel Real Sense F200 (SR300) camera")]),e._v(" "),r("h2",{attrs:{id:"output-port-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("h [integer]:")]),e._v(" The face rectangle height in pixels.")]),e._v(" "),r("li",[r("strong",[e._v("w [integer]:")]),e._v(" The face rectangle width in pixels.")]),e._v(" "),r("li",[r("strong",[e._v("x [integer]:")]),e._v(" The x coordinate of the top left corner of the face rectangle.")]),e._v(" "),r("li",[r("strong",[e._v("y [integer]:")]),e._v(" The y coordinate of the top left corner of the face rectangle.")]),e._v(" "),r("li",[r("strong",[e._v("roll [integer]:")]),e._v(" Degree of head roll.")]),e._v(" "),r("li",[r("strong",[e._v("yaw [integer]:")]),e._v(" Degree of head yaw (left - right).")]),e._v(" "),r("li",[r("strong",[e._v("pitch [integer]:")]),e._v(" Degree of head pitch (up - down).")])]),e._v(" "),r("h2",{attrs:{id:"event-trigger-description"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("browRaiserLeft:")]),e._v(" browRaiserLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("browRaiserRight:")]),e._v(" browRaiserRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("browLowererLeft:")]),e._v(" browLowererLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("browLowererRight:")]),e._v(" browLowererRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("smile:")]),e._v(" smile expression happened")]),e._v(" "),r("li",[r("strong",[e._v("kiss:")]),e._v(" kiss expression happened")]),e._v(" "),r("li",[r("strong",[e._v("mouthOpen:")]),e._v(" mouthOpen expression happened")]),e._v(" "),r("li",[r("strong",[e._v("tongueOut:")]),e._v(" tongueOut expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesClosedLeft:")]),e._v(" eyesClosedLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesClosedRight:")]),e._v(" eyesClosedRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesTurnLeft:")]),e._v(" eyesTurnLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesTurnRight:")]),e._v(" eyesTurnRight expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesUp:")]),e._v(" eyesUp expression happened")]),e._v(" "),r("li",[r("strong",[e._v("eyesDown:")]),e._v(" eyesDown expression happened")]),e._v(" "),r("li",[r("strong",[e._v("puffLeft:")]),e._v(" puffLeft expression happened")]),e._v(" "),r("li",[r("strong",[e._v("puffRight:")]),e._v(" puffRight expression happened")])]),e._v(" "),r("h2",{attrs:{id:"properties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("deviceModel [combobox selection]:")]),e._v(" Camera model, one of: F200, R200, R200_Enhanced, SR300")]),e._v(" "),r("li",[r("strong",[e._v("enableExpressions:")]),e._v(" Enable,Disable facial expressions")]),e._v(" "),r("li",[r("strong",[e._v("displayGUI:")]),e._v(" Enable, Disable camera gui.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowRaiserLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowRaiserRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowLowererLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreBrowLowererRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreSmile:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreKiss:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreMouthOpen:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreThongueOut:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesClosedLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesClosedRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesTurnLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesTurnRight:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesUp:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scoreEyesDown:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scorePuffLeft:")]),e._v(" Set score threshold value of expression to trigger event.")]),e._v(" "),r("li",[r("strong",[e._v("scorePuffRight:")]),e._v(" Set score threshold value of expression to trigger event.")])])])}),[],!1,null,null,null);r.default=o.exports},810:function(e,r,t){e.exports=t.p+"assets/img/realsense_f200_camera.1ced686a.jpg"}}]); \ No newline at end of file diff --git a/assets/js/26.b9ede0b3.js b/assets/js/26.db92f2bc.js similarity index 99% rename from assets/js/26.b9ede0b3.js rename to assets/js/26.db92f2bc.js index e12e3254a9..6dd4d7be40 100644 --- a/assets/js/26.b9ede0b3.js +++ b/assets/js/26.db92f2bc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{296:function(e,t){e.exports="data:image/png;base64,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"},297:function(e,t){e.exports="data:image/png;base64,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"},298:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_33ee9963708d1fff.70ac87d7.png"},299:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_f830b9b181946728.4be74a14.png"},300:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_d5be58f6ea0f5f1.b4ff3013.png"},301:function(e,t,a){e.exports=a.p+"assets/img/eclipse-ant-buildtarget.a52616ed.png"},982:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"development-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#development-environment"}},[e._v("#")]),e._v(" Development Environment")]),e._v(" "),t("h2",{attrs:{id:"repository-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#repository-overview"}},[e._v("#")]),e._v(" Repository Overview")]),e._v(" "),t("p",[e._v("The source code repository is organised in the following subfolders:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(296),alt:""}})]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ACS")])]),e._v(" folder contains the AsTeRICS Configuration Suite source code.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Android")])]),e._v(" folder contains a server application for Android phones which allows interfacing with the AsTeRICS Android plugin to use phone functions in AsTeRICS models.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ARE")])]),e._v(" folder contains the middleware and service layers and ARE components.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("bin")])]),e._v(" folder contains subfolders where ARE and ACS executable files are placed during the build flow. These folders contain additional configuration files or dependencies, for example the config.ini and loader.ini files which specify the modules which are loaded by the ARE at startup.")]),e._v(" "),t("p",[e._v("Additionally, the bin folder contains several resources which are useful, e.g. a pre-built ACS with demo models (in the ACS\\models folder) and the OSKA application.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("BNCIevaluationSuite")])]),e._v(" is a collection of matlab files for analysis and comparison of algorithms for Brain Computer Interfaces (contributed by Starlab).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("CIM")])]),e._v(" folder contains firmware for the microcontroller modules used to interface the system to the environment (maintained by IMA and FHTW).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Documentation")])]),e._v(" folder contains the User- and the Developer Manual, and OSKA manual and the licence information for the developed and all utilized source code and libraries.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("NativeASAPI")])]),e._v(" folder contains C++ libraries for mobile-phone and GSM modem access, 3d-mouse and tremor reduction from own C++ projects.")]),e._v(" "),t("h2",{attrs:{id:"clone-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-repository"}},[e._v("#")]),e._v(" Clone Repository")]),e._v(" "),t("p",[e._v("Install a "),t("a",{attrs:{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("git"),t("OutboundLink")],1),e._v(" command line client and clone the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS.git",target:"_blank",rel:"noopener noreferrer"}},[e._v("repository"),t("OutboundLink")],1),e._v(" by entering:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/asterics/AsTeRICS.git\n")])])]),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("You need:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Java Development Kit 8")]),e._v(": "),t("a",{attrs:{href:"https://www.azul.com/downloads/zulu-community/?version=java-8-lts&package=jdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zulu JDKs"),t("OutboundLink")],1),e._v(" are recommended, but you can also use "),t("a",{attrs:{href:"https://openjdk.java.net/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenJDK"),t("OutboundLink")],1),e._v(" or the "),t("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Oracle JDK"),t("OutboundLink")],1),e._v(". If you are on Windows, be sure to select the 32-bit version of the JDK.")]),e._v(" "),t("li",[t("a",{attrs:{href:"http://ant.apache.org/bindownload.cgi",target:"_blank",rel:"noopener noreferrer"}},[e._v("apache ant build framework (version >= 1.9.1)"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Set "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment Variables")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment Variables")]),e._v(" "),t("ul",[t("li",[e._v("Ensure to set "),t("code",[e._v("JAVA_HOME")]),e._v(" to the folder where you installed the Java JDK and add the JDK bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")]),e._v(" "),t("li",[e._v("Ensure to set "),t("code",[e._v("ANT_HOME")]),e._v(" to the folder where you installed ant and add the ant bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")])]),e._v(" "),t("p",[e._v("See below an example of how to set the environment variable "),t("code",[e._v("JAVA_HOME")]),e._v(" on Windows 7.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(297),alt:"Setting Environment Variable JAVA_HOME on Windows 7"}})]),e._v(" "),t("h2",{attrs:{id:"build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),t("p",[e._v("AsTeRICS uses the build system "),t("code",[e._v("ant")]),e._v(".\nYou can simply build the framework from the command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h3",{attrs:{id:"building-are-middleware-services-and-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#building-are-middleware-services-and-plugins"}},[e._v("#")]),e._v(" Building ARE Middleware, Services and Plugins")]),e._v(" "),t("p",[e._v("In the "),t("code",[e._v("ARE")]),e._v(" subfolder the source code of the ARE middleware ("),t("code",[e._v("ARE/middleware")]),e._v("), ARE services ("),t("code",[e._v("ARE/services")]),e._v(") and plugins ("),t("code",[e._v("ARE/components")]),e._v(") can be found.")]),e._v(" "),t("p",[e._v("The middleware, the services and the components have separate ant build files ("),t("code",[e._v("build.xml")]),e._v("). The middleware and services are required for building the plugins (components). To build everything, a top-level build script is available in the "),t("code",[e._v("ARE")]),e._v(" folder.\nAlternatively, individual services or components can be built by selecting their associated "),t("code",[e._v("build.xml")]),e._v(" script from the corresponding subfolders.")]),e._v(" "),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" the ARE (plugins, services), enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE with "),t("strong",[e._v("remote debugging enabled")]),e._v(", enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run-debug\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h2",{attrs:{id:"eclipse-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eclipse-setup"}},[e._v("#")]),e._v(" Eclipse Setup")]),e._v(" "),t("p",[e._v("The AsTeRICS framework is not bound to a specific IDE, but "),t("a",{attrs:{href:"https://www.eclipse.org/downloads/packages/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Eclipse IDE for Enterprise Java Developers"),t("OutboundLink")],1),e._v(" is recommended. This will provide editing support for diverse file types (java, html, Js, CSS, xml). Alternately you can install "),t("em",[e._v("Eclipse IDE for Java Developers")]),e._v(" and later install addons for web development.")]),e._v(" "),t("h3",{attrs:{id:"java-project"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#java-project"}},[e._v("#")]),e._v(" Java Project")]),e._v(" "),t("p",[e._v("You must create a "),t("code",[e._v("Java Project")]),e._v(" first:")]),e._v(" "),t("p",[e._v("Choose "),t("em",[e._v("File -> New -> JavaProject")]),e._v(" in the Eclipse main menu, disable the option "),t("em",[e._v("“Use default location”")]),e._v(" and browse to the "),t("em",[e._v("ARE")]),e._v(" subfolder:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(298),alt:""}})]),e._v(" "),t("p",[e._v("Then you should see something like this:\n"),t("img",{attrs:{src:a(299),alt:""}})]),e._v(" "),t("p",[e._v("Eclipse provides different views ("),t("em",[e._v("Window -> Show View")]),e._v("), where the "),t("em",[e._v("Navigator")]),e._v(" and the "),t("em",[e._v("Package Explorer")]),e._v(" are most useful for Java source code development.")]),e._v(" "),t("p",[e._v("Note that the “"),t("em",[e._v("Refresh")]),e._v("” command ("),t("em",[e._v("F5")]),e._v(") synchronizes the Navigator view with changes in the local file system.")]),e._v(" "),t("h3",{attrs:{id:"character-encoding"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#character-encoding"}},[e._v("#")]),e._v(" Character encoding")]),e._v(" "),t("p",[e._v("Incorrect character encoding settings can cause problems with ANT-based builds in eclipse, especially if special characters like ö, ä, etc. are used in the source code. Be sure to use ISO-8859-1 as character encoding in "),t("em",[e._v("Configuations and Lauch")]),e._v(" settings (in the "),t("em",[e._v("Common")]),e._v(" tab) as shown in the screenshot (note that this is not the default setting in some versions of eclipse):")]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:""}})]),e._v(" "),t("h3",{attrs:{id:"editing-model-files-windows-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-model-files-windows-only"}},[e._v("#")]),e._v(" Editing Model Files (windows-only)")]),e._v(" "),t("p",[e._v("You can configure the Eclipse editor to open the "),t("em",[e._v("ACS")]),e._v(" editor for AsTeRICS model files ("),t("code",[e._v(".acs")]),e._v(").")]),e._v(" "),t("ol",[t("li",[e._v("Right click on a model file, select "),t("code",[e._v("Open with/Other")])]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("External programs")]),e._v(" and browse to "),t("code",[e._v("C:\\Program Files (x86)\\AsTeRICS\\ACS\\ACS.bat")]),e._v(" (Note: "),t("strong",[e._v("ACS.bat")]),e._v(")")]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("Use it for all `*.acs file")])]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Ok")])])]),e._v(" "),t("h3",{attrs:{id:"ant-within-eclipse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ant-within-eclipse"}},[e._v("#")]),e._v(" Ant within Eclipse")]),e._v(" "),t("p",[e._v("You can run the "),t("em",[e._v("ant")]),e._v(" targets of the AsTeRICS build system from within Eclipse.")]),e._v(" "),t("h4",{attrs:{id:"run-default-target"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-default-target"}},[e._v("#")]),e._v(" Run default target")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build")]),e._v(" (first entry)")])]),e._v(" "),t("h4",{attrs:{id:"run-selected-targets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-selected-targets"}},[e._v("#")]),e._v(" Run selected targets")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build...")]),e._v(" (second entry)")]),e._v(" "),t("li",[e._v("Click onto targets to run")]),e._v(" "),t("li",[e._v("Select order of execution at the bottom")]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Apply")]),e._v(" and "),t("code",[e._v("Run")])])]),e._v(" "),t("p",[e._v("The screenshot below shows the dialog for build target selection:\n"),t("img",{attrs:{src:a(301),alt:"Screenshot of ant build target selection"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{296:function(e,t){e.exports="data:image/png;base64,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"},297:function(e,t){e.exports="data:image/png;base64,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"},298:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_33ee9963708d1fff.70ac87d7.png"},299:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_f830b9b181946728.4be74a14.png"},300:function(e,t,a){e.exports=a.p+"assets/img/DeveloperManual_html_d5be58f6ea0f5f1.b4ff3013.png"},301:function(e,t,a){e.exports=a.p+"assets/img/eclipse-ant-buildtarget.a52616ed.png"},984:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"development-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#development-environment"}},[e._v("#")]),e._v(" Development Environment")]),e._v(" "),t("h2",{attrs:{id:"repository-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#repository-overview"}},[e._v("#")]),e._v(" Repository Overview")]),e._v(" "),t("p",[e._v("The source code repository is organised in the following subfolders:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(296),alt:""}})]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ACS")])]),e._v(" folder contains the AsTeRICS Configuration Suite source code.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Android")])]),e._v(" folder contains a server application for Android phones which allows interfacing with the AsTeRICS Android plugin to use phone functions in AsTeRICS models.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("ARE")])]),e._v(" folder contains the middleware and service layers and ARE components.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("bin")])]),e._v(" folder contains subfolders where ARE and ACS executable files are placed during the build flow. These folders contain additional configuration files or dependencies, for example the config.ini and loader.ini files which specify the modules which are loaded by the ARE at startup.")]),e._v(" "),t("p",[e._v("Additionally, the bin folder contains several resources which are useful, e.g. a pre-built ACS with demo models (in the ACS\\models folder) and the OSKA application.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("BNCIevaluationSuite")])]),e._v(" is a collection of matlab files for analysis and comparison of algorithms for Brain Computer Interfaces (contributed by Starlab).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("CIM")])]),e._v(" folder contains firmware for the microcontroller modules used to interface the system to the environment (maintained by IMA and FHTW).")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("Documentation")])]),e._v(" folder contains the User- and the Developer Manual, and OSKA manual and the licence information for the developed and all utilized source code and libraries.")]),e._v(" "),t("p",[e._v("The "),t("em",[t("strong",[e._v("NativeASAPI")])]),e._v(" folder contains C++ libraries for mobile-phone and GSM modem access, 3d-mouse and tremor reduction from own C++ projects.")]),e._v(" "),t("h2",{attrs:{id:"clone-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-repository"}},[e._v("#")]),e._v(" Clone Repository")]),e._v(" "),t("p",[e._v("Install a "),t("a",{attrs:{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("git"),t("OutboundLink")],1),e._v(" command line client and clone the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS.git",target:"_blank",rel:"noopener noreferrer"}},[e._v("repository"),t("OutboundLink")],1),e._v(" by entering:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/asterics/AsTeRICS.git\n")])])]),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("You need:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Java Development Kit 8")]),e._v(": "),t("a",{attrs:{href:"https://www.azul.com/downloads/zulu-community/?version=java-8-lts&package=jdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zulu JDKs"),t("OutboundLink")],1),e._v(" are recommended, but you can also use "),t("a",{attrs:{href:"https://openjdk.java.net/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenJDK"),t("OutboundLink")],1),e._v(" or the "),t("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Oracle JDK"),t("OutboundLink")],1),e._v(". If you are on Windows, be sure to select the 32-bit version of the JDK.")]),e._v(" "),t("li",[t("a",{attrs:{href:"http://ant.apache.org/bindownload.cgi",target:"_blank",rel:"noopener noreferrer"}},[e._v("apache ant build framework (version >= 1.9.1)"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Set "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment Variables")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment Variables")]),e._v(" "),t("ul",[t("li",[e._v("Ensure to set "),t("code",[e._v("JAVA_HOME")]),e._v(" to the folder where you installed the Java JDK and add the JDK bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")]),e._v(" "),t("li",[e._v("Ensure to set "),t("code",[e._v("ANT_HOME")]),e._v(" to the folder where you installed ant and add the ant bin path to the Environment Variable "),t("code",[e._v("Path")]),e._v(".")])]),e._v(" "),t("p",[e._v("See below an example of how to set the environment variable "),t("code",[e._v("JAVA_HOME")]),e._v(" on Windows 7.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(297),alt:"Setting Environment Variable JAVA_HOME on Windows 7"}})]),e._v(" "),t("h2",{attrs:{id:"build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),t("p",[e._v("AsTeRICS uses the build system "),t("code",[e._v("ant")]),e._v(".\nYou can simply build the framework from the command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h3",{attrs:{id:"building-are-middleware-services-and-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#building-are-middleware-services-and-plugins"}},[e._v("#")]),e._v(" Building ARE Middleware, Services and Plugins")]),e._v(" "),t("p",[e._v("In the "),t("code",[e._v("ARE")]),e._v(" subfolder the source code of the ARE middleware ("),t("code",[e._v("ARE/middleware")]),e._v("), ARE services ("),t("code",[e._v("ARE/services")]),e._v(") and plugins ("),t("code",[e._v("ARE/components")]),e._v(") can be found.")]),e._v(" "),t("p",[e._v("The middleware, the services and the components have separate ant build files ("),t("code",[e._v("build.xml")]),e._v("). The middleware and services are required for building the plugins (components). To build everything, a top-level build script is available in the "),t("code",[e._v("ARE")]),e._v(" folder.\nAlternatively, individual services or components can be built by selecting their associated "),t("code",[e._v("build.xml")]),e._v(" script from the corresponding subfolders.")]),e._v(" "),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" the ARE (plugins, services), enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run\n")])])]),t("p",[e._v("To "),t("strong",[e._v("build")]),e._v(" and "),t("strong",[e._v("start")]),e._v(" the ARE with "),t("strong",[e._v("remote debugging enabled")]),e._v(", enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant run-debug\n")])])]),t("p",[e._v("For other build targets and their meaning, enter:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("ant "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-projecthelp")]),e._v("\n")])])]),t("h2",{attrs:{id:"eclipse-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eclipse-setup"}},[e._v("#")]),e._v(" Eclipse Setup")]),e._v(" "),t("p",[e._v("The AsTeRICS framework is not bound to a specific IDE, but "),t("a",{attrs:{href:"https://www.eclipse.org/downloads/packages/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Eclipse IDE for Enterprise Java Developers"),t("OutboundLink")],1),e._v(" is recommended. This will provide editing support for diverse file types (java, html, Js, CSS, xml). Alternately you can install "),t("em",[e._v("Eclipse IDE for Java Developers")]),e._v(" and later install addons for web development.")]),e._v(" "),t("h3",{attrs:{id:"java-project"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#java-project"}},[e._v("#")]),e._v(" Java Project")]),e._v(" "),t("p",[e._v("You must create a "),t("code",[e._v("Java Project")]),e._v(" first:")]),e._v(" "),t("p",[e._v("Choose "),t("em",[e._v("File -> New -> JavaProject")]),e._v(" in the Eclipse main menu, disable the option "),t("em",[e._v("“Use default location”")]),e._v(" and browse to the "),t("em",[e._v("ARE")]),e._v(" subfolder:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(298),alt:""}})]),e._v(" "),t("p",[e._v("Then you should see something like this:\n"),t("img",{attrs:{src:a(299),alt:""}})]),e._v(" "),t("p",[e._v("Eclipse provides different views ("),t("em",[e._v("Window -> Show View")]),e._v("), where the "),t("em",[e._v("Navigator")]),e._v(" and the "),t("em",[e._v("Package Explorer")]),e._v(" are most useful for Java source code development.")]),e._v(" "),t("p",[e._v("Note that the “"),t("em",[e._v("Refresh")]),e._v("” command ("),t("em",[e._v("F5")]),e._v(") synchronizes the Navigator view with changes in the local file system.")]),e._v(" "),t("h3",{attrs:{id:"character-encoding"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#character-encoding"}},[e._v("#")]),e._v(" Character encoding")]),e._v(" "),t("p",[e._v("Incorrect character encoding settings can cause problems with ANT-based builds in eclipse, especially if special characters like ö, ä, etc. are used in the source code. Be sure to use ISO-8859-1 as character encoding in "),t("em",[e._v("Configuations and Lauch")]),e._v(" settings (in the "),t("em",[e._v("Common")]),e._v(" tab) as shown in the screenshot (note that this is not the default setting in some versions of eclipse):")]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:""}})]),e._v(" "),t("h3",{attrs:{id:"editing-model-files-windows-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-model-files-windows-only"}},[e._v("#")]),e._v(" Editing Model Files (windows-only)")]),e._v(" "),t("p",[e._v("You can configure the Eclipse editor to open the "),t("em",[e._v("ACS")]),e._v(" editor for AsTeRICS model files ("),t("code",[e._v(".acs")]),e._v(").")]),e._v(" "),t("ol",[t("li",[e._v("Right click on a model file, select "),t("code",[e._v("Open with/Other")])]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("External programs")]),e._v(" and browse to "),t("code",[e._v("C:\\Program Files (x86)\\AsTeRICS\\ACS\\ACS.bat")]),e._v(" (Note: "),t("strong",[e._v("ACS.bat")]),e._v(")")]),e._v(" "),t("li",[e._v("Check "),t("code",[e._v("Use it for all `*.acs file")])]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Ok")])])]),e._v(" "),t("h3",{attrs:{id:"ant-within-eclipse"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ant-within-eclipse"}},[e._v("#")]),e._v(" Ant within Eclipse")]),e._v(" "),t("p",[e._v("You can run the "),t("em",[e._v("ant")]),e._v(" targets of the AsTeRICS build system from within Eclipse.")]),e._v(" "),t("h4",{attrs:{id:"run-default-target"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-default-target"}},[e._v("#")]),e._v(" Run default target")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build")]),e._v(" (first entry)")])]),e._v(" "),t("h4",{attrs:{id:"run-selected-targets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-selected-targets"}},[e._v("#")]),e._v(" Run selected targets")]),e._v(" "),t("ol",[t("li",[e._v("Right click onto file "),t("code",[e._v("build.xml")])]),e._v(" "),t("li",[e._v("Select "),t("code",[e._v("Run As/Ant Build...")]),e._v(" (second entry)")]),e._v(" "),t("li",[e._v("Click onto targets to run")]),e._v(" "),t("li",[e._v("Select order of execution at the bottom")]),e._v(" "),t("li",[e._v("Click onto "),t("code",[e._v("Apply")]),e._v(" and "),t("code",[e._v("Run")])])]),e._v(" "),t("p",[e._v("The screenshot below shows the dialog for build target selection:\n"),t("img",{attrs:{src:a(301),alt:"Screenshot of ant build target selection"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/259.10324228.js b/assets/js/260.3e8cd90d.js similarity index 98% rename from assets/js/259.10324228.js rename to assets/js/260.3e8cd90d.js index fda6e74f6d..7e49644b6c 100644 --- a/assets/js/259.10324228.js +++ b/assets/js/260.3e8cd90d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[259],{1235:function(t,v,_){"use strict";_.r(v);var e=_(2),r=Object(e.a)({},(function(){var t=this,v=t._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"frontmatter-title"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),v("p",[t._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),t._v(" "),v("p",[t._v("This component provides access to keystrokes of a single key on the keyboard. The keystroke capture does not depend on a particular window or text field to have the input focus. For every keypress and release of the specified key an event gets fired. Possible applications include triggering functions by keyboard input, interfacing to speech recognition software or remapping keys to other keycodes.")]),t._v(" "),v("p",[v("img",{attrs:{src:_(807),alt:"Screenshot: KeyCapture plugin",title:"Screenshot: KeyCapture plugin"}})]),t._v(" "),v("p",[t._v("KeybCapture plugin")]),t._v(" "),v("h2",{attrs:{id:"requirements"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),v("p",[t._v("A keyboard which generates keystrokes or a software component which injects keystrokes into the operating system message queue.")]),t._v(" "),v("h2",{attrs:{id:"mapping-of-keycodes-to-actual-keys"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#mapping-of-keycodes-to-actual-keys"}},[t._v("#")]),t._v(" Mapping of keyCodes to actual keys")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("Key")]),t._v(" "),v("th",[t._v("KeyCode")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("A")]),t._v(" "),v("td",[t._v("30")])]),t._v(" "),v("tr",[v("td",[t._v("B")]),t._v(" "),v("td",[t._v("48")])]),t._v(" "),v("tr",[v("td",[t._v("C")]),t._v(" "),v("td",[t._v("46")])]),t._v(" "),v("tr",[v("td",[t._v("D")]),t._v(" "),v("td",[t._v("32")])]),t._v(" "),v("tr",[v("td",[t._v("E")]),t._v(" "),v("td",[t._v("18")])]),t._v(" "),v("tr",[v("td",[t._v("F")]),t._v(" "),v("td",[t._v("33")])]),t._v(" "),v("tr",[v("td",[t._v("G")]),t._v(" "),v("td",[t._v("34")])]),t._v(" "),v("tr",[v("td",[t._v("H")]),t._v(" "),v("td",[t._v("35")])]),t._v(" "),v("tr",[v("td",[t._v("I")]),t._v(" "),v("td",[t._v("23")])]),t._v(" "),v("tr",[v("td",[t._v("J")]),t._v(" "),v("td",[t._v("36")])]),t._v(" "),v("tr",[v("td",[t._v("K")]),t._v(" "),v("td",[t._v("37")])]),t._v(" "),v("tr",[v("td",[t._v("L")]),t._v(" "),v("td",[t._v("38")])]),t._v(" "),v("tr",[v("td",[t._v("M")]),t._v(" "),v("td",[t._v("50")])]),t._v(" "),v("tr",[v("td",[t._v("N")]),t._v(" "),v("td",[t._v("49")])]),t._v(" "),v("tr",[v("td",[t._v("O")]),t._v(" "),v("td",[t._v("24")])]),t._v(" "),v("tr",[v("td",[t._v("P")]),t._v(" "),v("td",[t._v("25")])]),t._v(" "),v("tr",[v("td",[t._v("Q")]),t._v(" "),v("td",[t._v("16")])]),t._v(" "),v("tr",[v("td",[t._v("R")]),t._v(" "),v("td",[t._v("19")])]),t._v(" "),v("tr",[v("td",[t._v("S")]),t._v(" "),v("td",[t._v("31")])]),t._v(" "),v("tr",[v("td",[t._v("T")]),t._v(" "),v("td",[t._v("20")])]),t._v(" "),v("tr",[v("td",[t._v("U")]),t._v(" "),v("td",[t._v("22")])]),t._v(" "),v("tr",[v("td",[t._v("V")]),t._v(" "),v("td",[t._v("47")])]),t._v(" "),v("tr",[v("td",[t._v("W")]),t._v(" "),v("td",[t._v("17")])]),t._v(" "),v("tr",[v("td",[t._v("X")]),t._v(" "),v("td",[t._v("45")])]),t._v(" "),v("tr",[v("td",[t._v("Y")]),t._v(" "),v("td",[t._v("21")])]),t._v(" "),v("tr",[v("td",[t._v("Z")]),t._v(" "),v("td",[t._v("44")])]),t._v(" "),v("tr",[v("td",[t._v("0")]),t._v(" "),v("td",[t._v("11")])]),t._v(" "),v("tr",[v("td",[t._v("1")]),t._v(" "),v("td",[t._v("2")])]),t._v(" "),v("tr",[v("td",[t._v("2")]),t._v(" "),v("td",[t._v("3")])]),t._v(" "),v("tr",[v("td",[t._v("3")]),t._v(" "),v("td",[t._v("4")])]),t._v(" "),v("tr",[v("td",[t._v("4")]),t._v(" "),v("td",[t._v("5")])]),t._v(" "),v("tr",[v("td",[t._v("5")]),t._v(" "),v("td",[t._v("6")])]),t._v(" "),v("tr",[v("td",[t._v("6")]),t._v(" "),v("td",[t._v("7")])]),t._v(" "),v("tr",[v("td",[t._v("7")]),t._v(" "),v("td",[t._v("8")])]),t._v(" "),v("tr",[v("td",[t._v("8")]),t._v(" "),v("td",[t._v("9")])]),t._v(" "),v("tr",[v("td",[t._v("9")]),t._v(" "),v("td",[t._v("10")])]),t._v(" "),v("tr",[v("td",[t._v("F1")]),t._v(" "),v("td",[t._v("59")])]),t._v(" "),v("tr",[v("td",[t._v("F2")]),t._v(" "),v("td",[t._v("60")])]),t._v(" "),v("tr",[v("td",[t._v("F3")]),t._v(" "),v("td",[t._v("61")])]),t._v(" "),v("tr",[v("td",[t._v("F4")]),t._v(" "),v("td",[t._v("62")])]),t._v(" "),v("tr",[v("td",[t._v("F5")]),t._v(" "),v("td",[t._v("63")])]),t._v(" "),v("tr",[v("td",[t._v("F6")]),t._v(" "),v("td",[t._v("64")])]),t._v(" "),v("tr",[v("td",[t._v("F7")]),t._v(" "),v("td",[t._v("65")])]),t._v(" "),v("tr",[v("td",[t._v("F8")]),t._v(" "),v("td",[t._v("66")])]),t._v(" "),v("tr",[v("td",[t._v("F9")]),t._v(" "),v("td",[t._v("67")])]),t._v(" "),v("tr",[v("td",[t._v("F10")]),t._v(" "),v("td",[t._v("68")])]),t._v(" "),v("tr",[v("td",[t._v("F11")]),t._v(" "),v("td",[t._v("87")])]),t._v(" "),v("tr",[v("td",[t._v("F12")]),t._v(" "),v("td",[t._v("88")])]),t._v(" "),v("tr",[v("td",[t._v("F13")]),t._v(" "),v("td",[t._v("91")])]),t._v(" "),v("tr",[v("td",[t._v("F14")]),t._v(" "),v("td",[t._v("92")])]),t._v(" "),v("tr",[v("td",[t._v("F15")]),t._v(" "),v("td",[t._v("93")])]),t._v(" "),v("tr",[v("td",[t._v("F16")]),t._v(" "),v("td",[t._v("99")])]),t._v(" "),v("tr",[v("td",[t._v("F17")]),t._v(" "),v("td",[t._v("100")])]),t._v(" "),v("tr",[v("td",[t._v("F18")]),t._v(" "),v("td",[t._v("101")])]),t._v(" "),v("tr",[v("td",[t._v("F19")]),t._v(" "),v("td",[t._v("102")])]),t._v(" "),v("tr",[v("td",[t._v("F20")]),t._v(" "),v("td",[t._v("103")])]),t._v(" "),v("tr",[v("td",[t._v("F21")]),t._v(" "),v("td",[t._v("104")])]),t._v(" "),v("tr",[v("td",[t._v("F22")]),t._v(" "),v("td",[t._v("105")])]),t._v(" "),v("tr",[v("td",[t._v("F23")]),t._v(" "),v("td",[t._v("106")])]),t._v(" "),v("tr",[v("td",[t._v("F24")]),t._v(" "),v("td",[t._v("107")])]),t._v(" "),v("tr",[v("td",[t._v("ESC")]),t._v(" "),v("td",[t._v("1")])]),t._v(" "),v("tr",[v("td",[t._v("-")]),t._v(" "),v("td",[t._v("12")])]),t._v(" "),v("tr",[v("td",[t._v("=/+")]),t._v(" "),v("td",[t._v("13")])]),t._v(" "),v("tr",[v("td",[t._v("Backspace")]),t._v(" "),v("td",[t._v("14")])]),t._v(" "),v("tr",[v("td",[t._v("Tab")]),t._v(" "),v("td",[t._v("15")])]),t._v(" "),v("tr",[v("td",[t._v("Caps Lock")]),t._v(" "),v("td",[t._v("58")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Up")]),t._v(" "),v("td",[t._v("57416")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Left")]),t._v(" "),v("td",[t._v("57419")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Right")]),t._v(" "),v("td",[t._v("57421")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Down")]),t._v(" "),v("td",[t._v("57424")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 0")]),t._v(" "),v("td",[t._v("82")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 1")]),t._v(" "),v("td",[t._v("79")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 2")]),t._v(" "),v("td",[t._v("80")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 3")]),t._v(" "),v("td",[t._v("81")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 4")]),t._v(" "),v("td",[t._v("75")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 5")]),t._v(" "),v("td",[t._v("76")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 6")]),t._v(" "),v("td",[t._v("77")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 7")]),t._v(" "),v("td",[t._v("71")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 8")]),t._v(" "),v("td",[t._v("72")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 9")]),t._v(" "),v("td",[t._v("73")])]),t._v(" "),v("tr",[v("td",[t._v("Ctrl left")]),t._v(" "),v("td",[t._v("29")])]),t._v(" "),v("tr",[v("td",[t._v("Ctrl right")]),t._v(" "),v("td",[t._v("3613")])]),t._v(" "),v("tr",[v("td",[t._v("Alt left")]),t._v(" "),v("td",[t._v("56")])]),t._v(" "),v("tr",[v("td",[t._v("Alt right")]),t._v(" "),v("td",[t._v("3640")])]),t._v(" "),v("tr",[v("td",[t._v("Context Menu")]),t._v(" "),v("td",[t._v("3677")])]),t._v(" "),v("tr",[v("td",[t._v("Windows Key")]),t._v(" "),v("td",[t._v("3675 or 3676")])]),t._v(" "),v("tr",[v("td",[t._v("SPACE")]),t._v(" "),v("td",[t._v("57")])]),t._v(" "),v("tr",[v("td",[t._v("Print Screen")]),t._v(" "),v("td",[t._v("3639")])]),t._v(" "),v("tr",[v("td",[t._v("Scroll Lock")]),t._v(" "),v("td",[t._v("70")])]),t._v(" "),v("tr",[v("td",[t._v("Pause")]),t._v(" "),v("td",[t._v("3653")])]),t._v(" "),v("tr",[v("td",[t._v("Enter")]),t._v(" "),v("td",[t._v("28")])]),t._v(" "),v("tr",[v("td",[t._v("Page Up")]),t._v(" "),v("td",[t._v("3657")])]),t._v(" "),v("tr",[v("td",[t._v("Page Down")]),t._v(" "),v("td",[t._v("3665")])]),t._v(" "),v("tr",[v("td",[t._v(",")]),t._v(" "),v("td",[t._v("51")])]),t._v(" "),v("tr",[v("td",[t._v(".")]),t._v(" "),v("td",[t._v("52")])])])]),t._v(" "),v("p",[v("a",{attrs:{href:"https://github.com/kwhat/jnativehook/blob/master/src/java/org/jnativehook/keyboard/NativeKeyEvent.java",title:"Opens external link in new window",target:"_blank",rel:"noopener noreferrer"}},[t._v("Click here"),v("OutboundLink")],1),t._v(" to view a full list of keycodes.")]),t._v(" "),v("h2",{attrs:{id:"input-port-description"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("keyCode [integer]:")]),t._v(" The keycode of the key which should be captured. For a list of the mapping between keycodes and keys see the graphics above.")])]),t._v(" "),v("h2",{attrs:{id:"event-trigger-description"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("keyPressed:")]),t._v(" This event port fires an event if the key with the specified keyCode was pressed.")]),t._v(" "),v("li",[v("strong",[t._v("keyReleased:")]),t._v(" This event port fires an event if the key with the specified keyCode was released.")])]),t._v(" "),v("h2",{attrs:{id:"event-listener-description"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("enable:")]),t._v(" The keystate is captured and events get fired")]),t._v(" "),v("li",[v("strong",[t._v("disable:")]),t._v(" The plugin does not fire any event.")]),t._v(" "),v("li",[v("strong",[t._v("block:")]),t._v(" After this event, the keystroke of the key with the specified keyCode is not forwarded to the operating system.")]),t._v(" "),v("li",[v("strong",[t._v("unblock:")]),t._v(" After this event, the keystroke of the key with the specified keyCode is forwarded to the operating system.")])]),t._v(" "),v("h2",{attrs:{id:"properties"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("block [boolean]:")]),t._v(" If this property is set to true, no key press activities will be routed to the operating system")]),t._v(" "),v("li",[v("strong",[t._v("keyCode[integer]:")]),t._v(" The keycode of the key which should be captured. For a list of the mapping between keycodes and keys see the graphics above.")])])])}),[],!1,null,null,null);v.default=r.exports},807:function(t,v,_){t.exports=_.p+"assets/img/keycapture.23ab76be.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[260],{1239:function(t,v,_){"use strict";_.r(v);var e=_(2),r=Object(e.a)({},(function(){var t=this,v=t._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"frontmatter-title"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),v("p",[t._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),t._v(" "),v("p",[t._v("This component provides access to keystrokes of a single key on the keyboard. The keystroke capture does not depend on a particular window or text field to have the input focus. For every keypress and release of the specified key an event gets fired. Possible applications include triggering functions by keyboard input, interfacing to speech recognition software or remapping keys to other keycodes.")]),t._v(" "),v("p",[v("img",{attrs:{src:_(811),alt:"Screenshot: KeyCapture plugin",title:"Screenshot: KeyCapture plugin"}})]),t._v(" "),v("p",[t._v("KeybCapture plugin")]),t._v(" "),v("h2",{attrs:{id:"requirements"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),v("p",[t._v("A keyboard which generates keystrokes or a software component which injects keystrokes into the operating system message queue.")]),t._v(" "),v("h2",{attrs:{id:"mapping-of-keycodes-to-actual-keys"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#mapping-of-keycodes-to-actual-keys"}},[t._v("#")]),t._v(" Mapping of keyCodes to actual keys")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("Key")]),t._v(" "),v("th",[t._v("KeyCode")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("A")]),t._v(" "),v("td",[t._v("30")])]),t._v(" "),v("tr",[v("td",[t._v("B")]),t._v(" "),v("td",[t._v("48")])]),t._v(" "),v("tr",[v("td",[t._v("C")]),t._v(" "),v("td",[t._v("46")])]),t._v(" "),v("tr",[v("td",[t._v("D")]),t._v(" "),v("td",[t._v("32")])]),t._v(" "),v("tr",[v("td",[t._v("E")]),t._v(" "),v("td",[t._v("18")])]),t._v(" "),v("tr",[v("td",[t._v("F")]),t._v(" "),v("td",[t._v("33")])]),t._v(" "),v("tr",[v("td",[t._v("G")]),t._v(" "),v("td",[t._v("34")])]),t._v(" "),v("tr",[v("td",[t._v("H")]),t._v(" "),v("td",[t._v("35")])]),t._v(" "),v("tr",[v("td",[t._v("I")]),t._v(" "),v("td",[t._v("23")])]),t._v(" "),v("tr",[v("td",[t._v("J")]),t._v(" "),v("td",[t._v("36")])]),t._v(" "),v("tr",[v("td",[t._v("K")]),t._v(" "),v("td",[t._v("37")])]),t._v(" "),v("tr",[v("td",[t._v("L")]),t._v(" "),v("td",[t._v("38")])]),t._v(" "),v("tr",[v("td",[t._v("M")]),t._v(" "),v("td",[t._v("50")])]),t._v(" "),v("tr",[v("td",[t._v("N")]),t._v(" "),v("td",[t._v("49")])]),t._v(" "),v("tr",[v("td",[t._v("O")]),t._v(" "),v("td",[t._v("24")])]),t._v(" "),v("tr",[v("td",[t._v("P")]),t._v(" "),v("td",[t._v("25")])]),t._v(" "),v("tr",[v("td",[t._v("Q")]),t._v(" "),v("td",[t._v("16")])]),t._v(" "),v("tr",[v("td",[t._v("R")]),t._v(" "),v("td",[t._v("19")])]),t._v(" "),v("tr",[v("td",[t._v("S")]),t._v(" "),v("td",[t._v("31")])]),t._v(" "),v("tr",[v("td",[t._v("T")]),t._v(" "),v("td",[t._v("20")])]),t._v(" "),v("tr",[v("td",[t._v("U")]),t._v(" "),v("td",[t._v("22")])]),t._v(" "),v("tr",[v("td",[t._v("V")]),t._v(" "),v("td",[t._v("47")])]),t._v(" "),v("tr",[v("td",[t._v("W")]),t._v(" "),v("td",[t._v("17")])]),t._v(" "),v("tr",[v("td",[t._v("X")]),t._v(" "),v("td",[t._v("45")])]),t._v(" "),v("tr",[v("td",[t._v("Y")]),t._v(" "),v("td",[t._v("21")])]),t._v(" "),v("tr",[v("td",[t._v("Z")]),t._v(" "),v("td",[t._v("44")])]),t._v(" "),v("tr",[v("td",[t._v("0")]),t._v(" "),v("td",[t._v("11")])]),t._v(" "),v("tr",[v("td",[t._v("1")]),t._v(" "),v("td",[t._v("2")])]),t._v(" "),v("tr",[v("td",[t._v("2")]),t._v(" "),v("td",[t._v("3")])]),t._v(" "),v("tr",[v("td",[t._v("3")]),t._v(" "),v("td",[t._v("4")])]),t._v(" "),v("tr",[v("td",[t._v("4")]),t._v(" "),v("td",[t._v("5")])]),t._v(" "),v("tr",[v("td",[t._v("5")]),t._v(" "),v("td",[t._v("6")])]),t._v(" "),v("tr",[v("td",[t._v("6")]),t._v(" "),v("td",[t._v("7")])]),t._v(" "),v("tr",[v("td",[t._v("7")]),t._v(" "),v("td",[t._v("8")])]),t._v(" "),v("tr",[v("td",[t._v("8")]),t._v(" "),v("td",[t._v("9")])]),t._v(" "),v("tr",[v("td",[t._v("9")]),t._v(" "),v("td",[t._v("10")])]),t._v(" "),v("tr",[v("td",[t._v("F1")]),t._v(" "),v("td",[t._v("59")])]),t._v(" "),v("tr",[v("td",[t._v("F2")]),t._v(" "),v("td",[t._v("60")])]),t._v(" "),v("tr",[v("td",[t._v("F3")]),t._v(" "),v("td",[t._v("61")])]),t._v(" "),v("tr",[v("td",[t._v("F4")]),t._v(" "),v("td",[t._v("62")])]),t._v(" "),v("tr",[v("td",[t._v("F5")]),t._v(" "),v("td",[t._v("63")])]),t._v(" "),v("tr",[v("td",[t._v("F6")]),t._v(" "),v("td",[t._v("64")])]),t._v(" "),v("tr",[v("td",[t._v("F7")]),t._v(" "),v("td",[t._v("65")])]),t._v(" "),v("tr",[v("td",[t._v("F8")]),t._v(" "),v("td",[t._v("66")])]),t._v(" "),v("tr",[v("td",[t._v("F9")]),t._v(" "),v("td",[t._v("67")])]),t._v(" "),v("tr",[v("td",[t._v("F10")]),t._v(" "),v("td",[t._v("68")])]),t._v(" "),v("tr",[v("td",[t._v("F11")]),t._v(" "),v("td",[t._v("87")])]),t._v(" "),v("tr",[v("td",[t._v("F12")]),t._v(" "),v("td",[t._v("88")])]),t._v(" "),v("tr",[v("td",[t._v("F13")]),t._v(" "),v("td",[t._v("91")])]),t._v(" "),v("tr",[v("td",[t._v("F14")]),t._v(" "),v("td",[t._v("92")])]),t._v(" "),v("tr",[v("td",[t._v("F15")]),t._v(" "),v("td",[t._v("93")])]),t._v(" "),v("tr",[v("td",[t._v("F16")]),t._v(" "),v("td",[t._v("99")])]),t._v(" "),v("tr",[v("td",[t._v("F17")]),t._v(" "),v("td",[t._v("100")])]),t._v(" "),v("tr",[v("td",[t._v("F18")]),t._v(" "),v("td",[t._v("101")])]),t._v(" "),v("tr",[v("td",[t._v("F19")]),t._v(" "),v("td",[t._v("102")])]),t._v(" "),v("tr",[v("td",[t._v("F20")]),t._v(" "),v("td",[t._v("103")])]),t._v(" "),v("tr",[v("td",[t._v("F21")]),t._v(" "),v("td",[t._v("104")])]),t._v(" "),v("tr",[v("td",[t._v("F22")]),t._v(" "),v("td",[t._v("105")])]),t._v(" "),v("tr",[v("td",[t._v("F23")]),t._v(" "),v("td",[t._v("106")])]),t._v(" "),v("tr",[v("td",[t._v("F24")]),t._v(" "),v("td",[t._v("107")])]),t._v(" "),v("tr",[v("td",[t._v("ESC")]),t._v(" "),v("td",[t._v("1")])]),t._v(" "),v("tr",[v("td",[t._v("-")]),t._v(" "),v("td",[t._v("12")])]),t._v(" "),v("tr",[v("td",[t._v("=/+")]),t._v(" "),v("td",[t._v("13")])]),t._v(" "),v("tr",[v("td",[t._v("Backspace")]),t._v(" "),v("td",[t._v("14")])]),t._v(" "),v("tr",[v("td",[t._v("Tab")]),t._v(" "),v("td",[t._v("15")])]),t._v(" "),v("tr",[v("td",[t._v("Caps Lock")]),t._v(" "),v("td",[t._v("58")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Up")]),t._v(" "),v("td",[t._v("57416")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Left")]),t._v(" "),v("td",[t._v("57419")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Right")]),t._v(" "),v("td",[t._v("57421")])]),t._v(" "),v("tr",[v("td",[t._v("Cursor Down")]),t._v(" "),v("td",[t._v("57424")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 0")]),t._v(" "),v("td",[t._v("82")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 1")]),t._v(" "),v("td",[t._v("79")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 2")]),t._v(" "),v("td",[t._v("80")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 3")]),t._v(" "),v("td",[t._v("81")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 4")]),t._v(" "),v("td",[t._v("75")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 5")]),t._v(" "),v("td",[t._v("76")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 6")]),t._v(" "),v("td",[t._v("77")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 7")]),t._v(" "),v("td",[t._v("71")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 8")]),t._v(" "),v("td",[t._v("72")])]),t._v(" "),v("tr",[v("td",[t._v("NumPad 9")]),t._v(" "),v("td",[t._v("73")])]),t._v(" "),v("tr",[v("td",[t._v("Ctrl left")]),t._v(" "),v("td",[t._v("29")])]),t._v(" "),v("tr",[v("td",[t._v("Ctrl right")]),t._v(" "),v("td",[t._v("3613")])]),t._v(" "),v("tr",[v("td",[t._v("Alt left")]),t._v(" "),v("td",[t._v("56")])]),t._v(" "),v("tr",[v("td",[t._v("Alt right")]),t._v(" "),v("td",[t._v("3640")])]),t._v(" "),v("tr",[v("td",[t._v("Context Menu")]),t._v(" "),v("td",[t._v("3677")])]),t._v(" "),v("tr",[v("td",[t._v("Windows Key")]),t._v(" "),v("td",[t._v("3675 or 3676")])]),t._v(" "),v("tr",[v("td",[t._v("SPACE")]),t._v(" "),v("td",[t._v("57")])]),t._v(" "),v("tr",[v("td",[t._v("Print Screen")]),t._v(" "),v("td",[t._v("3639")])]),t._v(" "),v("tr",[v("td",[t._v("Scroll Lock")]),t._v(" "),v("td",[t._v("70")])]),t._v(" "),v("tr",[v("td",[t._v("Pause")]),t._v(" "),v("td",[t._v("3653")])]),t._v(" "),v("tr",[v("td",[t._v("Enter")]),t._v(" "),v("td",[t._v("28")])]),t._v(" "),v("tr",[v("td",[t._v("Page Up")]),t._v(" "),v("td",[t._v("3657")])]),t._v(" "),v("tr",[v("td",[t._v("Page Down")]),t._v(" "),v("td",[t._v("3665")])]),t._v(" "),v("tr",[v("td",[t._v(",")]),t._v(" "),v("td",[t._v("51")])]),t._v(" "),v("tr",[v("td",[t._v(".")]),t._v(" "),v("td",[t._v("52")])])])]),t._v(" "),v("p",[v("a",{attrs:{href:"https://github.com/kwhat/jnativehook/blob/master/src/java/org/jnativehook/keyboard/NativeKeyEvent.java",title:"Opens external link in new window",target:"_blank",rel:"noopener noreferrer"}},[t._v("Click here"),v("OutboundLink")],1),t._v(" to view a full list of keycodes.")]),t._v(" "),v("h2",{attrs:{id:"input-port-description"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("keyCode [integer]:")]),t._v(" The keycode of the key which should be captured. For a list of the mapping between keycodes and keys see the graphics above.")])]),t._v(" "),v("h2",{attrs:{id:"event-trigger-description"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("keyPressed:")]),t._v(" This event port fires an event if the key with the specified keyCode was pressed.")]),t._v(" "),v("li",[v("strong",[t._v("keyReleased:")]),t._v(" This event port fires an event if the key with the specified keyCode was released.")])]),t._v(" "),v("h2",{attrs:{id:"event-listener-description"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("enable:")]),t._v(" The keystate is captured and events get fired")]),t._v(" "),v("li",[v("strong",[t._v("disable:")]),t._v(" The plugin does not fire any event.")]),t._v(" "),v("li",[v("strong",[t._v("block:")]),t._v(" After this event, the keystroke of the key with the specified keyCode is not forwarded to the operating system.")]),t._v(" "),v("li",[v("strong",[t._v("unblock:")]),t._v(" After this event, the keystroke of the key with the specified keyCode is forwarded to the operating system.")])]),t._v(" "),v("h2",{attrs:{id:"properties"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),v("ul",[v("li",[v("strong",[t._v("block [boolean]:")]),t._v(" If this property is set to true, no key press activities will be routed to the operating system")]),t._v(" "),v("li",[v("strong",[t._v("keyCode[integer]:")]),t._v(" The keycode of the key which should be captured. For a list of the mapping between keycodes and keys see the graphics above.")])])])}),[],!1,null,null,null);v.default=r.exports},811:function(t,v,_){t.exports=_.p+"assets/img/keycapture.23ab76be.jpg"}}]); \ No newline at end of file diff --git a/assets/js/260.2b62d609.js b/assets/js/261.b5067531.js similarity index 94% rename from assets/js/260.2b62d609.js rename to assets/js/261.b5067531.js index a6ad282603..f4bac3b790 100644 --- a/assets/js/260.2b62d609.js +++ b/assets/js/261.b5067531.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[260],{1234:function(e,t,s){"use strict";s.r(t);var r=s(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),e._v(" "),t("p",[e._v("This component provides access to keystrokes input via a standard keyboard. The keystroke capture does not depend on a particular window or text field to have the input focus. The keycodes of the pressed keys and accumulated words (multiple keys separated by ) are provided at the output ports of this component. Possible applications include triggering functions by keyboard input, interfacing to speech recognition software or remapping keys to other keycodes.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(806),alt:"Screenshot: KeyboardCapture plugin",title:"Screenshot: KeyboardCapture plugin"}})]),e._v(" "),t("p",[e._v("KeyboardCapture plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A keyboard which generates keystrokes or a software component which injects keystrokes into the operating system message queue.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keyCode [integer]:")]),e._v(" This port sends the virtual keycode of the last pressed key as an integer value.")]),e._v(" "),t("li",[t("strong",[e._v("words [string]:")]),e._v(" This ports accumulates keystrokes and sends them as a string as soon as a blank separator (space key) appears in the key input stream.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("recognizedCommand1 - recognizedCommand10:")]),e._v(" These event ports fire an event if one of seven command strings has been detected in the current input stream of keys.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("blockEvents [boolean]:")]),e._v(" If this property is set to true, no key press activities will be routed to the operating system - they will not be processed by other applications and disappear. If the property value is set to false, keystrokes will be passed back to the operating system and processed as usual.")]),e._v(" "),t("li",[t("strong",[e._v("command1 [string] - command10 [string]:")]),e._v(" Seven string properties to specify command strings. The component looks for these command strings in the input stream of keystrokes. If a command string matches, the corresponding event trigger port is raised. This can be useful for example to define voice commands which should trigger certain actions in other ARE plugins.")])])])}),[],!1,null,null,null);t.default=o.exports},806:function(e,t,s){e.exports=s.p+"assets/img/keyboardcapture.483dae78.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[261],{1240:function(e,t,s){"use strict";s.r(t);var r=s(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),e._v(" "),t("p",[e._v("This component provides access to keystrokes input via a standard keyboard. The keystroke capture does not depend on a particular window or text field to have the input focus. The keycodes of the pressed keys and accumulated words (multiple keys separated by ) are provided at the output ports of this component. Possible applications include triggering functions by keyboard input, interfacing to speech recognition software or remapping keys to other keycodes.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(812),alt:"Screenshot: KeyboardCapture plugin",title:"Screenshot: KeyboardCapture plugin"}})]),e._v(" "),t("p",[e._v("KeyboardCapture plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A keyboard which generates keystrokes or a software component which injects keystrokes into the operating system message queue.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keyCode [integer]:")]),e._v(" This port sends the virtual keycode of the last pressed key as an integer value.")]),e._v(" "),t("li",[t("strong",[e._v("words [string]:")]),e._v(" This ports accumulates keystrokes and sends them as a string as soon as a blank separator (space key) appears in the key input stream.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("recognizedCommand1 - recognizedCommand10:")]),e._v(" These event ports fire an event if one of seven command strings has been detected in the current input stream of keys.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("blockEvents [boolean]:")]),e._v(" If this property is set to true, no key press activities will be routed to the operating system - they will not be processed by other applications and disappear. If the property value is set to false, keystrokes will be passed back to the operating system and processed as usual.")]),e._v(" "),t("li",[t("strong",[e._v("command1 [string] - command10 [string]:")]),e._v(" Seven string properties to specify command strings. The component looks for these command strings in the input stream of keystrokes. If a command string matches, the corresponding event trigger port is raised. This can be useful for example to define voice commands which should trigger certain actions in other ARE plugins.")])])])}),[],!1,null,null,null);t.default=o.exports},812:function(e,t,s){e.exports=s.p+"assets/img/keyboardcapture.483dae78.jpg"}}]); \ No newline at end of file diff --git a/assets/js/261.ab228d2e.js b/assets/js/262.3dd87d32.js similarity index 95% rename from assets/js/261.ab228d2e.js rename to assets/js/262.3dd87d32.js index 858dcc89f9..5d221b3a78 100644 --- a/assets/js/261.ab228d2e.js +++ b/assets/js/262.3dd87d32.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[261],{1236:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"kinect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kinect"}},[e._v("#")]),e._v(" Kinect")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Visions)")]),e._v(" "),t("p",[e._v("The Kinect component interfaces to the Microsoft Kinect camera over the OpenNI library. It provides the skeleton Data of exactly one person in front of the kinect camera.")]),e._v(" "),t("p",[e._v("For the installation of the OpenNI framework and the drivers see for example "),t("a",{attrs:{href:"http://studentguru.gr/b/vangos/archive/2011/01/20/how-to-successfully-install-kinect-windows-openni-nite.aspx",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:o(808),alt:"Screenshot: Kinect plugin",title:"Screenshot: Kinect plugin"}})]),e._v(" "),t("p",[e._v("Kinect plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A Microsoft Kinect must be connected to the system.")]),e._v(" "),t("li",[e._v("The installed drivers must be compatible to the framework. e.g. The SensorKinect drivers work perfectly.")]),e._v(" "),t("li",[e._v("The OpenNI Framework must be installed.")]),e._v(" "),t("li",[e._v("The Nite Middleware must be installed")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("p",[e._v("The range of the coordinates is 0 - 640 for the x coordinates and 0 - 480 for the y coordinates if centerZeroPoint is set false and -320 - 320 for the x coordinate and -240 - 240 for the y coordinate when set to true.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("HeadX [double]:")]),e._v(" The X position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadY [double]:")]),e._v(" The Y position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadZ [double]:")]),e._v(" The Z position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("leftHandX [double]:")]),e._v(" The X position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("leftHandY [double]:")]),e._v(" The Y position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("leftHandZ [double]:")]),e._v(" The Z position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightHandX [double]:")]),e._v(" The X position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightHandY [double]:")]),e._v(" The Y position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightHandZ [double]:")]),e._v(" The Z position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightFootX [double]:")]),e._v(" The X position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("rightFootY [double]:")]),e._v(" The Y position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("rightFootZ [double]:")]),e._v(" The Z position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("leftFootX [double]:")]),e._v(" The X position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("leftFootY [double]:")]),e._v(" The Y position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("leftFootZ [double]:")]),e._v(" The Z position of the left Foot")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("visualize [boolean]:")]),e._v(" When set to true a windows is displayed which shows the tracked skeleton. While the window is simply grey, no skeleton has been found yet.")]),e._v(" "),t("li",[t("strong",[e._v("centerZeroPoint [boolean]:")]),e._v(" Specifies wether the 0,0 point is at the top left corner (centerZeroPoint=false) or in the middle of the frame (centerZeroPoint=true)")])])])}),[],!1,null,null,null);t.default=n.exports},808:function(e,t,o){e.exports=o.p+"assets/img/kinect.b78672d6.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[262],{1248:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"kinect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kinect"}},[e._v("#")]),e._v(" Kinect")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Visions)")]),e._v(" "),t("p",[e._v("The Kinect component interfaces to the Microsoft Kinect camera over the OpenNI library. It provides the skeleton Data of exactly one person in front of the kinect camera.")]),e._v(" "),t("p",[e._v("For the installation of the OpenNI framework and the drivers see for example "),t("a",{attrs:{href:"http://studentguru.gr/b/vangos/archive/2011/01/20/how-to-successfully-install-kinect-windows-openni-nite.aspx",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:o(823),alt:"Screenshot: Kinect plugin",title:"Screenshot: Kinect plugin"}})]),e._v(" "),t("p",[e._v("Kinect plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A Microsoft Kinect must be connected to the system.")]),e._v(" "),t("li",[e._v("The installed drivers must be compatible to the framework. e.g. The SensorKinect drivers work perfectly.")]),e._v(" "),t("li",[e._v("The OpenNI Framework must be installed.")]),e._v(" "),t("li",[e._v("The Nite Middleware must be installed")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("p",[e._v("The range of the coordinates is 0 - 640 for the x coordinates and 0 - 480 for the y coordinates if centerZeroPoint is set false and -320 - 320 for the x coordinate and -240 - 240 for the y coordinate when set to true.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("HeadX [double]:")]),e._v(" The X position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadY [double]:")]),e._v(" The Y position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadZ [double]:")]),e._v(" The Z position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("leftHandX [double]:")]),e._v(" The X position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("leftHandY [double]:")]),e._v(" The Y position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("leftHandZ [double]:")]),e._v(" The Z position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightHandX [double]:")]),e._v(" The X position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightHandY [double]:")]),e._v(" The Y position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightHandZ [double]:")]),e._v(" The Z position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("rightFootX [double]:")]),e._v(" The X position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("rightFootY [double]:")]),e._v(" The Y position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("rightFootZ [double]:")]),e._v(" The Z position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("leftFootX [double]:")]),e._v(" The X position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("leftFootY [double]:")]),e._v(" The Y position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("leftFootZ [double]:")]),e._v(" The Z position of the left Foot")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("visualize [boolean]:")]),e._v(" When set to true a windows is displayed which shows the tracked skeleton. While the window is simply grey, no skeleton has been found yet.")]),e._v(" "),t("li",[t("strong",[e._v("centerZeroPoint [boolean]:")]),e._v(" Specifies wether the 0,0 point is at the top left corner (centerZeroPoint=false) or in the middle of the frame (centerZeroPoint=true)")])])])}),[],!1,null,null,null);t.default=n.exports},823:function(e,t,o){e.exports=o.p+"assets/img/kinect.b78672d6.jpg"}}]); \ No newline at end of file diff --git a/assets/js/262.da3e9d1e.js b/assets/js/263.1d93cb25.js similarity index 97% rename from assets/js/262.da3e9d1e.js rename to assets/js/263.1d93cb25.js index 8ea76f00d7..c192998900 100644 --- a/assets/js/262.da3e9d1e.js +++ b/assets/js/263.1d93cb25.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[262],{1237:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"kinectj4k"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kinectj4k"}},[e._v("#")]),e._v(" KinectJ4K")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Visions)")]),e._v(" "),t("p",[e._v("The Kinect component interfaces to the Microsoft Kinect v1 camera over the "),t("a",{attrs:{href:"http://research.dwi.ufl.edu/ufdw/j4k/J4KSDK.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("J4K library"),t("OutboundLink")],1),e._v(". It provides the skeleton data of exactly one person in front of the kinect v1 camera.")]),e._v(" "),t("p",[e._v("For the installation the SDK from Microsoft is needed. The plugin was tested with the SDK-Version 1.5 (see "),t("a",{attrs:{href:"http://www.microsoft.com/en-us/download/details.aspx?id=29866",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[t("img",{attrs:{src:o(809),alt:"Screenshot: KinectJ4K plugin",title:"Screenshot: KinectJ4K plugin"}})]),e._v(" "),t("p",[e._v("KinectJ4K plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A Microsoft Kinect v1 must be connected to the system.")]),e._v(" "),t("li",[e._v("The drivers from Microsoft (usually installed with the SDK) are required.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("p",[e._v("You can find more information about the Coordinate Spaces "),t("a",{attrs:{href:"http://www.microsoft.com/en-us/download/details.aspx?id=29866",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("FootLeftX [double]:")]),e._v(" The X position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootLeftY [double]:")]),e._v(" The Y position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootLeftZ [double]:")]),e._v(" The Z position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootRightX [double]:")]),e._v(" The X position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootRightY [double]:")]),e._v(" The Y position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootRightZ [double]:")]),e._v(" The Z position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("AnkleLeftX [double]:")]),e._v(" The X position of the left Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleLeftY [double]:")]),e._v(" The Y position of the left Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleLeftZ [double]:")]),e._v(" The Z position of the left Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleRightX [double]:")]),e._v(" The X position of the right Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleRightY [double]:")]),e._v(" The Y position of the right Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleRightZ [double]:")]),e._v(" The Z position of the right Ankle")]),e._v(" "),t("li",[t("strong",[e._v("KneeLeftX [double]:")]),e._v(" The X position of the left Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeLeftY [double]:")]),e._v(" The Y position of the left Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeLeftZ [double]:")]),e._v(" The Z position of the left Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeRightX [double]:")]),e._v(" The X position of the right Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeRightY [double]:")]),e._v(" The Y position of the right Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeRightZ [double]:")]),e._v(" The Z position of the right Knee")]),e._v(" "),t("li",[t("strong",[e._v("HipLeftX [double]:")]),e._v(" The X position of the left side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipLeftY [double]:")]),e._v(" The Y position of the left side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipLeftZ [double]:")]),e._v(" The Z position of the left side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipCenterX [double]:")]),e._v(" The X position of the center of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipCenterY [double]:")]),e._v(" The Y position of the center of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipCenterZ [double]:")]),e._v(" The Z position of the center of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipRightX [double]:")]),e._v(" The X position of the right side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipRightY [double]:")]),e._v(" The Y position of the right side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipRightZ [double]:")]),e._v(" The Z position of the right side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("SpineX [double]:")]),e._v(" The X position of the Spine")]),e._v(" "),t("li",[t("strong",[e._v("SpineY [double]:")]),e._v(" The Y position of the Spine")]),e._v(" "),t("li",[t("strong",[e._v("SpineZ [double]:")]),e._v(" The Z position of the Spine")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderLeftX [double]:")]),e._v(" The X position of the left Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderLeftY [double]:")]),e._v(" The Y position of the left Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderLeftZ [double]:")]),e._v(" The Z position of the left Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderCenterX [double]:")]),e._v(" The X position of the area between the Shoulders")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderCenterY [double]:")]),e._v(" The Y position of the area between the Shoulders")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderCenterZ [double]:")]),e._v(" The Z position of the area between the Shoulders")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderRightX [double]:")]),e._v(" The X position of the right Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderRightY [double]:")]),e._v(" The Y position of the right Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderRightZ [double]:")]),e._v(" The Z position of the right Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ElbowLeftX [double]:")]),e._v(" The X position of the left Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowLeftY [double]:")]),e._v(" The Y position of the left Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowLeftZ [double]:")]),e._v(" The Z position of the left Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowRightX [double]:")]),e._v(" The X position of the right Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowRightY [double]:")]),e._v(" The Y position of the right Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowRightZ [double]:")]),e._v(" The Z position of the right Elbow")]),e._v(" "),t("li",[t("strong",[e._v("WristLeftX [double]:")]),e._v(" The X position of the left Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristLeftY [double]:")]),e._v(" The Y position of the left Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristLeftZ [double]:")]),e._v(" The Z position of the left Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristRightX [double]:")]),e._v(" The X position of the right Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristRightY [double]:")]),e._v(" The Y position of the right Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristRightZ [double]:")]),e._v(" The Z position of the right Wrist")]),e._v(" "),t("li",[t("strong",[e._v("HandLeftX [double]:")]),e._v(" The X position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandLeftY [double]:")]),e._v(" The Y position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandLeftZ [double]:")]),e._v(" The Z position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandRightX [double]:")]),e._v(" The X position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandRightY [double]:")]),e._v(" The Y position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandRightZ [double]:")]),e._v(" The Z position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("HeadX [double]:")]),e._v(" The X position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadY [double]:")]),e._v(" The Y position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadZ [double]:")]),e._v(" The Z position of the Head")])])])}),[],!1,null,null,null);t.default=n.exports},809:function(e,t,o){e.exports=o.p+"assets/img/kinectj4k.519d9582.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[263],{1244:function(e,t,o){"use strict";o.r(t);var i=o(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"kinectj4k"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kinectj4k"}},[e._v("#")]),e._v(" KinectJ4K")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Visions)")]),e._v(" "),t("p",[e._v("The Kinect component interfaces to the Microsoft Kinect v1 camera over the "),t("a",{attrs:{href:"http://research.dwi.ufl.edu/ufdw/j4k/J4KSDK.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("J4K library"),t("OutboundLink")],1),e._v(". It provides the skeleton data of exactly one person in front of the kinect v1 camera.")]),e._v(" "),t("p",[e._v("For the installation the SDK from Microsoft is needed. The plugin was tested with the SDK-Version 1.5 (see "),t("a",{attrs:{href:"http://www.microsoft.com/en-us/download/details.aspx?id=29866",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[t("img",{attrs:{src:o(818),alt:"Screenshot: KinectJ4K plugin",title:"Screenshot: KinectJ4K plugin"}})]),e._v(" "),t("p",[e._v("KinectJ4K plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A Microsoft Kinect v1 must be connected to the system.")]),e._v(" "),t("li",[e._v("The drivers from Microsoft (usually installed with the SDK) are required.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("p",[e._v("You can find more information about the Coordinate Spaces "),t("a",{attrs:{href:"http://www.microsoft.com/en-us/download/details.aspx?id=29866",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("FootLeftX [double]:")]),e._v(" The X position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootLeftY [double]:")]),e._v(" The Y position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootLeftZ [double]:")]),e._v(" The Z position of the left Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootRightX [double]:")]),e._v(" The X position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootRightY [double]:")]),e._v(" The Y position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("FootRightZ [double]:")]),e._v(" The Z position of the right Foot")]),e._v(" "),t("li",[t("strong",[e._v("AnkleLeftX [double]:")]),e._v(" The X position of the left Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleLeftY [double]:")]),e._v(" The Y position of the left Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleLeftZ [double]:")]),e._v(" The Z position of the left Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleRightX [double]:")]),e._v(" The X position of the right Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleRightY [double]:")]),e._v(" The Y position of the right Ankle")]),e._v(" "),t("li",[t("strong",[e._v("AnkleRightZ [double]:")]),e._v(" The Z position of the right Ankle")]),e._v(" "),t("li",[t("strong",[e._v("KneeLeftX [double]:")]),e._v(" The X position of the left Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeLeftY [double]:")]),e._v(" The Y position of the left Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeLeftZ [double]:")]),e._v(" The Z position of the left Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeRightX [double]:")]),e._v(" The X position of the right Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeRightY [double]:")]),e._v(" The Y position of the right Knee")]),e._v(" "),t("li",[t("strong",[e._v("KneeRightZ [double]:")]),e._v(" The Z position of the right Knee")]),e._v(" "),t("li",[t("strong",[e._v("HipLeftX [double]:")]),e._v(" The X position of the left side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipLeftY [double]:")]),e._v(" The Y position of the left side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipLeftZ [double]:")]),e._v(" The Z position of the left side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipCenterX [double]:")]),e._v(" The X position of the center of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipCenterY [double]:")]),e._v(" The Y position of the center of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipCenterZ [double]:")]),e._v(" The Z position of the center of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipRightX [double]:")]),e._v(" The X position of the right side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipRightY [double]:")]),e._v(" The Y position of the right side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("HipRightZ [double]:")]),e._v(" The Z position of the right side of the Hip")]),e._v(" "),t("li",[t("strong",[e._v("SpineX [double]:")]),e._v(" The X position of the Spine")]),e._v(" "),t("li",[t("strong",[e._v("SpineY [double]:")]),e._v(" The Y position of the Spine")]),e._v(" "),t("li",[t("strong",[e._v("SpineZ [double]:")]),e._v(" The Z position of the Spine")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderLeftX [double]:")]),e._v(" The X position of the left Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderLeftY [double]:")]),e._v(" The Y position of the left Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderLeftZ [double]:")]),e._v(" The Z position of the left Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderCenterX [double]:")]),e._v(" The X position of the area between the Shoulders")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderCenterY [double]:")]),e._v(" The Y position of the area between the Shoulders")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderCenterZ [double]:")]),e._v(" The Z position of the area between the Shoulders")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderRightX [double]:")]),e._v(" The X position of the right Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderRightY [double]:")]),e._v(" The Y position of the right Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ShoulderRightZ [double]:")]),e._v(" The Z position of the right Shoulder")]),e._v(" "),t("li",[t("strong",[e._v("ElbowLeftX [double]:")]),e._v(" The X position of the left Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowLeftY [double]:")]),e._v(" The Y position of the left Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowLeftZ [double]:")]),e._v(" The Z position of the left Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowRightX [double]:")]),e._v(" The X position of the right Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowRightY [double]:")]),e._v(" The Y position of the right Elbow")]),e._v(" "),t("li",[t("strong",[e._v("ElbowRightZ [double]:")]),e._v(" The Z position of the right Elbow")]),e._v(" "),t("li",[t("strong",[e._v("WristLeftX [double]:")]),e._v(" The X position of the left Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristLeftY [double]:")]),e._v(" The Y position of the left Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristLeftZ [double]:")]),e._v(" The Z position of the left Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristRightX [double]:")]),e._v(" The X position of the right Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristRightY [double]:")]),e._v(" The Y position of the right Wrist")]),e._v(" "),t("li",[t("strong",[e._v("WristRightZ [double]:")]),e._v(" The Z position of the right Wrist")]),e._v(" "),t("li",[t("strong",[e._v("HandLeftX [double]:")]),e._v(" The X position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandLeftY [double]:")]),e._v(" The Y position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandLeftZ [double]:")]),e._v(" The Z position of the left Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandRightX [double]:")]),e._v(" The X position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandRightY [double]:")]),e._v(" The Y position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("HandRightZ [double]:")]),e._v(" The Z position of the right Hand")]),e._v(" "),t("li",[t("strong",[e._v("HeadX [double]:")]),e._v(" The X position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadY [double]:")]),e._v(" The Y position of the Head")]),e._v(" "),t("li",[t("strong",[e._v("HeadZ [double]:")]),e._v(" The Z position of the Head")])])])}),[],!1,null,null,null);t.default=n.exports},818:function(e,t,o){e.exports=o.p+"assets/img/kinectj4k.519d9582.png"}}]); \ No newline at end of file diff --git a/assets/js/263.1d689a6a.js b/assets/js/264.0c9b9a91.js similarity index 95% rename from assets/js/263.1d689a6a.js rename to assets/js/264.0c9b9a91.js index 1ded6ebc86..3690b43408 100644 --- a/assets/js/263.1d689a6a.js +++ b/assets/js/264.0c9b9a91.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[263],{1240:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"lightscore"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightscore"}},[t._v("#")]),t._v(" Lightscore")]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),t._v(" "),e("p",[t._v("The Lightscore plugin provides the data output of the 9DOF IMU and RGB-color sensor "),e("a",{attrs:{href:"https://allesoderlicht.com/Archive/projects/lightscores",target:"_blank",rel:"noopener noreferrer"}},[t._v("lightscores"),e("OutboundLink")],1),t._v(". Additionally to the raw data, calculated euler values of the orentation (picht, yaw, roll) are provided. Please note that this in an early version of the product and the installation process is thus a bit demanding …")]),t._v(" "),e("p",[e("img",{attrs:{src:r(814),alt:"Screenshot: Lightscore plugin",title:"Screenshot: Lightscore plugin"}})]),t._v(" "),e("p",[t._v("Lightscore plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This plugin requires a lightscroes BLE sensor module connected to the AsTeRICS platform, please contact "),e("a",{attrs:{href:"https://allesoderlicht.com/contact",target:"_blank",rel:"noopener noreferrer"}},[t._v("AllesOderLicht"),e("OutboundLink")],1),t._v(" for cooperation or details about the hardware.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("led1 [double]:")]),t._v(" light intensity for led1. [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("led2 [double]:")]),t._v(" light intensity for led2. [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("led3 [double]:")]),t._v(" light intensity for led3. [currently not used]")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("start:")]),t._v(" start data transfer [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("stop:")]),t._v(" stop data transfer [currently not used]")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("red [double]:")]),t._v(" Red light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("green [double]:")]),t._v(" Green light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("blue double]:")]),t._v(" Blue light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("white [double]:")]),t._v(" White / total light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("accX [double]:")]),t._v(" Acceleration X axis.")]),t._v(" "),e("li",[e("strong",[t._v("accY [double]:")]),t._v(" Acceleration Y axis.")]),t._v(" "),e("li",[e("strong",[t._v("accZ [double]:")]),t._v(" Acceleration Z axis.")]),t._v(" "),e("li",[e("strong",[t._v("magX [double]:")]),t._v(" Magnetometer X axis.")]),t._v(" "),e("li",[e("strong",[t._v("magY [double]:")]),t._v(" Magnetometer Y axis.")]),t._v(" "),e("li",[e("strong",[t._v("magZ [double]:")]),t._v(" Magnetometer Z axis.")]),t._v(" "),e("li",[e("strong",[t._v("gyrX [double]:")]),t._v(" Gyroscope X axis.")]),t._v(" "),e("li",[e("strong",[t._v("gyrY [double]:")]),t._v(" Gyroscope Y axis.")]),t._v(" "),e("li",[e("strong",[t._v("gyrZ [double]:")]),t._v(" Gyroscope Z axis.")]),t._v(" "),e("li",[e("strong",[t._v("yaw [double]:")]),t._v(" Yaw value in euler degrees.")]),t._v(" "),e("li",[e("strong",[t._v("pitch [double]:")]),t._v(" Pitch value in euler degrees.")]),t._v(" "),e("li",[e("strong",[t._v("roll [double]:")]),t._v(" Roll value in euler degrees.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("autostart [Boolean]:")]),t._v(" Start data transmission automatically after model start. [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("id [String]:")]),t._v(" ID number of the lichtscores sensor. [currently not used]")])])])}),[],!1,null,null,null);e.default=s.exports},814:function(t,e,r){t.exports=r.p+"assets/img/lightscore.c0b77e36.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[264],{1243:function(t,e,r){"use strict";r.r(e);var o=r(2),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"lightscore"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightscore"}},[t._v("#")]),t._v(" Lightscore")]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),t._v(" "),e("p",[t._v("The Lightscore plugin provides the data output of the 9DOF IMU and RGB-color sensor "),e("a",{attrs:{href:"https://allesoderlicht.com/Archive/projects/lightscores",target:"_blank",rel:"noopener noreferrer"}},[t._v("lightscores"),e("OutboundLink")],1),t._v(". Additionally to the raw data, calculated euler values of the orentation (picht, yaw, roll) are provided. Please note that this in an early version of the product and the installation process is thus a bit demanding …")]),t._v(" "),e("p",[e("img",{attrs:{src:r(817),alt:"Screenshot: Lightscore plugin",title:"Screenshot: Lightscore plugin"}})]),t._v(" "),e("p",[t._v("Lightscore plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This plugin requires a lightscroes BLE sensor module connected to the AsTeRICS platform, please contact "),e("a",{attrs:{href:"https://allesoderlicht.com/contact",target:"_blank",rel:"noopener noreferrer"}},[t._v("AllesOderLicht"),e("OutboundLink")],1),t._v(" for cooperation or details about the hardware.")]),t._v(" "),e("h2",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("led1 [double]:")]),t._v(" light intensity for led1. [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("led2 [double]:")]),t._v(" light intensity for led2. [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("led3 [double]:")]),t._v(" light intensity for led3. [currently not used]")])]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("start:")]),t._v(" start data transfer [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("stop:")]),t._v(" stop data transfer [currently not used]")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("red [double]:")]),t._v(" Red light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("green [double]:")]),t._v(" Green light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("blue double]:")]),t._v(" Blue light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("white [double]:")]),t._v(" White / total light intensity.")]),t._v(" "),e("li",[e("strong",[t._v("accX [double]:")]),t._v(" Acceleration X axis.")]),t._v(" "),e("li",[e("strong",[t._v("accY [double]:")]),t._v(" Acceleration Y axis.")]),t._v(" "),e("li",[e("strong",[t._v("accZ [double]:")]),t._v(" Acceleration Z axis.")]),t._v(" "),e("li",[e("strong",[t._v("magX [double]:")]),t._v(" Magnetometer X axis.")]),t._v(" "),e("li",[e("strong",[t._v("magY [double]:")]),t._v(" Magnetometer Y axis.")]),t._v(" "),e("li",[e("strong",[t._v("magZ [double]:")]),t._v(" Magnetometer Z axis.")]),t._v(" "),e("li",[e("strong",[t._v("gyrX [double]:")]),t._v(" Gyroscope X axis.")]),t._v(" "),e("li",[e("strong",[t._v("gyrY [double]:")]),t._v(" Gyroscope Y axis.")]),t._v(" "),e("li",[e("strong",[t._v("gyrZ [double]:")]),t._v(" Gyroscope Z axis.")]),t._v(" "),e("li",[e("strong",[t._v("yaw [double]:")]),t._v(" Yaw value in euler degrees.")]),t._v(" "),e("li",[e("strong",[t._v("pitch [double]:")]),t._v(" Pitch value in euler degrees.")]),t._v(" "),e("li",[e("strong",[t._v("roll [double]:")]),t._v(" Roll value in euler degrees.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("autostart [Boolean]:")]),t._v(" Start data transmission automatically after model start. [currently not used]")]),t._v(" "),e("li",[e("strong",[t._v("id [String]:")]),t._v(" ID number of the lichtscores sensor. [currently not used]")])])])}),[],!1,null,null,null);e.default=s.exports},817:function(t,e,r){t.exports=r.p+"assets/img/lightscore.c0b77e36.jpg"}}]); \ No newline at end of file diff --git a/assets/js/264.e275943d.js b/assets/js/265.4a13e2d8.js similarity index 93% rename from assets/js/264.e275943d.js rename to assets/js/265.4a13e2d8.js index f4f5ad4ba5..251f3d91dd 100644 --- a/assets/js/264.e275943d.js +++ b/assets/js/265.4a13e2d8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[264],{1241:function(e,t,r){"use strict";r.r(t);var i=r(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"linereader"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linereader"}},[e._v("#")]),e._v(" LineReader")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This component reads lines from a text file and sends them to an output port. The line reading can be triggered by an incoming event.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(815),alt:"Screenshot: LineReader plugin",title:"Screenshot: LineReader plugin"}})]),e._v(" "),t("p",[e._v("ButtonGrid plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("skipLines (integer):")]),e._v(" When an integer number is received at this port, the component tries to skip this number of lines. The next line will be read from the resulting position.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("actLine (string):")]),e._v(" A line of text which has been read from the file (as line termination character, the “enter”-key (\\n) is used.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("readNextLine:")]),e._v(" When this event is triggered, the component tries to read one line of text from the file and sends it to the output port.")]),e._v(" "),t("li",[t("strong",[e._v("resetToFirstLine:")]),e._v(" When this event is triggered, the internal file pointer is reset ot the beginning of the file.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("endOfFile:")]),e._v(" This event is fired when no line can be read from the file (file end or other error occurred)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("fileName [string]:")]),e._v(" The full path and file name of the text file to read. The path can be given as absolute path or relative to the ARE executable’s directory")])])])}),[],!1,null,null,null);t.default=n.exports},815:function(e,t,r){e.exports=r.p+"assets/img/linereader.11a07801.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[265],{1246:function(e,t,r){"use strict";r.r(t);var i=r(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"linereader"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linereader"}},[e._v("#")]),e._v(" LineReader")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: File System)")]),e._v(" "),t("p",[e._v("This component reads lines from a text file and sends them to an output port. The line reading can be triggered by an incoming event.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(821),alt:"Screenshot: LineReader plugin",title:"Screenshot: LineReader plugin"}})]),e._v(" "),t("p",[e._v("ButtonGrid plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("skipLines (integer):")]),e._v(" When an integer number is received at this port, the component tries to skip this number of lines. The next line will be read from the resulting position.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("actLine (string):")]),e._v(" A line of text which has been read from the file (as line termination character, the “enter”-key (\\n) is used.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("readNextLine:")]),e._v(" When this event is triggered, the component tries to read one line of text from the file and sends it to the output port.")]),e._v(" "),t("li",[t("strong",[e._v("resetToFirstLine:")]),e._v(" When this event is triggered, the internal file pointer is reset ot the beginning of the file.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("endOfFile:")]),e._v(" This event is fired when no line can be read from the file (file end or other error occurred)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("fileName [string]:")]),e._v(" The full path and file name of the text file to read. The path can be given as absolute path or relative to the ARE executable’s directory")])])])}),[],!1,null,null,null);t.default=n.exports},821:function(e,t,r){e.exports=r.p+"assets/img/linereader.11a07801.jpg"}}]); \ No newline at end of file diff --git a/assets/js/265.d4676be2.js b/assets/js/266.40a71094.js similarity index 97% rename from assets/js/265.d4676be2.js rename to assets/js/266.40a71094.js index 4e8fbcdccf..735abdf282 100644 --- a/assets/js/265.d4676be2.js +++ b/assets/js/266.40a71094.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[265],{1242:function(e,t,s){"use strict";s.r(t);var i=s(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"lipmouseir"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lipmouseir"}},[e._v("#")]),e._v(" LipmouseIR")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),e._v(" "),t("p",[e._v("This component provides signals from the Lipmouse module, which allows computer control via a mouthpiece. The user can create input signals with 3 degrees of freedom by interacting with the mouthpiece: left/right, up/down and sip/puff. The horizontal and vertical movements are measured via force sensors inside the lipmouse module. The sip/puff actions are measured via a pressure sensor. The lipmouse can be adjusted to very low force that it can be used by persons with severly reduced motor capabilites (e.g. late stage musculuar dystrophy or quadraplegia up to C1/C2 lesions). Additionally the Lipmouse has an infrared interface which enables it to control electronic devices."),t("br"),e._v("\nThrough a receiver it is possible to record commands from existing remote controls and store the codes to a database. When needed, the IR signal is reconstructed and transmitted to the device to be controlled.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(816),alt:"Screenshot: LipmouseIR plugin",title:"Screenshot: LipmouseIR plugin"}})]),e._v(" "),t("p",[e._v("The LipmouseIR sensor plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The LipmouseIR module must be connected to a USB port. Firmware for the lipmouseIR sensor can be found in the folder CIMs/Lipmouse_CIM. The free “teensy loader” tool can be used to update the firmware of the lipmouseIR module. Detailed design documentation will be provided in the future.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("DeviceType [string]:")]),e._v(" Type of the device to be controlled via IR (e.g.: TV)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceName [string]:")]),e._v(" Name of the device to be controlled via IR (e.g.: Sony, Samsung, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceFunction [string]:")]),e._v(" Name of function of the device (e.g.: On, Off, VolumeUp, etc.)")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("X [integer]:")]),e._v(" the force applied to the Lipmouse mouthpiece in x-direction")]),e._v(" "),t("li",[t("strong",[e._v("Y [integer]:")]),e._v(" the force applied to the Lipmouse mouthpiece in y-direction")]),e._v(" "),t("li",[t("strong",[e._v("pressure [integer]:")]),e._v(" the pressure value applied to the sip/puff - sensor")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("SendIRCode:")]),e._v(" Send an IR Code to the Lipmouse")]),e._v(" "),t("li",[t("strong",[e._v("RecordIRCode:")]),e._v(" Record an IR Code through the Lipmouse")]),e._v(" "),t("li",[t("strong",[e._v("calibration:")]),e._v(" if this event is received, the x/y force value is set to 0 (removing any drift of the sensor values)")]),e._v(" "),t("li",[t("strong",[e._v("setLed1:")]),e._v(" if this event is received, Led1 will be turned on")]),e._v(" "),t("li",[t("strong",[e._v("clearLed1:")]),e._v(" if this event is received, Led1 will be turned off")]),e._v(" "),t("li",[t("strong",[e._v("setLed2:")]),e._v(" if this event is received, Led2 will be turned on")]),e._v(" "),t("li",[t("strong",[e._v("clearLed2:")]),e._v(" if this event is received, Led2 will be turned off")]),e._v(" "),t("li",[t("strong",[e._v("setLed3:")]),e._v(" if this event is received, Led3 will be turned on")]),e._v(" "),t("li",[t("strong",[e._v("clearLed3:")]),e._v(" if this event is received, Led3 will be turned off")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("StartRecord:")]),e._v(" will be triggered when Lipmouse is recording")]),e._v(" "),t("li",[t("strong",[e._v("StopRecord:")]),e._v(" will be triggered when Lipmouse has finished recording")]),e._v(" "),t("li",[t("strong",[e._v("sip:")]),e._v(" will be triggered when pressure decreases under the selected sip treshold and increses back before the selected sipTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("longSip:")]),e._v(" will be triggered when pressure decreases under the selected sip treshold and increases back after the selected sipTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("sipStart:")]),e._v(" will be triggered at the moment when pressure decreases under the selected sip treshold")]),e._v(" "),t("li",[t("strong",[e._v("sipEnd:")]),e._v(" will be triggered at the moment when pressure increases above the selected sip treshold")]),e._v(" "),t("li",[t("strong",[e._v("puff:")]),e._v(" will be triggered when pressure increases above the selected puff treshold and decreases back before the selected puffTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("longPuff:")]),e._v(" will be triggered when pressure increases above the selected puff treshold and decreases back after the selected puffTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("puffStart:")]),e._v(" will be triggered at the moment when pressure increases above the selected puff treshold")]),e._v(" "),t("li",[t("strong",[e._v("puffEnd:")]),e._v(" will be triggered at the moment when pressure decreases under the selected puff treshold")]),e._v(" "),t("li",[t("strong",[e._v("button1Pressed:")]),e._v(" will be triggered when button1 of the lipmouse is pressed")]),e._v(" "),t("li",[t("strong",[e._v("button1Released:")]),e._v(" will be triggered when button1 of the lipmouse is released")]),e._v(" "),t("li",[t("strong",[e._v("button2Pressed:")]),e._v(" will be triggered when button2 of the lipmouse is pressed")]),e._v(" "),t("li",[t("strong",[e._v("button2Released:")]),e._v(" will be triggered when button2 of the lipmouse is released")]),e._v(" "),t("li",[t("strong",[e._v("button3Pressed:")]),e._v(" will be triggered when button3 of the lipmouse is pressed")]),e._v(" "),t("li",[t("strong",[e._v("button3Released:")]),e._v(" will be triggered when button3 of the lipmouse is released")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("uniqueID [integer]:")]),e._v(" a unique identifier, useful if more then one lipmouse modules are used (dynamic property).")]),e._v(" "),t("li",[t("strong",[e._v("periodicADCUpdate [integer]:")]),e._v(" the update rate for force and pressure values in milliseconds.")]),e._v(" "),t("li",[t("strong",[e._v("sipThreshold [integer]:")]),e._v(" threshold value for sip actions.")]),e._v(" "),t("li",[t("strong",[e._v("sipTime [integer]:")]),e._v(" threshold time for sip/longSip events.")]),e._v(" "),t("li",[t("strong",[e._v("puffThreshold [integer]:")]),e._v(" threshold value for puff actions.")]),e._v(" "),t("li",[t("strong",[e._v("puffTime [integer]:")]),e._v(" threshold time for puff/longPuff events.")]),e._v(" "),t("li",[t("strong",[e._v("IRCodeFilePath [string]:")]),e._v(" Filepath to the file, where the IR Codes are stored.")])]),e._v(" "),t("h2",{attrs:{id:"ir-code-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ir-code-database"}},[e._v("#")]),e._v(" IR Code Database")]),e._v(" "),t("p",[e._v("The database which contains the IR codes as well as the information about the type and name of the device and the specific function is a comma separated value file. The first value is the type, the second one is the name and the third one is the function. The following 512 values are the IR code. This database is automatically generated and maintained if new IR codes are recorded with the Lipmouse with IR functions.")])])}),[],!1,null,null,null);t.default=r.exports},816:function(e,t,s){e.exports=s.p+"assets/img/lipmouseir.135b0f05.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[266],{1247:function(e,t,s){"use strict";s.r(t);var i=s(2),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"lipmouseir"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lipmouseir"}},[e._v("#")]),e._v(" LipmouseIR")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Sensor Modules)")]),e._v(" "),t("p",[e._v("This component provides signals from the Lipmouse module, which allows computer control via a mouthpiece. The user can create input signals with 3 degrees of freedom by interacting with the mouthpiece: left/right, up/down and sip/puff. The horizontal and vertical movements are measured via force sensors inside the lipmouse module. The sip/puff actions are measured via a pressure sensor. The lipmouse can be adjusted to very low force that it can be used by persons with severly reduced motor capabilites (e.g. late stage musculuar dystrophy or quadraplegia up to C1/C2 lesions). Additionally the Lipmouse has an infrared interface which enables it to control electronic devices."),t("br"),e._v("\nThrough a receiver it is possible to record commands from existing remote controls and store the codes to a database. When needed, the IR signal is reconstructed and transmitted to the device to be controlled.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(822),alt:"Screenshot: LipmouseIR plugin",title:"Screenshot: LipmouseIR plugin"}})]),e._v(" "),t("p",[e._v("The LipmouseIR sensor plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("The LipmouseIR module must be connected to a USB port. Firmware for the lipmouseIR sensor can be found in the folder CIMs/Lipmouse_CIM. The free “teensy loader” tool can be used to update the firmware of the lipmouseIR module. Detailed design documentation will be provided in the future.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("DeviceType [string]:")]),e._v(" Type of the device to be controlled via IR (e.g.: TV)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceName [string]:")]),e._v(" Name of the device to be controlled via IR (e.g.: Sony, Samsung, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("DeviceFunction [string]:")]),e._v(" Name of function of the device (e.g.: On, Off, VolumeUp, etc.)")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("X [integer]:")]),e._v(" the force applied to the Lipmouse mouthpiece in x-direction")]),e._v(" "),t("li",[t("strong",[e._v("Y [integer]:")]),e._v(" the force applied to the Lipmouse mouthpiece in y-direction")]),e._v(" "),t("li",[t("strong",[e._v("pressure [integer]:")]),e._v(" the pressure value applied to the sip/puff - sensor")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("SendIRCode:")]),e._v(" Send an IR Code to the Lipmouse")]),e._v(" "),t("li",[t("strong",[e._v("RecordIRCode:")]),e._v(" Record an IR Code through the Lipmouse")]),e._v(" "),t("li",[t("strong",[e._v("calibration:")]),e._v(" if this event is received, the x/y force value is set to 0 (removing any drift of the sensor values)")]),e._v(" "),t("li",[t("strong",[e._v("setLed1:")]),e._v(" if this event is received, Led1 will be turned on")]),e._v(" "),t("li",[t("strong",[e._v("clearLed1:")]),e._v(" if this event is received, Led1 will be turned off")]),e._v(" "),t("li",[t("strong",[e._v("setLed2:")]),e._v(" if this event is received, Led2 will be turned on")]),e._v(" "),t("li",[t("strong",[e._v("clearLed2:")]),e._v(" if this event is received, Led2 will be turned off")]),e._v(" "),t("li",[t("strong",[e._v("setLed3:")]),e._v(" if this event is received, Led3 will be turned on")]),e._v(" "),t("li",[t("strong",[e._v("clearLed3:")]),e._v(" if this event is received, Led3 will be turned off")])]),e._v(" "),t("h2",{attrs:{id:"event-triggerer-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-triggerer-description"}},[e._v("#")]),e._v(" Event Triggerer Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("StartRecord:")]),e._v(" will be triggered when Lipmouse is recording")]),e._v(" "),t("li",[t("strong",[e._v("StopRecord:")]),e._v(" will be triggered when Lipmouse has finished recording")]),e._v(" "),t("li",[t("strong",[e._v("sip:")]),e._v(" will be triggered when pressure decreases under the selected sip treshold and increses back before the selected sipTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("longSip:")]),e._v(" will be triggered when pressure decreases under the selected sip treshold and increases back after the selected sipTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("sipStart:")]),e._v(" will be triggered at the moment when pressure decreases under the selected sip treshold")]),e._v(" "),t("li",[t("strong",[e._v("sipEnd:")]),e._v(" will be triggered at the moment when pressure increases above the selected sip treshold")]),e._v(" "),t("li",[t("strong",[e._v("puff:")]),e._v(" will be triggered when pressure increases above the selected puff treshold and decreases back before the selected puffTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("longPuff:")]),e._v(" will be triggered when pressure increases above the selected puff treshold and decreases back after the selected puffTime has passed")]),e._v(" "),t("li",[t("strong",[e._v("puffStart:")]),e._v(" will be triggered at the moment when pressure increases above the selected puff treshold")]),e._v(" "),t("li",[t("strong",[e._v("puffEnd:")]),e._v(" will be triggered at the moment when pressure decreases under the selected puff treshold")]),e._v(" "),t("li",[t("strong",[e._v("button1Pressed:")]),e._v(" will be triggered when button1 of the lipmouse is pressed")]),e._v(" "),t("li",[t("strong",[e._v("button1Released:")]),e._v(" will be triggered when button1 of the lipmouse is released")]),e._v(" "),t("li",[t("strong",[e._v("button2Pressed:")]),e._v(" will be triggered when button2 of the lipmouse is pressed")]),e._v(" "),t("li",[t("strong",[e._v("button2Released:")]),e._v(" will be triggered when button2 of the lipmouse is released")]),e._v(" "),t("li",[t("strong",[e._v("button3Pressed:")]),e._v(" will be triggered when button3 of the lipmouse is pressed")]),e._v(" "),t("li",[t("strong",[e._v("button3Released:")]),e._v(" will be triggered when button3 of the lipmouse is released")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("uniqueID [integer]:")]),e._v(" a unique identifier, useful if more then one lipmouse modules are used (dynamic property).")]),e._v(" "),t("li",[t("strong",[e._v("periodicADCUpdate [integer]:")]),e._v(" the update rate for force and pressure values in milliseconds.")]),e._v(" "),t("li",[t("strong",[e._v("sipThreshold [integer]:")]),e._v(" threshold value for sip actions.")]),e._v(" "),t("li",[t("strong",[e._v("sipTime [integer]:")]),e._v(" threshold time for sip/longSip events.")]),e._v(" "),t("li",[t("strong",[e._v("puffThreshold [integer]:")]),e._v(" threshold value for puff actions.")]),e._v(" "),t("li",[t("strong",[e._v("puffTime [integer]:")]),e._v(" threshold time for puff/longPuff events.")]),e._v(" "),t("li",[t("strong",[e._v("IRCodeFilePath [string]:")]),e._v(" Filepath to the file, where the IR Codes are stored.")])]),e._v(" "),t("h2",{attrs:{id:"ir-code-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ir-code-database"}},[e._v("#")]),e._v(" IR Code Database")]),e._v(" "),t("p",[e._v("The database which contains the IR codes as well as the information about the type and name of the device and the specific function is a comma separated value file. The first value is the type, the second one is the name and the third one is the function. The following 512 values are the IR code. This database is automatically generated and maintained if new IR codes are recorded with the Lipmouse with IR functions.")])])}),[],!1,null,null,null);t.default=r.exports},822:function(e,t,s){e.exports=s.p+"assets/img/lipmouseir.135b0f05.png"}}]); \ No newline at end of file diff --git a/assets/js/266.6e9dc86c.js b/assets/js/267.506928a1.js similarity index 96% rename from assets/js/266.6e9dc86c.js rename to assets/js/267.506928a1.js index d16891d8af..7bfbe021da 100644 --- a/assets/js/266.6e9dc86c.js +++ b/assets/js/267.506928a1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[266],{1245:function(e,t,s){"use strict";s.r(t);var i=s(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"micgpi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#micgpi"}},[e._v("#")]),e._v(" MicGPI")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Generic Control Input)")]),e._v(" "),t("p",[e._v("This component reads the input from the microphone or line-in of a computer’s sound device. The averaged amplitude / sound pressure level and the dominant frequency can be calculated and used for control purposes. It is highly recommended to use a headset microphone to avoid unwanted detections from ambient noise. The sampling rate can be set (300-44100 Hz), the other device properties are mono (1 channel) and 8 bit resoltion.")]),e._v(" "),t("p",[e._v("It is possible to attach a momentary switch via standard 3.5mm jack plug to the mic/line input of the soundcard (or a cheap USB soundcard) and use this component for detection of switch presses.")]),e._v(" "),t("p",[t("strong",[e._v("Disclaimer:")]),e._v(" Attaching a switch to mic/line input does not work with all sound cards. Although we are not aware of a permanent damage to a sound card, you do this on your own risk !")]),e._v(" "),t("p",[t("img",{attrs:{src:s(820),alt:"Screenshot: MicGPI plugin",title:"Screenshot: MicGPI plugin"}})]),e._v(" "),t("p",[e._v("MicGPI plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A internal or external sound device with mic or line input is required. If the component is utilized as switch input, a momentary switch must be attached to the line-in or microphone input jack. No additional input circuit is required. Any sort of filtering of the signal like background noise cancelling must be disabled.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("thresholdLow [int]:")]),e._v(" This input port sets the low threshold below a signal must move that a inLow event gets triggered.")]),e._v(" "),t("li",[t("strong",[e._v("thresholdHigh [int]:")]),e._v(" This input port sets the high threshold above a signal must move that a inHigh event gets triggered.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pressure [double]:")]),e._v(" This port outputs the sound amplitude or pressure level of the mic input signal (the values depend on the selected calculation mode).")]),e._v(" "),t("li",[t("strong",[e._v("frequency [integer]:")]),e._v(" In case frequency calculation is enabled, this port outputs the dominant frequency of the spectrum (in Hz).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("inLow:")]),e._v(" This event is fired if the calculated level goes below the low threshold (can be used to detect switch press/release or sound pressure level).")]),e._v(" "),t("li",[t("strong",[e._v("inHigh:")]),e._v(" This event is fired if the calculated level goes above the high threshold (can be used to detect switch press/release or sound pressure level).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("samplingRate [int]:")]),e._v(" Defines the sampling rate in Hz (allowed values are in the rang of 300 - 44100 Hz)")]),e._v(" "),t("li",[t("strong",[e._v("sampleSize [int]:")]),e._v(" Defines the size of the sample buffer. Must be a power of 2. The values 32/64/128/256/512/1024/2048 can be selected from a combobox. This buffer size determines the calculation-interval on the output ports.")]),e._v(" "),t("li",[t("strong",[e._v("mode [int, combobox selection]:")]),e._v(" Defines the way how the output signal (which is also compared to the threshold values) is calculated. The calculation is applied on a block of samples of the selected size. Available options are: average sample values, average absolute sample values, min value, max value and max absolute value")]),e._v(" "),t("li",[t("strong",[e._v("thresholdLow [int]:")]),e._v(" This property sets the low threshold below a signal must move that a inLow event gets triggered.")]),e._v(" "),t("li",[t("strong",[e._v("thresholdHigh [int]:")]),e._v(" This property sets the high threshold above a signal must move that a inHigh event gets triggered.")]),e._v(" "),t("li",[t("strong",[e._v("noiseLevel [double]:")]),e._v(" This property defines a minimum level fo a valid sound signal. All noise which is below this level will be attenauted to avoid unwanted detections.")]),e._v(" "),t("li",[t("strong",[e._v("calculateFrequency [boolean]:")]),e._v(" If true, an FFT will be performed to calculate the frequency spectrum and output the dominant frequency to the associated port.")]),e._v(" "),t("li",[t("strong",[e._v("printSpectrum [boolean]:")]),e._v(" If this property is set to true and frequency calculation is enabled, the FFT spectrum will be printed to the console (only reasonable in debug mode).")]),e._v(" "),t("li",[t("strong",[e._v("captureDevice: [string]:")]),e._v(" This property defines the sound card from which the audio samples should be analysed. (dynamic property, values are suggested when ARE is in synced state)")])])])}),[],!1,null,null,null);t.default=o.exports},820:function(e,t,s){e.exports=s.p+"assets/img/micgpi.c3fe15a9.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[267],{1249:function(e,t,s){"use strict";s.r(t);var i=s(2),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"micgpi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#micgpi"}},[e._v("#")]),e._v(" MicGPI")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Generic Control Input)")]),e._v(" "),t("p",[e._v("This component reads the input from the microphone or line-in of a computer’s sound device. The averaged amplitude / sound pressure level and the dominant frequency can be calculated and used for control purposes. It is highly recommended to use a headset microphone to avoid unwanted detections from ambient noise. The sampling rate can be set (300-44100 Hz), the other device properties are mono (1 channel) and 8 bit resoltion.")]),e._v(" "),t("p",[e._v("It is possible to attach a momentary switch via standard 3.5mm jack plug to the mic/line input of the soundcard (or a cheap USB soundcard) and use this component for detection of switch presses.")]),e._v(" "),t("p",[t("strong",[e._v("Disclaimer:")]),e._v(" Attaching a switch to mic/line input does not work with all sound cards. Although we are not aware of a permanent damage to a sound card, you do this on your own risk !")]),e._v(" "),t("p",[t("img",{attrs:{src:s(824),alt:"Screenshot: MicGPI plugin",title:"Screenshot: MicGPI plugin"}})]),e._v(" "),t("p",[e._v("MicGPI plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A internal or external sound device with mic or line input is required. If the component is utilized as switch input, a momentary switch must be attached to the line-in or microphone input jack. No additional input circuit is required. Any sort of filtering of the signal like background noise cancelling must be disabled.")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("thresholdLow [int]:")]),e._v(" This input port sets the low threshold below a signal must move that a inLow event gets triggered.")]),e._v(" "),t("li",[t("strong",[e._v("thresholdHigh [int]:")]),e._v(" This input port sets the high threshold above a signal must move that a inHigh event gets triggered.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("pressure [double]:")]),e._v(" This port outputs the sound amplitude or pressure level of the mic input signal (the values depend on the selected calculation mode).")]),e._v(" "),t("li",[t("strong",[e._v("frequency [integer]:")]),e._v(" In case frequency calculation is enabled, this port outputs the dominant frequency of the spectrum (in Hz).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("inLow:")]),e._v(" This event is fired if the calculated level goes below the low threshold (can be used to detect switch press/release or sound pressure level).")]),e._v(" "),t("li",[t("strong",[e._v("inHigh:")]),e._v(" This event is fired if the calculated level goes above the high threshold (can be used to detect switch press/release or sound pressure level).")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("samplingRate [int]:")]),e._v(" Defines the sampling rate in Hz (allowed values are in the rang of 300 - 44100 Hz)")]),e._v(" "),t("li",[t("strong",[e._v("sampleSize [int]:")]),e._v(" Defines the size of the sample buffer. Must be a power of 2. The values 32/64/128/256/512/1024/2048 can be selected from a combobox. This buffer size determines the calculation-interval on the output ports.")]),e._v(" "),t("li",[t("strong",[e._v("mode [int, combobox selection]:")]),e._v(" Defines the way how the output signal (which is also compared to the threshold values) is calculated. The calculation is applied on a block of samples of the selected size. Available options are: average sample values, average absolute sample values, min value, max value and max absolute value")]),e._v(" "),t("li",[t("strong",[e._v("thresholdLow [int]:")]),e._v(" This property sets the low threshold below a signal must move that a inLow event gets triggered.")]),e._v(" "),t("li",[t("strong",[e._v("thresholdHigh [int]:")]),e._v(" This property sets the high threshold above a signal must move that a inHigh event gets triggered.")]),e._v(" "),t("li",[t("strong",[e._v("noiseLevel [double]:")]),e._v(" This property defines a minimum level fo a valid sound signal. All noise which is below this level will be attenauted to avoid unwanted detections.")]),e._v(" "),t("li",[t("strong",[e._v("calculateFrequency [boolean]:")]),e._v(" If true, an FFT will be performed to calculate the frequency spectrum and output the dominant frequency to the associated port.")]),e._v(" "),t("li",[t("strong",[e._v("printSpectrum [boolean]:")]),e._v(" If this property is set to true and frequency calculation is enabled, the FFT spectrum will be printed to the console (only reasonable in debug mode).")]),e._v(" "),t("li",[t("strong",[e._v("captureDevice: [string]:")]),e._v(" This property defines the sound card from which the audio samples should be analysed. (dynamic property, values are suggested when ARE is in synced state)")])])])}),[],!1,null,null,null);t.default=o.exports},824:function(e,t,s){e.exports=s.p+"assets/img/micgpi.c3fe15a9.png"}}]); \ No newline at end of file diff --git a/assets/js/267.2ba7f88d.js b/assets/js/268.dedea315.js similarity index 96% rename from assets/js/267.2ba7f88d.js rename to assets/js/268.dedea315.js index 8c4c44ca23..10f7d8a927 100644 --- a/assets/js/267.2ba7f88d.js +++ b/assets/js/268.dedea315.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[267],{1244:function(e,t,s){"use strict";s.r(t);var o=s(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),e._v(" "),t("p",[e._v("This component provides access to mouse input activities of connected a standard mouse, like mouse x/y movement or button press/release activities. Mouse wheel and third mouse button are supported.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(819),alt:"Screenshot: MouseCapture plugin",title:"Screenshot: MouseCapture plugin"}})]),e._v(" "),t("p",[e._v("MouseCapture plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A mouse or mouse-equivalent must be connected to the computer/personal platform.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mouseX [integer]:")]),e._v(" This port provides current absolute mouse X-position or relative mouse X-movement as integer value (depending on the mode of operation).")]),e._v(" "),t("li",[t("strong",[e._v("mouseY [integer]:")]),e._v(" This port provides current absolute mouse Y-position or relative mouse Y-movement as integer value (depending on the mode of operation).")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("blockEvents:")]),e._v(" After this incoming event no mouse activities will be routed to the operating system.")]),e._v(" "),t("li",[t("strong",[e._v("forwardEvents:")]),e._v(" After this incoming event all mouse activities will also be forwarded to the operating system.")]),e._v(" "),t("li",[t("strong",[e._v("toggleBlock:")]),e._v(" An incoming event toggles the current blockEvents. If the mouse activities were forwarded they will now be kept and vica versa.")]),e._v(" "),t("li",[t("strong",[e._v("pollMousePosition:")]),e._v(" Retrieves the current mouse position (x/y) values and sends them to the output ports. Useful for tracking the mouse if it is moved programmatically.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("leftButtonPressed:")]),e._v(" This port fires an event as the left mouse button is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("leftButtonReleased:")]),e._v(" This port fires an event as the left mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("rightButtonPressed:")]),e._v(" This port fires an event as the right mouse button is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("rightButtonReleased:")]),e._v(" This port fires an event as the right mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("middleButtonPressed:")]),e._v(" This port fires an event as the middle mouse button is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("middleButtonReleased:")]),e._v(" This port fires an event as the middle mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("wheelUp:")]),e._v(" This port fires an event as the mouse wheel is turned one step away from the user.")]),e._v(" "),t("li",[t("strong",[e._v("wheelDown:")]),e._v(" This port fires an event as the mouse wheel is turned one step towards the user.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("blockEvents [boolean]:")]),e._v(" This property defines the mode of operation of the mousehook component. If this property is set to true, no mouse activities will be routed to the operating system - they will not be processed by other applications, the mouse cursor will not move and no clicks will be actually performed by the operation system. This can be useful if the mouse activity shall be transferred e.g. from the AsTeRICS personal platform to another system (via the HID actuator) or the mouse should be trapped to control a particular GUI or menu structure. In this case, the mouse component outputs only relative mouse movements in X and Y axis at the corresponding output ports. If the property value is set to false, mouse activities will be passed back to the operating system and will be processed as usual. In this case, the mousehook component provides the absolute mouse positions at the component?s output ports.")])])])}),[],!1,null,null,null);t.default=r.exports},819:function(e,t,s){e.exports=s.p+"assets/img/mousecapture.9a78212a.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[268],{1250:function(e,t,s){"use strict";s.r(t);var o=s(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Standard Input Devices)")]),e._v(" "),t("p",[e._v("This component provides access to mouse input activities of connected a standard mouse, like mouse x/y movement or button press/release activities. Mouse wheel and third mouse button are supported.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(825),alt:"Screenshot: MouseCapture plugin",title:"Screenshot: MouseCapture plugin"}})]),e._v(" "),t("p",[e._v("MouseCapture plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A mouse or mouse-equivalent must be connected to the computer/personal platform.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mouseX [integer]:")]),e._v(" This port provides current absolute mouse X-position or relative mouse X-movement as integer value (depending on the mode of operation).")]),e._v(" "),t("li",[t("strong",[e._v("mouseY [integer]:")]),e._v(" This port provides current absolute mouse Y-position or relative mouse Y-movement as integer value (depending on the mode of operation).")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("blockEvents:")]),e._v(" After this incoming event no mouse activities will be routed to the operating system.")]),e._v(" "),t("li",[t("strong",[e._v("forwardEvents:")]),e._v(" After this incoming event all mouse activities will also be forwarded to the operating system.")]),e._v(" "),t("li",[t("strong",[e._v("toggleBlock:")]),e._v(" An incoming event toggles the current blockEvents. If the mouse activities were forwarded they will now be kept and vica versa.")]),e._v(" "),t("li",[t("strong",[e._v("pollMousePosition:")]),e._v(" Retrieves the current mouse position (x/y) values and sends them to the output ports. Useful for tracking the mouse if it is moved programmatically.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("leftButtonPressed:")]),e._v(" This port fires an event as the left mouse button is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("leftButtonReleased:")]),e._v(" This port fires an event as the left mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("rightButtonPressed:")]),e._v(" This port fires an event as the right mouse button is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("rightButtonReleased:")]),e._v(" This port fires an event as the right mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("middleButtonPressed:")]),e._v(" This port fires an event as the middle mouse button is pressed.")]),e._v(" "),t("li",[t("strong",[e._v("middleButtonReleased:")]),e._v(" This port fires an event as the middle mouse button is released.")]),e._v(" "),t("li",[t("strong",[e._v("wheelUp:")]),e._v(" This port fires an event as the mouse wheel is turned one step away from the user.")]),e._v(" "),t("li",[t("strong",[e._v("wheelDown:")]),e._v(" This port fires an event as the mouse wheel is turned one step towards the user.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("blockEvents [boolean]:")]),e._v(" This property defines the mode of operation of the mousehook component. If this property is set to true, no mouse activities will be routed to the operating system - they will not be processed by other applications, the mouse cursor will not move and no clicks will be actually performed by the operation system. This can be useful if the mouse activity shall be transferred e.g. from the AsTeRICS personal platform to another system (via the HID actuator) or the mouse should be trapped to control a particular GUI or menu structure. In this case, the mouse component outputs only relative mouse movements in X and Y axis at the corresponding output ports. If the property value is set to false, mouse activities will be passed back to the operating system and will be processed as usual. In this case, the mousehook component provides the absolute mouse positions at the component?s output ports.")])])])}),[],!1,null,null,null);t.default=r.exports},825:function(e,t,s){e.exports=s.p+"assets/img/mousecapture.9a78212a.jpg"}}]); \ No newline at end of file diff --git a/assets/js/268.2ce4448f.js b/assets/js/269.c5bf814a.js similarity index 92% rename from assets/js/268.2ce4448f.js rename to assets/js/269.c5bf814a.js index 09013ef19b..a6c059b80f 100644 --- a/assets/js/268.2ce4448f.js +++ b/assets/js/269.c5bf814a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[268],{1248:function(e,t,r){"use strict";r.r(t);var o=r(2),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"openbci"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openbci"}},[e._v("#")]),e._v(" OpenBCI")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Bioelectric Measurement)")]),e._v(" "),t("p",[e._v("This component provides an interface to bioelectric amplifiers which are compatible to the openBCI packet fromat. For more information please refer to the "),t("a",{attrs:{href:"http://www.openbci.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenBCI"),t("OutboundLink")],1),e._v(" website. The COM Port number where the device is connected must be specified in the plugin properties.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(824),alt:"Screenshot: OpenBCI plugin",title:"Screenshot: OpenBCI plugin"}})]),e._v(" "),t("p",[e._v("OpenBCI plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an Open BCI compatible device connected to a COM Port, which sends packet protocol for channel data.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Channel1 to Channel8 [integer]:")]),e._v(" Each output corresponds to the sampled data from its corresponding channel. A calibration procedure to obtain the factor for calculation of microvolts must be performed with the amplifier device.")]),e._v(" "),t("li",[t("strong",[e._v("AccX, AccY, AccZ [integer]:")]),e._v(" The current values of the 3 axis of the acceleration sensor.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [String]:")]),e._v(" The name of the COM port, for example COM2 or COM17.")]),e._v(" "),t("li",[t("strong",[e._v("Baudrate [Integer]:")]),e._v(" The baud rate for the transmission. Standard is 115200.")])])])}),[],!1,null,null,null);t.default=n.exports},824:function(e,t,r){e.exports=r.p+"assets/img/openbci.36c1b739.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[269],{1252:function(e,t,r){"use strict";r.r(t);var o=r(2),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"openbci"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openbci"}},[e._v("#")]),e._v(" OpenBCI")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Bioelectric Measurement)")]),e._v(" "),t("p",[e._v("This component provides an interface to bioelectric amplifiers which are compatible to the openBCI packet fromat. For more information please refer to the "),t("a",{attrs:{href:"http://www.openbci.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenBCI"),t("OutboundLink")],1),e._v(" website. The COM Port number where the device is connected must be specified in the plugin properties.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(828),alt:"Screenshot: OpenBCI plugin",title:"Screenshot: OpenBCI plugin"}})]),e._v(" "),t("p",[e._v("OpenBCI plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an Open BCI compatible device connected to a COM Port, which sends packet protocol for channel data.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Channel1 to Channel8 [integer]:")]),e._v(" Each output corresponds to the sampled data from its corresponding channel. A calibration procedure to obtain the factor for calculation of microvolts must be performed with the amplifier device.")]),e._v(" "),t("li",[t("strong",[e._v("AccX, AccY, AccZ [integer]:")]),e._v(" The current values of the 3 axis of the acceleration sensor.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [String]:")]),e._v(" The name of the COM port, for example COM2 or COM17.")]),e._v(" "),t("li",[t("strong",[e._v("Baudrate [Integer]:")]),e._v(" The baud rate for the transmission. Standard is 115200.")])])])}),[],!1,null,null,null);t.default=n.exports},828:function(e,t,r){e.exports=r.p+"assets/img/openbci.36c1b739.jpg"}}]); \ No newline at end of file diff --git a/assets/js/27.c2587794.js b/assets/js/27.730f0b1c.js similarity index 91% rename from assets/js/27.c2587794.js rename to assets/js/27.730f0b1c.js index 18e1c3866c..893a5203a6 100644 --- a/assets/js/27.c2587794.js +++ b/assets/js/27.730f0b1c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{1038:function(e,t,n){"use strict";n.r(t);var s=n(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"keyboard-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-control"}},[e._v("#")]),e._v(" Keyboard Control")]),e._v(" "),t("p",[e._v("The WebACS is fully accessible via keyboard. The following sections describe the usage in the different parts of the ACS.")]),e._v(" "),t("h2",{attrs:{id:"shortcuts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#shortcuts"}},[e._v("#")]),e._v(" Shortcuts")]),e._v(" "),t("p",[e._v("The shortcut menu right at the top of the screen (see picture below) gives the user the chance to jump directly to one of the subsections of the page, thus making keyboard navigation much faster.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(489),alt:"Screenshot: Shortcut menu",title:"Screenshot: Shortcut menu"}})]),e._v(" "),t("p",[e._v("WebACS shortcut menu")]),e._v(" "),t("h2",{attrs:{id:"menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#menu"}},[e._v("#")]),e._v(" Menu")]),e._v(" "),t("p",[e._v("After jumping to the menu with "),t("em",[e._v("CTRL-0")]),e._v(", the menu tabs can be switched by using the "),t("em",[e._v("arrow")]),e._v(" keys. Once the desired tab is active, the menu items can be reached via the "),t("em",[e._v("Tab")]),e._v(" key. When one of the component menus in the Components tab is selected, it can also be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(490),alt:"Screenshot: The menu after opening a components submenu",title:"Screenshot: The menu after opening a components submenu"}})]),e._v(" "),t("p",[e._v("The menu after opening a components submenu")]),e._v(" "),t("h2",{attrs:{id:"model-panel"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-panel"}},[e._v("#")]),e._v(" Model Panel")]),e._v(" "),t("p",[e._v("After jumping to the model panel with "),t("em",[e._v("CTRL-1")]),e._v(", the "),t("em",[e._v("arrow")]),e._v(" keys can be used to switch between the models.")]),e._v(" "),t("h2",{attrs:{id:"model-designer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-designer"}},[e._v("#")]),e._v(" Model Designer")]),e._v(" "),t("p",[e._v("After jumping to the model designer with "),t("em",[e._v("CTRL-2")]),e._v(", the user can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Now the components can be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys or moved by using "),t("em",[e._v("Shift-Arrow")]),e._v("."),t("br"),e._v("\nPressing the "),t("em",[e._v("Space")]),e._v(" bar activates port mode, thus enabling the user to navigate the ports of the selected component via the "),t("em",[e._v("arrow")]),e._v(" keys. Pressing "),t("em",[e._v("Shift-Space")]),e._v(" on an output port starts drawing a new channel. The user must then navigate to a matching input port on another component and press "),t("em",[e._v("Shift-Space")]),e._v(" there to complete the channel. "),t("em",[e._v("Esc")]),e._v(" ends port mode."),t("br"),e._v("\nWhen in port mode, the user can activate channel mode by pressing the "),t("em",[e._v("Space")]),e._v(" bar again. Now the channels connected to the selected port can be navigated using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends channel mode.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(491),alt:"Screenshot: The Model Designer in port mode",title:"Screenshot: The Model Designer in port mode"}})]),e._v(" "),t("p",[e._v("The Model Designer in port mode")]),e._v(" "),t("h2",{attrs:{id:"gui-designer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gui-designer"}},[e._v("#")]),e._v(" GUI Designer")]),e._v(" "),t("p",[e._v("After jumping to the GUI Designer with "),t("em",[e._v("CTRL-3")]),e._v(", the user can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Then the user can navigate the elements by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Shift-arrow")]),e._v(" keys moves the selected element, "),t("em",[e._v("Alt-arrow")]),e._v(" keys resizes the selected element.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(492),alt:"Screenshot: The GUI Designer in keyboard mode",title:"Screenshot: The GUI Designer in keyboard mode"}})]),e._v(" "),t("p",[e._v("The GUI Designer in keyboard mode")]),e._v(" "),t("h2",{attrs:{id:"list-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-view"}},[e._v("#")]),e._v(" List View")]),e._v(" "),t("p",[e._v("After jumping to the List View with "),t("em",[e._v("CTRL-4")]),e._v(", the user can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Then the user can navigate the elements by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Space")]),e._v(" activates port mode, so that the ports of the selected components can be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends port mode."),t("br"),e._v("\nWhen in port mode, the user can activate channel mode by pressing the "),t("em",[e._v("Space")]),e._v(" bar again. Now the channels connected to the selected port can be navigated using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends channel mode.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(493),alt:"Screenshot: List View in channel mode",title:"Screenshot: List View in channel mode"}})]),e._v(" "),t("p",[e._v("List View in channel mode")]),e._v(" "),t("h2",{attrs:{id:"property-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#property-editor"}},[e._v("#")]),e._v(" Property Editor")]),e._v(" "),t("p",[e._v("After jumping to the Property Editor with "),t("em",[e._v("CTRL-5")]),e._v(", the user can switch the tabs of the Property Editor by using the "),t("em",[e._v("arrow")]),e._v(" keys. All other elements can be reached by using the "),t("em",[e._v("Tab")]),e._v(" key in the same way as on any website.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(494),alt:"Screenshot: Property Editor with open dropdown",title:"Screenshot: Property Editor with open dropdown"}})]),e._v(" "),t("p",[e._v("Property Editor with open dropdown")])])}),[],!1,null,null,null);t.default=r.exports},489:function(e,t){e.exports="data:image/png;base64,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"},490:function(e,t,n){e.exports=n.p+"assets/img/menu_open_components.7be82a1c.png"},491:function(e,t,n){e.exports=n.p+"assets/img/model_designer_in_port_mode.b0d664ff.png"},492:function(e,t,n){e.exports=n.p+"assets/img/gui_designer_in_keyboard_mode.9e46d348.png"},493:function(e,t,n){e.exports=n.p+"assets/img/list_view_in_channel_mode.3427773e.png"},494:function(e,t,n){e.exports=n.p+"assets/img/property_editor_with_open_dropdown.ce0c4b62.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{1041:function(e,t,n){"use strict";n.r(t);var s=n(2),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"keyboard-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-control"}},[e._v("#")]),e._v(" Keyboard Control")]),e._v(" "),t("p",[e._v("The WebACS is fully accessible via keyboard. The following sections describe the usage in the different parts of the ACS.")]),e._v(" "),t("h2",{attrs:{id:"shortcuts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#shortcuts"}},[e._v("#")]),e._v(" Shortcuts")]),e._v(" "),t("p",[e._v("The shortcut menu right at the top of the screen (see picture below) gives the user the chance to jump directly to one of the subsections of the page, thus making keyboard navigation much faster.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(488),alt:"Screenshot: Shortcut menu",title:"Screenshot: Shortcut menu"}})]),e._v(" "),t("p",[e._v("WebACS shortcut menu")]),e._v(" "),t("h2",{attrs:{id:"menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#menu"}},[e._v("#")]),e._v(" Menu")]),e._v(" "),t("p",[e._v("After jumping to the menu with "),t("em",[e._v("CTRL-0")]),e._v(", the menu tabs can be switched by using the "),t("em",[e._v("arrow")]),e._v(" keys. Once the desired tab is active, the menu items can be reached via the "),t("em",[e._v("Tab")]),e._v(" key. When one of the component menus in the Components tab is selected, it can also be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(489),alt:"Screenshot: The menu after opening a components submenu",title:"Screenshot: The menu after opening a components submenu"}})]),e._v(" "),t("p",[e._v("The menu after opening a components submenu")]),e._v(" "),t("h2",{attrs:{id:"model-panel"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-panel"}},[e._v("#")]),e._v(" Model Panel")]),e._v(" "),t("p",[e._v("After jumping to the model panel with "),t("em",[e._v("CTRL-1")]),e._v(", the "),t("em",[e._v("arrow")]),e._v(" keys can be used to switch between the models.")]),e._v(" "),t("h2",{attrs:{id:"model-designer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-designer"}},[e._v("#")]),e._v(" Model Designer")]),e._v(" "),t("p",[e._v("After jumping to the model designer with "),t("em",[e._v("CTRL-2")]),e._v(", the user can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Now the components can be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys or moved by using "),t("em",[e._v("Shift-Arrow")]),e._v("."),t("br"),e._v("\nPressing the "),t("em",[e._v("Space")]),e._v(" bar activates port mode, thus enabling the user to navigate the ports of the selected component via the "),t("em",[e._v("arrow")]),e._v(" keys. Pressing "),t("em",[e._v("Shift-Space")]),e._v(" on an output port starts drawing a new channel. The user must then navigate to a matching input port on another component and press "),t("em",[e._v("Shift-Space")]),e._v(" there to complete the channel. "),t("em",[e._v("Esc")]),e._v(" ends port mode."),t("br"),e._v("\nWhen in port mode, the user can activate channel mode by pressing the "),t("em",[e._v("Space")]),e._v(" bar again. Now the channels connected to the selected port can be navigated using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends channel mode.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(490),alt:"Screenshot: The Model Designer in port mode",title:"Screenshot: The Model Designer in port mode"}})]),e._v(" "),t("p",[e._v("The Model Designer in port mode")]),e._v(" "),t("h2",{attrs:{id:"gui-designer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gui-designer"}},[e._v("#")]),e._v(" GUI Designer")]),e._v(" "),t("p",[e._v("After jumping to the GUI Designer with "),t("em",[e._v("CTRL-3")]),e._v(", the user can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Then the user can navigate the elements by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Shift-arrow")]),e._v(" keys moves the selected element, "),t("em",[e._v("Alt-arrow")]),e._v(" keys resizes the selected element.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(491),alt:"Screenshot: The GUI Designer in keyboard mode",title:"Screenshot: The GUI Designer in keyboard mode"}})]),e._v(" "),t("p",[e._v("The GUI Designer in keyboard mode")]),e._v(" "),t("h2",{attrs:{id:"list-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-view"}},[e._v("#")]),e._v(" List View")]),e._v(" "),t("p",[e._v("After jumping to the List View with "),t("em",[e._v("CTRL-4")]),e._v(", the user can enter keyboard mode by pressing "),t("em",[e._v("Enter")]),e._v(". Then the user can navigate the elements by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Space")]),e._v(" activates port mode, so that the ports of the selected components can be navigated by using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends port mode."),t("br"),e._v("\nWhen in port mode, the user can activate channel mode by pressing the "),t("em",[e._v("Space")]),e._v(" bar again. Now the channels connected to the selected port can be navigated using the "),t("em",[e._v("arrow")]),e._v(" keys. "),t("em",[e._v("Esc")]),e._v(" ends channel mode.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(492),alt:"Screenshot: List View in channel mode",title:"Screenshot: List View in channel mode"}})]),e._v(" "),t("p",[e._v("List View in channel mode")]),e._v(" "),t("h2",{attrs:{id:"property-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#property-editor"}},[e._v("#")]),e._v(" Property Editor")]),e._v(" "),t("p",[e._v("After jumping to the Property Editor with "),t("em",[e._v("CTRL-5")]),e._v(", the user can switch the tabs of the Property Editor by using the "),t("em",[e._v("arrow")]),e._v(" keys. All other elements can be reached by using the "),t("em",[e._v("Tab")]),e._v(" key in the same way as on any website.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(493),alt:"Screenshot: Property Editor with open dropdown",title:"Screenshot: Property Editor with open dropdown"}})]),e._v(" "),t("p",[e._v("Property Editor with open dropdown")])])}),[],!1,null,null,null);t.default=r.exports},488:function(e,t){e.exports="data:image/png;base64,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"},489:function(e,t,n){e.exports=n.p+"assets/img/menu_open_components.7be82a1c.png"},490:function(e,t,n){e.exports=n.p+"assets/img/model_designer_in_port_mode.b0d664ff.png"},491:function(e,t,n){e.exports=n.p+"assets/img/gui_designer_in_keyboard_mode.9e46d348.png"},492:function(e,t,n){e.exports=n.p+"assets/img/list_view_in_channel_mode.3427773e.png"},493:function(e,t,n){e.exports=n.p+"assets/img/property_editor_with_open_dropdown.ce0c4b62.png"}}]); \ No newline at end of file diff --git a/assets/js/269.3ea9f7e7.js b/assets/js/270.cab2fd90.js similarity index 92% rename from assets/js/269.3ea9f7e7.js rename to assets/js/270.cab2fd90.js index f330d88936..08768372b6 100644 --- a/assets/js/269.3ea9f7e7.js +++ b/assets/js/270.cab2fd90.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[269],{1246:function(e,t,r){"use strict";r.r(t);var o=r(2),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"p2parser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#p2parser"}},[e._v("#")]),e._v(" P2Parser")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Bioelectric Measurement)")]),e._v(" "),t("p",[e._v("This component provides an interface to bioelectric amplifiers which are compatible to the openEEG P2 packet fromat (e.g. the ModualarEEG or the SMTEEG by Olimex). For more information please refer to the "),t("a",{attrs:{href:"http://openeeg.sf.net",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenEEG"),t("OutboundLink")],1),e._v(" website.The COM Port number where the device is connected must be specified in the plugin properties.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(821),alt:"Screenshot: OpenEEG P2Parser plugin",title:"Screenshot: OpenEEG P2Parser plugin"}})]),e._v(" "),t("p",[e._v("OpenEEG P2 Parser plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an OpenEEG compatible device connected to a COM Port, which sends the P2 packet protocol for channel data.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Channel1 to Channel6 [integer]:")]),e._v(" Each output corresponds to the sampled data from its corresponding channel. The values range for -512 to 512. A calibration procedure to obtain the factor for calculation of microvolts must be performed with the amplifier device.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [String]:")]),e._v(" The name of the COM port, for example COM2 or COM17.")]),e._v(" "),t("li",[t("strong",[e._v("Baudrate [Integer]:")]),e._v(" The baud rate for the transmission. Standard is 57600.")])])])}),[],!1,null,null,null);t.default=a.exports},821:function(e,t,r){e.exports=r.p+"assets/img/p2parser.8b47904f.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[270],{1255:function(e,t,r){"use strict";r.r(t);var o=r(2),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"p2parser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#p2parser"}},[e._v("#")]),e._v(" P2Parser")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Bioelectric Measurement)")]),e._v(" "),t("p",[e._v("This component provides an interface to bioelectric amplifiers which are compatible to the openEEG P2 packet fromat (e.g. the ModualarEEG or the SMTEEG by Olimex). For more information please refer to the "),t("a",{attrs:{href:"http://openeeg.sf.net",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenEEG"),t("OutboundLink")],1),e._v(" website.The COM Port number where the device is connected must be specified in the plugin properties.")]),e._v(" "),t("p",[t("img",{attrs:{src:r(832),alt:"Screenshot: OpenEEG P2Parser plugin",title:"Screenshot: OpenEEG P2Parser plugin"}})]),e._v(" "),t("p",[e._v("OpenEEG P2 Parser plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This software component requires an OpenEEG compatible device connected to a COM Port, which sends the P2 packet protocol for channel data.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Channel1 to Channel6 [integer]:")]),e._v(" Each output corresponds to the sampled data from its corresponding channel. The values range for -512 to 512. A calibration procedure to obtain the factor for calculation of microvolts must be performed with the amplifier device.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("COMPort [String]:")]),e._v(" The name of the COM port, for example COM2 or COM17.")]),e._v(" "),t("li",[t("strong",[e._v("Baudrate [Integer]:")]),e._v(" The baud rate for the transmission. Standard is 57600.")])])])}),[],!1,null,null,null);t.default=a.exports},832:function(e,t,r){e.exports=r.p+"assets/img/p2parser.8b47904f.jpg"}}]); \ No newline at end of file diff --git a/assets/js/270.d8d60f6f.js b/assets/js/271.c1e47c14.js similarity index 97% rename from assets/js/270.d8d60f6f.js rename to assets/js/271.c1e47c14.js index 627028f86a..efc3dba60f 100644 --- a/assets/js/270.d8d60f6f.js +++ b/assets/js/271.c1e47c14.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[270],{1252:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"philipshuesensor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#philipshuesensor"}},[e._v("#")]),e._v(" PhilipsHueSensor")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Home Control)")]),e._v(" "),t("p",[e._v("The PhilipsHueSensor component provides an interface to the motion sensor and dimmer switch of the "),t("a",{attrs:{href:"https://www2.meethue.com/en-us",target:"_blank",rel:"noopener noreferrer"}},[e._v("Philips Hue smart lighting system"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("One instance of this plugin can fire events for one specified Philips Hue sensor.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(829),alt:"Screenshot: PhilipsHue plugin",title:"Screenshot: PhilipsHue plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A Philips Hue hardware Bridge")]),e._v(" "),t("li",[e._v("A Philips Hue Sensor (a dimmer switch or a motion sensor)")])]),e._v(" "),t("h2",{attrs:{id:"initial-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#initial-setup"}},[e._v("#")]),e._v(" Initial Setup")]),e._v(" "),t("p",[e._v("See the PhilipsHue actuator plugin documentation for detailed instructions.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("currentState [string]:")]),e._v(" This port periodically returns the state the target sensor. The polling rate can be set via the updateRate property (in milliseconds).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("statusChanged:")]),e._v(" fires when the configure sensor changes its status (buttons pressed, motion detected, battery charge, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("tick:")]),e._v(" fires for each tick (depends on updateRate property)")]),e._v(" "),t("li",[t("strong",[e._v("motionDetected:")]),e._v(" fires once presence is detected (motion sensor only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonOn:")]),e._v(" fires if the first button is pressed (dimmer switch only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonBrighter:")]),e._v(" fires if the second button is pressed (dimmer switch only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonDarker:")]),e._v(" fires if the third button is pressed (dimmer switch only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonOff:")]),e._v(" fires if the last button is pressed (dimmer switch only)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("apiKey [string]:")]),e._v(" API key for the REST API of the bridge")]),e._v(" "),t("li",[t("strong",[e._v("ip [string]:")]),e._v(" IP address of the bridge")]),e._v(" "),t("li",[t("strong",[e._v("target [string]:")]),e._v(" sensor that should be used as input in the form "),t("code",[e._v("/sensors/")])]),e._v(" "),t("li",[t("strong",[e._v("updateRate [integer]:")]),e._v(" polling rate for "),t("strong",[e._v("currentState")]),e._v(" and the event triggers\n"),t("ul",[t("li",[e._v("value in milliseconds")]),e._v(" "),t("li",[e._v("the lower this value is, the faster you will be notified of changes")]),e._v(" "),t("li",[e._v("don’t set this too low or the bridge might slow down (500 milliseconds is a good compromise)")])])])])])}),[],!1,null,null,null);t.default=s.exports},829:function(e,t){e.exports="data:image/png;base64,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"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[271],{1254:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"philipshuesensor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#philipshuesensor"}},[e._v("#")]),e._v(" PhilipsHueSensor")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Home Control)")]),e._v(" "),t("p",[e._v("The PhilipsHueSensor component provides an interface to the motion sensor and dimmer switch of the "),t("a",{attrs:{href:"https://www2.meethue.com/en-us",target:"_blank",rel:"noopener noreferrer"}},[e._v("Philips Hue smart lighting system"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("One instance of this plugin can fire events for one specified Philips Hue sensor.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(831),alt:"Screenshot: PhilipsHue plugin",title:"Screenshot: PhilipsHue plugin"}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("A Philips Hue hardware Bridge")]),e._v(" "),t("li",[e._v("A Philips Hue Sensor (a dimmer switch or a motion sensor)")])]),e._v(" "),t("h2",{attrs:{id:"initial-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#initial-setup"}},[e._v("#")]),e._v(" Initial Setup")]),e._v(" "),t("p",[e._v("See the PhilipsHue actuator plugin documentation for detailed instructions.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("currentState [string]:")]),e._v(" This port periodically returns the state the target sensor. The polling rate can be set via the updateRate property (in milliseconds).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("statusChanged:")]),e._v(" fires when the configure sensor changes its status (buttons pressed, motion detected, battery charge, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("tick:")]),e._v(" fires for each tick (depends on updateRate property)")]),e._v(" "),t("li",[t("strong",[e._v("motionDetected:")]),e._v(" fires once presence is detected (motion sensor only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonOn:")]),e._v(" fires if the first button is pressed (dimmer switch only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonBrighter:")]),e._v(" fires if the second button is pressed (dimmer switch only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonDarker:")]),e._v(" fires if the third button is pressed (dimmer switch only)")]),e._v(" "),t("li",[t("strong",[e._v("dimmerButtonOff:")]),e._v(" fires if the last button is pressed (dimmer switch only)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("apiKey [string]:")]),e._v(" API key for the REST API of the bridge")]),e._v(" "),t("li",[t("strong",[e._v("ip [string]:")]),e._v(" IP address of the bridge")]),e._v(" "),t("li",[t("strong",[e._v("target [string]:")]),e._v(" sensor that should be used as input in the form "),t("code",[e._v("/sensors/")])]),e._v(" "),t("li",[t("strong",[e._v("updateRate [integer]:")]),e._v(" polling rate for "),t("strong",[e._v("currentState")]),e._v(" and the event triggers\n"),t("ul",[t("li",[e._v("value in milliseconds")]),e._v(" "),t("li",[e._v("the lower this value is, the faster you will be notified of changes")]),e._v(" "),t("li",[e._v("don’t set this too low or the bridge might slow down (500 milliseconds is a good compromise)")])])])])])}),[],!1,null,null,null);t.default=s.exports},831:function(e,t){e.exports="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/271.f45f5b47.js b/assets/js/272.6a9add5b.js similarity index 94% rename from assets/js/271.f45f5b47.js rename to assets/js/272.6a9add5b.js index c5b44b7ec0..51aa8aa0d2 100644 --- a/assets/js/271.f45f5b47.js +++ b/assets/js/272.6a9add5b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[271],{1251:function(e,t,o){"use strict";o.r(t);var n=o(2),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"platform-analog-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#platform-analog-in"}},[e._v("#")]),e._v(" Platform Analog In")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Personal Platform)")]),e._v(" "),t("p",[e._v("The PlatformAnalogIn component is a sensor which is used in combination with the analog inputs of the personal platform. The component provides two output ports which correlate to the inputs IN1 and IN2 of the platform. The component can be set up to sample the inputs periodically or upon an incoming event. Both inputs can be used for voltage and resistance measurement.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(828),alt:"Screenshot: PlatformAnalogIn plugin",title:"Screenshot: PlatformAnalogIn plugin"}})]),e._v(" "),t("p",[e._v("Platform AnalogIn plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This component requires the Core CIM (CIM Id: 0x0602) of the AsTeRICS Personal Platform.")]),e._v(" "),t("p",[e._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),e._v(" "),t("p",[e._v("The AsteRICS Personal Platform")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1 to in2 [integer]:")]),e._v(" Each of these output port corresponds to one input of the ADC CIM. The measured values are forwarded directly from the CIM thus corresponding to the description given in the CIM specification. Depending on the type of connected sensor the values either correspond to a voltage or a resistive value.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("adcSampleTrigger:")]),e._v(" An incoming event on this port will cause the ADC CIM to sample data on its inputs. This event will only take effect if the periodic_update property is set to 0.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("periodicUpdate [integer]:")]),e._v(" This property defines the time between data sampling requests to the ADC CIM (in milliseconds). The software component will send requests to the CIM in the given intervals. Due to current limitations of the ADC CIM it is recommended to use time intervals not lower than 50 milliseconds (20 samples per second).")]),e._v(" "),t("li",[t("strong",[e._v("activateInput1 to activateInput2 [Boolean]:")]),e._v(" These properties correspond the CIM’s ADC inputs IN1 to IN8, if the property is true, the corresponding output port of the software component will send the sampled data.")])])])}),[],!1,null,null,null);t.default=r.exports},828:function(e,t,o){e.exports=o.p+"assets/img/platformanalogin.b5aea034.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[272],{1256:function(e,t,o){"use strict";o.r(t);var n=o(2),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"platform-analog-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#platform-analog-in"}},[e._v("#")]),e._v(" Platform Analog In")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Personal Platform)")]),e._v(" "),t("p",[e._v("The PlatformAnalogIn component is a sensor which is used in combination with the analog inputs of the personal platform. The component provides two output ports which correlate to the inputs IN1 and IN2 of the platform. The component can be set up to sample the inputs periodically or upon an incoming event. Both inputs can be used for voltage and resistance measurement.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(833),alt:"Screenshot: PlatformAnalogIn plugin",title:"Screenshot: PlatformAnalogIn plugin"}})]),e._v(" "),t("p",[e._v("Platform AnalogIn plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("This component requires the Core CIM (CIM Id: 0x0602) of the AsTeRICS Personal Platform.")]),e._v(" "),t("p",[e._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),e._v(" "),t("p",[e._v("The AsteRICS Personal Platform")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("in1 to in2 [integer]:")]),e._v(" Each of these output port corresponds to one input of the ADC CIM. The measured values are forwarded directly from the CIM thus corresponding to the description given in the CIM specification. Depending on the type of connected sensor the values either correspond to a voltage or a resistive value.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("adcSampleTrigger:")]),e._v(" An incoming event on this port will cause the ADC CIM to sample data on its inputs. This event will only take effect if the periodic_update property is set to 0.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("periodicUpdate [integer]:")]),e._v(" This property defines the time between data sampling requests to the ADC CIM (in milliseconds). The software component will send requests to the CIM in the given intervals. Due to current limitations of the ADC CIM it is recommended to use time intervals not lower than 50 milliseconds (20 samples per second).")]),e._v(" "),t("li",[t("strong",[e._v("activateInput1 to activateInput2 [Boolean]:")]),e._v(" These properties correspond the CIM’s ADC inputs IN1 to IN8, if the property is true, the corresponding output port of the software component will send the sampled data.")])])])}),[],!1,null,null,null);t.default=r.exports},833:function(e,t,o){e.exports=o.p+"assets/img/platformanalogin.b5aea034.jpg"}}]); \ No newline at end of file diff --git a/assets/js/272.b93818bb.js b/assets/js/273.32a8e96d.js similarity index 93% rename from assets/js/272.b93818bb.js rename to assets/js/273.32a8e96d.js index 491b4d83b0..98434ae9b3 100644 --- a/assets/js/272.b93818bb.js +++ b/assets/js/273.32a8e96d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[272],{1250:function(t,e,i){"use strict";i.r(e);var n=i(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"platform-digital-in"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#platform-digital-in"}},[t._v("#")]),t._v(" Platform Digital In")]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Personal Platform)")]),t._v(" "),e("p",[t._v("The PlatformDigitalIn component provides an interface to read the digital inputs of the AsTeRICS Personal Platform. On state changes of the connected signals (transitions to high or low level), the component generates corresponding trigger events.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(827),alt:"Screenshot: PlatformDigitalIn plugin",title:"Screenshot: PlatformDigitalIn plugin"}})]),t._v(" "),e("p",[t._v("PlatformDigitalIn plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the Core CIM (CIM Id: 0x0602) of the AsTeRICS Personal Platform.")]),t._v(" "),e("p",[t._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),t._v(" "),e("p",[t._v("The AsteRICS Personal Platform")]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in1High to in3High:")]),t._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to high level, an event will be raised on the corresponding port.")]),t._v(" "),e("li",[e("strong",[t._v("in1Low to in3Low:")]),t._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to low level, an event will be raised on the corresponding port.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("activateEventIn1 to activateEventIn3 [Boolean]:")]),t._v(" These properties declare for each port whether or not a signal transition on the actual input port should result in an event being triggered in the ARE. If a property is set true for one input, it will raise events on signal transitions, if it is set to false it will not.")])])])}),[],!1,null,null,null);e.default=r.exports},827:function(t,e,i){t.exports=i.p+"assets/img/platformdigitalin.f8f31a4b.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[273],{1258:function(t,e,i){"use strict";i.r(e);var n=i(2),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"platform-digital-in"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#platform-digital-in"}},[t._v("#")]),t._v(" Platform Digital In")]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: Personal Platform)")]),t._v(" "),e("p",[t._v("The PlatformDigitalIn component provides an interface to read the digital inputs of the AsTeRICS Personal Platform. On state changes of the connected signals (transitions to high or low level), the component generates corresponding trigger events.")]),t._v(" "),e("p",[e("img",{attrs:{src:i(836),alt:"Screenshot: PlatformDigitalIn plugin",title:"Screenshot: PlatformDigitalIn plugin"}})]),t._v(" "),e("p",[t._v("PlatformDigitalIn plugin")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("This component requires the Core CIM (CIM Id: 0x0602) of the AsTeRICS Personal Platform.")]),t._v(" "),e("p",[t._v("![The AsteRICS Personal Platform (./preliminary version)](./img/personalplatform.jpg “The AsteRICS Personal Platform (preliminary version)”)")]),t._v(" "),e("p",[t._v("The AsteRICS Personal Platform")]),t._v(" "),e("h2",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("in1High to in3High:")]),t._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to high level, an event will be raised on the corresponding port.")]),t._v(" "),e("li",[e("strong",[t._v("in1Low to in3Low:")]),t._v(" Each of these event ports is linked to one input port, if the device connection to this input port delivers a signal which changes to low level, an event will be raised on the corresponding port.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("activateEventIn1 to activateEventIn3 [Boolean]:")]),t._v(" These properties declare for each port whether or not a signal transition on the actual input port should result in an event being triggered in the ARE. If a property is set true for one input, it will raise events on signal transitions, if it is set to false it will not.")])])])}),[],!1,null,null,null);e.default=r.exports},836:function(t,e,i){t.exports=i.p+"assets/img/platformdigitalin.f8f31a4b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/273.b4fe1e86.js b/assets/js/274.937a1f2a.js similarity index 91% rename from assets/js/273.b4fe1e86.js rename to assets/js/274.937a1f2a.js index 1e404c2994..998ad119b4 100644 --- a/assets/js/273.b4fe1e86.js +++ b/assets/js/274.937a1f2a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[273],{1257:function(t,e,s){"use strict";s.r(e);var r=s(2),i=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This plugin reads a whole .csv file and sends the seperate lines as strings to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(836),alt:"Screenshot: ReadCSV plugin",title:"Screenshot: ReadCSV plugin"}})]),t._v(" "),e("p",[t._v("ReadCSV")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("read:")]),t._v(" Opens a file-chooser menu to select a csv-file which should be opened and read. The file is read immideately after selection (attention: this blocks the ARE model execution until the file contents are read completely !)")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Output[string]:")]),t._v(" The port sends the individual lines of the file as strings. An example for the string is: “data1;data2;data3”. To seperate the string into individual strin values, the StringSplitter can be used.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FilePath[string]:")]),t._v(" Defines the default Path were the file is located. (TBD: add property for default FileName and line-by-line read option)")])])])}),[],!1,null,null,null);e.default=i.exports},836:function(t,e,s){t.exports=s.p+"assets/img/readcsv.fc76a472.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[274],{1262:function(t,e,s){"use strict";s.r(e);var r=s(2),i=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This plugin reads a whole .csv file and sends the seperate lines as strings to the output port.")]),t._v(" "),e("p",[e("img",{attrs:{src:s(841),alt:"Screenshot: ReadCSV plugin",title:"Screenshot: ReadCSV plugin"}})]),t._v(" "),e("p",[t._v("ReadCSV")]),t._v(" "),e("h2",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("read:")]),t._v(" Opens a file-chooser menu to select a csv-file which should be opened and read. The file is read immideately after selection (attention: this blocks the ARE model execution until the file contents are read completely !)")])]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Output[string]:")]),t._v(" The port sends the individual lines of the file as strings. An example for the string is: “data1;data2;data3”. To seperate the string into individual strin values, the StringSplitter can be used.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FilePath[string]:")]),t._v(" Defines the default Path were the file is located. (TBD: add property for default FileName and line-by-line read option)")])])])}),[],!1,null,null,null);e.default=i.exports},841:function(t,e,s){t.exports=s.p+"assets/img/readcsv.fc76a472.png"}}]); \ No newline at end of file diff --git a/assets/js/274.63966e68.js b/assets/js/275.8ac2558b.js similarity index 87% rename from assets/js/274.63966e68.js rename to assets/js/275.8ac2558b.js index 07589606b7..7ffbf19a3c 100644 --- a/assets/js/274.63966e68.js +++ b/assets/js/275.8ac2558b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[274],{1258:function(t,e,s){"use strict";s.r(e);var r=s(2),a=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This plugin reads an .edf file and sends the data to its output ports")]),t._v(" "),e("p",[e("img",{attrs:{src:s(837),alt:"Screenshot: ReadEDF plugin",title:"Screenshot: ReadEDF plugin"}})]),t._v(" "),e("p",[t._v("ReadEDF")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("CH1 - CH8[double]:")]),t._v(" these ports send the samples of the recorded signals.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FileName[string]:")]),t._v(" specifies the name of the file, in which the data has been recorded "),e("strong",[t._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);e.default=a.exports},837:function(t,e,s){t.exports=s.p+"assets/img/readedf.a50c4602.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[275],{1263:function(t,e,s){"use strict";s.r(e);var r=s(2),a=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frontmatter-title"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[t._v("#")]),t._v(" "+t._s(t.$frontmatter.title))]),t._v(" "),e("p",[t._v("Component Type: Sensor (Subcategory: File System)")]),t._v(" "),e("p",[t._v("This plugin reads an .edf file and sends the data to its output ports")]),t._v(" "),e("p",[e("img",{attrs:{src:s(842),alt:"Screenshot: ReadEDF plugin",title:"Screenshot: ReadEDF plugin"}})]),t._v(" "),e("p",[t._v("ReadEDF")]),t._v(" "),e("h2",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("CH1 - CH8[double]:")]),t._v(" these ports send the samples of the recorded signals.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("FileName[string]:")]),t._v(" specifies the name of the file, in which the data has been recorded "),e("strong",[t._v("Supports value suggestions from ARE (dynamic property)")])])])])}),[],!1,null,null,null);e.default=a.exports},842:function(t,e,s){t.exports=s.p+"assets/img/readedf.a50c4602.png"}}]); \ No newline at end of file diff --git a/assets/js/275.804b1840.js b/assets/js/276.9217d9f9.js similarity index 92% rename from assets/js/275.804b1840.js rename to assets/js/276.9217d9f9.js index 8f8b717e45..3d8da68c0d 100644 --- a/assets/js/275.804b1840.js +++ b/assets/js/276.9217d9f9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[275],{1260:function(e,t,o){"use strict";o.r(t);var r=o(2),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Simulation)")]),e._v(" "),t("p",[e._v("The SignalGenerator component can generate several output waveforms for component tests or other purposes like timing or event generation. Available waveforms are sine, sawtooth, rectangle and random signal data.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(840),alt:"Screenshot: SignalGenerator plugin",title:"Screenshot: SignalGenerator plugin"}})]),e._v(" "),t("p",[e._v("SignalGenerator plugin")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("out [double]:")]),e._v(" The generated waveform is provided at this port.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendInterval [integer]:")]),e._v(" This value specifies the output rate in milliseconds. Please note that the output rate has to be fast enough to assemble the selected output frequency. For example if a frequency of 2 Hz is set, the send_interval should not be greater than 125 milliseconds according to the sample theorem.")]),e._v(" "),t("li",[t("strong",[e._v("waveForm [integer]:")]),e._v(" The waveform types random, sine, sawtooth and rectangle can be selected.")]),e._v(" "),t("li",[t("strong",[e._v("frequency [double]:")]),e._v(" The frequency of the output signal in Hertz.")]),e._v(" "),t("li",[t("strong",[e._v("amplitude [double]:")]),e._v(" The amplitude of the output signal.")]),e._v(" "),t("li",[t("strong",[e._v("phaseShift [double]:")]),e._v(" The output signal is phase-shifted by this value (in milliseconds).")]),e._v(" "),t("li",[t("strong",[e._v("offset [double]:")]),e._v(" Amplitude-offset of the output signal (this value is added to each generated waveform value).")])])])}),[],!1,null,null,null);t.default=a.exports},840:function(e,t,o){e.exports=o.p+"assets/img/signalgenerator.3806148b.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[276],{1264:function(e,t,o){"use strict";o.r(t);var r=o(2),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Simulation)")]),e._v(" "),t("p",[e._v("The SignalGenerator component can generate several output waveforms for component tests or other purposes like timing or event generation. Available waveforms are sine, sawtooth, rectangle and random signal data.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(843),alt:"Screenshot: SignalGenerator plugin",title:"Screenshot: SignalGenerator plugin"}})]),e._v(" "),t("p",[e._v("SignalGenerator plugin")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("out [double]:")]),e._v(" The generated waveform is provided at this port.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("sendInterval [integer]:")]),e._v(" This value specifies the output rate in milliseconds. Please note that the output rate has to be fast enough to assemble the selected output frequency. For example if a frequency of 2 Hz is set, the send_interval should not be greater than 125 milliseconds according to the sample theorem.")]),e._v(" "),t("li",[t("strong",[e._v("waveForm [integer]:")]),e._v(" The waveform types random, sine, sawtooth and rectangle can be selected.")]),e._v(" "),t("li",[t("strong",[e._v("frequency [double]:")]),e._v(" The frequency of the output signal in Hertz.")]),e._v(" "),t("li",[t("strong",[e._v("amplitude [double]:")]),e._v(" The amplitude of the output signal.")]),e._v(" "),t("li",[t("strong",[e._v("phaseShift [double]:")]),e._v(" The output signal is phase-shifted by this value (in milliseconds).")]),e._v(" "),t("li",[t("strong",[e._v("offset [double]:")]),e._v(" Amplitude-offset of the output signal (this value is added to each generated waveform value).")])])])}),[],!1,null,null,null);t.default=a.exports},843:function(e,t,o){e.exports=o.p+"assets/img/signalgenerator.3806148b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/276.39d8baa3.js b/assets/js/277.bafd8488.js similarity index 94% rename from assets/js/276.39d8baa3.js rename to assets/js/277.bafd8488.js index df024d15db..909fd3332d 100644 --- a/assets/js/276.39d8baa3.js +++ b/assets/js/277.bafd8488.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[276],{1262:function(e,t,i){"use strict";i.r(t);var o=i(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"slider"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#slider"}},[e._v("#")]),e._v(" Slider")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("The Slider component generates a slider with adjustable range of values and size on the ARE desktop. This slider can be used to change important parameters of the model during runtime. Furthermore, an incoming signal can be adjusted by the slider component, using a gain factor property.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(843),alt:"Screenshot: Slider plugin",title:"Screenshot: Slider plugin"}})]),e._v(" "),t("p",[e._v("Slider plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("setValue [integer]:")]),e._v(" Sets the slider position to the incoming value. Note that this value is not propagated to the output port (to avoid loops).")]),e._v(" "),t("li",[t("strong",[e._v("in [double]:")]),e._v(" input port for an incoming signal which can be amplified by the slider component")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("value [integer]:")]),e._v(" This port provides the currently selected slider value (position). Only integer values are possible.")]),e._v(" "),t("li",[t("strong",[e._v("out [double]:")]),e._v(" The amplified (or attenuated) input signal (out = in * gain * slider value)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("min [integer]:")]),e._v(" The minimum value of the slider range")]),e._v(" "),t("li",[t("strong",[e._v("max [integer]:")]),e._v(" The maximum value of the slider range")]),e._v(" "),t("li",[t("strong",[e._v("default [integer]:")]),e._v(" The defualt position of the slider at model startup (this value is not automatically sent to the port at model startup.")]),e._v(" "),t("li",[t("strong",[e._v("gain [double]:")]),e._v(" The amplification value for an (optional) incoming signal (out = in * gain * slider value)")]),e._v(" "),t("li",[t("strong",[e._v("caption [string]:")]),e._v(" A label for the slider")]),e._v(" "),t("li",[t("strong",[e._v("majorTickspacing [integer]:")]),e._v(" Coarse sections for the slider value captions")]),e._v(" "),t("li",[t("strong",[e._v("minorTickspacing [integer]:")]),e._v(" Fine sections for the slider value captions")]),e._v(" "),t("li",[t("strong",[e._v("alignment [integer, combobox selection]:")]),e._v(" Slider orientation in the GUI, can be horizontal or vertical")]),e._v(" "),t("li",[t("strong",[e._v("fontSize [integer]:")]),e._v(" Font size of the caption")]),e._v(" "),t("li",[t("strong",[e._v("storeValue [boolean]:")]),e._v(" if the storeValue property is enabled, the current value of the slider position is stored and restored when the model is started next time. Note that this overrides the defaultValue property.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=r.exports},843:function(e,t,i){e.exports=i.p+"assets/img/slider.5dd042d2.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[277],{1268:function(e,t,i){"use strict";i.r(t);var o=i(2),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"slider"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#slider"}},[e._v("#")]),e._v(" Slider")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("The Slider component generates a slider with adjustable range of values and size on the ARE desktop. This slider can be used to change important parameters of the model during runtime. Furthermore, an incoming signal can be adjusted by the slider component, using a gain factor property.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(850),alt:"Screenshot: Slider plugin",title:"Screenshot: Slider plugin"}})]),e._v(" "),t("p",[e._v("Slider plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("setValue [integer]:")]),e._v(" Sets the slider position to the incoming value. Note that this value is not propagated to the output port (to avoid loops).")]),e._v(" "),t("li",[t("strong",[e._v("in [double]:")]),e._v(" input port for an incoming signal which can be amplified by the slider component")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("value [integer]:")]),e._v(" This port provides the currently selected slider value (position). Only integer values are possible.")]),e._v(" "),t("li",[t("strong",[e._v("out [double]:")]),e._v(" The amplified (or attenuated) input signal (out = in * gain * slider value)")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("min [integer]:")]),e._v(" The minimum value of the slider range")]),e._v(" "),t("li",[t("strong",[e._v("max [integer]:")]),e._v(" The maximum value of the slider range")]),e._v(" "),t("li",[t("strong",[e._v("default [integer]:")]),e._v(" The defualt position of the slider at model startup (this value is not automatically sent to the port at model startup.")]),e._v(" "),t("li",[t("strong",[e._v("gain [double]:")]),e._v(" The amplification value for an (optional) incoming signal (out = in * gain * slider value)")]),e._v(" "),t("li",[t("strong",[e._v("caption [string]:")]),e._v(" A label for the slider")]),e._v(" "),t("li",[t("strong",[e._v("majorTickspacing [integer]:")]),e._v(" Coarse sections for the slider value captions")]),e._v(" "),t("li",[t("strong",[e._v("minorTickspacing [integer]:")]),e._v(" Fine sections for the slider value captions")]),e._v(" "),t("li",[t("strong",[e._v("alignment [integer, combobox selection]:")]),e._v(" Slider orientation in the GUI, can be horizontal or vertical")]),e._v(" "),t("li",[t("strong",[e._v("fontSize [integer]:")]),e._v(" Font size of the caption")]),e._v(" "),t("li",[t("strong",[e._v("storeValue [boolean]:")]),e._v(" if the storeValue property is enabled, the current value of the slider position is stored and restored when the model is started next time. Note that this overrides the defaultValue property.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=r.exports},850:function(e,t,i){e.exports=i.p+"assets/img/slider.5dd042d2.jpg"}}]); \ No newline at end of file diff --git a/assets/js/277.e6d70a61.js b/assets/js/278.fe9fa335.js similarity index 94% rename from assets/js/277.e6d70a61.js rename to assets/js/278.fe9fa335.js index 2f21427529..c25cb765f0 100644 --- a/assets/js/277.e6d70a61.js +++ b/assets/js/278.fe9fa335.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[277],{1265:function(e,t,s){"use strict";s.r(t);var r=s(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("Similar to the Keyboard Hook component, this component provides access to keystrokes coming from a standard keyboard or injected via software. The difference to the Keyboard Hook is that the Text Field Reader opens a GUI element with a text input filed and processes key input only from this text field. The keycodes of the pressed keys and accumulated words (multiple keys separated by ) are provided at the output ports of this component. Possible applications include triggering functions by keyboard input or remapping keys to other keycodes.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(847),alt:"Screenshot: TextfieldReader plugin",title:"Screenshot: TextfieldReader plugin"}})]),e._v(" "),t("p",[e._v("TextfieldReader plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A keyboard which generates keystrokes or a software component which injects keystrokes into the operating system?s message queue.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keys [integer]:")]),e._v(" This port sends the virtual keycode of the last pressed key as an integer value.")]),e._v(" "),t("li",[t("strong",[e._v("words [string]:")]),e._v(" This ports accumulates keystrokes and sends them as a string as soon as a blank separator (space key) appears in the key input stream.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("recognizedCommand1 - recognizedCommand7:")]),e._v(" These event ports fire an event if one of seven command strings has been detected in the current input stream of keys.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("command1 [string] - command7 [string]:")]),e._v(" Seven string properties to specify command strings. The component looks for these command strings in the input stream of keystrokes. If a command string matches, the corresponding event trigger port is raised. This can be useful for example to define voice commands which should trigger certain actions in other ARE plugins.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=o.exports},847:function(e,t,s){e.exports=s.p+"assets/img/textfieldreader.3a481d00.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[278],{1269:function(e,t,s){"use strict";s.r(t);var r=s(2),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frontmatter-title"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frontmatter-title"}},[e._v("#")]),e._v(" "+e._s(e.$frontmatter.title))]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Graphical User Interface)")]),e._v(" "),t("p",[e._v("Similar to the Keyboard Hook component, this component provides access to keystrokes coming from a standard keyboard or injected via software. The difference to the Keyboard Hook is that the Text Field Reader opens a GUI element with a text input filed and processes key input only from this text field. The keycodes of the pressed keys and accumulated words (multiple keys separated by ) are provided at the output ports of this component. Possible applications include triggering functions by keyboard input or remapping keys to other keycodes.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(851),alt:"Screenshot: TextfieldReader plugin",title:"Screenshot: TextfieldReader plugin"}})]),e._v(" "),t("p",[e._v("TextfieldReader plugin")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A keyboard which generates keystrokes or a software component which injects keystrokes into the operating system?s message queue.")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("keys [integer]:")]),e._v(" This port sends the virtual keycode of the last pressed key as an integer value.")]),e._v(" "),t("li",[t("strong",[e._v("words [string]:")]),e._v(" This ports accumulates keystrokes and sends them as a string as soon as a blank separator (space key) appears in the key input stream.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("recognizedCommand1 - recognizedCommand7:")]),e._v(" These event ports fire an event if one of seven command strings has been detected in the current input stream of keys.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("command1 [string] - command7 [string]:")]),e._v(" Seven string properties to specify command strings. The component looks for these command strings in the input stream of keystrokes. If a command string matches, the corresponding event trigger port is raised. This can be useful for example to define voice commands which should trigger certain actions in other ARE plugins.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" If selected, the GUI of this component will be displayed - if not, the GUI will be hidden and disabled.")])])])}),[],!1,null,null,null);t.default=o.exports},851:function(e,t,s){e.exports=s.p+"assets/img/textfieldreader.3a481d00.jpg"}}]); \ No newline at end of file diff --git a/assets/js/278.f476fa23.js b/assets/js/279.46051ca8.js similarity index 96% rename from assets/js/278.f476fa23.js rename to assets/js/279.46051ca8.js index cc570772a9..0b3f8b7e8d 100644 --- a/assets/js/278.f476fa23.js +++ b/assets/js/279.46051ca8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[278],{1264:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"timer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#timer"}},[e._v("#")]),e._v(" Timer")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Simulation)")]),e._v(" "),t("p",[e._v("The timer component can measure time in milliseconds, provide current time on an output port and trigger events when a specified time period has passed. It can be used to influence other features (e.g. to provide acceleration) or to enable dwell selection, for example clicking when a certain time has passed.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(846),alt:"Screenshot: Timer plugin",title:"Screenshot: Timer plugin"}})]),e._v(" "),t("p",[e._v("Timer plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("period [integer]:")]),e._v(" The number of milliseconds the timer period property is set to.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("time [integer]:")]),e._v(" The number of milliseconds which have passed since the timer has been started.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" An incoming event starts the timer.")]),e._v(" "),t("li",[t("strong",[e._v("stop:")]),e._v(" An incoming event stops the timer (pause, the current time value is not reset to 0).")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" An incoming event resets the time value to 0 (but does not stop the timer).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("periodFinished:")]),e._v(" This event is triggered when the given time has passed.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mode [integer]:")]),e._v(" This property selects one of several possible modes of operation of the timer:\n"),t("ul",[t("li",[t("em",[e._v("“one shot”:")]),e._v(" The timer runs once from 0 to the specified time, and then stops.")]),e._v(" "),t("li",[t("em",[e._v("“repeat n times”:")]),e._v(" The timer completes the time period several times (the number is selected with the repeat counter property).")]),e._v(" "),t("li",[t("em",[e._v("“endless loop”:")]),e._v(" the timer completes the time period until it is stopped by an event at the stop listener port.")]),e._v(" "),t("li",[t("em",[e._v("“once and continue time output”:")]),e._v(" The time period is completed once, the timer is not stopped but continues to send the last time value (this is useful to generate increasing values with persisting maximum value, e.g. for utilization as accelerated speed value).")]),e._v(" "),t("li",[t("em",[e._v("“measure time between start and stop”:")]),e._v(" The timer sends the time passed from start to stop events to the output port (when stop was received).")])])]),e._v(" "),t("li",[t("strong",[e._v("repeatCounter [integer]:")]),e._v(' The number of periods to finish for the "repeat n times " mode.')]),e._v(" "),t("li",[t("strong",[e._v("timePeriod (ms) [integer]:")]),e._v(" The time period covered by this counter in milliseconds.")]),e._v(" "),t("li",[t("strong",[e._v("resolution (ms) [integer]:")]),e._v(" The update rate of the timer in milliseconds. This value defines how often the current time value is updated and sent to the output port. It thereby defines the accuracy for the timer.")]),e._v(" "),t("li",[t("strong",[e._v("waitPeriod (ms) [integer]:")]),e._v(" This value specifies how long the timer is bypassed before it actually starts (after receiving a start event).")]),e._v(" "),t("li",[t("strong",[e._v("autostart [boolean]:")]),e._v(" This property defines if the timer will be started automatically together with the model (true) or if it will be started by an event (false).")])])])}),[],!1,null,null,null);t.default=s.exports},846:function(e,t,i){e.exports=i.p+"assets/img/timer.1ce9db2c.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[279],{1271:function(e,t,i){"use strict";i.r(t);var r=i(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"timer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#timer"}},[e._v("#")]),e._v(" Timer")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Simulation)")]),e._v(" "),t("p",[e._v("The timer component can measure time in milliseconds, provide current time on an output port and trigger events when a specified time period has passed. It can be used to influence other features (e.g. to provide acceleration) or to enable dwell selection, for example clicking when a certain time has passed.")]),e._v(" "),t("p",[t("img",{attrs:{src:i(855),alt:"Screenshot: Timer plugin",title:"Screenshot: Timer plugin"}})]),e._v(" "),t("p",[e._v("Timer plugin")]),e._v(" "),t("h2",{attrs:{id:"input-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[e._v("#")]),e._v(" Input Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("period [integer]:")]),e._v(" The number of milliseconds the timer period property is set to.")])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("time [integer]:")]),e._v(" The number of milliseconds which have passed since the timer has been started.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("start:")]),e._v(" An incoming event starts the timer.")]),e._v(" "),t("li",[t("strong",[e._v("stop:")]),e._v(" An incoming event stops the timer (pause, the current time value is not reset to 0).")]),e._v(" "),t("li",[t("strong",[e._v("reset:")]),e._v(" An incoming event resets the time value to 0 (but does not stop the timer).")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("periodFinished:")]),e._v(" This event is triggered when the given time has passed.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("mode [integer]:")]),e._v(" This property selects one of several possible modes of operation of the timer:\n"),t("ul",[t("li",[t("em",[e._v("“one shot”:")]),e._v(" The timer runs once from 0 to the specified time, and then stops.")]),e._v(" "),t("li",[t("em",[e._v("“repeat n times”:")]),e._v(" The timer completes the time period several times (the number is selected with the repeat counter property).")]),e._v(" "),t("li",[t("em",[e._v("“endless loop”:")]),e._v(" the timer completes the time period until it is stopped by an event at the stop listener port.")]),e._v(" "),t("li",[t("em",[e._v("“once and continue time output”:")]),e._v(" The time period is completed once, the timer is not stopped but continues to send the last time value (this is useful to generate increasing values with persisting maximum value, e.g. for utilization as accelerated speed value).")]),e._v(" "),t("li",[t("em",[e._v("“measure time between start and stop”:")]),e._v(" The timer sends the time passed from start to stop events to the output port (when stop was received).")])])]),e._v(" "),t("li",[t("strong",[e._v("repeatCounter [integer]:")]),e._v(' The number of periods to finish for the "repeat n times " mode.')]),e._v(" "),t("li",[t("strong",[e._v("timePeriod (ms) [integer]:")]),e._v(" The time period covered by this counter in milliseconds.")]),e._v(" "),t("li",[t("strong",[e._v("resolution (ms) [integer]:")]),e._v(" The update rate of the timer in milliseconds. This value defines how often the current time value is updated and sent to the output port. It thereby defines the accuracy for the timer.")]),e._v(" "),t("li",[t("strong",[e._v("waitPeriod (ms) [integer]:")]),e._v(" This value specifies how long the timer is bypassed before it actually starts (after receiving a start event).")]),e._v(" "),t("li",[t("strong",[e._v("autostart [boolean]:")]),e._v(" This property defines if the timer will be started automatically together with the model (true) or if it will be started by an event (false).")])])])}),[],!1,null,null,null);t.default=s.exports},855:function(e,t,i){e.exports=i.p+"assets/img/timer.1ce9db2c.jpg"}}]); \ No newline at end of file diff --git a/assets/js/28.46ef6553.js b/assets/js/28.80b9c744.js similarity index 94% rename from assets/js/28.46ef6553.js rename to assets/js/28.80b9c744.js index e9f8b75f74..c52b09219c 100644 --- a/assets/js/28.46ef6553.js +++ b/assets/js/28.80b9c744.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{1050:function(e,t,i){"use strict";i.r(t);var a=i(2),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"grid-appearance-and-layout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grid-appearance-and-layout"}},[e._v("#")]),e._v(" Grid appearance and layout")]),e._v(" "),t("p",[t("strong",[e._v("Videos on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Iw605fb85bs&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=12&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Layout options"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=X6YrWJW2ZoM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=21&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Collect elements"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=t0FWZcM9TMg&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=22&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Prediction elements"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("This chapter is about a grid’s layout and appearance and how to edit it:")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html#adding-elements-and-layout-options"}},[e._v("Adding elements and change the layout")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html#editing-grid-elements"}},[e._v("Editing grid elements menu")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html#edit-grid-item-modal"}},[e._v("Edit modal")]),e._v(": changing label and image")],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"adding-elements-and-layout-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-elements-and-layout-options"}},[e._v("#")]),e._v(" Adding elements and layout options")]),e._v(" "),t("p",[e._v("In the "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#edit-view"}},[e._v("Edit view (“Editing on”)")]),e._v(" the following menu opens on a click on “more”:")],1),e._v(" "),t("p",[t("img",{attrs:{src:i(534),alt:"edit view - more menu"}}),e._v(" "),t("em",[e._v("Fig. 1: Edit view - menu “more”")])]),e._v(" "),t("p",[e._v("These are the actions to select in the menu:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("New → New Element")]),e._v(": creates a normal new element, opening a dialog where label and image can be defined")]),e._v(" "),t("li",[t("strong",[e._v("New → Many new elements")]),e._v(": creates multiple new normal elements at once, opening a dialog where multiple elements can be defined and inserted into the grid")]),e._v(" "),t("li",[t("strong",[e._v("New → New collect element")]),e._v(": creates a new collect element, see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#grid-element"}},[e._v("Terms")])],1),e._v(" "),t("li",[t("strong",[e._v("New → New prediction element")]),e._v(": creates a new prediction element, see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#grid-element"}},[e._v("Terms")])],1),e._v(" "),t("li",[t("strong",[e._v("New → New YouTube Player")]),e._v(": creates a new YouTube Player element")]),e._v(" "),t("li",[t("strong",[e._v("Delete all elements")]),e._v(": removes all grid elements from the grid")]),e._v(" "),t("li",[t("strong",[e._v("Change grid dimensions")]),e._v(": set grid size (number of rows and minimum number of columns)")]),e._v(" "),t("li",[t("strong",[e._v("Translate grid")]),e._v(": select which grid(s) to translate and in which language the texts shall be translated")]),e._v(" "),t("li",[t("strong",[e._v("Fill gaps")]),e._v(": moves all grid elements as far left as possible, closing gaps as the following image shows:\n"),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{staticStyle:{"margin-left":"2em"},attrs:{src:i(535),alt:"fill gaps",width:"130"}})])]),e._v(" "),t("li",[t("strong",[e._v("Edit global grid")]),e._v(": directly go to the page, where the global grid can be edited (otherwise go to "),t("em",[e._v("Manage grids → Edit global Grid")]),e._v(" (at the bottom))")])]),e._v(" "),t("h2",{attrs:{id:"editing-grid-elements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-grid-elements"}},[e._v("#")]),e._v(" Editing grid elements")]),e._v(" "),t("p",[e._v("A right click (or long tap) on a grid element in "),t("strong",[e._v("edit view (“editing on”)")]),e._v(" opens the following menu:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(536),alt:"edit view - element menu"}}),e._v(" "),t("em",[e._v("Fig. 2: Grid element menu in “Editing on” - view")])]),e._v(" "),t("p",[e._v("These are the options to select:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Edit")]),e._v(": opens a dialog to edit the label and the image of this element (“Edit modal”)")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": deletes this element")]),e._v(" "),t("li",[t("strong",[e._v("More → Clone")]),e._v(": inserts a copy of this element to the grid")]),e._v(" "),t("li",[t("strong",[e._v("More → Do element action")]),e._v(": performs the actions that are assigned to this grid element, e.g. speaking the label or navigating to another grid")]),e._v(" "),t("li",[t("strong",[e._v("More → Move element to other grid")]),e._v(": moves the element to another grid which can be selected")])]),e._v(" "),t("h2",{attrs:{id:"edit-grid-item-modal"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#edit-grid-item-modal"}},[e._v("#")]),e._v(" “Edit grid item” modal")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=KWwWgCgidXM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=13&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Add and edit elements"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The “Edit”-modal is opened by a right click (or long tap) on a grid element in "),t("strong",[e._v("edit view (“editing on”)")]),e._v(" and subsequent clicking on “Edit”. The “Edit”-modal has three tabs (General, Image and Actions):")]),e._v(" "),t("h4",{attrs:{id:"tab-general"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tab-general"}},[e._v("#")]),e._v(" Tab “General”")]),e._v(" "),t("p",[e._v("Clicking on “Edit” in the grid element menu (Fig. 2) opens the following modal (Tab "),t("em",[e._v("General")]),e._v(") shown in Figure 3:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(537),alt:"edit grid element general"}}),e._v(" "),t("em",[e._v("Fig. 3: “Edit grid item” modal - Tab “General”")])]),e._v(" "),t("p",[e._v("These are the elements in the modal of Figure 3 (Edit grid item - Tab "),t("em",[e._v("General")]),e._v("):")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Label")]),e._v(": change the label of the element shown under the image, can be empty")]),e._v(" "),t("li",[t("strong",[e._v("Color category")]),e._v(": choose the color category (Noun, Verb, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("Search for images")]),e._v(": change to the "),t("em",[e._v("Image")]),e._v("-Tab.")]),e._v(" "),t("li",[t("strong",[e._v("Costum background color")]),e._v(": choose a different backgroud color")]),e._v(" "),t("li",[t("strong",[e._v("Hide element")]),e._v(": the element will only be visible in the “Editing on”-view. After clicking “Editing off”, it will not be visible.")]),e._v(" "),t("li",[t("strong",[e._v("Cancel")]),e._v(": discard all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK")]),e._v(": save all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit previous")]),e._v(": save all changes, edit the previous grid element in the “Edit grid item” modal - Tab “General”")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit next")]),e._v(": save all changes, edit the next grid element in the “Edit grid item” modal - Tab “General”")])]),e._v(" "),t("h4",{attrs:{id:"tab-image"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tab-image"}},[e._v("#")]),e._v(" Tab “Image”")]),e._v(" "),t("p",[t("img",{attrs:{src:i(538),alt:"edit grid element image"}}),e._v(" "),t("em",[e._v("Fig. 4: “Edit grid item” modal - Tab “Image”")])]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Choose file")]),e._v(": opens a file dialog to choose a different image")]),e._v(" "),t("li",[t("strong",[e._v("Search by label")]),e._v(": image search is done by label")]),e._v(" "),t("li",[t("strong",[e._v("Clear image")]),e._v(": deletes the currently chosen image")]),e._v(" "),t("li",[t("strong",[e._v("Drop area")]),e._v(": drag and drop image files in this area to select them. It’s possible to drag and drop files from a file explorer or also other programs like e.g. METACOM MetaSearch*.\n![fill gaps](file://C:\\Users\\Agnes Scheibenreif\\OneDrive - FH Technikum Wien\\Projekte\\WBT\\Github codes\\AsTeRICS-Grid\\docs\\documentation_user\\img\\drag_metacom.gif)")]),e._v(" "),t("li",[t("strong",[e._v("Image Search")]),e._v(": type in the name of which images shall be looked for")]),e._v(" "),t("li",[t("strong",[e._v("Search Provider")]),e._v(": select the provider for the image search")]),e._v(" "),t("li",[t("strong",[e._v("Settings for image search")]),e._v(": select additional settings like Plural or Color (skin color, hair color,…)")])]),e._v(" "),t("h4",{attrs:{id:"tab-actions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tab-actions"}},[e._v("#")]),e._v(" Tab “Actions”")]),e._v(" "),t("p",[t("img",{attrs:{src:i(313),alt:"edit grid element actions"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 5: “Edit grid item” modal - Tab “Actions”")])]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("New Action")]),e._v(": select type of new action in the combobox (e.g. Speak label, Navigate to other grid)")]),e._v(" "),t("li",[t("strong",[e._v("Add action")]),e._v(": add the selected type of action to the grid")]),e._v(" "),t("li",[t("strong",[e._v("Current actions")]),e._v(": actions currently assigned to the current grid element are shown here")]),e._v(" "),t("li",[t("strong",[e._v("Edit")]),e._v(": open additional drop down menus to edit and configure the particular action")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": delete this action from the current grid element")]),e._v(" "),t("li",[t("strong",[e._v("Test")]),e._v(": tests the action, e.g. speaks the label. This button is not available for all types of actions.")]),e._v(" "),t("li",[t("strong",[e._v("Cancel")]),e._v(": discard all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK")]),e._v(": save all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit previous")]),e._v(": save all changes, edit the previous grid element in the “Edit grid item” modal - Tab “Actions”")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit next")]),e._v(": save all changes, edit the next grid element in the “Edit grid item” modal - Tab “Actions”")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.metacom-symbole.de/",target:"_blank"}},[e._v("*METACOM and MetaSearch")]),e._v(" © Annette Kitzinger")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=n.exports},313:function(e,t,i){e.exports=i.p+"assets/img/edit_grid_element_actions_en.8cb3125d.jpg"},534:function(e,t,i){e.exports=i.p+"assets/img/edit_moremenu_en.619098c5.jpg"},535:function(e,t,i){e.exports=i.p+"assets/img/fill_gaps.cc2b28c6.gif"},536:function(e,t,i){e.exports=i.p+"assets/img/edit_element_menu_en.41b988c2.jpg"},537:function(e,t,i){e.exports=i.p+"assets/img/edit_grid_element_general_en.c0b2582a.jpg"},538:function(e,t,i){e.exports=i.p+"assets/img/edit_grid_element_image_en.d78a5e47.jpg"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{1049:function(e,t,i){"use strict";i.r(t);var a=i(2),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"grid-appearance-and-layout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grid-appearance-and-layout"}},[e._v("#")]),e._v(" Grid appearance and layout")]),e._v(" "),t("p",[t("strong",[e._v("Videos on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Iw605fb85bs&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=12&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Layout options"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=X6YrWJW2ZoM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=21&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Collect elements"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=t0FWZcM9TMg&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=22&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Prediction elements"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("This chapter is about a grid’s layout and appearance and how to edit it:")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html#adding-elements-and-layout-options"}},[e._v("Adding elements and change the layout")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html#editing-grid-elements"}},[e._v("Editing grid elements menu")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/03_appearance_layout.html#edit-grid-item-modal"}},[e._v("Edit modal")]),e._v(": changing label and image")],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"adding-elements-and-layout-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-elements-and-layout-options"}},[e._v("#")]),e._v(" Adding elements and layout options")]),e._v(" "),t("p",[e._v("In the "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html#edit-view"}},[e._v("Edit view (“Editing on”)")]),e._v(" the following menu opens on a click on “more”:")],1),e._v(" "),t("p",[t("img",{attrs:{src:i(501),alt:"edit view - more menu"}}),e._v(" "),t("em",[e._v("Fig. 1: Edit view - menu “more”")])]),e._v(" "),t("p",[e._v("These are the actions to select in the menu:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("New → New Element")]),e._v(": creates a normal new element, opening a dialog where label and image can be defined")]),e._v(" "),t("li",[t("strong",[e._v("New → Many new elements")]),e._v(": creates multiple new normal elements at once, opening a dialog where multiple elements can be defined and inserted into the grid")]),e._v(" "),t("li",[t("strong",[e._v("New → New collect element")]),e._v(": creates a new collect element, see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#grid-element"}},[e._v("Terms")])],1),e._v(" "),t("li",[t("strong",[e._v("New → New prediction element")]),e._v(": creates a new prediction element, see "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/01_terms.html#grid-element"}},[e._v("Terms")])],1),e._v(" "),t("li",[t("strong",[e._v("New → New YouTube Player")]),e._v(": creates a new YouTube Player element")]),e._v(" "),t("li",[t("strong",[e._v("Delete all elements")]),e._v(": removes all grid elements from the grid")]),e._v(" "),t("li",[t("strong",[e._v("Change grid dimensions")]),e._v(": set grid size (number of rows and minimum number of columns)")]),e._v(" "),t("li",[t("strong",[e._v("Translate grid")]),e._v(": select which grid(s) to translate and in which language the texts shall be translated")]),e._v(" "),t("li",[t("strong",[e._v("Fill gaps")]),e._v(": moves all grid elements as far left as possible, closing gaps as the following image shows:\n"),t("div",{staticStyle:{"margin-left":"2em"}},[t("img",{staticStyle:{"margin-left":"2em"},attrs:{src:i(502),alt:"fill gaps",width:"130"}})])]),e._v(" "),t("li",[t("strong",[e._v("Edit global grid")]),e._v(": directly go to the page, where the global grid can be edited (otherwise go to "),t("em",[e._v("Manage grids → Edit global Grid")]),e._v(" (at the bottom))")])]),e._v(" "),t("h2",{attrs:{id:"editing-grid-elements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-grid-elements"}},[e._v("#")]),e._v(" Editing grid elements")]),e._v(" "),t("p",[e._v("A right click (or long tap) on a grid element in "),t("strong",[e._v("edit view (“editing on”)")]),e._v(" opens the following menu:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(503),alt:"edit view - element menu"}}),e._v(" "),t("em",[e._v("Fig. 2: Grid element menu in “Editing on” - view")])]),e._v(" "),t("p",[e._v("These are the options to select:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Edit")]),e._v(": opens a dialog to edit the label and the image of this element (“Edit modal”)")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": deletes this element")]),e._v(" "),t("li",[t("strong",[e._v("More → Clone")]),e._v(": inserts a copy of this element to the grid")]),e._v(" "),t("li",[t("strong",[e._v("More → Do element action")]),e._v(": performs the actions that are assigned to this grid element, e.g. speaking the label or navigating to another grid")]),e._v(" "),t("li",[t("strong",[e._v("More → Move element to other grid")]),e._v(": moves the element to another grid which can be selected")])]),e._v(" "),t("h2",{attrs:{id:"edit-grid-item-modal"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#edit-grid-item-modal"}},[e._v("#")]),e._v(" “Edit grid item” modal")]),e._v(" "),t("p",[t("strong",[e._v("Video on YouTube:")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=KWwWgCgidXM&list=PL0UXHkT03dGrIHldlEKR0ZWfNMkShuTNz&index=13&t=0s",target:"_blank",rel:"noopener noreferrer"}},[e._v("Add and edit elements"),t("OutboundLink")],1),e._v(" (German, but auto-translated subtitles available)")]),e._v(" "),t("p",[e._v("The “Edit”-modal is opened by a right click (or long tap) on a grid element in "),t("strong",[e._v("edit view (“editing on”)")]),e._v(" and subsequent clicking on “Edit”. The “Edit”-modal has three tabs (General, Image and Actions):")]),e._v(" "),t("h4",{attrs:{id:"tab-general"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tab-general"}},[e._v("#")]),e._v(" Tab “General”")]),e._v(" "),t("p",[e._v("Clicking on “Edit” in the grid element menu (Fig. 2) opens the following modal (Tab "),t("em",[e._v("General")]),e._v(") shown in Figure 3:")]),e._v(" "),t("p",[t("img",{attrs:{src:i(504),alt:"edit grid element general"}}),e._v(" "),t("em",[e._v("Fig. 3: “Edit grid item” modal - Tab “General”")])]),e._v(" "),t("p",[e._v("These are the elements in the modal of Figure 3 (Edit grid item - Tab "),t("em",[e._v("General")]),e._v("):")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Label")]),e._v(": change the label of the element shown under the image, can be empty")]),e._v(" "),t("li",[t("strong",[e._v("Color category")]),e._v(": choose the color category (Noun, Verb, etc.)")]),e._v(" "),t("li",[t("strong",[e._v("Search for images")]),e._v(": change to the "),t("em",[e._v("Image")]),e._v("-Tab.")]),e._v(" "),t("li",[t("strong",[e._v("Costum background color")]),e._v(": choose a different backgroud color")]),e._v(" "),t("li",[t("strong",[e._v("Hide element")]),e._v(": the element will only be visible in the “Editing on”-view. After clicking “Editing off”, it will not be visible.")]),e._v(" "),t("li",[t("strong",[e._v("Cancel")]),e._v(": discard all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK")]),e._v(": save all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit previous")]),e._v(": save all changes, edit the previous grid element in the “Edit grid item” modal - Tab “General”")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit next")]),e._v(": save all changes, edit the next grid element in the “Edit grid item” modal - Tab “General”")])]),e._v(" "),t("h4",{attrs:{id:"tab-image"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tab-image"}},[e._v("#")]),e._v(" Tab “Image”")]),e._v(" "),t("p",[t("img",{attrs:{src:i(505),alt:"edit grid element image"}}),e._v(" "),t("em",[e._v("Fig. 4: “Edit grid item” modal - Tab “Image”")])]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Choose file")]),e._v(": opens a file dialog to choose a different image")]),e._v(" "),t("li",[t("strong",[e._v("Search by label")]),e._v(": image search is done by label")]),e._v(" "),t("li",[t("strong",[e._v("Clear image")]),e._v(": deletes the currently chosen image")]),e._v(" "),t("li",[t("strong",[e._v("Drop area")]),e._v(": drag and drop image files in this area to select them. It’s possible to drag and drop files from a file explorer or also other programs like e.g. METACOM MetaSearch*.\n![fill gaps](file://C:\\Users\\Agnes Scheibenreif\\OneDrive - FH Technikum Wien\\Projekte\\WBT\\Github codes\\AsTeRICS-Grid\\docs\\documentation_user\\img\\drag_metacom.gif)")]),e._v(" "),t("li",[t("strong",[e._v("Image Search")]),e._v(": type in the name of which images shall be looked for")]),e._v(" "),t("li",[t("strong",[e._v("Search Provider")]),e._v(": select the provider for the image search")]),e._v(" "),t("li",[t("strong",[e._v("Settings for image search")]),e._v(": select additional settings like Plural or Color (skin color, hair color,…)")])]),e._v(" "),t("h4",{attrs:{id:"tab-actions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tab-actions"}},[e._v("#")]),e._v(" Tab “Actions”")]),e._v(" "),t("p",[t("img",{attrs:{src:i(313),alt:"edit grid element actions"}})]),e._v(" "),t("p",[t("em",[e._v("Fig. 5: “Edit grid item” modal - Tab “Actions”")])]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("New Action")]),e._v(": select type of new action in the combobox (e.g. Speak label, Navigate to other grid)")]),e._v(" "),t("li",[t("strong",[e._v("Add action")]),e._v(": add the selected type of action to the grid")]),e._v(" "),t("li",[t("strong",[e._v("Current actions")]),e._v(": actions currently assigned to the current grid element are shown here")]),e._v(" "),t("li",[t("strong",[e._v("Edit")]),e._v(": open additional drop down menus to edit and configure the particular action")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(": delete this action from the current grid element")]),e._v(" "),t("li",[t("strong",[e._v("Test")]),e._v(": tests the action, e.g. speaks the label. This button is not available for all types of actions.")]),e._v(" "),t("li",[t("strong",[e._v("Cancel")]),e._v(": discard all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK")]),e._v(": save all changes and close the modal")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit previous")]),e._v(": save all changes, edit the previous grid element in the “Edit grid item” modal - Tab “Actions”")]),e._v(" "),t("li",[t("strong",[e._v("OK, edit next")]),e._v(": save all changes, edit the next grid element in the “Edit grid item” modal - Tab “Actions”")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.metacom-symbole.de/",target:"_blank"}},[e._v("*METACOM and MetaSearch")]),e._v(" © Annette Kitzinger")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/02_navigation.html"}},[e._v("← Previous Chapter")]),e._v(" "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/04_input_options.html"}},[e._v("Next Chapter →")])],1),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("Back to Overview")])],1)])}),[],!1,null,null,null);t.default=n.exports},313:function(e,t,i){e.exports=i.p+"assets/img/edit_grid_element_actions_en.8cb3125d.jpg"},501:function(e,t,i){e.exports=i.p+"assets/img/edit_moremenu_en.619098c5.jpg"},502:function(e,t,i){e.exports=i.p+"assets/img/fill_gaps.cc2b28c6.gif"},503:function(e,t,i){e.exports=i.p+"assets/img/edit_element_menu_en.41b988c2.jpg"},504:function(e,t,i){e.exports=i.p+"assets/img/edit_grid_element_general_en.c0b2582a.jpg"},505:function(e,t,i){e.exports=i.p+"assets/img/edit_grid_element_image_en.d78a5e47.jpg"}}]); \ No newline at end of file diff --git a/assets/js/279.cb1399b6.js b/assets/js/280.61f9805f.js similarity index 96% rename from assets/js/279.cb1399b6.js rename to assets/js/280.61f9805f.js index bd3f8331d8..cc19bd6d2c 100644 --- a/assets/js/279.cb1399b6.js +++ b/assets/js/280.61f9805f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[279],{1271:function(e,t,a){"use strict";a.r(t);var r=a(2),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tobii4cheadtracker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tobii4cheadtracker"}},[e._v("#")]),e._v(" Tobii4CHeadTracker")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("OS: Windows")]),e._v(" "),t("p",[e._v("This component provides access to the raw head tracking data of the "),t("a",{attrs:{href:"https://tobiigaming.com/eye-tracker-4c/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tobii Tracker 4C"),t("OutboundLink")],1),e._v(" eye tracking device. The data includes the head position (x/y/z) in mm and the head rotation (x/y/z) in Euler angles. The Tobii4CHeadTracker plugin can be combined with the "),t("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/AsTeRICS-Help/master/Plugins/sensors/EyeX.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("EyeX"),t("OutboundLink")],1),e._v(" plugin to also get the eye gaze data.")]),e._v(" "),t("p",[e._v("The plugin connects to the device via the "),t("a",{attrs:{href:"https://tobiigaming.com/getstarted/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tobii Eye Tracking Core Software"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("OS: Windows")]),e._v(" "),t("li",[e._v("USB port: The Tracker 4C needs at least a USB 2.0 port. Preferably don’t use a USB hub, or only use a "),t("a",{attrs:{href:"https://help.tobii.com/hc/en-us/articles/212907389-Recommended-USB-2-0-hubs",target:"_blank",rel:"noopener noreferrer"}},[e._v("recommended hub from Tobii"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://tobiigaming.com/getstarted/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tobii Eye Tracking Core Software"),t("OutboundLink")],1),e._v(" must be installed and running.")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(858),alt:"Screenshot: Tobii Tracker 4C plugin",title:"Screenshot: Tobii Tracker 4C plugin"}})]),e._v(" "),t("p",[e._v("Tobii Tracker 4C")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[e._v("**headRotX [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head rotation x angle (Euler).")]),e._v(" "),t("li",[e._v("**headRotY [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head rotation y angle (Euler).")]),e._v(" "),t("li",[e._v("**headRotZ [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head rotation z angle (Euler).")]),e._v(" "),t("li",[e._v("**headPosX [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head position x coordinate (mm).")]),e._v(" "),t("li",[e._v("**headPosY [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head position y coordinate (mm).")]),e._v(" "),t("li",[e._v("**headPosZ [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head position y coordinate (mm).")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activate:")]),e._v(" Activates (Turns on) the eye tracker device.")]),e._v(" "),t("li",[t("strong",[e._v("deactivate")]),e._v(" Deactivates (Pauses) the eye tracker device.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("userPresenceStatusAway:")]),e._v(" Indicates that no user is sitting in front of the tracker.")]),e._v(" "),t("li",[t("strong",[e._v("userPresenceStatusPresent:")]),e._v(" Indicates that a user is sitting in front of the tracker.")]),e._v(" "),t("li",[t("strong",[e._v("calibrationStarted:")]),e._v(" Indicates that the tracker calibration has been started.")]),e._v(" "),t("li",[t("strong",[e._v("calibrationFinished:")]),e._v(" Indicates that the tracker calibration has been finished.")]),e._v(" "),t("li",[t("strong",[e._v("displayAreaChanged:")]),e._v(" Indicates that the assigned display has been changed.")]),e._v(" "),t("li",[t("strong",[e._v("powerSaveStateTrue:")]),e._v(" Indicates that the tracker is in power save mode.")]),e._v(" "),t("li",[t("strong",[e._v("powerSaveStateFalse:")]),e._v(" Indicates that the tracker is not in power save mode.")]),e._v(" "),t("li",[t("strong",[e._v("deviceOff:")]),e._v(" Indicates that the tracker is currently paused.")]),e._v(" "),t("li",[t("strong",[e._v("deviceOn:")]),e._v(" Indicates that the tracker is currently enabled.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enabled [boolean]:")]),e._v(" Selects if the tracker is enabled at startup.")])])])}),[],!1,null,null,null);t.default=i.exports},858:function(e,t,a){e.exports=a.p+"assets/img/tobiigaming_product_4c.a006cad9.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[280],{1272:function(e,t,a){"use strict";a.r(t);var r=a(2),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tobii4cheadtracker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tobii4cheadtracker"}},[e._v("#")]),e._v(" Tobii4CHeadTracker")]),e._v(" "),t("p",[e._v("Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("OS: Windows")]),e._v(" "),t("p",[e._v("This component provides access to the raw head tracking data of the "),t("a",{attrs:{href:"https://tobiigaming.com/eye-tracker-4c/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tobii Tracker 4C"),t("OutboundLink")],1),e._v(" eye tracking device. The data includes the head position (x/y/z) in mm and the head rotation (x/y/z) in Euler angles. The Tobii4CHeadTracker plugin can be combined with the "),t("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/AsTeRICS-Help/master/Plugins/sensors/EyeX.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("EyeX"),t("OutboundLink")],1),e._v(" plugin to also get the eye gaze data.")]),e._v(" "),t("p",[e._v("The plugin connects to the device via the "),t("a",{attrs:{href:"https://tobiigaming.com/getstarted/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tobii Eye Tracking Core Software"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("OS: Windows")]),e._v(" "),t("li",[e._v("USB port: The Tracker 4C needs at least a USB 2.0 port. Preferably don’t use a USB hub, or only use a "),t("a",{attrs:{href:"https://help.tobii.com/hc/en-us/articles/212907389-Recommended-USB-2-0-hubs",target:"_blank",rel:"noopener noreferrer"}},[e._v("recommended hub from Tobii"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://tobiigaming.com/getstarted/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tobii Eye Tracking Core Software"),t("OutboundLink")],1),e._v(" must be installed and running.")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(856),alt:"Screenshot: Tobii Tracker 4C plugin",title:"Screenshot: Tobii Tracker 4C plugin"}})]),e._v(" "),t("p",[e._v("Tobii Tracker 4C")]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[e._v("**headRotX [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head rotation x angle (Euler).")]),e._v(" "),t("li",[e._v("**headRotY [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head rotation y angle (Euler).")]),e._v(" "),t("li",[e._v("**headRotZ [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head rotation z angle (Euler).")]),e._v(" "),t("li",[e._v("**headPosX [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head position x coordinate (mm).")]),e._v(" "),t("li",[e._v("**headPosY [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head position y coordinate (mm).")]),e._v(" "),t("li",[e._v("**headPosZ [double]"),t("img",{staticClass:"emoji",attrs:{draggable:"false",alt:"😗",src:"https://twemoji.maxcdn.com/2/svg/1f617.svg"}}),e._v("*Head position y coordinate (mm).")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("activate:")]),e._v(" Activates (Turns on) the eye tracker device.")]),e._v(" "),t("li",[t("strong",[e._v("deactivate")]),e._v(" Deactivates (Pauses) the eye tracker device.")])]),e._v(" "),t("h2",{attrs:{id:"event-trigger-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[e._v("#")]),e._v(" Event Trigger Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("userPresenceStatusAway:")]),e._v(" Indicates that no user is sitting in front of the tracker.")]),e._v(" "),t("li",[t("strong",[e._v("userPresenceStatusPresent:")]),e._v(" Indicates that a user is sitting in front of the tracker.")]),e._v(" "),t("li",[t("strong",[e._v("calibrationStarted:")]),e._v(" Indicates that the tracker calibration has been started.")]),e._v(" "),t("li",[t("strong",[e._v("calibrationFinished:")]),e._v(" Indicates that the tracker calibration has been finished.")]),e._v(" "),t("li",[t("strong",[e._v("displayAreaChanged:")]),e._v(" Indicates that the assigned display has been changed.")]),e._v(" "),t("li",[t("strong",[e._v("powerSaveStateTrue:")]),e._v(" Indicates that the tracker is in power save mode.")]),e._v(" "),t("li",[t("strong",[e._v("powerSaveStateFalse:")]),e._v(" Indicates that the tracker is not in power save mode.")]),e._v(" "),t("li",[t("strong",[e._v("deviceOff:")]),e._v(" Indicates that the tracker is currently paused.")]),e._v(" "),t("li",[t("strong",[e._v("deviceOn:")]),e._v(" Indicates that the tracker is currently enabled.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("enabled [boolean]:")]),e._v(" Selects if the tracker is enabled at startup.")])])])}),[],!1,null,null,null);t.default=i.exports},856:function(e,t,a){e.exports=a.p+"assets/img/tobiigaming_product_4c.a006cad9.png"}}]); \ No newline at end of file diff --git a/assets/js/280.326c93e2.js b/assets/js/281.702a3ccc.js similarity index 99% rename from assets/js/280.326c93e2.js rename to assets/js/281.702a3ccc.js index b90c1bf13e..7892611dc5 100644 --- a/assets/js/280.326c93e2.js +++ b/assets/js/281.702a3ccc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[280],{1268:function(e,t,a){"use strict";a.r(t);var r=a(2),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"xfacetrackerlk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#xfacetrackerlk"}},[e._v("#")]),e._v(" XFacetrackerLK")]),e._v(" "),t("h3",{attrs:{id:"component-type-sensor-subcategory-computer-vision"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-sensor-subcategory-computer-vision"}},[e._v("#")]),e._v(" Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("OS: Windows (x86, x64), Linux (x86, x64, RPi3), Mac OSX")]),e._v(" "),t("p",[e._v("This component provides a cross-platform face tracking computer vision algorithm which puts out estimated movement of a user’s nose and chin in x and y coordinates. The underlying mechanism builds upon the "),t("a",{attrs:{href:"https://github.com/bytedeco/javacv",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaCV library"),t("OutboundLink")],1),e._v(" for frame grabbing and computer vision processing. In particular a trained cascade of haar-like features is used in combination with a Lukas Kanade optical flow algorithm to track a face and its movement. The x- and y- coordinates can be used in camera-mouse configurations or to enable selection or control tasks. The values are only provided if a face can be tracked by the algorithm. Note that the x- and y- values represent relative movement in pixels and have to be accumulated (e.g. via the integrate component) to generate e.g. absolute mouse positions.")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A camera has to be available (this can be any webcam or a camera which is available as image acquisition device via the operating system). The picture below shows the Logitech Webcam 9000 Pro. Also the camera device of a Kinect sensor or PS3Eye should work. Furthermore, a video stream of an IP camera can be used for tracking.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(315),alt:"Logitech Webcam 9000 Pro",title:"Logitech Webcam 9000 Pro"}}),t("br"),e._v("\nLogitech Webcam 9000 Pro")]),e._v(" "),t("h3",{attrs:{id:"note-for-raspberry-pi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#note-for-raspberry-pi"}},[e._v("#")]),e._v(" Note for Raspberry Pi")]),e._v(" "),t("p",[e._v("The plugin can be used on a Raspberry Pi 3 (tested with Raspbian Jessie) with USB cameras, the Kinect camera or the "),t("a",{attrs:{href:"https://www.raspberrypi.org/products/camera-module-v2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Raspberry Pi camera module"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In order for the raspi cam to work, the following steps are necessary:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Enable the camera with")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" raspi-config\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Add the v4l driver for the camera, to make it accessible as /dev/videoXX device:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" modprobe bcm2835-v4l2 "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("max_video_width")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("2592")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("max_video_height")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1944")]),e._v("\n")])])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("noseX [integer]:")]),e._v(" This value specifies the relative change in the x coordinate of the user’s nose with respect to the previous image frame.")]),e._v(" "),t("li",[t("strong",[e._v("noseY [integer]:")]),e._v(" This value specifies the relative change in the y coordinate of the user’s nose with respect to the previous image frame.")]),e._v(" "),t("li",[t("strong",[e._v("chinX [integer]:")]),e._v(" This value specifies the relative change in the x coordinate of the user’s chin with respect to the previous image frame.")]),e._v(" "),t("li",[t("strong",[e._v("chinY [integer]:")]),e._v(" This value specifies the relative change in the y coordinate of the user’s chin with respect to the previous image frame.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("init:")]),e._v(" if this event is triggered, the face recognition procedure is initiated. This can be useful if the correct face position has been lost due to drifting of the LK algorithm.")]),e._v(" "),t("li",[t("strong",[e._v("showCameraSettings")]),e._v(" an incoming event displays the settings window for the camera device (only on Windows), where parameters like image brightness or contrast can be adjusted.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("frameGrabber[string, combobox selection]:")]),e._v(" Name of FrameGrabber to use (Default, VideoInput, OpenCV, FFmpeg, OpenKinect, PS3Eye, IPCamera).")]),e._v(" "),t("li",[t("strong",[e._v("frameGrabberFormat[string]:")]),e._v(" Format for grabber, e.g. FFmpeg: ‘dshow’ (default), ‘vfwcap’, ‘gdigrab’.")]),e._v(" "),t("li",[t("strong",[e._v("deviceList [string, combobox selection]:")]),e._v(" List of available devices, if supported by grabber")]),e._v(" "),t("li",[t("strong",[e._v("cameraSelection [string]:")]),e._v(" The camera device to be used - use camdIdx e.g. ‘0’ (VideoInput, OpenCV, OpenKinect, PS3Eye), or camName e.g. ‘video=Integrated Camera’ or ‘desktop’ (FFmpeg), stream-url for IPCamera.")]),e._v(" "),t("li",[t("strong",[e._v("cameraResolution [string, combobox selection]:")]),e._v(" This selection box provides several standard camera resolutions. Changing the resolution affects accuracy and performance (CPU load of the runtime system). Provided selections include 160x120, 320x240, 640x480, 800x600, 1024x768 and 1600x1200.")]),e._v(" "),t("li",[t("strong",[e._v("frameRate [integer]:")]),e._v(" The frame rate to use for frame grabbing. In case of 0 or a negative value, the maximum frame rate will be used.")]),e._v(" "),t("li",[t("strong",[e._v("titleVideoFrameWindow [string]:")]),e._v(" The title of the window showing the video frame.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI window will be shown.")]),e._v(" "),t("li",[t("strong",[e._v("enableOverlaySettings [boolean]:")]),e._v(" if selected, the video frame shows the current frame rate and device name as overlayed text.")])]),e._v(" "),t("h2",{attrs:{id:"example-configuraitons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-configuraitons"}},[e._v("#")]),e._v(" Example Configuraitons")]),e._v(" "),t("h3",{attrs:{id:"default"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#default"}},[e._v("#")]),e._v(" Default")]),e._v(" "),t("p",[e._v("Selects the best frame grabber for the platform the ARE is running on. (Linux: FFmpeg, Mac OSX: OpenCV, Windows: VideoInput)")]),e._v(" "),t("p",[e._v("Configuration")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:Default")]),e._v(" "),t("li",[e._v("cameraSelection:0")])]),e._v(" "),t("h3",{attrs:{id:"opencv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#opencv"}},[e._v("#")]),e._v(" OpenCV")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:OpenCV")]),e._v(" "),t("li",[e._v("cameraSelection:0")])]),e._v(" "),t("h3",{attrs:{id:"videoinput-windows-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videoinput-windows-only"}},[e._v("#")]),e._v(" VideoInput (Windows only)")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:VideoInput")]),e._v(" "),t("li",[e._v("cameraSelection:0")])]),e._v(" "),t("h3",{attrs:{id:"ffmpeg-linux-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ffmpeg-linux-only"}},[e._v("#")]),e._v(" FFmpeg (Linux only)")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:FFmpeg")]),e._v(" "),t("li",[e._v("frameGrabberFormat (optional): e.g. vfwcap or dshow")]),e._v(" "),t("li",[e._v("cameraSelection (device name or device number): e.g. /dev/video0 or 0 (will be mapped to /dev/video0)")])]),e._v(" "),t("h3",{attrs:{id:"mjpeg-stream-of-smartphone-camera"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mjpeg-stream-of-smartphone-camera"}},[e._v("#")]),e._v(" MJPEG stream of SmartPhone camera")]),e._v(" "),t("p",[e._v("Install the following Android app on your smartphone and start streaming the front camera: "),t("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.vinternete.camerastream",target:"_blank",rel:"noopener noreferrer"}},[e._v("Camera Stream - WiFi IP Webcam (Web Host LLC)"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Enter the http url displayed at your smartphone and add /video to the url")]),e._v(" "),t("p",[e._v("e.g.")]),e._v(" "),t("p",[e._v("http://192.168.1.100:8080/video")]),e._v(" "),t("p",[e._v("Set the cameraSelection property of the XFacetrackerLK plugin to this url.")]),e._v(" "),t("p",[e._v("Configuration")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:IPCamera")]),e._v(" "),t("li",[e._v("cameraSelection:http://192.168.1.100:8080/video")])])])}),[],!1,null,null,null);t.default=i.exports},315:function(e,t){e.exports="data:image/jpeg;base64,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oc0juKqwysZG4udcjKd3TbT22WxxenZA4xOJe8CN2Y23PhY8Nt1Zrdyitc2SwVt0qoqJwT5IsFvtkdhqiueHWdHTX8qUi1xxbGD5x69w9haOu5HsKdeapIs0gQs69czz7GDxUmrGw7D44ImxRNDY2DK0Do6b8STqTxJWSsKIiICIiAiIgIiICIiAiIgIiICIiAiIgLDxHB4JxaaNkg4XGov0O3t7isxEHDVfI7hrzdvPxdTJbjwkDlequSmhkbEHunPNRNhaQ9ou1rnOBIy2vdx3Ls0QcG/kcoLHK+pa62hzsNu7JqteeRVv0t/qW/fUmIrojH8io+lu9QP5i9/Iv/zZ9QP5ik1E2RF7uRd3CrHfAf5ivUvIrFrz1TK4/J5tjGAdubNf2KSkTRHJ5Fab6RUW46Q+/Ks7GOSqnqah0z5pmhwYMjRHoGRtYPKcDwaF3CJo5XCOTTD6c3EZld0yuLxp+po32LqWtAFhoN3/AML1FAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB/9k="}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[281],{1274:function(e,t,a){"use strict";a.r(t);var r=a(2),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"xfacetrackerlk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#xfacetrackerlk"}},[e._v("#")]),e._v(" XFacetrackerLK")]),e._v(" "),t("h3",{attrs:{id:"component-type-sensor-subcategory-computer-vision"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#component-type-sensor-subcategory-computer-vision"}},[e._v("#")]),e._v(" Component Type: Sensor (Subcategory: Computer Vision)")]),e._v(" "),t("p",[e._v("OS: Windows (x86, x64), Linux (x86, x64, RPi3), Mac OSX")]),e._v(" "),t("p",[e._v("This component provides a cross-platform face tracking computer vision algorithm which puts out estimated movement of a user’s nose and chin in x and y coordinates. The underlying mechanism builds upon the "),t("a",{attrs:{href:"https://github.com/bytedeco/javacv",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaCV library"),t("OutboundLink")],1),e._v(" for frame grabbing and computer vision processing. In particular a trained cascade of haar-like features is used in combination with a Lukas Kanade optical flow algorithm to track a face and its movement. The x- and y- coordinates can be used in camera-mouse configurations or to enable selection or control tasks. The values are only provided if a face can be tracked by the algorithm. Note that the x- and y- values represent relative movement in pixels and have to be accumulated (e.g. via the integrate component) to generate e.g. absolute mouse positions.")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("A camera has to be available (this can be any webcam or a camera which is available as image acquisition device via the operating system). The picture below shows the Logitech Webcam 9000 Pro. Also the camera device of a Kinect sensor or PS3Eye should work. Furthermore, a video stream of an IP camera can be used for tracking.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(315),alt:"Logitech Webcam 9000 Pro",title:"Logitech Webcam 9000 Pro"}}),t("br"),e._v("\nLogitech Webcam 9000 Pro")]),e._v(" "),t("h3",{attrs:{id:"note-for-raspberry-pi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#note-for-raspberry-pi"}},[e._v("#")]),e._v(" Note for Raspberry Pi")]),e._v(" "),t("p",[e._v("The plugin can be used on a Raspberry Pi 3 (tested with Raspbian Jessie) with USB cameras, the Kinect camera or the "),t("a",{attrs:{href:"https://www.raspberrypi.org/products/camera-module-v2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Raspberry Pi camera module"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In order for the raspi cam to work, the following steps are necessary:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Enable the camera with")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" raspi-config\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Add the v4l driver for the camera, to make it accessible as /dev/videoXX device:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" modprobe bcm2835-v4l2 "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("max_video_width")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("2592")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("max_video_height")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1944")]),e._v("\n")])])])])]),e._v(" "),t("h2",{attrs:{id:"output-port-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[e._v("#")]),e._v(" Output Port Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("noseX [integer]:")]),e._v(" This value specifies the relative change in the x coordinate of the user’s nose with respect to the previous image frame.")]),e._v(" "),t("li",[t("strong",[e._v("noseY [integer]:")]),e._v(" This value specifies the relative change in the y coordinate of the user’s nose with respect to the previous image frame.")]),e._v(" "),t("li",[t("strong",[e._v("chinX [integer]:")]),e._v(" This value specifies the relative change in the x coordinate of the user’s chin with respect to the previous image frame.")]),e._v(" "),t("li",[t("strong",[e._v("chinY [integer]:")]),e._v(" This value specifies the relative change in the y coordinate of the user’s chin with respect to the previous image frame.")])]),e._v(" "),t("h2",{attrs:{id:"event-listener-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[e._v("#")]),e._v(" Event Listener Description")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("init:")]),e._v(" if this event is triggered, the face recognition procedure is initiated. This can be useful if the correct face position has been lost due to drifting of the LK algorithm.")]),e._v(" "),t("li",[t("strong",[e._v("showCameraSettings")]),e._v(" an incoming event displays the settings window for the camera device (only on Windows), where parameters like image brightness or contrast can be adjusted.")])]),e._v(" "),t("h2",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("frameGrabber[string, combobox selection]:")]),e._v(" Name of FrameGrabber to use (Default, VideoInput, OpenCV, FFmpeg, OpenKinect, PS3Eye, IPCamera).")]),e._v(" "),t("li",[t("strong",[e._v("frameGrabberFormat[string]:")]),e._v(" Format for grabber, e.g. FFmpeg: ‘dshow’ (default), ‘vfwcap’, ‘gdigrab’.")]),e._v(" "),t("li",[t("strong",[e._v("deviceList [string, combobox selection]:")]),e._v(" List of available devices, if supported by grabber")]),e._v(" "),t("li",[t("strong",[e._v("cameraSelection [string]:")]),e._v(" The camera device to be used - use camdIdx e.g. ‘0’ (VideoInput, OpenCV, OpenKinect, PS3Eye), or camName e.g. ‘video=Integrated Camera’ or ‘desktop’ (FFmpeg), stream-url for IPCamera.")]),e._v(" "),t("li",[t("strong",[e._v("cameraResolution [string, combobox selection]:")]),e._v(" This selection box provides several standard camera resolutions. Changing the resolution affects accuracy and performance (CPU load of the runtime system). Provided selections include 160x120, 320x240, 640x480, 800x600, 1024x768 and 1600x1200.")]),e._v(" "),t("li",[t("strong",[e._v("frameRate [integer]:")]),e._v(" The frame rate to use for frame grabbing. In case of 0 or a negative value, the maximum frame rate will be used.")]),e._v(" "),t("li",[t("strong",[e._v("titleVideoFrameWindow [string]:")]),e._v(" The title of the window showing the video frame.")]),e._v(" "),t("li",[t("strong",[e._v("displayGUI [boolean]:")]),e._v(" if selected, the GUI window will be shown.")]),e._v(" "),t("li",[t("strong",[e._v("enableOverlaySettings [boolean]:")]),e._v(" if selected, the video frame shows the current frame rate and device name as overlayed text.")])]),e._v(" "),t("h2",{attrs:{id:"example-configuraitons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-configuraitons"}},[e._v("#")]),e._v(" Example Configuraitons")]),e._v(" "),t("h3",{attrs:{id:"default"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#default"}},[e._v("#")]),e._v(" Default")]),e._v(" "),t("p",[e._v("Selects the best frame grabber for the platform the ARE is running on. (Linux: FFmpeg, Mac OSX: OpenCV, Windows: VideoInput)")]),e._v(" "),t("p",[e._v("Configuration")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:Default")]),e._v(" "),t("li",[e._v("cameraSelection:0")])]),e._v(" "),t("h3",{attrs:{id:"opencv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#opencv"}},[e._v("#")]),e._v(" OpenCV")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:OpenCV")]),e._v(" "),t("li",[e._v("cameraSelection:0")])]),e._v(" "),t("h3",{attrs:{id:"videoinput-windows-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videoinput-windows-only"}},[e._v("#")]),e._v(" VideoInput (Windows only)")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:VideoInput")]),e._v(" "),t("li",[e._v("cameraSelection:0")])]),e._v(" "),t("h3",{attrs:{id:"ffmpeg-linux-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ffmpeg-linux-only"}},[e._v("#")]),e._v(" FFmpeg (Linux only)")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:FFmpeg")]),e._v(" "),t("li",[e._v("frameGrabberFormat (optional): e.g. vfwcap or dshow")]),e._v(" "),t("li",[e._v("cameraSelection (device name or device number): e.g. /dev/video0 or 0 (will be mapped to /dev/video0)")])]),e._v(" "),t("h3",{attrs:{id:"mjpeg-stream-of-smartphone-camera"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mjpeg-stream-of-smartphone-camera"}},[e._v("#")]),e._v(" MJPEG stream of SmartPhone camera")]),e._v(" "),t("p",[e._v("Install the following Android app on your smartphone and start streaming the front camera: "),t("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.vinternete.camerastream",target:"_blank",rel:"noopener noreferrer"}},[e._v("Camera Stream - WiFi IP Webcam (Web Host LLC)"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Enter the http url displayed at your smartphone and add /video to the url")]),e._v(" "),t("p",[e._v("e.g.")]),e._v(" "),t("p",[e._v("http://192.168.1.100:8080/video")]),e._v(" "),t("p",[e._v("Set the cameraSelection property of the XFacetrackerLK plugin to this url.")]),e._v(" "),t("p",[e._v("Configuration")]),e._v(" "),t("ul",[t("li",[e._v("frameGrabber:IPCamera")]),e._v(" "),t("li",[e._v("cameraSelection:http://192.168.1.100:8080/video")])])])}),[],!1,null,null,null);t.default=i.exports},315:function(e,t){e.exports="data:image/jpeg;base64,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oc0juKqwysZG4udcjKd3TbT22WxxenZA4xOJe8CN2Y23PhY8Nt1Zrdyitc2SwVt0qoqJwT5IsFvtkdhqiueHWdHTX8qUi1xxbGD5x69w9haOu5HsKdeapIs0gQs69czz7GDxUmrGw7D44ImxRNDY2DK0Do6b8STqTxJWSsKIiICIiAiIgIiICIiAiIgIiICIiAiIgLDxHB4JxaaNkg4XGov0O3t7isxEHDVfI7hrzdvPxdTJbjwkDlequSmhkbEHunPNRNhaQ9ou1rnOBIy2vdx3Ls0QcG/kcoLHK+pa62hzsNu7JqteeRVv0t/qW/fUmIrojH8io+lu9QP5i9/Iv/zZ9QP5ik1E2RF7uRd3CrHfAf5ivUvIrFrz1TK4/J5tjGAdubNf2KSkTRHJ5Fab6RUW46Q+/Ks7GOSqnqah0z5pmhwYMjRHoGRtYPKcDwaF3CJo5XCOTTD6c3EZld0yuLxp+po32LqWtAFhoN3/AML1FAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB/9k="}}]); \ No newline at end of file diff --git a/assets/js/281.29d5fb8e.js b/assets/js/282.1b7758c0.js similarity index 93% rename from assets/js/281.29d5fb8e.js rename to assets/js/282.1b7758c0.js index f663baeabf..0f3a0e052f 100644 --- a/assets/js/281.29d5fb8e.js +++ b/assets/js/282.1b7758c0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[281],{1273:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"camera-mouse-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#camera-mouse-solution"}},[e._v("#")]),e._v(" Camera Mouse Solution")]),e._v(" "),t("h2",{attrs:{id:"objective"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[e._v("#")]),e._v(" Objective")]),e._v(" "),t("p",[e._v("Mouse control (moving mouse cursor, clicking and dragging) by head movements.")]),e._v(" "),t("h2",{attrs:{id:"description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#description"}},[e._v("#")]),e._v(" Description")]),e._v(" "),t("p",[e._v("By moving the head up/down or left/right the mouse cursor should move accordingly. A left click is performed by dwelling (stopping movement and waiting for some time). To do a right, double or drag click select the respective button in the ARE GUI and move the cursor to the location where the click should be performed at. The camera device, the mouse speed and other settings can be changed by clicking onto the "),t("code",[e._v("Settings")]),e._v(" button. Additionally, external switches can be configured for clicking and an on-screen keyboard of choice can be defined.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(859),alt:"Face with tracking marks."}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("Integrated Webcam or USB camera")]),e._v(" "),t("li",[e._v("AsTeRICS installed and ARE running")]),e._v(" "),t("li",[e._v("OS: Windows, Linux (incl. RPi), Mac OSX")])]),e._v(" "),t("h2",{attrs:{id:"related-videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#related-videos"}},[e._v("#")]),e._v(" Related Videos")]),e._v(" "),t("Video",{attrs:{code:"P9qJAWegkFM"}}),e._v(" "),t("h2",{attrs:{id:"major-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#major-plugins"}},[e._v("#")]),e._v(" Major Plugins")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"/plugins/sensors/XFacetrackerLK"}},[e._v("XFacetrackerLK")])]),e._v(" "),t("li",[t("a",{attrs:{href:"/plugins/actuators/Mouse"}},[e._v("Mouse")])])]),e._v(" "),t("h2",{attrs:{id:"related-tutorials"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#related-tutorials"}},[e._v("#")]),e._v(" Related Tutorials")]),e._v(" "),t("p",[t("a",{attrs:{href:"/customize/Model-Creation"}},[e._v("Model Creation - Camera Mouse Simple")])])],1)}),[],!1,null,null,null);t.default=s.exports},859:function(e,t,a){e.exports=a.p+"assets/img/camera-mouse-tracked-face.5e64e466.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[282],{1278:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"camera-mouse-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#camera-mouse-solution"}},[e._v("#")]),e._v(" Camera Mouse Solution")]),e._v(" "),t("h2",{attrs:{id:"objective"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[e._v("#")]),e._v(" Objective")]),e._v(" "),t("p",[e._v("Mouse control (moving mouse cursor, clicking and dragging) by head movements.")]),e._v(" "),t("h2",{attrs:{id:"description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#description"}},[e._v("#")]),e._v(" Description")]),e._v(" "),t("p",[e._v("By moving the head up/down or left/right the mouse cursor should move accordingly. A left click is performed by dwelling (stopping movement and waiting for some time). To do a right, double or drag click select the respective button in the ARE GUI and move the cursor to the location where the click should be performed at. The camera device, the mouse speed and other settings can be changed by clicking onto the "),t("code",[e._v("Settings")]),e._v(" button. Additionally, external switches can be configured for clicking and an on-screen keyboard of choice can be defined.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(864),alt:"Face with tracking marks."}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("Integrated Webcam or USB camera")]),e._v(" "),t("li",[e._v("AsTeRICS installed and ARE running")]),e._v(" "),t("li",[e._v("OS: Windows, Linux (incl. RPi), Mac OSX")])]),e._v(" "),t("h2",{attrs:{id:"related-videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#related-videos"}},[e._v("#")]),e._v(" Related Videos")]),e._v(" "),t("Video",{attrs:{code:"P9qJAWegkFM"}}),e._v(" "),t("h2",{attrs:{id:"major-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#major-plugins"}},[e._v("#")]),e._v(" Major Plugins")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"/plugins/sensors/XFacetrackerLK"}},[e._v("XFacetrackerLK")])]),e._v(" "),t("li",[t("a",{attrs:{href:"/plugins/actuators/Mouse"}},[e._v("Mouse")])])]),e._v(" "),t("h2",{attrs:{id:"related-tutorials"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#related-tutorials"}},[e._v("#")]),e._v(" Related Tutorials")]),e._v(" "),t("p",[t("a",{attrs:{href:"/customize/Model-Creation"}},[e._v("Model Creation - Camera Mouse Simple")])])],1)}),[],!1,null,null,null);t.default=s.exports},864:function(e,t,a){e.exports=a.p+"assets/img/camera-mouse-tracked-face.5e64e466.png"}}]); \ No newline at end of file diff --git a/assets/js/282.9233fe43.js b/assets/js/283.5e9a51d4.js similarity index 89% rename from assets/js/282.9233fe43.js rename to assets/js/283.5e9a51d4.js index 50ff83e886..d8fb309c8e 100644 --- a/assets/js/282.9233fe43.js +++ b/assets/js/283.5e9a51d4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[282],{1275:function(t,a,e){"use strict";e.r(a);var s=e(2),r=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"head-sound-solution"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#head-sound-solution"}},[t._v("#")]),t._v(" Head Sound Solution")]),t._v(" "),a("h2",{attrs:{id:"objective"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[t._v("#")]),t._v(" Objective")]),t._v(" "),a("p",[t._v("Generate sounds according to head movement.")]),t._v(" "),a("h2",{attrs:{id:"description"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#description"}},[t._v("#")]),t._v(" Description")]),t._v(" "),a("p",[t._v("By moving the head left/right, the tone scale should go up and down accordingly. Additionally, by moving the head up/down, the volume can be changed.")]),t._v(" "),a("p",[a("img",{attrs:{src:e(860),alt:"ARE GUI with tone scale and graph for tone scale and volume."}})]),t._v(" "),a("h2",{attrs:{id:"requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),a("ul",[a("li",[t._v("Integrated Webcam or USB camera")]),t._v(" "),a("li",[t._v("AsTeRICS installed and ARE running")]),t._v(" "),a("li",[t._v("OS: Windows, Linux (incl. RPi), Mac OSX")])]),t._v(" "),a("h2",{attrs:{id:"major-plugins"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#major-plugins"}},[t._v("#")]),t._v(" Major Plugins")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"/plugins/sensors/XFacetrackerLK"}},[t._v("XFacetrackerLK")])]),t._v(" "),a("li",[a("a",{attrs:{href:"/plugins/actuators/MidiPlayer"}},[t._v("MidiPlayer")])])])])}),[],!1,null,null,null);a.default=r.exports},860:function(t,a,e){t.exports=e.p+"assets/img/headsound.9bcac6dc.png"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[283],{1280:function(t,a,e){"use strict";e.r(a);var s=e(2),r=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"head-sound-solution"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#head-sound-solution"}},[t._v("#")]),t._v(" Head Sound Solution")]),t._v(" "),a("h2",{attrs:{id:"objective"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#objective"}},[t._v("#")]),t._v(" Objective")]),t._v(" "),a("p",[t._v("Generate sounds according to head movement.")]),t._v(" "),a("h2",{attrs:{id:"description"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#description"}},[t._v("#")]),t._v(" Description")]),t._v(" "),a("p",[t._v("By moving the head left/right, the tone scale should go up and down accordingly. Additionally, by moving the head up/down, the volume can be changed.")]),t._v(" "),a("p",[a("img",{attrs:{src:e(865),alt:"ARE GUI with tone scale and graph for tone scale and volume."}})]),t._v(" "),a("h2",{attrs:{id:"requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),a("ul",[a("li",[t._v("Integrated Webcam or USB camera")]),t._v(" "),a("li",[t._v("AsTeRICS installed and ARE running")]),t._v(" "),a("li",[t._v("OS: Windows, Linux (incl. RPi), Mac OSX")])]),t._v(" "),a("h2",{attrs:{id:"major-plugins"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#major-plugins"}},[t._v("#")]),t._v(" Major Plugins")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"/plugins/sensors/XFacetrackerLK"}},[t._v("XFacetrackerLK")])]),t._v(" "),a("li",[a("a",{attrs:{href:"/plugins/actuators/MidiPlayer"}},[t._v("MidiPlayer")])])])])}),[],!1,null,null,null);a.default=r.exports},865:function(t,a,e){t.exports=e.p+"assets/img/headsound.9bcac6dc.png"}}]); \ No newline at end of file diff --git a/assets/js/283.d700f164.js b/assets/js/284.36da2500.js similarity index 99% rename from assets/js/283.d700f164.js rename to assets/js/284.36da2500.js index f3f48a8101..18c274a608 100644 --- a/assets/js/283.d700f164.js +++ b/assets/js/284.36da2500.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[283],{900:function(e,t,n){window,e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,n){"use strict";var r=n(2),o=n(10),i=Object.prototype.toString;function s(e){return"[object Array]"===i.call(e)}function a(e){return null!==e&&"object"==typeof e}function u(e){return"[object Function]"===i.call(e)}function c(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),s(e))for(var n=0,r=e.length;n=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){u.headers[e]=r.merge(i)})),e.exports=u}).call(this,n(12))},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,r=arguments.length>2?arguments[2]:void 0,a=arguments.length>3?arguments[3]:void 0;null===t?t={}:"string"==typeof t&&(t=JSON.parse(t));var u=0;for(var c in t)u+=Object.keys(t[c]).length;r=i(r),o(e,(function(){u>0?(0,n.setRuntimeComponentProperties)((function(e,t){e.length!==u&&(e.length>0&&console.log("Only following properties set successfully: "+e),alert("Could not set all properties successfully.")),console.log("The following properties could be set: "+e),(0,n.startModel)(r,a)}),a,t):(0,n.startModel)(r,a)}),a=s(a))},e.storeFileFromWebserverOnARE=function(e,t,o,a){o=i(o),r(e,(function(e){(0,n.storeData)(o,a,t,e)}),a=s(a))},t=(c=t)&&c.__esModule?c:{default:c}})?r.apply(t,o):r)||(e.exports=i)},function(e,t,n){e.exports=n(9)},function(e,t,n){"use strict";var r=n(0),o=n(2),i=n(11),s=n(1);function a(e){var t=new i(e),n=o(i.prototype.request,t);return r.extend(n,i.prototype,t),r.extend(n,t),n}var u=a(s);u.Axios=i,u.create=function(e){return a(r.merge(s,e))},u.Cancel=n(6),u.CancelToken=n(26),u.isCancel=n(5),u.all=function(e){return Promise.all(e)},u.spread=n(27),e.exports=u,e.exports.default=u},function(e,t){function n(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)} +(window.webpackJsonp=window.webpackJsonp||[]).push([[284],{903:function(e,t,n){window,e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,n){"use strict";var r=n(2),o=n(10),i=Object.prototype.toString;function s(e){return"[object Array]"===i.call(e)}function a(e){return null!==e&&"object"==typeof e}function u(e){return"[object Function]"===i.call(e)}function c(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),s(e))for(var n=0,r=e.length;n=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){u.headers[e]=r.merge(i)})),e.exports=u}).call(this,n(12))},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,r=arguments.length>2?arguments[2]:void 0,a=arguments.length>3?arguments[3]:void 0;null===t?t={}:"string"==typeof t&&(t=JSON.parse(t));var u=0;for(var c in t)u+=Object.keys(t[c]).length;r=i(r),o(e,(function(){u>0?(0,n.setRuntimeComponentProperties)((function(e,t){e.length!==u&&(e.length>0&&console.log("Only following properties set successfully: "+e),alert("Could not set all properties successfully.")),console.log("The following properties could be set: "+e),(0,n.startModel)(r,a)}),a,t):(0,n.startModel)(r,a)}),a=s(a))},e.storeFileFromWebserverOnARE=function(e,t,o,a){o=i(o),r(e,(function(e){(0,n.storeData)(o,a,t,e)}),a=s(a))},t=(c=t)&&c.__esModule?c:{default:c}})?r.apply(t,o):r)||(e.exports=i)},function(e,t,n){e.exports=n(9)},function(e,t,n){"use strict";var r=n(0),o=n(2),i=n(11),s=n(1);function a(e){var t=new i(e),n=o(i.prototype.request,t);return r.extend(n,i.prototype,t),r.extend(n,t),n}var u=a(s);u.Axios=i,u.create=function(e){return a(r.merge(s,e))},u.Cancel=n(6),u.CancelToken=n(26),u.isCancel=n(5),u.all=function(e){return Promise.all(e)},u.spread=n(27),e.exports=u,e.exports.default=u},function(e,t){function n(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)} /*! * Determine if an object is a Buffer * diff --git a/assets/js/284.cdc4bb07.js b/assets/js/285.57b8090b.js similarity index 79% rename from assets/js/284.cdc4bb07.js rename to assets/js/285.57b8090b.js index 312b9f5555..e8043f2f8b 100644 --- a/assets/js/284.cdc4bb07.js +++ b/assets/js/285.57b8090b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[284],{914:function(n,e,t){"use strict";t.r(e);var u={name:"Label"},a=t(2),l=Object(a.a)(u,(function(){var n=this;return(0,n._self._c)("div",[n._t("default",(function(){return[n._v("DefaultLabel")]}))],2)}),[],!1,null,"08065f03",null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[285],{916:function(n,e,t){"use strict";t.r(e);var u={name:"Label"},a=t(2),l=Object(a.a)(u,(function(){var n=this;return(0,n._self._c)("div",[n._t("default",(function(){return[n._v("DefaultLabel")]}))],2)}),[],!1,null,"08065f03",null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/285.b50d0de5.js b/assets/js/286.37a195ea.js similarity index 96% rename from assets/js/285.b50d0de5.js rename to assets/js/286.37a195ea.js index 3c3df4dacb..fa5e02c27a 100644 --- a/assets/js/285.b50d0de5.js +++ b/assets/js/286.37a195ea.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[285],{918:function(e,t,n){"use strict";n.r(t);var a=n(15),i={name:"UseCases",methods:{onSlideChangeStart(){a.a.$emit("slide-change-transition-start")},onSlideChangeEnd(){a.a.$emit("slide-change-transition-end")},onPrevious(){this.$refs.previous.click()},onNext(){this.$refs.next.click()}},data:()=>({options:{a11y:!0,loop:!1,grabCursor:!0,mode:"horizontal",keyboard:{enabled:!0},autoplay:{delay:5e3,disableOnInteraction:!0},pagination:{el:".swiper-pagination",dynamicBullets:!0,clickable:!1},navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"}}}),computed:{swiper(){return this.$refs.swiper.$swiper}},mounted(){}},s=n(2),o=Object(s.a)(i,(function(){var e=this,t=e._self._c;return t("swiper",{ref:"swiper",staticClass:"swiper",attrs:{options:e.options},on:{"slide-change-transition-start":e.onSlideChangeStart,"slide-change-transition-end":e.onSlideChangeEnd}},[e._t("default"),e._v(" "),t("div",{ref:"previous",staticClass:"swiper-button-prev",attrs:{slot:"button-prev",tabindex:"0"},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"space",32,t.key,[" ","Spacebar"])?null:(t.preventDefault(),e.onPrevious.apply(null,arguments))}},slot:"button-prev"}),e._v(" "),t("div",{ref:"next",staticClass:"swiper-button-next",attrs:{slot:"button-next",tabindex:"0"},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"space",32,t.key,[" ","Spacebar"])?null:(t.preventDefault(),e.onNext.apply(null,arguments))}},slot:"button-next"}),e._v(" "),t("div",{staticClass:"swiper-pagination",attrs:{slot:"pagination"},slot:"pagination"})],2)}),[],!1,null,"6cc6f85a",null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[286],{921:function(e,t,n){"use strict";n.r(t);var a=n(15),i={name:"UseCases",methods:{onSlideChangeStart(){a.a.$emit("slide-change-transition-start")},onSlideChangeEnd(){a.a.$emit("slide-change-transition-end")},onPrevious(){this.$refs.previous.click()},onNext(){this.$refs.next.click()}},data:()=>({options:{a11y:!0,loop:!1,grabCursor:!0,mode:"horizontal",keyboard:{enabled:!0},autoplay:{delay:5e3,disableOnInteraction:!0},pagination:{el:".swiper-pagination",dynamicBullets:!0,clickable:!1},navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"}}}),computed:{swiper(){return this.$refs.swiper.$swiper}},mounted(){}},s=n(2),o=Object(s.a)(i,(function(){var e=this,t=e._self._c;return t("swiper",{ref:"swiper",staticClass:"swiper",attrs:{options:e.options},on:{"slide-change-transition-start":e.onSlideChangeStart,"slide-change-transition-end":e.onSlideChangeEnd}},[e._t("default"),e._v(" "),t("div",{ref:"previous",staticClass:"swiper-button-prev",attrs:{slot:"button-prev",tabindex:"0"},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"space",32,t.key,[" ","Spacebar"])?null:(t.preventDefault(),e.onPrevious.apply(null,arguments))}},slot:"button-prev"}),e._v(" "),t("div",{ref:"next",staticClass:"swiper-button-next",attrs:{slot:"button-next",tabindex:"0"},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"space",32,t.key,[" ","Spacebar"])?null:(t.preventDefault(),e.onNext.apply(null,arguments))}},slot:"button-next"}),e._v(" "),t("div",{staticClass:"swiper-pagination",attrs:{slot:"pagination"},slot:"pagination"})],2)}),[],!1,null,"6cc6f85a",null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/286.9f92ca86.js b/assets/js/287.8d69f615.js similarity index 96% rename from assets/js/286.9f92ca86.js rename to assets/js/287.8d69f615.js index bb67b102c6..1e2929f23d 100644 --- a/assets/js/286.9f92ca86.js +++ b/assets/js/287.8d69f615.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[286],{907:function(t,e,a){"use strict";a.r(e);var s=a(329),o=a(332),i=a(276),n={name:"Layout",components:{Sidebar:o.a,Navbar:s.a},data:()=>({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(i.j)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},r=a(2),h=Object(r.a)(n,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),e("main",{staticClass:"page"},[t._t("content")],2)],1)}),[],!1,null,null,null);e.default=h.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[287],{910:function(t,e,a){"use strict";a.r(e);var s=a(329),o=a(332),i=a(276),n={name:"Layout",components:{Sidebar:o.a,Navbar:s.a},data:()=>({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(i.j)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},r=a(2),h=Object(r.a)(n,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),e("main",{staticClass:"page"},[t._t("content")],2)],1)}),[],!1,null,null,null);e.default=h.exports}}]); \ No newline at end of file diff --git a/assets/js/287.8d2cf956.js b/assets/js/288.15ddf9b7.js similarity index 90% rename from assets/js/287.8d2cf956.js rename to assets/js/288.15ddf9b7.js index 6d296a3d10..5143ae9f91 100644 --- a/assets/js/287.8d2cf956.js +++ b/assets/js/288.15ddf9b7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[287],{906:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(2),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[288],{909:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(2),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/288.7bf6ecd4.js b/assets/js/289.bf271ce2.js similarity index 99% rename from assets/js/288.7bf6ecd4.js rename to assets/js/289.bf271ce2.js index af7810ae7a..3064927407 100644 --- a/assets/js/288.7bf6ecd4.js +++ b/assets/js/289.bf271ce2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[288],{922:function(e,t,o){"use strict";o.r(t);var s=o(2),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey},scopedSlots:e._u([{key:"jumbotron",fn:function(){return[t("Header",[e._v("AsTeRICS")]),e._v(" "),t("Subtitle",[e._v("Create Customized Low-Cost Assistive Technologies for People with Disabilities.")]),e._v(" "),t("ActionGroup",[t("Label",[e._v("Are you looking for special solutions to use a computer, control your environment or play games?")]),e._v(" "),t("Actions",[t("Action",{attrs:{path:"/solutions/"}},[e._v("Discover Solutions")]),e._v(" "),t("Action",{attrs:{path:"/get-started/",dark:""}},[e._v("Get Started")])],1)],1)]},proxy:!0}])},[t("h2",{attrs:{id:"use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases"}},[e._v("#")]),e._v(" Use Cases")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Computer Control",media:"/assets/img/harry-shutterstock_213119035.jpg"}},[e._v("Control your computer by switches, head movements or eyetracking, depending on your capabilities.")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Environment Control",media:"/assets/img/smart-home-shutterstock_304964420.jpg"}},[e._v("Switch on/off lights or control your TV and stereo.")]),e._v(" "),t("UseCase",{attrs:{title:"Alternative and Augmentative Communication",media:"/assets/img/AsTeRICS-Ergo_Grid_en-1-768x592.jpg"}},[e._v("Create your own communication grid and use it on all your devices.")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Gaming & Toys",media:"https://www.youtube.com/watch?v=JwL_zS3fpnU"}},[e._v("Emulate mouse, keyboard or joystick for playing games or remote control toy helicopters or cars.")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Music",media:"https://www.youtube.com/watch?v=w7oz9YqMK6Q"}},[e._v("Generate sounds or play adapted music instruments.")]),e._v(" "),t("h2",{attrs:{id:"why-asterics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-asterics"}},[e._v("#")]),e._v(" Why AsTeRICS?")]),e._v(" "),t("p",[e._v("There are many Assistive Technologies available on the market, but in many cases they are too expensive or not suitable for a certain combination of disabilities.")]),e._v(" "),t("p",[t("strong",[e._v("AsTeRICS")])]),e._v(" "),t("ul",[t("li",[e._v("provides support for many consumer devices which can be used as input devices (e.g. switches, eye-tracker, webcam, …).")]),e._v(" "),t("li",[e._v("let’s you combine several input devices depending on your capabilities (e.g. 2 switches + 1 eye-tracker).")]),e._v(" "),t("li",[e._v("provides support for many use cases (e.g. computer control, environmental control).")]),e._v(" "),t("li",[e._v("has more than 160 plugins.")]),e._v(" "),t("li",[e._v("allows easily customizing existing solutions or designing new ones.")]),e._v(" "),t("li",[e._v("is Open Source, which means that it is free forever and others can contribute to the framework.")])]),e._v(" "),t("h2",{attrs:{id:"partners-funding"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#partners-funding"}},[e._v("#")]),e._v(" Partners & Funding")]),e._v(" "),t("p",[e._v("The AsTeRICS project was funded by international and national research grants. AsTeRICS was initiated by "),t("a",{attrs:{href:"https://www.ki-i.at",target:"_blank",rel:"noopener noreferrer"}},[e._v("KI-I Linz"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://www.technikum-wien.at/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UAS Technikum Wien"),t("OutboundLink")],1),e._v(". The creation of this web page was funded by the City of Vienna, MA23, in course of the project "),t("strong",[e._v("StudyATHome Internationally")]),e._v(" (Grant Nr. 22-07). In Feb. 2017 the "),t("a",{attrs:{href:"https://www.asterics-foundation.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS Foundation"),t("OutboundLink")],1),e._v(" was founded to bring the project results to people with disabilities, to organize workshops and to maintain project results, see "),t("RouterLink",{attrs:{to:"/get-involved/About-us.html"}},[e._v("About Us")]),e._v(".")],1),e._v(" "),t("Funding",[t("Partner",{attrs:{media:"/assets/img/ma23-logo.svg",alt:"MA23, City of Vienna - Logo",href:"#partners-funding"}}),e._v(" "),t("Partner",{attrs:{media:"/assets/img/fhtw-logo.svg",alt:"UAS Technikum Wien - Logo",href:"#partners-funding",scale:"0.7"}})],1),e._v(" "),t("Funding",[t("Partner",{attrs:{media:"/assets/img/torades-logo.png",alt:"ToRaDes - Project Logo",href:"#partners-funding"}}),e._v(" "),t("Partner",{attrs:{media:"/assets/img/ki-i-logo.png",alt:"KI-I",href:"#partners-funding"}}),e._v(" "),t("Partner",{attrs:{media:"/assets/img/StudyATHome-logo.svg",alt:"StudyATHome Internationally - Project Logo",href:"#partners-funding",scale:"0.9"}})],1),e._v(" "),t("h2",{attrs:{id:"donation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#donation"}},[e._v("#")]),e._v(" Donation")]),e._v(" "),t("p",[t("strong",[e._v("We need donations")]),e._v(" in order to continue the development and maintainance of the tools and to continuously provide the hosting of AsTeRICS grid and the consulting and assembly of Assistive solutions. The donation will go to the non-profit organization "),t("a",{attrs:{href:"https://www.asterics-foundation.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Asterics Foundation"),t("OutboundLink")],1),e._v(" which maintains the project results and continues development of assistive tools.")]),e._v(" "),t("a",{attrs:{title:"Support AsTeRICS Foundation on opencollective.com",href:"https://opencollective.com/asterics-foundation",target:"_blank"}},[t("img",{attrs:{src:"https://opencollective.com/webpack/donate/button@2x.png?color=blue",width:"300"}})]),e._v(" "),t("h2",{attrs:{id:"asterics-project-web-page"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-project-web-page"}},[e._v("#")]),e._v(" AsTeRICS Project Web Page")]),e._v(" "),t("p",[e._v("This is a newly created web page to present AsTeRICS technologies and corresponding documentation. If you are looking for the web page of the original AsTeRICS project, please go to "),t("a",{attrs:{href:"https://project.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://project.asterics.eu"),t("OutboundLink")],1),e._v(".")])],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[289],{925:function(e,t,o){"use strict";o.r(t);var s=o(2),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey},scopedSlots:e._u([{key:"jumbotron",fn:function(){return[t("Header",[e._v("AsTeRICS")]),e._v(" "),t("Subtitle",[e._v("Create Customized Low-Cost Assistive Technologies for People with Disabilities.")]),e._v(" "),t("ActionGroup",[t("Label",[e._v("Are you looking for special solutions to use a computer, control your environment or play games?")]),e._v(" "),t("Actions",[t("Action",{attrs:{path:"/solutions/"}},[e._v("Discover Solutions")]),e._v(" "),t("Action",{attrs:{path:"/get-started/",dark:""}},[e._v("Get Started")])],1)],1)]},proxy:!0}])},[t("h2",{attrs:{id:"use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases"}},[e._v("#")]),e._v(" Use Cases")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Computer Control",media:"/assets/img/harry-shutterstock_213119035.jpg"}},[e._v("Control your computer by switches, head movements or eyetracking, depending on your capabilities.")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Environment Control",media:"/assets/img/smart-home-shutterstock_304964420.jpg"}},[e._v("Switch on/off lights or control your TV and stereo.")]),e._v(" "),t("UseCase",{attrs:{title:"Alternative and Augmentative Communication",media:"/assets/img/AsTeRICS-Ergo_Grid_en-1-768x592.jpg"}},[e._v("Create your own communication grid and use it on all your devices.")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Gaming & Toys",media:"https://www.youtube.com/watch?v=JwL_zS3fpnU"}},[e._v("Emulate mouse, keyboard or joystick for playing games or remote control toy helicopters or cars.")]),e._v(" "),t("UseCase",{attrs:{title:"Accessible Music",media:"https://www.youtube.com/watch?v=w7oz9YqMK6Q"}},[e._v("Generate sounds or play adapted music instruments.")]),e._v(" "),t("h2",{attrs:{id:"why-asterics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-asterics"}},[e._v("#")]),e._v(" Why AsTeRICS?")]),e._v(" "),t("p",[e._v("There are many Assistive Technologies available on the market, but in many cases they are too expensive or not suitable for a certain combination of disabilities.")]),e._v(" "),t("p",[t("strong",[e._v("AsTeRICS")])]),e._v(" "),t("ul",[t("li",[e._v("provides support for many consumer devices which can be used as input devices (e.g. switches, eye-tracker, webcam, …).")]),e._v(" "),t("li",[e._v("let’s you combine several input devices depending on your capabilities (e.g. 2 switches + 1 eye-tracker).")]),e._v(" "),t("li",[e._v("provides support for many use cases (e.g. computer control, environmental control).")]),e._v(" "),t("li",[e._v("has more than 160 plugins.")]),e._v(" "),t("li",[e._v("allows easily customizing existing solutions or designing new ones.")]),e._v(" "),t("li",[e._v("is Open Source, which means that it is free forever and others can contribute to the framework.")])]),e._v(" "),t("h2",{attrs:{id:"partners-funding"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#partners-funding"}},[e._v("#")]),e._v(" Partners & Funding")]),e._v(" "),t("p",[e._v("The AsTeRICS project was funded by international and national research grants. AsTeRICS was initiated by "),t("a",{attrs:{href:"https://www.ki-i.at",target:"_blank",rel:"noopener noreferrer"}},[e._v("KI-I Linz"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://www.technikum-wien.at/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UAS Technikum Wien"),t("OutboundLink")],1),e._v(". The creation of this web page was funded by the City of Vienna, MA23, in course of the project "),t("strong",[e._v("StudyATHome Internationally")]),e._v(" (Grant Nr. 22-07). In Feb. 2017 the "),t("a",{attrs:{href:"https://www.asterics-foundation.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("AsTeRICS Foundation"),t("OutboundLink")],1),e._v(" was founded to bring the project results to people with disabilities, to organize workshops and to maintain project results, see "),t("RouterLink",{attrs:{to:"/get-involved/About-us.html"}},[e._v("About Us")]),e._v(".")],1),e._v(" "),t("Funding",[t("Partner",{attrs:{media:"/assets/img/ma23-logo.svg",alt:"MA23, City of Vienna - Logo",href:"#partners-funding"}}),e._v(" "),t("Partner",{attrs:{media:"/assets/img/fhtw-logo.svg",alt:"UAS Technikum Wien - Logo",href:"#partners-funding",scale:"0.7"}})],1),e._v(" "),t("Funding",[t("Partner",{attrs:{media:"/assets/img/torades-logo.png",alt:"ToRaDes - Project Logo",href:"#partners-funding"}}),e._v(" "),t("Partner",{attrs:{media:"/assets/img/ki-i-logo.png",alt:"KI-I",href:"#partners-funding"}}),e._v(" "),t("Partner",{attrs:{media:"/assets/img/StudyATHome-logo.svg",alt:"StudyATHome Internationally - Project Logo",href:"#partners-funding",scale:"0.9"}})],1),e._v(" "),t("h2",{attrs:{id:"donation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#donation"}},[e._v("#")]),e._v(" Donation")]),e._v(" "),t("p",[t("strong",[e._v("We need donations")]),e._v(" in order to continue the development and maintainance of the tools and to continuously provide the hosting of AsTeRICS grid and the consulting and assembly of Assistive solutions. The donation will go to the non-profit organization "),t("a",{attrs:{href:"https://www.asterics-foundation.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Asterics Foundation"),t("OutboundLink")],1),e._v(" which maintains the project results and continues development of assistive tools.")]),e._v(" "),t("a",{attrs:{title:"Support AsTeRICS Foundation on opencollective.com",href:"https://opencollective.com/asterics-foundation",target:"_blank"}},[t("img",{attrs:{src:"https://opencollective.com/webpack/donate/button@2x.png?color=blue",width:"300"}})]),e._v(" "),t("h2",{attrs:{id:"asterics-project-web-page"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-project-web-page"}},[e._v("#")]),e._v(" AsTeRICS Project Web Page")]),e._v(" "),t("p",[e._v("This is a newly created web page to present AsTeRICS technologies and corresponding documentation. If you are looking for the web page of the original AsTeRICS project, please go to "),t("a",{attrs:{href:"https://project.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://project.asterics.eu"),t("OutboundLink")],1),e._v(".")])],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/29.5a32db41.js b/assets/js/29.21fc714e.js similarity index 94% rename from assets/js/29.5a32db41.js rename to assets/js/29.21fc714e.js index 8c896d5c6c..56e312e573 100644 --- a/assets/js/29.5a32db41.js +++ b/assets/js/29.21fc714e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{288:function(e,t,s){e.exports=s.p+"assets/img/quickstart11.c2ae8b7e.png"},439:function(e,t,s){e.exports=s.p+"assets/img/simple-model-labelled.8f5c2c7f.png"},440:function(e,t,s){e.exports=s.p+"assets/img/asterics-program-overview.e1002930.svg"},441:function(e,t,s){e.exports=s.p+"assets/img/web-acs-empty.276c001e.png"},442:function(e,t,s){e.exports=s.p+"assets/img/ARE-startscreen.c800dec4.png"},996:function(e,t,s){"use strict";s.r(t);var a=s(2),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"asterics-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-overview"}},[e._v("#")]),e._v(" AsTeRICS Overview")]),e._v(" "),t("p",[e._v("This pages explains the most important terms and elements of the AsTeRICS framework.")]),e._v(" "),t("h2",{attrs:{id:"terms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#terms"}},[e._v("#")]),e._v(" Terms")]),e._v(" "),t("p",[e._v("The most important terms are described below.")]),e._v(" "),t("h3",{attrs:{id:"asterics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics"}},[e._v("#")]),e._v(" AsTeRICS")]),e._v(" "),t("p",[e._v("The term AsTeRICS stands for "),t("strong",[e._v("As")]),e._v("sistive "),t("strong",[e._v("Te")]),e._v("chnology "),t("strong",[e._v("R")]),e._v("apid "),t("strong",[e._v("I")]),e._v("ntegration and "),t("strong",[e._v("C")]),e._v("onstruction "),t("strong",[e._v("S")]),e._v("et and allows the creation of customized low-cost Assistive Technologies.")]),e._v(" "),t("h3",{attrs:{id:"solutions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#solutions"}},[e._v("#")]),e._v(" Solutions")]),e._v(" "),t("p",[e._v("The AsTeRICS framework provides some selected "),t("RouterLink",{attrs:{to:"/solutions/"}},[e._v("solutions")]),e._v(" which can be used out of the box. The solutions are grouped by "),t("strong",[e._v("use cases")]),e._v(" and can be directly started from the solutions page. Some solutions depend on certain "),t("a",{attrs:{href:"#input-device"}},[e._v("input devices")]),e._v(" or other hardware and software. Just click on the "),t("code",[e._v("Read More")]),e._v(" button in a solution’s tile to get a detailed step by step instruction of how to install and use it.")],1),e._v(" "),t("p",[e._v("A solution can be categorized by the AsTeRICS technology used. It can be a "),t("a",{attrs:{href:"#model"}},[e._v("model")]),e._v(", an "),t("a",{attrs:{href:"#asterics-grid"}},[e._v("AsTERICS Grid")]),e._v(" or an "),t("a",{attrs:{href:"#at-solution"}},[e._v("AT solution")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model"}},[e._v("#")]),e._v(" Model")]),e._v(" "),t("p",[e._v("A model represents a simple Assistive Technology (AT). It is used to define "),t("strong",[e._v("what")]),e._v(" should be done (e.g. mouse control, switching light on/off) and "),t("strong",[e._v("how")]),e._v(" this can be done (e.g. button-press, head movement,…). A model uses "),t("a",{attrs:{href:"#plugin"}},[e._v("plugins")]),e._v(" to support input devices (e.g. webcam, switch,…) and required actions. On the image below you can see the XFaceTrackerLK plugin which uses the webcam to track the movements of your head. This gesture is directly translated to mouse movements by connecting the XFaceTrackerLK plugin to the Mouse plugin.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(439),alt:"Model with a webcam plugin as input device and a mouse action plugin"}})]),e._v(" "),t("h3",{attrs:{id:"plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin"}},[e._v("#")]),e._v(" Plugin")]),e._v(" "),t("p",[e._v("A plugin represents a modular component that can be used within a model.\nIt can be an input device (sensor), a processor (processing, modifying data) or an action (actuator).")]),e._v(" "),t("h3",{attrs:{id:"input-device"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-device"}},[e._v("#")]),e._v(" Input Device")]),e._v(" "),t("p",[e._v("AsTeRICS supports numerous input devices like a switch, a webcam or an eye-tracker. The list of supported devices can be found under "),t("RouterLink",{attrs:{to:"/plugins/"}},[e._v("Plugins/Sensors")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#action"}},[e._v("#")]),e._v(" Action")]),e._v(" "),t("p",[e._v("The actions that are executed by a model are implemented using actuator plugins, which can be found under "),t("RouterLink",{attrs:{to:"/plugins/"}},[e._v("Plugins/Actuators")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"asterics-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid"}},[e._v("#")]),e._v(" AsTeRICS Grid")]),e._v(" "),t("p",[e._v("The AsTeRICS Grid is a web-based user interface which can be used for Augmentative and Alternative Communication (AAC). It is available on "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://grid.asterics.eu"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Grids can be defined in a flexible layout of cells acting as buttons. The cells show text and images/symbols and if one of them is selected a defined phrase can be spoken (text-to-speech). A grid can also be connected to a model and be used to trigger actions like switching lights on/off.")]),e._v(" "),t("p",[t("img",{attrs:{src:"/assets/img/AsTeRICS-Ergo_Grid_en-1-768x592.jpg",alt:"Grid with symbols for Alternative and Augmentative Communication"}})]),e._v(" "),t("p",[e._v("For more information about how to use the AsTeRICS Grid, please read the "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("user manual")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"at-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-solution"}},[e._v("#")]),e._v(" AT Solution")]),e._v(" "),t("p",[e._v("An AT solution is a more complex Assistive Technology and may be comprised of several models, grids, images or web user interfaces. An AT solution can be seen as a standalone SW application, that allows easier customization and configuration for the end user.")]),e._v(" "),t("h2",{attrs:{id:"programs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#programs"}},[e._v("#")]),e._v(" Programs")]),e._v(" "),t("p",[e._v("AsTeRICS consists of several executable programs.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(440),alt:"Diagram showing ACS and ARE interaction."}})]),e._v(" "),t("h3",{attrs:{id:"acs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acs"}},[e._v("#")]),e._v(" ACS")]),e._v(" "),t("p",[e._v("The AsTeRICS Configuration Suite (ACS) is a graphical editor for easy designing and testing model files. A model file can be saved to a file or uploaded to the "),t("a",{attrs:{href:"#are"}},[e._v("ARE")]),e._v(" to execute it. Likewise, a model can be downloaded from the ARE to be changed or customized. Furthermore, the ACS allows to remote control the ARE program and to start and stop a model. For more information about how to use the ACS, please read the "),t("RouterLink",{attrs:{to:"/manuals/ACS/"}},[e._v("ACS user manual")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:s(288),alt:"Screenshot of ACS program with a simple model."}})]),e._v(" "),t("h3",{attrs:{id:"webacs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#webacs"}},[e._v("#")]),e._v(" WebACS")]),e._v(" "),t("p",[e._v("The WebACS is a new web-based version of the "),t("a",{attrs:{href:"#acs"}},[e._v("ACS")]),e._v(" program for designing and testing model files. For more information about how to use the WebACS, please read the "),t("RouterLink",{attrs:{to:"/manuals/WebACS/"}},[e._v("WebACS user manual")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:s(441),alt:"Screenshot of ACS program with a simple model."}})]),e._v(" "),t("h3",{attrs:{id:"are"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are"}},[e._v("#")]),e._v(" ARE")]),e._v(" "),t("p",[e._v("The AsTeRICS Runtime Environment (ARE) executes a given model. The screenshot below shows the autostart model running after starting the ARE. You can click the "),t("code",[e._v("Play")]),e._v(", "),t("code",[e._v("Pause")]),e._v(" or "),t("code",[e._v("Stop")]),e._v(" button of the control panel to start, pause or stop a model. Alternatively, you can use the respective shortcuts "),t("code",[e._v("F5")]),e._v(","),t("code",[e._v("F6")]),e._v(","),t("code",[e._v("F7")]),e._v(". Furthermore, you can open a new model file by clicking on the "),t("code",[e._v("Open")]),e._v(" button. Additionally, a model can be uploaded, if opened in the ACS/WebACS programs or directly from the "),t("RouterLink",{attrs:{to:"/solutions/"}},[e._v("solutions")]),e._v(" page. The ARE also provides a remote interface. For more information about how to use the ARE, please read the "),t("RouterLink",{attrs:{to:"/manuals/ARE/"}},[e._v("ARE user manual")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:s(442),alt:"Screenshot of AsTeRICS Runtime Environment"}})]),e._v(" "),t("h2",{attrs:{id:"user-interfaces"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-interfaces"}},[e._v("#")]),e._v(" User Interfaces")]),e._v(" "),t("p",[e._v("AsTeRICS provides two different types of user interfaces, which can be used for a model.")]),e._v(" "),t("h3",{attrs:{id:"are-gui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-gui"}},[e._v("#")]),e._v(" ARE GUI")]),e._v(" "),t("p",[e._v("The ARE provides a Graphical User Interface (GUI) desktop (see "),t("a",{attrs:{href:"#are"}},[e._v("ARE screenshot")]),e._v("). When designing a model with the ACS or WebACS you can use plugins which provide user interface elements like a slider or a button. You can then define where the element should be shown on the ARE desktop. Furthermore you can define actions depending on user input.")]),e._v(" "),t("h3",{attrs:{id:"asterics-grid-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid-2"}},[e._v("#")]),e._v(" AsTeRICS Grid")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#asterics-grid"}},[e._v("AsTeRICS Grid")]),e._v(" is a new way of defining a user interface for AsTeRICS.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{288:function(e,t,s){e.exports=s.p+"assets/img/quickstart11.c2ae8b7e.png"},430:function(e,t,s){e.exports=s.p+"assets/img/simple-model-labelled.8f5c2c7f.png"},431:function(e,t,s){e.exports=s.p+"assets/img/asterics-program-overview.e1002930.svg"},432:function(e,t,s){e.exports=s.p+"assets/img/web-acs-empty.276c001e.png"},433:function(e,t,s){e.exports=s.p+"assets/img/ARE-startscreen.c800dec4.png"},999:function(e,t,s){"use strict";s.r(t);var a=s(2),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"asterics-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-overview"}},[e._v("#")]),e._v(" AsTeRICS Overview")]),e._v(" "),t("p",[e._v("This pages explains the most important terms and elements of the AsTeRICS framework.")]),e._v(" "),t("h2",{attrs:{id:"terms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#terms"}},[e._v("#")]),e._v(" Terms")]),e._v(" "),t("p",[e._v("The most important terms are described below.")]),e._v(" "),t("h3",{attrs:{id:"asterics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics"}},[e._v("#")]),e._v(" AsTeRICS")]),e._v(" "),t("p",[e._v("The term AsTeRICS stands for "),t("strong",[e._v("As")]),e._v("sistive "),t("strong",[e._v("Te")]),e._v("chnology "),t("strong",[e._v("R")]),e._v("apid "),t("strong",[e._v("I")]),e._v("ntegration and "),t("strong",[e._v("C")]),e._v("onstruction "),t("strong",[e._v("S")]),e._v("et and allows the creation of customized low-cost Assistive Technologies.")]),e._v(" "),t("h3",{attrs:{id:"solutions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#solutions"}},[e._v("#")]),e._v(" Solutions")]),e._v(" "),t("p",[e._v("The AsTeRICS framework provides some selected "),t("RouterLink",{attrs:{to:"/solutions/"}},[e._v("solutions")]),e._v(" which can be used out of the box. The solutions are grouped by "),t("strong",[e._v("use cases")]),e._v(" and can be directly started from the solutions page. Some solutions depend on certain "),t("a",{attrs:{href:"#input-device"}},[e._v("input devices")]),e._v(" or other hardware and software. Just click on the "),t("code",[e._v("Read More")]),e._v(" button in a solution’s tile to get a detailed step by step instruction of how to install and use it.")],1),e._v(" "),t("p",[e._v("A solution can be categorized by the AsTeRICS technology used. It can be a "),t("a",{attrs:{href:"#model"}},[e._v("model")]),e._v(", an "),t("a",{attrs:{href:"#asterics-grid"}},[e._v("AsTERICS Grid")]),e._v(" or an "),t("a",{attrs:{href:"#at-solution"}},[e._v("AT solution")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model"}},[e._v("#")]),e._v(" Model")]),e._v(" "),t("p",[e._v("A model represents a simple Assistive Technology (AT). It is used to define "),t("strong",[e._v("what")]),e._v(" should be done (e.g. mouse control, switching light on/off) and "),t("strong",[e._v("how")]),e._v(" this can be done (e.g. button-press, head movement,…). A model uses "),t("a",{attrs:{href:"#plugin"}},[e._v("plugins")]),e._v(" to support input devices (e.g. webcam, switch,…) and required actions. On the image below you can see the XFaceTrackerLK plugin which uses the webcam to track the movements of your head. This gesture is directly translated to mouse movements by connecting the XFaceTrackerLK plugin to the Mouse plugin.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(430),alt:"Model with a webcam plugin as input device and a mouse action plugin"}})]),e._v(" "),t("h3",{attrs:{id:"plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin"}},[e._v("#")]),e._v(" Plugin")]),e._v(" "),t("p",[e._v("A plugin represents a modular component that can be used within a model.\nIt can be an input device (sensor), a processor (processing, modifying data) or an action (actuator).")]),e._v(" "),t("h3",{attrs:{id:"input-device"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#input-device"}},[e._v("#")]),e._v(" Input Device")]),e._v(" "),t("p",[e._v("AsTeRICS supports numerous input devices like a switch, a webcam or an eye-tracker. The list of supported devices can be found under "),t("RouterLink",{attrs:{to:"/plugins/"}},[e._v("Plugins/Sensors")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#action"}},[e._v("#")]),e._v(" Action")]),e._v(" "),t("p",[e._v("The actions that are executed by a model are implemented using actuator plugins, which can be found under "),t("RouterLink",{attrs:{to:"/plugins/"}},[e._v("Plugins/Actuators")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"asterics-grid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid"}},[e._v("#")]),e._v(" AsTeRICS Grid")]),e._v(" "),t("p",[e._v("The AsTeRICS Grid is a web-based user interface which can be used for Augmentative and Alternative Communication (AAC). It is available on "),t("a",{attrs:{href:"https://grid.asterics.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://grid.asterics.eu"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Grids can be defined in a flexible layout of cells acting as buttons. The cells show text and images/symbols and if one of them is selected a defined phrase can be spoken (text-to-speech). A grid can also be connected to a model and be used to trigger actions like switching lights on/off.")]),e._v(" "),t("p",[t("img",{attrs:{src:"/assets/img/AsTeRICS-Ergo_Grid_en-1-768x592.jpg",alt:"Grid with symbols for Alternative and Augmentative Communication"}})]),e._v(" "),t("p",[e._v("For more information about how to use the AsTeRICS Grid, please read the "),t("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[e._v("user manual")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"at-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-solution"}},[e._v("#")]),e._v(" AT Solution")]),e._v(" "),t("p",[e._v("An AT solution is a more complex Assistive Technology and may be comprised of several models, grids, images or web user interfaces. An AT solution can be seen as a standalone SW application, that allows easier customization and configuration for the end user.")]),e._v(" "),t("h2",{attrs:{id:"programs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#programs"}},[e._v("#")]),e._v(" Programs")]),e._v(" "),t("p",[e._v("AsTeRICS consists of several executable programs.")]),e._v(" "),t("p",[t("img",{attrs:{src:s(431),alt:"Diagram showing ACS and ARE interaction."}})]),e._v(" "),t("h3",{attrs:{id:"acs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acs"}},[e._v("#")]),e._v(" ACS")]),e._v(" "),t("p",[e._v("The AsTeRICS Configuration Suite (ACS) is a graphical editor for easy designing and testing model files. A model file can be saved to a file or uploaded to the "),t("a",{attrs:{href:"#are"}},[e._v("ARE")]),e._v(" to execute it. Likewise, a model can be downloaded from the ARE to be changed or customized. Furthermore, the ACS allows to remote control the ARE program and to start and stop a model. For more information about how to use the ACS, please read the "),t("RouterLink",{attrs:{to:"/manuals/ACS/"}},[e._v("ACS user manual")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:s(288),alt:"Screenshot of ACS program with a simple model."}})]),e._v(" "),t("h3",{attrs:{id:"webacs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#webacs"}},[e._v("#")]),e._v(" WebACS")]),e._v(" "),t("p",[e._v("The WebACS is a new web-based version of the "),t("a",{attrs:{href:"#acs"}},[e._v("ACS")]),e._v(" program for designing and testing model files. For more information about how to use the WebACS, please read the "),t("RouterLink",{attrs:{to:"/manuals/WebACS/"}},[e._v("WebACS user manual")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:s(432),alt:"Screenshot of ACS program with a simple model."}})]),e._v(" "),t("h3",{attrs:{id:"are"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are"}},[e._v("#")]),e._v(" ARE")]),e._v(" "),t("p",[e._v("The AsTeRICS Runtime Environment (ARE) executes a given model. The screenshot below shows the autostart model running after starting the ARE. You can click the "),t("code",[e._v("Play")]),e._v(", "),t("code",[e._v("Pause")]),e._v(" or "),t("code",[e._v("Stop")]),e._v(" button of the control panel to start, pause or stop a model. Alternatively, you can use the respective shortcuts "),t("code",[e._v("F5")]),e._v(","),t("code",[e._v("F6")]),e._v(","),t("code",[e._v("F7")]),e._v(". Furthermore, you can open a new model file by clicking on the "),t("code",[e._v("Open")]),e._v(" button. Additionally, a model can be uploaded, if opened in the ACS/WebACS programs or directly from the "),t("RouterLink",{attrs:{to:"/solutions/"}},[e._v("solutions")]),e._v(" page. The ARE also provides a remote interface. For more information about how to use the ARE, please read the "),t("RouterLink",{attrs:{to:"/manuals/ARE/"}},[e._v("ARE user manual")]),e._v(".")],1),e._v(" "),t("p",[t("img",{attrs:{src:s(433),alt:"Screenshot of AsTeRICS Runtime Environment"}})]),e._v(" "),t("h2",{attrs:{id:"user-interfaces"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-interfaces"}},[e._v("#")]),e._v(" User Interfaces")]),e._v(" "),t("p",[e._v("AsTeRICS provides two different types of user interfaces, which can be used for a model.")]),e._v(" "),t("h3",{attrs:{id:"are-gui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-gui"}},[e._v("#")]),e._v(" ARE GUI")]),e._v(" "),t("p",[e._v("The ARE provides a Graphical User Interface (GUI) desktop (see "),t("a",{attrs:{href:"#are"}},[e._v("ARE screenshot")]),e._v("). When designing a model with the ACS or WebACS you can use plugins which provide user interface elements like a slider or a button. You can then define where the element should be shown on the ARE desktop. Furthermore you can define actions depending on user input.")]),e._v(" "),t("h3",{attrs:{id:"asterics-grid-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-grid-2"}},[e._v("#")]),e._v(" AsTeRICS Grid")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#asterics-grid"}},[e._v("AsTeRICS Grid")]),e._v(" is a new way of defining a user interface for AsTeRICS.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/289.7407abb3.js b/assets/js/290.8215c8e1.js similarity index 96% rename from assets/js/289.7407abb3.js rename to assets/js/290.8215c8e1.js index 1113ad5538..90fcb9878d 100644 --- a/assets/js/289.7407abb3.js +++ b/assets/js/290.8215c8e1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[289],{925:function(t,o,e){"use strict";e.r(o);var s=e(2),i=Object(s.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"tutorials"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#tutorials"}},[t._v("#")]),t._v(" Tutorials")]),t._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),o("p",[t._v("If you are an "),o("strong",[t._v("occupational therapist")]),t._v(" or an "),o("strong",[t._v("assistive technology professional")]),t._v(" or simply want to "),o("strong",[t._v("customize")]),t._v(" or "),o("strong",[t._v("create")]),t._v(" new solutions, this is the right place for you.")]),t._v(" "),o("p",[t._v("In this section you will find tutorials about model creation and editing.")])]),t._v(" "),o("p",[t._v("If you would like to use a solution for a dedicated person with disabilities, go to the "),o("RouterLink",{attrs:{to:"/solutions/"}},[t._v("solutions")]),t._v(" page and start experimenting with solutions of the needed use case. Some solutions directly provide a settings page by clicking the "),o("code",[t._v("Settings")]),t._v(" button. In case of the camera mouse this allows to configure the camera device, the mouse speed and other settings. Otherwise you will have to edit the underlying model directly. This can be done by clicking the "),o("code",[t._v("Edit")]),t._v(" button.")],1),t._v(" "),o("h2",{attrs:{id:"go-to"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#go-to"}},[t._v("#")]),t._v(" Go to")]),t._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"./model/Model-Customization"}},[o("strong",[t._v("Model Customization")])]),t._v(" to learn how to modify a given model and adapt single properties.")]),t._v(" "),o("li",[o("a",{attrs:{href:"./model/Model-Creation"}},[o("strong",[t._v("Model Creation")])]),t._v(" to learn how to create a new model.")])])])}),[],!1,null,null,null);o.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[290],{926:function(t,o,e){"use strict";e.r(o);var s=e(2),i=Object(s.a)({},(function(){var t=this,o=t._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"tutorials"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#tutorials"}},[t._v("#")]),t._v(" Tutorials")]),t._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),o("p",[t._v("If you are an "),o("strong",[t._v("occupational therapist")]),t._v(" or an "),o("strong",[t._v("assistive technology professional")]),t._v(" or simply want to "),o("strong",[t._v("customize")]),t._v(" or "),o("strong",[t._v("create")]),t._v(" new solutions, this is the right place for you.")]),t._v(" "),o("p",[t._v("In this section you will find tutorials about model creation and editing.")])]),t._v(" "),o("p",[t._v("If you would like to use a solution for a dedicated person with disabilities, go to the "),o("RouterLink",{attrs:{to:"/solutions/"}},[t._v("solutions")]),t._v(" page and start experimenting with solutions of the needed use case. Some solutions directly provide a settings page by clicking the "),o("code",[t._v("Settings")]),t._v(" button. In case of the camera mouse this allows to configure the camera device, the mouse speed and other settings. Otherwise you will have to edit the underlying model directly. This can be done by clicking the "),o("code",[t._v("Edit")]),t._v(" button.")],1),t._v(" "),o("h2",{attrs:{id:"go-to"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#go-to"}},[t._v("#")]),t._v(" Go to")]),t._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"./model/Model-Customization"}},[o("strong",[t._v("Model Customization")])]),t._v(" to learn how to modify a given model and adapt single properties.")]),t._v(" "),o("li",[o("a",{attrs:{href:"./model/Model-Creation"}},[o("strong",[t._v("Model Creation")])]),t._v(" to learn how to create a new model.")])])])}),[],!1,null,null,null);o.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/290.91ff1fca.js b/assets/js/291.37eadd5a.js similarity index 90% rename from assets/js/290.91ff1fca.js rename to assets/js/291.37eadd5a.js index 7978a8e0cf..a89261c244 100644 --- a/assets/js/290.91ff1fca.js +++ b/assets/js/291.37eadd5a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[290],{924:function(t,s,e){"use strict";e.r(s);var i=e(2),a=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"bioelectrical-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bioelectrical-input"}},[this._v("#")]),this._v(" Bioelectrical Input")]),this._v(" "),t("h2",{attrs:{id:"emg-based-mouse-click"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#emg-based-mouse-click"}},[this._v("#")]),this._v(" EMG-based Mouse Click")]),this._v(" "),t("p",[this._v("…")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[291],{928:function(t,s,e){"use strict";e.r(s);var i=e(2),a=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"bioelectrical-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bioelectrical-input"}},[this._v("#")]),this._v(" Bioelectrical Input")]),this._v(" "),t("h2",{attrs:{id:"emg-based-mouse-click"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#emg-based-mouse-click"}},[this._v("#")]),this._v(" EMG-based Mouse Click")]),this._v(" "),t("p",[this._v("…")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/291.04640e36.js b/assets/js/292.b0142d4e.js similarity index 99% rename from assets/js/291.04640e36.js rename to assets/js/292.b0142d4e.js index 127faae4b8..c088b862e1 100644 --- a/assets/js/291.04640e36.js +++ b/assets/js/292.b0142d4e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[291],{926:function(e,t,a){"use strict";a.r(t);var o=a(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"gaming-toys-music"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gaming-toys-music"}},[e._v("#")]),e._v(" Gaming, Toys & Music")]),e._v(" "),t("p",[e._v("AsTeRICS can be used to control computer games, music programs or infrared-controlled lights and toys. The keyboard input of a game or a music program can be substituted by another input modality (e.g. head movement, eye gaze, switch press,…) which emulates a key press. Similarily, a toy can be controlled by adapting an input modality to an RC or infrared command.")]),e._v(" "),t("h2",{attrs:{id:"head-movement-to-smiley-tutorial"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#head-movement-to-smiley-tutorial"}},[e._v("#")]),e._v(" Head Movement to Smiley Tutorial")]),e._v(" "),t("p",[e._v("In a first tutorial, you will learn how to map up/down head movements to a discrete number between 1 and 4. The number will than be mapped to one of 4 image paths and the selected image will be shown in the ImageBox widget depending on the head movement.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137794267-4b207741-a95c-40ed-9237-cdd9473f159c.gif",alt:"Demo showing selected smiley image (from angry to happy) depending on head movement"}})]),e._v(" "),t("p",[e._v("Later this tutorial can be used as a basis for other use cases as well, simply by exchanging the input signal (e.g. Use an air pressure or sip/puff value instead of head movements) or by exchanging the action (e.g. Send cursor keys "),t("kbd",[e._v("UP")]),e._v("/"),t("kbd",[e._v("DOWN")]),e._v(" or send a certain Infrared command instead of showing an image).")]),e._v(" "),t("h3",{attrs:{id:"model-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-description"}},[e._v("#")]),e._v(" Model Description")]),e._v(" "),t("p",[e._v("Below you can see the model used for this tutorial. You can "),t("a",{attrs:{href:"https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/tutorial/B_HeadMovement_MappedTo_SmileyImage.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("download"),t("OutboundLink")],1),e._v(" and open it in the "),t("strong",[e._v("ACS program")]),e._v(" or directly "),t("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=http://127.0.0.1:8081&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/tutorial/B_HeadMovement_MappedTo_SmileyImage.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("open it in the "),t("strong",[e._v("WebACS")]),t("OutboundLink")],1),e._v(" web application.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/149799674-39c65c41-7873-4fe2-ab23-e369548ed78b.png",alt:"Head-Smiley-Control-Model"}})]),e._v(" "),t("ol",[t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/sensors/XFacetrackerLK.html"}},[e._v("XFacetrackerLK")]),e._v(" plugin opens the first camera device with a resolution of 320x240 pixels, tracks the head movements and sends the relative movement in y-direction to the Integrate plugin.")],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/Integrate.html"}},[e._v("Integrate")]),e._v(" plugin integrates the relative movements with minimum and maximum values set to "),t("strong",[e._v("0 and 240")]),e._v(" respectively (same as camera resolution). "),t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137796282-a2a080aa-d32a-4693-bfe8-af4a75dfadec.png",alt:"Head-Smiley-Control-Integrate-Properties"}})],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/SignalTranslation.html"}},[e._v("SignalTranslation")]),e._v(" plugin translates the values between "),t("strong",[e._v("0 and 240")]),e._v(" to values between "),t("strong",[e._v("1.00 and 4.00")]),e._v(". "),t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137796551-1629aea6-a031-4143-9502-7d2c2862ccbd.png",alt:"Head-Smiley-Control-SignalTranslator-Properties"}})],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/Quantizer.html"}},[e._v("Quantizer")]),e._v(" plugin creates a quantized (integer) number by rounding to the nearest integer number.")],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/StringDispatcher.html"}},[e._v("StringDispatcher")]),e._v(" plugin has predefined Strings (paths to image files) which are sent to the output port depending on the input number (1-4). "),t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137797248-d663214b-8529-4493-858e-2bac85f129ae.png",alt:"Head-Smiley-Control-StringDispatcher-Properties"}})],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/actuators/TextDisplay.html"}},[e._v("TextDisplay")]),e._v(" widget shows the quantized number in a text box for debugging purposes only.")],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/actuators/ImageBox.html"}},[e._v("ImageBox")]),e._v(" widget shows the image which path was received at the input port.")],1)]),e._v(" "),t("h2",{attrs:{id:"gaming"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gaming"}},[e._v("#")]),e._v(" Gaming")]),e._v(" "),t("p",[e._v("Many games can be controlled by keyboard shortcuts e.g. "),t("kbd",[e._v("a")]),e._v(","),t("kbd",[e._v("s")]),e._v(","),t("kbd",[e._v("d")]),e._v(","),t("kbd",[e._v("f")]),e._v(" or "),t("kbd",[e._v("left")]),e._v(","),t("kbd",[e._v("right")]),e._v(","),t("kbd",[e._v("up")]),e._v(","),t("kbd",[e._v("down")]),e._v(".\nYou can now use the "),t("a",{attrs:{href:"#head-movement-to-smiley-tutorial"}},[e._v("Head Movement to Smiley Tutorial")]),e._v(" and simply map the head up/down movement to a keyboard key by using they "),t("RouterLink",{attrs:{to:"/plugins/actuators/Keyboard.html"}},[e._v("Keyboard")]),e._v(" plugin.")],1),e._v(" "),t("p",[e._v("Simply exchange the slot Strings in the StringDispatcher plugin by the key strings or special key code strings (e.g. "),t("code",[e._v("{UP}")]),e._v(" for a cursor up key press emulation).")]),e._v(" "),t("h2",{attrs:{id:"sound-and-voice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sound-and-voice"}},[e._v("#")]),e._v(" Sound and Voice")]),e._v(" "),t("p",[e._v("Instead of showing smiley images you can use the "),t("RouterLink",{attrs:{to:"/plugins/actuators/MidiPlayer.html"}},[e._v("MidiPlayer")]),e._v(" to create midi tones. In this case directly send the output value of the Quantizer plugin to the input port "),t("code",[e._v("pitch")]),e._v(".")],1),e._v(" "),t("p",[e._v("If you want to generate voice, set the slot strings of the StringDispatcher plugin to the words and sentences you would like to synthesize. You must then connect one of the voice generation plugins (e.g. "),t("RouterLink",{attrs:{to:"/plugins/processors/SpeechProcessor.html"}},[e._v("SpeechProcessor")]),e._v(", "),t("RouterLink",{attrs:{to:"/plugins/actuators/SyntheticVoice.html"}},[e._v("SyntheticVoice")]),e._v(", "),t("RouterLink",{attrs:{to:"/plugins/actuators/PicoTTS.html"}},[e._v("PicoTTS")]),e._v(" to it.")],1),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("project kissenklang")]),e._v(" uses a blood pressure cuff to create sounds using the "),t("RouterLink",{attrs:{to:"/plugins/actuators/MidiPlayer.html"}},[e._v("MidiPlayer")]),e._v(" plugin.")],1),e._v(" "),t("h2",{attrs:{id:"light"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#light"}},[e._v("#")]),e._v(" Light")]),e._v(" "),t("p",[e._v("If you would like to control an infrared-controlled light bulb, you can use the "),t("RouterLink",{attrs:{to:"/plugins/actuators/IRTrans.html"}},[e._v("IRTrans")]),e._v(" plugin and set the slot strings of the StringDispatcher plugin to the action strings of the respective infrared commands (e.g. "),t("code",[e._v("@IRTRANS: snd luminea-bulb,red")]),e._v(").")],1),e._v(" "),t("p",[e._v("Likewise you could use the "),t("RouterLink",{attrs:{to:"/plugins/actuators/PhilipsHue.html"}},[e._v("PhilipsHue")]),e._v(" plugin to control a Hue bulb depending on the head movement by setting the respective action string (e.g. "),t("code",[e._v('{"hue": 0, "sat": 254}')]),e._v(").")],1),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("project kissenklang")]),e._v(" uses a blood pressure cuff to control a light bulb via infrared commands sent by the "),t("RouterLink",{attrs:{to:"/plugins/actuators/IRTrans.html"}},[e._v("IRTrans")]),e._v(" plugin.")],1),e._v(" "),t("h2",{attrs:{id:"toys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#toys"}},[e._v("#")]),e._v(" Toys")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("project kissenklang")]),e._v(" uses a blood pressure cuff to control a toy robot via infrared commands sent by the "),t("RouterLink",{attrs:{to:"/plugins/actuators/IRTrans.html"}},[e._v("IRTrans")]),e._v(" plugin.")],1),e._v(" "),t("p",[e._v("The following tutorial documents a "),t("a",{attrs:{href:"https://www.ki-i.at/helicopter/",target:"_blank",rel:"noopener noreferrer"}},[e._v("toy helicopter controlled with muscle signals"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"example-projects"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-projects"}},[e._v("#")]),e._v(" Example Projects")]),e._v(" "),t("h3",{attrs:{id:"blood-pressure-cuff-sound-and-toy-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("#")]),e._v(" Blood Pressure Cuff Sound and Toy Control")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/asterics/unikate-kissenschalter",target:"_blank",rel:"noopener noreferrer"}},[e._v("project Kissenklang"),t("OutboundLink")],1),e._v(" used a consumer blood pressure cuff and the "),t("a",{attrs:{href:"https://www.asterics-foundation.org/projects/fabi/",target:"_blank",rel:"noopener noreferrer"}},[e._v("button interface FABI"),t("OutboundLink")],1),e._v(" to create sounds according to the pressure value of the cuff or to control various items like toy robots, soap bubble machine or infrared lights.")]),e._v(" "),t("h4",{attrs:{id:"demovideo-kissenklang"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#demovideo-kissenklang"}},[e._v("#")]),e._v(" Demovideo Kissenklang")]),e._v(" "),t("UseCase",{attrs:{title:"Kissenklang Demovideo",media:"https://youtu.be/5d4WYjJhgug"}},[e._v("Demo of Kissenklang generating sounds according to the pressure value of the blood pressure cuff.")])],1)}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[292],{929:function(e,t,a){"use strict";a.r(t);var o=a(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"gaming-toys-music"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gaming-toys-music"}},[e._v("#")]),e._v(" Gaming, Toys & Music")]),e._v(" "),t("p",[e._v("AsTeRICS can be used to control computer games, music programs or infrared-controlled lights and toys. The keyboard input of a game or a music program can be substituted by another input modality (e.g. head movement, eye gaze, switch press,…) which emulates a key press. Similarily, a toy can be controlled by adapting an input modality to an RC or infrared command.")]),e._v(" "),t("h2",{attrs:{id:"head-movement-to-smiley-tutorial"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#head-movement-to-smiley-tutorial"}},[e._v("#")]),e._v(" Head Movement to Smiley Tutorial")]),e._v(" "),t("p",[e._v("In a first tutorial, you will learn how to map up/down head movements to a discrete number between 1 and 4. The number will than be mapped to one of 4 image paths and the selected image will be shown in the ImageBox widget depending on the head movement.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137794267-4b207741-a95c-40ed-9237-cdd9473f159c.gif",alt:"Demo showing selected smiley image (from angry to happy) depending on head movement"}})]),e._v(" "),t("p",[e._v("Later this tutorial can be used as a basis for other use cases as well, simply by exchanging the input signal (e.g. Use an air pressure or sip/puff value instead of head movements) or by exchanging the action (e.g. Send cursor keys "),t("kbd",[e._v("UP")]),e._v("/"),t("kbd",[e._v("DOWN")]),e._v(" or send a certain Infrared command instead of showing an image).")]),e._v(" "),t("h3",{attrs:{id:"model-description"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-description"}},[e._v("#")]),e._v(" Model Description")]),e._v(" "),t("p",[e._v("Below you can see the model used for this tutorial. You can "),t("a",{attrs:{href:"https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/tutorial/B_HeadMovement_MappedTo_SmileyImage.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("download"),t("OutboundLink")],1),e._v(" and open it in the "),t("strong",[e._v("ACS program")]),e._v(" or directly "),t("a",{attrs:{href:"http://webacs.asterics.eu/?areBaseURI=http://127.0.0.1:8081&openFile=https://raw.githubusercontent.com/asterics/AsTeRICS/master/bin/ARE/models/tutorial/B_HeadMovement_MappedTo_SmileyImage.acs",target:"_blank",rel:"noopener noreferrer"}},[e._v("open it in the "),t("strong",[e._v("WebACS")]),t("OutboundLink")],1),e._v(" web application.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/149799674-39c65c41-7873-4fe2-ab23-e369548ed78b.png",alt:"Head-Smiley-Control-Model"}})]),e._v(" "),t("ol",[t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/sensors/XFacetrackerLK.html"}},[e._v("XFacetrackerLK")]),e._v(" plugin opens the first camera device with a resolution of 320x240 pixels, tracks the head movements and sends the relative movement in y-direction to the Integrate plugin.")],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/Integrate.html"}},[e._v("Integrate")]),e._v(" plugin integrates the relative movements with minimum and maximum values set to "),t("strong",[e._v("0 and 240")]),e._v(" respectively (same as camera resolution). "),t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137796282-a2a080aa-d32a-4693-bfe8-af4a75dfadec.png",alt:"Head-Smiley-Control-Integrate-Properties"}})],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/SignalTranslation.html"}},[e._v("SignalTranslation")]),e._v(" plugin translates the values between "),t("strong",[e._v("0 and 240")]),e._v(" to values between "),t("strong",[e._v("1.00 and 4.00")]),e._v(". "),t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137796551-1629aea6-a031-4143-9502-7d2c2862ccbd.png",alt:"Head-Smiley-Control-SignalTranslator-Properties"}})],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/Quantizer.html"}},[e._v("Quantizer")]),e._v(" plugin creates a quantized (integer) number by rounding to the nearest integer number.")],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/processors/StringDispatcher.html"}},[e._v("StringDispatcher")]),e._v(" plugin has predefined Strings (paths to image files) which are sent to the output port depending on the input number (1-4). "),t("img",{attrs:{src:"https://user-images.githubusercontent.com/4621810/137797248-d663214b-8529-4493-858e-2bac85f129ae.png",alt:"Head-Smiley-Control-StringDispatcher-Properties"}})],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/actuators/TextDisplay.html"}},[e._v("TextDisplay")]),e._v(" widget shows the quantized number in a text box for debugging purposes only.")],1),e._v(" "),t("li",[e._v("The "),t("RouterLink",{attrs:{to:"/plugins/actuators/ImageBox.html"}},[e._v("ImageBox")]),e._v(" widget shows the image which path was received at the input port.")],1)]),e._v(" "),t("h2",{attrs:{id:"gaming"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gaming"}},[e._v("#")]),e._v(" Gaming")]),e._v(" "),t("p",[e._v("Many games can be controlled by keyboard shortcuts e.g. "),t("kbd",[e._v("a")]),e._v(","),t("kbd",[e._v("s")]),e._v(","),t("kbd",[e._v("d")]),e._v(","),t("kbd",[e._v("f")]),e._v(" or "),t("kbd",[e._v("left")]),e._v(","),t("kbd",[e._v("right")]),e._v(","),t("kbd",[e._v("up")]),e._v(","),t("kbd",[e._v("down")]),e._v(".\nYou can now use the "),t("a",{attrs:{href:"#head-movement-to-smiley-tutorial"}},[e._v("Head Movement to Smiley Tutorial")]),e._v(" and simply map the head up/down movement to a keyboard key by using they "),t("RouterLink",{attrs:{to:"/plugins/actuators/Keyboard.html"}},[e._v("Keyboard")]),e._v(" plugin.")],1),e._v(" "),t("p",[e._v("Simply exchange the slot Strings in the StringDispatcher plugin by the key strings or special key code strings (e.g. "),t("code",[e._v("{UP}")]),e._v(" for a cursor up key press emulation).")]),e._v(" "),t("h2",{attrs:{id:"sound-and-voice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sound-and-voice"}},[e._v("#")]),e._v(" Sound and Voice")]),e._v(" "),t("p",[e._v("Instead of showing smiley images you can use the "),t("RouterLink",{attrs:{to:"/plugins/actuators/MidiPlayer.html"}},[e._v("MidiPlayer")]),e._v(" to create midi tones. In this case directly send the output value of the Quantizer plugin to the input port "),t("code",[e._v("pitch")]),e._v(".")],1),e._v(" "),t("p",[e._v("If you want to generate voice, set the slot strings of the StringDispatcher plugin to the words and sentences you would like to synthesize. You must then connect one of the voice generation plugins (e.g. "),t("RouterLink",{attrs:{to:"/plugins/processors/SpeechProcessor.html"}},[e._v("SpeechProcessor")]),e._v(", "),t("RouterLink",{attrs:{to:"/plugins/actuators/SyntheticVoice.html"}},[e._v("SyntheticVoice")]),e._v(", "),t("RouterLink",{attrs:{to:"/plugins/actuators/PicoTTS.html"}},[e._v("PicoTTS")]),e._v(" to it.")],1),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("project kissenklang")]),e._v(" uses a blood pressure cuff to create sounds using the "),t("RouterLink",{attrs:{to:"/plugins/actuators/MidiPlayer.html"}},[e._v("MidiPlayer")]),e._v(" plugin.")],1),e._v(" "),t("h2",{attrs:{id:"light"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#light"}},[e._v("#")]),e._v(" Light")]),e._v(" "),t("p",[e._v("If you would like to control an infrared-controlled light bulb, you can use the "),t("RouterLink",{attrs:{to:"/plugins/actuators/IRTrans.html"}},[e._v("IRTrans")]),e._v(" plugin and set the slot strings of the StringDispatcher plugin to the action strings of the respective infrared commands (e.g. "),t("code",[e._v("@IRTRANS: snd luminea-bulb,red")]),e._v(").")],1),e._v(" "),t("p",[e._v("Likewise you could use the "),t("RouterLink",{attrs:{to:"/plugins/actuators/PhilipsHue.html"}},[e._v("PhilipsHue")]),e._v(" plugin to control a Hue bulb depending on the head movement by setting the respective action string (e.g. "),t("code",[e._v('{"hue": 0, "sat": 254}')]),e._v(").")],1),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("project kissenklang")]),e._v(" uses a blood pressure cuff to control a light bulb via infrared commands sent by the "),t("RouterLink",{attrs:{to:"/plugins/actuators/IRTrans.html"}},[e._v("IRTrans")]),e._v(" plugin.")],1),e._v(" "),t("h2",{attrs:{id:"toys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#toys"}},[e._v("#")]),e._v(" Toys")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("project kissenklang")]),e._v(" uses a blood pressure cuff to control a toy robot via infrared commands sent by the "),t("RouterLink",{attrs:{to:"/plugins/actuators/IRTrans.html"}},[e._v("IRTrans")]),e._v(" plugin.")],1),e._v(" "),t("p",[e._v("The following tutorial documents a "),t("a",{attrs:{href:"https://www.ki-i.at/helicopter/",target:"_blank",rel:"noopener noreferrer"}},[e._v("toy helicopter controlled with muscle signals"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"example-projects"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-projects"}},[e._v("#")]),e._v(" Example Projects")]),e._v(" "),t("h3",{attrs:{id:"blood-pressure-cuff-sound-and-toy-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#blood-pressure-cuff-sound-and-toy-control"}},[e._v("#")]),e._v(" Blood Pressure Cuff Sound and Toy Control")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/asterics/unikate-kissenschalter",target:"_blank",rel:"noopener noreferrer"}},[e._v("project Kissenklang"),t("OutboundLink")],1),e._v(" used a consumer blood pressure cuff and the "),t("a",{attrs:{href:"https://www.asterics-foundation.org/projects/fabi/",target:"_blank",rel:"noopener noreferrer"}},[e._v("button interface FABI"),t("OutboundLink")],1),e._v(" to create sounds according to the pressure value of the cuff or to control various items like toy robots, soap bubble machine or infrared lights.")]),e._v(" "),t("h4",{attrs:{id:"demovideo-kissenklang"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#demovideo-kissenklang"}},[e._v("#")]),e._v(" Demovideo Kissenklang")]),e._v(" "),t("UseCase",{attrs:{title:"Kissenklang Demovideo",media:"https://youtu.be/5d4WYjJhgug"}},[e._v("Demo of Kissenklang generating sounds according to the pressure value of the blood pressure cuff.")])],1)}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/292.0b4b97e0.js b/assets/js/293.94c0832b.js similarity index 92% rename from assets/js/292.0b4b97e0.js rename to assets/js/293.94c0832b.js index 70505a5eff..cff3a92c46 100644 --- a/assets/js/292.0b4b97e0.js +++ b/assets/js/293.94c0832b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[292],{928:function(t,s,e){"use strict";e.r(s);var i=e(2),o=Object(i.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"customize-grid"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customize-grid"}},[t._v("#")]),t._v(" Customize Grid")]),t._v(" "),s("p",[t._v("In this section you will find short and simple tutorials about grid creation or the customization of an existing one.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("In case you need more detailed information, please check the "),s("strong",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[t._v("AsTeRICS Grid user manual")])],1),t._v(".")])])])}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[293],{930:function(t,s,e){"use strict";e.r(s);var i=e(2),o=Object(i.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"customize-grid"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customize-grid"}},[t._v("#")]),t._v(" Customize Grid")]),t._v(" "),s("p",[t._v("In this section you will find short and simple tutorials about grid creation or the customization of an existing one.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("In case you need more detailed information, please check the "),s("strong",[s("RouterLink",{attrs:{to:"/manuals/asterics-grid/"}},[t._v("AsTeRICS Grid user manual")])],1),t._v(".")])])])}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/293.96e973cd.js b/assets/js/294.de48d56d.js similarity index 88% rename from assets/js/293.96e973cd.js rename to assets/js/294.de48d56d.js index bd8fea8c85..5fe637ccd9 100644 --- a/assets/js/293.96e973cd.js +++ b/assets/js/294.de48d56d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[293],{932:function(t,s,o){"use strict";o.r(s);var i=o(2),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"customize-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customize-model"}},[this._v("#")]),this._v(" Customize Model")]),this._v(" "),t("p",[this._v("In this section you will find tutorials about model creation or the customization of an existing one.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[294],{935:function(t,s,o){"use strict";o.r(s);var i=o(2),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"customize-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customize-model"}},[this._v("#")]),this._v(" Customize Model")]),this._v(" "),t("p",[this._v("In this section you will find tutorials about model creation or the customization of an existing one.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/294.761aafcc.js b/assets/js/295.679b5587.js similarity index 97% rename from assets/js/294.761aafcc.js rename to assets/js/295.679b5587.js index 3cf341dd8e..5ce374eb96 100644 --- a/assets/js/294.761aafcc.js +++ b/assets/js/295.679b5587.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[294],{934:function(e,t,a){"use strict";a.r(t);var i=a(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"other-use-cases-and-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-use-cases-and-information"}},[e._v("#")]),e._v(" Other Use Cases and Information")]),e._v(" "),t("h2",{attrs:{id:"complete-asterics-user-manual"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#complete-asterics-user-manual"}},[e._v("#")]),e._v(" Complete AsTeRICS User Manual")]),e._v(" "),t("p",[e._v("Here you can find the .pdf version of the original "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/raw/master/Documentation/UserManual.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("UserManual"),t("OutboundLink")],1),e._v(" with more comprehensive information about:")]),e._v(" "),t("ul",[t("li",[e._v("the model creation process")]),e._v(" "),t("li",[e._v("more use cases and demo models (e.g. game accessibility and utilizing bioelectric signals)")]),e._v(" "),t("li",[e._v("hardware interfacing options")]),e._v(" "),t("li",[e._v("short overview on important plugins")])]),e._v(" "),t("p",[e._v("(Please note that this manual is not constantly updated and might contain outdated information).")]),e._v(" "),t("h2",{attrs:{id:"diy-guides"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#diy-guides"}},[e._v("#")]),e._v(" DIY Guides")]),e._v(" "),t("p",[e._v("Here you can find some "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/Documentation/DIYGuides",target:"_blank",rel:"noopener noreferrer"}},[e._v("DIY-guides"),t("OutboundLink")],1),e._v(" for HW and SW solutions using AsTeRICS, including:")]),e._v(" "),t("ul",[t("li",[e._v("using AsTeRICS, an Arduino microcontroller and a pressure sensor for building a sip-and-puff device")]),e._v(" "),t("li",[e._v("building a proximity switch")]),e._v(" "),t("li",[e._v("building a head-mounted eye-tracker")]),e._v(" "),t("li",[e._v("building an EOG sensor")]),e._v(" "),t("li",[e._v("mouse/keyboard/joystick emualtion (eg. for play station control) with the HID-actuator")]),e._v(" "),t("li",[e._v("and more!")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[295],{936:function(e,t,a){"use strict";a.r(t);var i=a(2),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"other-use-cases-and-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-use-cases-and-information"}},[e._v("#")]),e._v(" Other Use Cases and Information")]),e._v(" "),t("h2",{attrs:{id:"complete-asterics-user-manual"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#complete-asterics-user-manual"}},[e._v("#")]),e._v(" Complete AsTeRICS User Manual")]),e._v(" "),t("p",[e._v("Here you can find the .pdf version of the original "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/raw/master/Documentation/UserManual.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("UserManual"),t("OutboundLink")],1),e._v(" with more comprehensive information about:")]),e._v(" "),t("ul",[t("li",[e._v("the model creation process")]),e._v(" "),t("li",[e._v("more use cases and demo models (e.g. game accessibility and utilizing bioelectric signals)")]),e._v(" "),t("li",[e._v("hardware interfacing options")]),e._v(" "),t("li",[e._v("short overview on important plugins")])]),e._v(" "),t("p",[e._v("(Please note that this manual is not constantly updated and might contain outdated information).")]),e._v(" "),t("h2",{attrs:{id:"diy-guides"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#diy-guides"}},[e._v("#")]),e._v(" DIY Guides")]),e._v(" "),t("p",[e._v("Here you can find some "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/Documentation/DIYGuides",target:"_blank",rel:"noopener noreferrer"}},[e._v("DIY-guides"),t("OutboundLink")],1),e._v(" for HW and SW solutions using AsTeRICS, including:")]),e._v(" "),t("ul",[t("li",[e._v("using AsTeRICS, an Arduino microcontroller and a pressure sensor for building a sip-and-puff device")]),e._v(" "),t("li",[e._v("building a proximity switch")]),e._v(" "),t("li",[e._v("building a head-mounted eye-tracker")]),e._v(" "),t("li",[e._v("building an EOG sensor")]),e._v(" "),t("li",[e._v("mouse/keyboard/joystick emualtion (eg. for play station control) with the HID-actuator")]),e._v(" "),t("li",[e._v("and more!")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/295.2c18e510.js b/assets/js/296.7f2904c7.js similarity index 99% rename from assets/js/295.2c18e510.js rename to assets/js/296.7f2904c7.js index e77376aeb4..7628f68ba4 100644 --- a/assets/js/295.2c18e510.js +++ b/assets/js/296.7f2904c7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[295],{933:function(e,t,o){"use strict";o.r(t);var a=o(2),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"asterics-packaging-environment-ape"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-packaging-environment-ape"}},[e._v("#")]),e._v(" AsTeRICS Packaging Environment (APE)")]),e._v(" "),t("p",[e._v("The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using "),t("a",{attrs:{href:"http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGIBBCI",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaFX packaging technology"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"ape-consists-of-two-major-elements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ape-consists-of-two-major-elements"}},[e._v("#")]),e._v(" APE consists of two major elements")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#ape-copy-commandline-tool"}},[t("strong",[e._v("APE-copy command line tool")])]),e._v(": a commandine tool to create a downstripped version of the ARE based on provided model files")]),e._v(" "),t("li",[t("a",{attrs:{href:"#build-infrastructure-and-native-installer-creation"}},[t("strong",[e._v("Build infrastructure")])]),e._v(": a "),t("a",{attrs:{href:"template"}},[e._v("template")]),e._v(" project directory including an "),t("a",{attrs:{href:"https://ant.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ant"),t("OutboundLink")],1),e._v(" build file and a property file "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(". The build file contains the target "),t("code",[e._v("ant APE-copy")]),e._v(" which provides the functionality of the APE-copy commandline tool and the target "),t("code",[e._v("APE deploy")]),e._v(" to trigger the creation of "),t("strong",[e._v("native installer")]),e._v(" and "),t("strong",[e._v("native launcher")]),e._v(" for a dedicated target platform.")])]),e._v(" "),t("h2",{attrs:{id:"important-terms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#important-terms"}},[e._v("#")]),e._v(" Important Terms")]),e._v(" "),t("p",[e._v("The term "),t("code",[e._v("APE.baseURI")]),e._v(" refers to the location of "),t("code",[e._v("APE.jar")]),e._v(" and the "),t("code",[e._v("APE-copy")]),e._v(" command, which is in the folder "),t("code",[e._v("APE")]),e._v(" parallel to the "),t("code",[e._v("ARE")]),e._v(" folder of an AsTeRICS installation. The "),t("code",[e._v("APE.baseURI")]),e._v(" folder also contains the build infrastructure to create the native installers and contains the default project directory ("),t("code",[e._v("APE.projectDir=/defProjectDir")]),e._v(") and the default build directory ("),t("code",[e._v("APE.buildDir=/defProjectDir/build")]),e._v("). "),t("code",[e._v("APE.models")]),e._v(" refers to file and directory paths containing model files to use. Finally, "),t("code",[e._v("ARE.baseURI")]),e._v(" refers to the location of the ARE that is used as the source for the extracted ARE versions.")]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("The commandline tool APE-copy only needs a Java Runtime Environment. In order to use the ant build targets and create native installers you also need "),t("strong",[e._v("ant")]),e._v(" and a "),t("strong",[e._v("Java Development Kit 8")]),e._v(".")]),e._v(" "),t("ul",[t("li",[e._v("Install the ["),t("strong",[e._v("Java Development Kit 8 (32-bit)")]),e._v("] (http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n"),t("ul",[t("li",[e._v("Verify the java installation by opening a command shell and entering "),t("code",[e._v("javac -version")]),e._v(". In case of trouble, ensure to set “JAVA_HOME” to the folder where you installed the Java JDK and add the JDK bin path to the Environment Variable “Path”")])])]),e._v(" "),t("li",[e._v("Install the ["),t("strong",[e._v("apache ant build framework (version >= 1.9.1)")]),e._v("] (http://ant.apache.org/bindownload.cgi)\n"),t("ul",[t("li",[e._v("Ensure to set “ANT_HOME” to the folder where you installed ant and add the ant bin path to the Environment Variable “Path”")])])]),e._v(" "),t("li",[t("strong",[e._v("Only for native installer creation")]),e._v(": Install installer-specific toolkits like [InnoSetup >= 5] (http://www.jrsoftware.org/isdl.php) (.exe), "),t("a",{attrs:{href:"http://wixtoolset.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("WiX toolset >= 3.0"),t("OutboundLink")],1),e._v(" (.msi) or [debian packaging tools] (https://wiki.debian.org/PackageManagement) (.deb) depending on the required target platform. You must run the installer build process on the target platform of the installer. For more details, read the [JavaFX packaging tutorial] (https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#A1324980)")])]),e._v(" "),t("h2",{attrs:{id:"ape-copy-commandline-tool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ape-copy-commandline-tool"}},[e._v("#")]),e._v(" APE-copy commandline tool")]),e._v(" "),t("p",[e._v("Check the "),t("a",{attrs:{href:"#dependencies"}},[e._v("dependencies")]),e._v(" before you start.")]),e._v(" "),t("p",[e._v("To start APE-copy, call")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("APE-copy[.bat|.sh] -DAPE.models= [[-DAPE.buildDir=] [-DARE.baseURI=] [-DAPE.projectDir=/custom/bin/ARE/models")]),e._v(" is automatically added to the parameter.")]),e._v(" "),t("li",[t("strong",[e._v("APE.buildDir")]),e._v(": The path to the build (output) folder. The downsized ARE is copied to that folder. The path can be relative or absolute where a relative path is resolved against the APE directory. By default, the "),t("code",[e._v("build")]),e._v(" subfolder of the project directory ("),t("code",[e._v("APE.projectDir")]),e._v(") is used.")]),e._v(" "),t("li",[t("strong",[e._v("ARE.baseURI")]),e._v(": The path to the ARE installation. This can be the path to the "),t("code",[e._v("bin/ARE")]),e._v(" folder of a development version (cloned git repository) or the "),t("code",[e._v("ARE")]),e._v(" path of an installed AsTeRICS release (>= 2.8). The path can be relative or absolute where a relative path is resolved against the APE directory. By default, the parallel ```ARE`` folder is used.")]),e._v(" "),t("li",[t("strong",[e._v("APE.projectDir")]),e._v(": The path of the project directory to use. If the directory does not exist it is automatically created by copying the "),t("a",{attrs:{href:"#simplified-folder-structure"}},[t("code",[e._v("template")])]),e._v(" directory to the project directory. The given project directory must contain the "),t("code",[e._v("APE.properties")]),e._v(" file, which contains default project-specific property values that can be overridden by the commandline switches of APE-copy. Additionally, the files and resources in the subfolder "),t("code",[e._v("custom")]),e._v(" are finally copied to the target build directory ("),t("code",[e._v("APE.buildDir")]),e._v("). Read more about [customization of the ARE] here. By default, the project directory "),t("code",[e._v("APE.projectDir=/defProjectDir")]),e._v(" is used.")]),e._v(" "),t("li",[t("strong",[e._v("APE.logLevel")]),e._v(": You can specify the verbosity of the console output of the APE-copy command. Additionally, the log messages of the command execution are logged to the "),t("code",[e._v("/tmp")])])]),e._v(" "),t("h3",{attrs:{id:"example-usages-of-the-ape-copy-commandline-tool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-usages-of-the-ape-copy-commandline-tool"}},[e._v("#")]),e._v(" Example usages of the APE-copy commandline tool")]),e._v(" "),t("p",[e._v("You should be able to copy/paste the example commands below as long as you replace the placeholder with real values. The examples use windows path notations.")]),e._v(" "),t("p",[t("strong",[e._v("Note for Linux, Mac OSX")]),e._v(": On Linux and Mac OSX you must use "),t("code",[e._v("APE-copy.sh")]),e._v(" and slashify (’/’ instead of ‘’) the paths.")]),e._v(" "),t("h4",{attrs:{id:"one-model-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file"}},[e._v("#")]),e._v(" One model file")]),e._v(" "),t("p",[e._v("Create a downstripped ARE package of the model file "),t("code",[e._v("ImageDemo.acs")]),e._v(" located in the "),t("code",[e._v("ARE/models")]),e._v(" folder.\nBy default, the result is written to the folder "),t("code",[e._v("/merged")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nAPE-copy -DAPE.models=../ARE/models/ImageDemo.acs\n")])])]),t("h4",{attrs:{id:"several-model-files-folder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#several-model-files-folder"}},[e._v("#")]),e._v(" Several model files/folder")]),e._v(" "),t("p",[e._v("When specifying a folder, all contained model files (recursively) will be used. Several file or folder URIs can be seperated by a ‘"),t("strong",[e._v(";")]),e._v("’. Relative and absolute URIs can be mixed. By default, the result is written to the folder "),t("code",[e._v("/merged")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nAPE-copy -DAPE.models=../ARE/models/ImageDemo.acs;../ARE/models/eyetracking;D:/MyModelFiles/\n")])])]),t("h4",{attrs:{id:"one-model-file-custom-build-folder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-custom-build-folder"}},[e._v("#")]),e._v(" One model file, custom build folder")]),e._v(" "),t("p",[e._v("You can specify a custom build folder with the property "),t("code",[e._v("APE.buildDir")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nAPE-copy -DAPE.models=../ARE/models/ImageDemo.acs -DAPE.buildDir=C:\\ImageDemo\n")])])]),t("h2",{attrs:{id:"build-infrastructure-and-native-installer-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-infrastructure-and-native-installer-creation"}},[e._v("#")]),e._v(" Build infrastructure and native installer creation")]),e._v(" "),t("p",[e._v("The tool APE-copy is only used to copy the required resources for a given model file to a certain location, but APE also provides a full build infrastructure ("),t("code",[e._v("APE.projectDir=/defProjectDir")]),e._v(") that let’s you")]),e._v(" "),t("ul",[t("li",[e._v("configure the properties for APE-copy and the creation of native installers in a single file ("),t("code",[e._v("/APE.properties")]),e._v(")")]),e._v(" "),t("li",[e._v("replace single files/resources (images, model files, component and services jars and the respective configurations,…) of the ARE installation with custom files of the folder "),t("code",[e._v("/custom")])]),e._v(" "),t("li",[e._v("customize the installer creation by providing drop-in resources and installer-specific files in the folder "),t("code",[e._v("/package/linux")]),e._v(", "),t("code",[e._v("/package/windows")]),e._v(" or "),t("code",[e._v("/package/macosx")])]),e._v(" "),t("li",[e._v("trigger the creation of a native installer by using the provided ant build file at "),t("code",[e._v("/build.xml")])])]),e._v(" "),t("h3",{attrs:{id:"simplified-folder-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#simplified-folder-structure"}},[e._v("#")]),e._v(" Simplified folder structure")]),e._v(" "),t("p",[e._v("Subsequently you can see the simplified folder structure of an APE-based project, which contains an ant build file ("),t("strong",[t("code",[e._v("build.xml")])]),e._v("), a property-based configuration file ("),t("strong",[t("code",[e._v("APE.properties")])]),e._v("), the "),t("strong",[t("code",[e._v("custom/bin/ARE")])]),e._v(" folder to store the solution-specific files (e.g. model files), a "),t("strong",[t("code",[e._v("build")])]),e._v(" folder and a "),t("strong",[t("code",[e._v("package")])]),e._v(" folder for native installer customization.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("build\n |- merged\n |- deploy\ncustom\n |- bin/ARE\n |- data\n |- images\n |- LICENSE\n |- models\n |- .acs\n |- ...\n |-profile\npackage\n |- linux\n |- windows\n |- macosx\nAPE.properties\nbuild.xml\n")])])]),t("h3",{attrs:{id:"general-workflow-for-using-the-build-infrastructure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-workflow-for-using-the-build-infrastructure"}},[e._v("#")]),e._v(" General workflow for using the build infrastructure")]),e._v(" "),t("p",[e._v("If you want to start a new project based on AsTeRICS functionality, you would normally")]),e._v(" "),t("ol",[t("li",[e._v("Use the subfolder "),t("code",[e._v("defProjectDir")]),e._v(" directly or copy the "),t("a",{attrs:{href:"template"}},[e._v("template")]),e._v(" project directory to your project repository location.")]),e._v(" "),t("li",[e._v("Edit "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(" and set the location of the AsTeRICS ARE ("),t("code",[e._v("ARE.baseURI")]),e._v(") to use for APE-copy. You only have to set "),t("code",[e._v("ARE.baseURI")]),e._v(" if you use a project directory not within the AsTeRICS APE directory.")]),e._v(" "),t("li",[e._v("Create your AsTeRICS solution and save all needed resources (model files, images, configuration files,…) to the "),t("code",[e._v("custom/bin/ARE")]),e._v(" folder.")]),e._v(" "),t("li",[e._v("Call "),t("code",[e._v("ant APE-copy")]),e._v(" to create the extracted ARE solution or "),t("code",[e._v("ant deploy")]),e._v(" to create a native installer for a certain target platform")])]),e._v(" "),t("p",[e._v("Many Integrated Development Environments (IDE) like Eclipse support the ant build system. So you can use your favourite IDE to edit and build the project.")]),e._v(" "),t("h3",{attrs:{id:"example-usages-of-the-build-infrastructure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-usages-of-the-build-infrastructure"}},[e._v("#")]),e._v(" Example usages of the build infrastructure")]),e._v(" "),t("p",[e._v("Check the "),t("a",{attrs:{href:"#dependencies"}},[e._v("dependencies")]),e._v(" before you start.")]),e._v(" "),t("h4",{attrs:{id:"one-model-file-ant-ape-copy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-ant-ape-copy"}},[e._v("#")]),e._v(" One model file, ant APE-copy")]),e._v(" "),t("p",[e._v("Copy the model file "),t("code",[e._v("/models/ImageDemo.acs")]),e._v(" to the location "),t("code",[e._v("/custom/bin/ARE/models")]),e._v(" or edit the "),t("code",[e._v("APE.models")]),e._v(" property in the file "),t("code",[e._v("/APE.properties")]),e._v(". Then execute the following commands:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nant APE-copy\n")])])]),t("p",[e._v("The extracted ARE version can be found at "),t("code",[e._v("/build/merged/")]),e._v(", to test it, execute")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd build/merged/bin/ARE\nstart.bat\n")])])]),t("h4",{attrs:{id:"one-model-file-windows-exe-installer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-windows-exe-installer"}},[e._v("#")]),e._v(" One model file, windows .exe installer")]),e._v(" "),t("p",[e._v("To create a native .exe installer [InnoSetup >= 5] (http://www.jrsoftware.org/isdl.php) must be installed and the build process must be run on a Windows system.")]),e._v(" "),t("p",[e._v("Copy the model file "),t("code",[e._v("/models/ImageDemo.acs")]),e._v(" to the location "),t("code",[e._v("/custom/bin/ARE/models")]),e._v(" or edit the "),t("code",[e._v("APE.models")]),e._v(" property in the file "),t("code",[e._v("/APE.properties")]),e._v(". Then execute the following commands:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nant deploy\n")])])]),t("p",[e._v("By default, all supported installer types for the currently running platform are created and stored at "),t("code",[e._v("/deploy/bundles")]),e._v("\nThis can be changed by setting the property "),t("code",[e._v("fx.deploy.nativeBundles")]),e._v(" to another value like "),t("code",[e._v("msi")])]),e._v(" "),t("h4",{attrs:{id:"one-model-file-linux-debian-package"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-linux-debian-package"}},[e._v("#")]),e._v(" One model file, Linux debian package")]),e._v(" "),t("p",[e._v("To create a debian installer the [debian packaging tools] (https://wiki.debian.org/PackageManagement) must be installed and the build process must be run on a debian-based Linux.")]),e._v(" "),t("p",[e._v("Copy the model file "),t("code",[e._v("/models/ImageDemo.acs")]),e._v(" to the location "),t("code",[e._v("/custom/bin/ARE/models")]),e._v(" or edit the "),t("code",[e._v("APE.models")]),e._v(" property in the file "),t("code",[e._v("/APE.properties")]),e._v(". Then execute the following commands:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nant deploy\n")])])]),t("p",[e._v("By default, all supported installer types for the currently running platform are created and stored at "),t("code",[e._v("/deploy/bundles")]),e._v("\nThis can be changed by setting the property "),t("code",[e._v("fx.deploy.nativeBundles")]),e._v(" to another value like "),t("code",[e._v("deb")]),e._v(". On Linux, although also a .rpm package could be created by JavaFX packaging technology, APE only supports debian packages because the ARE needs some postinstall and prerm operations in order to run on Linux.")]),e._v(" "),t("h4",{attrs:{id:"one-model-file-mac-osx-dmg-installer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-mac-osx-dmg-installer"}},[e._v("#")]),e._v(" One model file, Mac OSX dmg installer")]),e._v(" "),t("p",[e._v("Run one of the above examples on Mac OSX to create a .dmg installer. The .dmg packaging dependencies should already be contained in your Mac OSX version.")]),e._v(" "),t("h3",{attrs:{id:"properties-for-copying-extraction-behaviour-of-ape"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties-for-copying-extraction-behaviour-of-ape"}},[e._v("#")]),e._v(" Properties for copying/extraction behaviour of APE")]),e._v(" "),t("p",[e._v("To change the behaviour of the ARE extraction with APE-copy, edit the following properties of "),t("a",{attrs:{href:"template/APE.properties"}},[e._v("APE.properties")])]),e._v(" "),t("ul",[t("li",[e._v("``APE.models```: Defines model files and folder containing model files to use")]),e._v(" "),t("li",[t("code",[e._v("APE.dataCopyMode")]),e._v(": Define if all the data files of the "),t("code",[e._v("/data")]),e._v(" folder should be copied or just some.")]),e._v(" "),t("li",[t("code",[e._v("APE.servicesFiles")]),e._v(": Define if optional service configuration files should be used.")])]),e._v(" "),t("h3",{attrs:{id:"properties-for-installer-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties-for-installer-creation"}},[e._v("#")]),e._v(" Properties for installer creation")]),e._v(" "),t("p",[e._v("The provided build files only support a subset of the whole functionality of "),t("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/javafx_ant_task_reference.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaFX packaging"),t("OutboundLink")],1),e._v(".\nTo change the behaviour of the installer creation, consider the following properties in "),t("a",{attrs:{href:"template/APE.properties"}},[e._v("APE.properties")])]),e._v(" "),t("ul",[t("li",[t("code",[e._v("fx.deploy.nativeBundles")]),e._v(": To define installer type to create")]),e._v(" "),t("li",[t("code",[e._v("fx.application.*")]),e._v(" and "),t("code",[e._v("fx.info.*")]),e._v(": To describe meta information of your application")]),e._v(" "),t("li",[t("code",[e._v("fx.preferences.*")]),e._v(": To define the desktop integration of the application")]),e._v(" "),t("li",[t("code",[e._v("APE.embedJava")]),e._v(" and "),t("code",[e._v("fx.platform.basedir")]),e._v(": To embed a Java Runtime Environment into your native installer. The embedded java is linked to the native application launcher. If it is not embedded the default system java is used (only on Windows and Mac OSX).")])]),e._v(" "),t("h3",{attrs:{id:"are-customization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-customization"}},[e._v("#")]),e._v(" ARE customization")]),e._v(" "),t("p",[e._v("The ARE can be customized by replacing single files/resources (images, model files, component and services jars and the respective configurations,…) of the ARE installation with custom files of the folder "),t("code",[e._v("/custom/bin/ARE")]),e._v(". You only must ensure to use the same relative file paths.")]),e._v(" "),t("h4",{attrs:{id:"skipping-non-used-are-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#skipping-non-used-are-services"}},[e._v("#")]),e._v(" Skipping non-used ARE services")]),e._v(" "),t("p",[e._v("If you want to exclude some of the ARE services (e.g. "),t("code",[e._v("javacv-*.jar")]),e._v(" or "),t("code",[e._v("cimcommunication*")]),e._v(".jar), simply copy the services configuration files of "),t("code",[e._v("/profile/*.ini")]),e._v(" to the "),t("code",[e._v("/custom/bin/ARE/profile")]),e._v(" folder and edit them. You can exclude a service by commenting it out (prepending #) in the respective .ini file.")]),e._v(" "),t("h3",{attrs:{id:"installer-customization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installer-customization"}},[e._v("#")]),e._v(" Installer customization")]),e._v(" "),t("p",[e._v("If you want to customize installer-specific configuration files (.e.g .iss for .exe installer) or add your own application icon. Use the respective platform-specific subfolder in the "),t("a",{attrs:{href:"template/package"}},[e._v("package")]),e._v(" folder. There you can place replacement files for the default ones. To find out the supported files, that can be replaced, enable verbosity by setting "),t("code",[e._v("fx.deploy.verbose=true")]),e._v(" in the "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(" file.")]),e._v(" "),t("p",[e._v("Summurized, the following steps are necessary:")]),e._v(" "),t("ol",[t("li",[e._v("Enable verbose mode in "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(": "),t("code",[e._v("fx.deploy.verbose=true")])]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("ant deploy")])]),e._v(" "),t("li",[e._v("Copy the resources (e.g. .iss or icon files) from the temp folder of the installer creation to the "),t("a",{attrs:{href:"template/package"}},[e._v("package/")]),e._v(" folder")]),e._v(" "),t("li",[e._v("Edit the custom files")]),e._v(" "),t("li",[e._v("Rerun "),t("code",[e._v("ant deploy")])])]),e._v(" "),t("p",[e._v("If you want to know more, read "),t("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGICFDB",target:"_blank",rel:"noopener noreferrer"}},[e._v("Customizing the Package Using Drop-In Resources"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"ant-build-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ant-build-files"}},[e._v("#")]),e._v(" ant build files")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("template")]),e._v(" directory contains two ant build files: "),t("a",{attrs:{href:"template/build.xml"}},[e._v("build.xml")]),e._v(" and "),t("a",{attrs:{href:"template/imported.xml"}},[e._v("imported.xml")]),e._v(". The file "),t("code",[e._v("build.xml")]),e._v(" contains some targets left for customization of the deployment build process. The targets "),t("code",[e._v("before-deploy, before-deploy-windows, before-deploy-linux and before-deploy-macosx")]),e._v(" are called after the "),t("code",[e._v("APE-copy")]),e._v(" target and before the "),t("code",[e._v("deploy")]),e._v(" target. This way generic and platform-specific task can be added before the installer creation is triggered. You can use it to delete files which are not needed for a certain target platform (e.g. ARE.exe on Linux or javacv-*-macosx on Windows).\nThe second build-file "),t("code",[e._v("imported.xml")]),e._v(" contains the internal targets and should not be modified except you really know, what you do.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[296],{937:function(e,t,o){"use strict";o.r(t);var a=o(2),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"asterics-packaging-environment-ape"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#asterics-packaging-environment-ape"}},[e._v("#")]),e._v(" AsTeRICS Packaging Environment (APE)")]),e._v(" "),t("p",[e._v("The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using "),t("a",{attrs:{href:"http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGIBBCI",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaFX packaging technology"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"ape-consists-of-two-major-elements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ape-consists-of-two-major-elements"}},[e._v("#")]),e._v(" APE consists of two major elements")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#ape-copy-commandline-tool"}},[t("strong",[e._v("APE-copy command line tool")])]),e._v(": a commandine tool to create a downstripped version of the ARE based on provided model files")]),e._v(" "),t("li",[t("a",{attrs:{href:"#build-infrastructure-and-native-installer-creation"}},[t("strong",[e._v("Build infrastructure")])]),e._v(": a "),t("a",{attrs:{href:"template"}},[e._v("template")]),e._v(" project directory including an "),t("a",{attrs:{href:"https://ant.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ant"),t("OutboundLink")],1),e._v(" build file and a property file "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(". The build file contains the target "),t("code",[e._v("ant APE-copy")]),e._v(" which provides the functionality of the APE-copy commandline tool and the target "),t("code",[e._v("APE deploy")]),e._v(" to trigger the creation of "),t("strong",[e._v("native installer")]),e._v(" and "),t("strong",[e._v("native launcher")]),e._v(" for a dedicated target platform.")])]),e._v(" "),t("h2",{attrs:{id:"important-terms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#important-terms"}},[e._v("#")]),e._v(" Important Terms")]),e._v(" "),t("p",[e._v("The term "),t("code",[e._v("APE.baseURI")]),e._v(" refers to the location of "),t("code",[e._v("APE.jar")]),e._v(" and the "),t("code",[e._v("APE-copy")]),e._v(" command, which is in the folder "),t("code",[e._v("APE")]),e._v(" parallel to the "),t("code",[e._v("ARE")]),e._v(" folder of an AsTeRICS installation. The "),t("code",[e._v("APE.baseURI")]),e._v(" folder also contains the build infrastructure to create the native installers and contains the default project directory ("),t("code",[e._v("APE.projectDir=/defProjectDir")]),e._v(") and the default build directory ("),t("code",[e._v("APE.buildDir=/defProjectDir/build")]),e._v("). "),t("code",[e._v("APE.models")]),e._v(" refers to file and directory paths containing model files to use. Finally, "),t("code",[e._v("ARE.baseURI")]),e._v(" refers to the location of the ARE that is used as the source for the extracted ARE versions.")]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("The commandline tool APE-copy only needs a Java Runtime Environment. In order to use the ant build targets and create native installers you also need "),t("strong",[e._v("ant")]),e._v(" and a "),t("strong",[e._v("Java Development Kit 8")]),e._v(".")]),e._v(" "),t("ul",[t("li",[e._v("Install the ["),t("strong",[e._v("Java Development Kit 8 (32-bit)")]),e._v("] (http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n"),t("ul",[t("li",[e._v("Verify the java installation by opening a command shell and entering "),t("code",[e._v("javac -version")]),e._v(". In case of trouble, ensure to set “JAVA_HOME” to the folder where you installed the Java JDK and add the JDK bin path to the Environment Variable “Path”")])])]),e._v(" "),t("li",[e._v("Install the ["),t("strong",[e._v("apache ant build framework (version >= 1.9.1)")]),e._v("] (http://ant.apache.org/bindownload.cgi)\n"),t("ul",[t("li",[e._v("Ensure to set “ANT_HOME” to the folder where you installed ant and add the ant bin path to the Environment Variable “Path”")])])]),e._v(" "),t("li",[t("strong",[e._v("Only for native installer creation")]),e._v(": Install installer-specific toolkits like [InnoSetup >= 5] (http://www.jrsoftware.org/isdl.php) (.exe), "),t("a",{attrs:{href:"http://wixtoolset.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("WiX toolset >= 3.0"),t("OutboundLink")],1),e._v(" (.msi) or [debian packaging tools] (https://wiki.debian.org/PackageManagement) (.deb) depending on the required target platform. You must run the installer build process on the target platform of the installer. For more details, read the [JavaFX packaging tutorial] (https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#A1324980)")])]),e._v(" "),t("h2",{attrs:{id:"ape-copy-commandline-tool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ape-copy-commandline-tool"}},[e._v("#")]),e._v(" APE-copy commandline tool")]),e._v(" "),t("p",[e._v("Check the "),t("a",{attrs:{href:"#dependencies"}},[e._v("dependencies")]),e._v(" before you start.")]),e._v(" "),t("p",[e._v("To start APE-copy, call")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("APE-copy[.bat|.sh] -DAPE.models= [[-DAPE.buildDir=] [-DARE.baseURI=] [-DAPE.projectDir=/custom/bin/ARE/models")]),e._v(" is automatically added to the parameter.")]),e._v(" "),t("li",[t("strong",[e._v("APE.buildDir")]),e._v(": The path to the build (output) folder. The downsized ARE is copied to that folder. The path can be relative or absolute where a relative path is resolved against the APE directory. By default, the "),t("code",[e._v("build")]),e._v(" subfolder of the project directory ("),t("code",[e._v("APE.projectDir")]),e._v(") is used.")]),e._v(" "),t("li",[t("strong",[e._v("ARE.baseURI")]),e._v(": The path to the ARE installation. This can be the path to the "),t("code",[e._v("bin/ARE")]),e._v(" folder of a development version (cloned git repository) or the "),t("code",[e._v("ARE")]),e._v(" path of an installed AsTeRICS release (>= 2.8). The path can be relative or absolute where a relative path is resolved against the APE directory. By default, the parallel ```ARE`` folder is used.")]),e._v(" "),t("li",[t("strong",[e._v("APE.projectDir")]),e._v(": The path of the project directory to use. If the directory does not exist it is automatically created by copying the "),t("a",{attrs:{href:"#simplified-folder-structure"}},[t("code",[e._v("template")])]),e._v(" directory to the project directory. The given project directory must contain the "),t("code",[e._v("APE.properties")]),e._v(" file, which contains default project-specific property values that can be overridden by the commandline switches of APE-copy. Additionally, the files and resources in the subfolder "),t("code",[e._v("custom")]),e._v(" are finally copied to the target build directory ("),t("code",[e._v("APE.buildDir")]),e._v("). Read more about [customization of the ARE] here. By default, the project directory "),t("code",[e._v("APE.projectDir=/defProjectDir")]),e._v(" is used.")]),e._v(" "),t("li",[t("strong",[e._v("APE.logLevel")]),e._v(": You can specify the verbosity of the console output of the APE-copy command. Additionally, the log messages of the command execution are logged to the "),t("code",[e._v("/tmp")])])]),e._v(" "),t("h3",{attrs:{id:"example-usages-of-the-ape-copy-commandline-tool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-usages-of-the-ape-copy-commandline-tool"}},[e._v("#")]),e._v(" Example usages of the APE-copy commandline tool")]),e._v(" "),t("p",[e._v("You should be able to copy/paste the example commands below as long as you replace the placeholder with real values. The examples use windows path notations.")]),e._v(" "),t("p",[t("strong",[e._v("Note for Linux, Mac OSX")]),e._v(": On Linux and Mac OSX you must use "),t("code",[e._v("APE-copy.sh")]),e._v(" and slashify (’/’ instead of ‘’) the paths.")]),e._v(" "),t("h4",{attrs:{id:"one-model-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file"}},[e._v("#")]),e._v(" One model file")]),e._v(" "),t("p",[e._v("Create a downstripped ARE package of the model file "),t("code",[e._v("ImageDemo.acs")]),e._v(" located in the "),t("code",[e._v("ARE/models")]),e._v(" folder.\nBy default, the result is written to the folder "),t("code",[e._v("/merged")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nAPE-copy -DAPE.models=../ARE/models/ImageDemo.acs\n")])])]),t("h4",{attrs:{id:"several-model-files-folder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#several-model-files-folder"}},[e._v("#")]),e._v(" Several model files/folder")]),e._v(" "),t("p",[e._v("When specifying a folder, all contained model files (recursively) will be used. Several file or folder URIs can be seperated by a ‘"),t("strong",[e._v(";")]),e._v("’. Relative and absolute URIs can be mixed. By default, the result is written to the folder "),t("code",[e._v("/merged")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nAPE-copy -DAPE.models=../ARE/models/ImageDemo.acs;../ARE/models/eyetracking;D:/MyModelFiles/\n")])])]),t("h4",{attrs:{id:"one-model-file-custom-build-folder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-custom-build-folder"}},[e._v("#")]),e._v(" One model file, custom build folder")]),e._v(" "),t("p",[e._v("You can specify a custom build folder with the property "),t("code",[e._v("APE.buildDir")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nAPE-copy -DAPE.models=../ARE/models/ImageDemo.acs -DAPE.buildDir=C:\\ImageDemo\n")])])]),t("h2",{attrs:{id:"build-infrastructure-and-native-installer-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-infrastructure-and-native-installer-creation"}},[e._v("#")]),e._v(" Build infrastructure and native installer creation")]),e._v(" "),t("p",[e._v("The tool APE-copy is only used to copy the required resources for a given model file to a certain location, but APE also provides a full build infrastructure ("),t("code",[e._v("APE.projectDir=/defProjectDir")]),e._v(") that let’s you")]),e._v(" "),t("ul",[t("li",[e._v("configure the properties for APE-copy and the creation of native installers in a single file ("),t("code",[e._v("/APE.properties")]),e._v(")")]),e._v(" "),t("li",[e._v("replace single files/resources (images, model files, component and services jars and the respective configurations,…) of the ARE installation with custom files of the folder "),t("code",[e._v("/custom")])]),e._v(" "),t("li",[e._v("customize the installer creation by providing drop-in resources and installer-specific files in the folder "),t("code",[e._v("/package/linux")]),e._v(", "),t("code",[e._v("/package/windows")]),e._v(" or "),t("code",[e._v("/package/macosx")])]),e._v(" "),t("li",[e._v("trigger the creation of a native installer by using the provided ant build file at "),t("code",[e._v("/build.xml")])])]),e._v(" "),t("h3",{attrs:{id:"simplified-folder-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#simplified-folder-structure"}},[e._v("#")]),e._v(" Simplified folder structure")]),e._v(" "),t("p",[e._v("Subsequently you can see the simplified folder structure of an APE-based project, which contains an ant build file ("),t("strong",[t("code",[e._v("build.xml")])]),e._v("), a property-based configuration file ("),t("strong",[t("code",[e._v("APE.properties")])]),e._v("), the "),t("strong",[t("code",[e._v("custom/bin/ARE")])]),e._v(" folder to store the solution-specific files (e.g. model files), a "),t("strong",[t("code",[e._v("build")])]),e._v(" folder and a "),t("strong",[t("code",[e._v("package")])]),e._v(" folder for native installer customization.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("build\n |- merged\n |- deploy\ncustom\n |- bin/ARE\n |- data\n |- images\n |- LICENSE\n |- models\n |- .acs\n |- ...\n |-profile\npackage\n |- linux\n |- windows\n |- macosx\nAPE.properties\nbuild.xml\n")])])]),t("h3",{attrs:{id:"general-workflow-for-using-the-build-infrastructure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-workflow-for-using-the-build-infrastructure"}},[e._v("#")]),e._v(" General workflow for using the build infrastructure")]),e._v(" "),t("p",[e._v("If you want to start a new project based on AsTeRICS functionality, you would normally")]),e._v(" "),t("ol",[t("li",[e._v("Use the subfolder "),t("code",[e._v("defProjectDir")]),e._v(" directly or copy the "),t("a",{attrs:{href:"template"}},[e._v("template")]),e._v(" project directory to your project repository location.")]),e._v(" "),t("li",[e._v("Edit "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(" and set the location of the AsTeRICS ARE ("),t("code",[e._v("ARE.baseURI")]),e._v(") to use for APE-copy. You only have to set "),t("code",[e._v("ARE.baseURI")]),e._v(" if you use a project directory not within the AsTeRICS APE directory.")]),e._v(" "),t("li",[e._v("Create your AsTeRICS solution and save all needed resources (model files, images, configuration files,…) to the "),t("code",[e._v("custom/bin/ARE")]),e._v(" folder.")]),e._v(" "),t("li",[e._v("Call "),t("code",[e._v("ant APE-copy")]),e._v(" to create the extracted ARE solution or "),t("code",[e._v("ant deploy")]),e._v(" to create a native installer for a certain target platform")])]),e._v(" "),t("p",[e._v("Many Integrated Development Environments (IDE) like Eclipse support the ant build system. So you can use your favourite IDE to edit and build the project.")]),e._v(" "),t("h3",{attrs:{id:"example-usages-of-the-build-infrastructure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-usages-of-the-build-infrastructure"}},[e._v("#")]),e._v(" Example usages of the build infrastructure")]),e._v(" "),t("p",[e._v("Check the "),t("a",{attrs:{href:"#dependencies"}},[e._v("dependencies")]),e._v(" before you start.")]),e._v(" "),t("h4",{attrs:{id:"one-model-file-ant-ape-copy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-ant-ape-copy"}},[e._v("#")]),e._v(" One model file, ant APE-copy")]),e._v(" "),t("p",[e._v("Copy the model file "),t("code",[e._v("/models/ImageDemo.acs")]),e._v(" to the location "),t("code",[e._v("/custom/bin/ARE/models")]),e._v(" or edit the "),t("code",[e._v("APE.models")]),e._v(" property in the file "),t("code",[e._v("/APE.properties")]),e._v(". Then execute the following commands:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nant APE-copy\n")])])]),t("p",[e._v("The extracted ARE version can be found at "),t("code",[e._v("/build/merged/")]),e._v(", to test it, execute")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd build/merged/bin/ARE\nstart.bat\n")])])]),t("h4",{attrs:{id:"one-model-file-windows-exe-installer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-windows-exe-installer"}},[e._v("#")]),e._v(" One model file, windows .exe installer")]),e._v(" "),t("p",[e._v("To create a native .exe installer [InnoSetup >= 5] (http://www.jrsoftware.org/isdl.php) must be installed and the build process must be run on a Windows system.")]),e._v(" "),t("p",[e._v("Copy the model file "),t("code",[e._v("/models/ImageDemo.acs")]),e._v(" to the location "),t("code",[e._v("/custom/bin/ARE/models")]),e._v(" or edit the "),t("code",[e._v("APE.models")]),e._v(" property in the file "),t("code",[e._v("/APE.properties")]),e._v(". Then execute the following commands:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nant deploy\n")])])]),t("p",[e._v("By default, all supported installer types for the currently running platform are created and stored at "),t("code",[e._v("/deploy/bundles")]),e._v("\nThis can be changed by setting the property "),t("code",[e._v("fx.deploy.nativeBundles")]),e._v(" to another value like "),t("code",[e._v("msi")])]),e._v(" "),t("h4",{attrs:{id:"one-model-file-linux-debian-package"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-linux-debian-package"}},[e._v("#")]),e._v(" One model file, Linux debian package")]),e._v(" "),t("p",[e._v("To create a debian installer the [debian packaging tools] (https://wiki.debian.org/PackageManagement) must be installed and the build process must be run on a debian-based Linux.")]),e._v(" "),t("p",[e._v("Copy the model file "),t("code",[e._v("/models/ImageDemo.acs")]),e._v(" to the location "),t("code",[e._v("/custom/bin/ARE/models")]),e._v(" or edit the "),t("code",[e._v("APE.models")]),e._v(" property in the file "),t("code",[e._v("/APE.properties")]),e._v(". Then execute the following commands:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("cd \nant deploy\n")])])]),t("p",[e._v("By default, all supported installer types for the currently running platform are created and stored at "),t("code",[e._v("/deploy/bundles")]),e._v("\nThis can be changed by setting the property "),t("code",[e._v("fx.deploy.nativeBundles")]),e._v(" to another value like "),t("code",[e._v("deb")]),e._v(". On Linux, although also a .rpm package could be created by JavaFX packaging technology, APE only supports debian packages because the ARE needs some postinstall and prerm operations in order to run on Linux.")]),e._v(" "),t("h4",{attrs:{id:"one-model-file-mac-osx-dmg-installer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#one-model-file-mac-osx-dmg-installer"}},[e._v("#")]),e._v(" One model file, Mac OSX dmg installer")]),e._v(" "),t("p",[e._v("Run one of the above examples on Mac OSX to create a .dmg installer. The .dmg packaging dependencies should already be contained in your Mac OSX version.")]),e._v(" "),t("h3",{attrs:{id:"properties-for-copying-extraction-behaviour-of-ape"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties-for-copying-extraction-behaviour-of-ape"}},[e._v("#")]),e._v(" Properties for copying/extraction behaviour of APE")]),e._v(" "),t("p",[e._v("To change the behaviour of the ARE extraction with APE-copy, edit the following properties of "),t("a",{attrs:{href:"template/APE.properties"}},[e._v("APE.properties")])]),e._v(" "),t("ul",[t("li",[e._v("``APE.models```: Defines model files and folder containing model files to use")]),e._v(" "),t("li",[t("code",[e._v("APE.dataCopyMode")]),e._v(": Define if all the data files of the "),t("code",[e._v("/data")]),e._v(" folder should be copied or just some.")]),e._v(" "),t("li",[t("code",[e._v("APE.servicesFiles")]),e._v(": Define if optional service configuration files should be used.")])]),e._v(" "),t("h3",{attrs:{id:"properties-for-installer-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties-for-installer-creation"}},[e._v("#")]),e._v(" Properties for installer creation")]),e._v(" "),t("p",[e._v("The provided build files only support a subset of the whole functionality of "),t("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/javafx_ant_task_reference.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaFX packaging"),t("OutboundLink")],1),e._v(".\nTo change the behaviour of the installer creation, consider the following properties in "),t("a",{attrs:{href:"template/APE.properties"}},[e._v("APE.properties")])]),e._v(" "),t("ul",[t("li",[t("code",[e._v("fx.deploy.nativeBundles")]),e._v(": To define installer type to create")]),e._v(" "),t("li",[t("code",[e._v("fx.application.*")]),e._v(" and "),t("code",[e._v("fx.info.*")]),e._v(": To describe meta information of your application")]),e._v(" "),t("li",[t("code",[e._v("fx.preferences.*")]),e._v(": To define the desktop integration of the application")]),e._v(" "),t("li",[t("code",[e._v("APE.embedJava")]),e._v(" and "),t("code",[e._v("fx.platform.basedir")]),e._v(": To embed a Java Runtime Environment into your native installer. The embedded java is linked to the native application launcher. If it is not embedded the default system java is used (only on Windows and Mac OSX).")])]),e._v(" "),t("h3",{attrs:{id:"are-customization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-customization"}},[e._v("#")]),e._v(" ARE customization")]),e._v(" "),t("p",[e._v("The ARE can be customized by replacing single files/resources (images, model files, component and services jars and the respective configurations,…) of the ARE installation with custom files of the folder "),t("code",[e._v("/custom/bin/ARE")]),e._v(". You only must ensure to use the same relative file paths.")]),e._v(" "),t("h4",{attrs:{id:"skipping-non-used-are-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#skipping-non-used-are-services"}},[e._v("#")]),e._v(" Skipping non-used ARE services")]),e._v(" "),t("p",[e._v("If you want to exclude some of the ARE services (e.g. "),t("code",[e._v("javacv-*.jar")]),e._v(" or "),t("code",[e._v("cimcommunication*")]),e._v(".jar), simply copy the services configuration files of "),t("code",[e._v("/profile/*.ini")]),e._v(" to the "),t("code",[e._v("/custom/bin/ARE/profile")]),e._v(" folder and edit them. You can exclude a service by commenting it out (prepending #) in the respective .ini file.")]),e._v(" "),t("h3",{attrs:{id:"installer-customization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installer-customization"}},[e._v("#")]),e._v(" Installer customization")]),e._v(" "),t("p",[e._v("If you want to customize installer-specific configuration files (.e.g .iss for .exe installer) or add your own application icon. Use the respective platform-specific subfolder in the "),t("a",{attrs:{href:"template/package"}},[e._v("package")]),e._v(" folder. There you can place replacement files for the default ones. To find out the supported files, that can be replaced, enable verbosity by setting "),t("code",[e._v("fx.deploy.verbose=true")]),e._v(" in the "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(" file.")]),e._v(" "),t("p",[e._v("Summurized, the following steps are necessary:")]),e._v(" "),t("ol",[t("li",[e._v("Enable verbose mode in "),t("a",{attrs:{href:"template/APE.properties"}},[t("code",[e._v("APE.properties")])]),e._v(": "),t("code",[e._v("fx.deploy.verbose=true")])]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("ant deploy")])]),e._v(" "),t("li",[e._v("Copy the resources (e.g. .iss or icon files) from the temp folder of the installer creation to the "),t("a",{attrs:{href:"template/package"}},[e._v("package/")]),e._v(" folder")]),e._v(" "),t("li",[e._v("Edit the custom files")]),e._v(" "),t("li",[e._v("Rerun "),t("code",[e._v("ant deploy")])])]),e._v(" "),t("p",[e._v("If you want to know more, read "),t("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGICFDB",target:"_blank",rel:"noopener noreferrer"}},[e._v("Customizing the Package Using Drop-In Resources"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"ant-build-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ant-build-files"}},[e._v("#")]),e._v(" ant build files")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("template")]),e._v(" directory contains two ant build files: "),t("a",{attrs:{href:"template/build.xml"}},[e._v("build.xml")]),e._v(" and "),t("a",{attrs:{href:"template/imported.xml"}},[e._v("imported.xml")]),e._v(". The file "),t("code",[e._v("build.xml")]),e._v(" contains some targets left for customization of the deployment build process. The targets "),t("code",[e._v("before-deploy, before-deploy-windows, before-deploy-linux and before-deploy-macosx")]),e._v(" are called after the "),t("code",[e._v("APE-copy")]),e._v(" target and before the "),t("code",[e._v("deploy")]),e._v(" target. This way generic and platform-specific task can be added before the installer creation is triggered. You can use it to delete files which are not needed for a certain target platform (e.g. ARE.exe on Linux or javacv-*-macosx on Windows).\nThe second build-file "),t("code",[e._v("imported.xml")]),e._v(" contains the internal targets and should not be modified except you really know, what you do.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/296.af03a659.js b/assets/js/297.1eaa6ab0.js similarity index 96% rename from assets/js/296.af03a659.js rename to assets/js/297.1eaa6ab0.js index 80cbec65d8..23c30f097e 100644 --- a/assets/js/296.af03a659.js +++ b/assets/js/297.1eaa6ab0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[296],{935:function(a,e,t){"use strict";t.r(e);var r=t(2),s=Object(r.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"are-middleware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-middleware"}},[a._v("#")]),a._v(" ARE Middleware")]),a._v(" "),e("p",[a._v("The ARE middleware is responsible for executing a model and transfering data and events from one plugin to a subsequent one.\nThe ARE provides many services and utils which should be used when developing code for the ARE middleware or ARE plugins.")]),a._v(" "),e("h2",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[a._v("#")]),a._v(" Logging")]),a._v(" "),e("h2",{attrs:{id:"model-execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#model-execution"}},[a._v("#")]),a._v(" Model execution")]),a._v(" "),e("h3",{attrs:{id:"event-propagation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-propagation"}},[a._v("#")]),a._v(" Event propagation")]),a._v(" "),e("h3",{attrs:{id:"data-propagation-conversion"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-propagation-conversion"}},[a._v("#")]),a._v(" Data propagation & conversion")]),a._v(" "),e("h2",{attrs:{id:"are-threading"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-threading"}},[a._v("#")]),a._v(" ARE Threading")]),a._v(" "),e("h3",{attrs:{id:"threading-concept"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#threading-concept"}},[a._v("#")]),a._v(" Threading concept")]),a._v(" "),e("h3",{attrs:{id:"thread-pool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#thread-pool"}},[a._v("#")]),a._v(" Thread pool")]),a._v(" "),e("h2",{attrs:{id:"are-desktop-gui"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-desktop-gui"}},[a._v("#")]),a._v(" ARE Desktop (GUI)")])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[297],{940:function(a,e,t){"use strict";t.r(e);var r=t(2),s=Object(r.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"are-middleware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-middleware"}},[a._v("#")]),a._v(" ARE Middleware")]),a._v(" "),e("p",[a._v("The ARE middleware is responsible for executing a model and transfering data and events from one plugin to a subsequent one.\nThe ARE provides many services and utils which should be used when developing code for the ARE middleware or ARE plugins.")]),a._v(" "),e("h2",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[a._v("#")]),a._v(" Logging")]),a._v(" "),e("h2",{attrs:{id:"model-execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#model-execution"}},[a._v("#")]),a._v(" Model execution")]),a._v(" "),e("h3",{attrs:{id:"event-propagation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-propagation"}},[a._v("#")]),a._v(" Event propagation")]),a._v(" "),e("h3",{attrs:{id:"data-propagation-conversion"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-propagation-conversion"}},[a._v("#")]),a._v(" Data propagation & conversion")]),a._v(" "),e("h2",{attrs:{id:"are-threading"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-threading"}},[a._v("#")]),a._v(" ARE Threading")]),a._v(" "),e("h3",{attrs:{id:"threading-concept"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#threading-concept"}},[a._v("#")]),a._v(" Threading concept")]),a._v(" "),e("h3",{attrs:{id:"thread-pool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#thread-pool"}},[a._v("#")]),a._v(" Thread pool")]),a._v(" "),e("h2",{attrs:{id:"are-desktop-gui"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-desktop-gui"}},[a._v("#")]),a._v(" ARE Desktop (GUI)")])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/297.9bd0c488.js b/assets/js/298.fff4504a.js similarity index 91% rename from assets/js/297.9bd0c488.js rename to assets/js/298.fff4504a.js index 474f42bc6e..51609408d7 100644 --- a/assets/js/297.9bd0c488.js +++ b/assets/js/298.fff4504a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[297],{937:function(t,s,e){"use strict";e.r(s);var i=e(2),r=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"interfacing-asterics-hw-using-the-cim-protocol"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#interfacing-asterics-hw-using-the-cim-protocol"}},[this._v("#")]),this._v(" Interfacing AsTeRICS HW using the CIM protocol")]),this._v(" "),t("p",[this._v("The tutorials can be found here "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/DeveloperManual.pdf"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[298],{938:function(t,s,e){"use strict";e.r(s);var i=e(2),r=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"interfacing-asterics-hw-using-the-cim-protocol"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#interfacing-asterics-hw-using-the-cim-protocol"}},[this._v("#")]),this._v(" Interfacing AsTeRICS HW using the CIM protocol")]),this._v(" "),t("p",[this._v("The tutorials can be found here "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/DeveloperManual.pdf"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/298.14c691a0.js b/assets/js/299.cf60493f.js similarity index 90% rename from assets/js/298.14c691a0.js rename to assets/js/299.cf60493f.js index 9f1513b259..7e464266cb 100644 --- a/assets/js/298.14c691a0.js +++ b/assets/js/299.cf60493f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[298],{936:function(e,t,s){"use strict";s.r(t);var a=s(2),r=Object(a.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"are-keyboard-and-mouse-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-keyboard-and-mouse-services"}},[this._v("#")]),this._v(" ARE Keyboard and Mouse Services")]),this._v(" "),e("p",[this._v("The source code can be found "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/DeveloperManual.pdf"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[299],{939:function(e,t,s){"use strict";s.r(t);var a=s(2),r=Object(a.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"are-keyboard-and-mouse-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-keyboard-and-mouse-services"}},[this._v("#")]),this._v(" ARE Keyboard and Mouse Services")]),this._v(" "),e("p",[this._v("The source code can be found "),e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/DeveloperManual.pdf"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/30.2a7d1d4d.js b/assets/js/30.b96cf1a5.js similarity index 96% rename from assets/js/30.2a7d1d4d.js rename to assets/js/30.b96cf1a5.js index d0f743d485..5a2f5f964c 100644 --- a/assets/js/30.2a7d1d4d.js +++ b/assets/js/30.b96cf1a5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{1015:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"keyboard-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-control"}},[e._v("#")]),e._v(" Keyboard Control")]),e._v(" "),t("p",[e._v("The AsTeRICS Configuration Suite is fully accessible by keyboard. The following sections describe the usage in the different parts of the ACS.")]),e._v(" "),t("h2",{attrs:{id:"menus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#menus"}},[e._v("#")]),e._v(" Menus")]),e._v(" "),t("p",[e._v("The whole ACS is fully accessible by keyboard. The menu items of the ACS menus can be acessed pressing the "),t("em",[e._v("Alt")]),e._v("-key, followed by the keys, being displayed. Screenshot 1 shows the menu after pressing "),t("em",[e._v("Alt")]),e._v(", Screenshot 2 shows the System menu after pressing "),t("em",[e._v("Alt")]),e._v(" folowed by pressing "),t("em",[e._v("Y")]),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:n(466),alt:"Screenshot: The menu after pressing Alt",title:"Screenshot: The menu after pressing Alt"}})]),e._v(" "),t("p",[e._v("Screenshot: The menu after pressing "),t("em",[e._v("Alt")])]),e._v(" "),t("p",[t("img",{attrs:{src:n(467),alt:"Screenshot: The menu after pressing Alt folowed by pressing Y",title:"Screenshot: The menu after pressing Alt folowed by pressing Y"}})]),e._v(" "),t("p",[e._v("Screenshot: The menu after pressing "),t("em",[e._v("Alt")]),e._v(" followed by pressing "),t("em",[e._v("Y")])]),e._v(" "),t("h2",{attrs:{id:"the-drawing-area"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-drawing-area"}},[e._v("#")]),e._v(" The Drawing Area")]),e._v(" "),t("p",[e._v("The drawing area can be reached, pressing "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("D")]),e._v(", the focus will be on the first element. The focus between the elements can be changed using the "),t("em",[e._v("Tab")]),e._v(" key or the Arrow keys. Elements can be selected using the "),t("em",[e._v("Space")]),e._v(" Key, multiple elements can be selected, pressing "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("Space")]),e._v(". Pressing the "),t("em",[e._v("App")]),e._v(" Key (also called Context Menu key) opens the context menu. Screenshot 3 shows a selected component with the opend context menu.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(468),alt:"Screenshot: Component with opend context menu",title:"Screenshot: Component with opend context menu"}})]),e._v(" "),t("p",[e._v("Screenshot: Component with opend context menu")]),e._v(" "),t("h3",{attrs:{id:"the-context-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-context-menu"}},[e._v("#")]),e._v(" The Context Menu")]),e._v(" "),t("ul",[t("li",[t("p",[t("em",[e._v("Add Channel")]),e._v(" creates a new channel. An output port must be selected to initiate a new channel.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Connect Channel")]),e._v(" sets the end point of the new channel. Select an empty input port to finish the channel")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Drop Channel")]),e._v(" deletes an initiated but unfinished channel")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Add Event Channel")]),e._v(" creates a new event channel. An event trigger must be selected to initiate a new event channel.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Connect Event Channel")]),e._v(" sets the end point of the new event channel. Select an event listener to finish the event channel. Afterwards, the events must be set in the Event Editor")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Drop Event Channel")]),e._v(" deletes an initiated but unfinished event channel")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Move Selection")]),e._v(" moves the selected elements on the drawing area by using the arrow keys. The move operation can be stopped by pressing "),t("em",[e._v("Enter")]),e._v(".")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Delete Selection")]),e._v(" deletes the selected components, channels and event channels.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Properties")]),e._v(" sets the focus to the Property Editor")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Show Component Status")]),e._v(" displays a component status window.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Remove Conflict Marker")]),e._v(" removes the marker, indicating a version conflict between the component collection of the ARE and the ACS.")])])]),e._v(" "),t("h2",{attrs:{id:"the-gui-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-gui-editor"}},[e._v("#")]),e._v(" The GUI Editor")]),e._v(" "),t("p",[e._v("Accessing the GUI Editor is quite similar to the Drawing area. Using the "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("G")]),e._v(" key combination sets the focus on the first element. The "),t("em",[e._v("App")]),e._v(" Key (also called Context Menu key) opens the context menu, offering the options of:")]),e._v(" "),t("ul",[t("li",[t("p",[t("em",[e._v("Resize")]),e._v(" chnages the width and hight of the GUI element by using the arrow keys.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Stop Resize")]),e._v(" stops the resize operation. This function will automatically be called if the focus is set to any other element (e.g by pressing the "),t("em",[e._v("Tab")]),e._v(" or the "),t("em",[e._v("App")]),e._v(" key).")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Move")]),e._v(" moves the GUI element on the GUI area by using the arrow keys.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Stop Move")]),e._v(" stops the move operation. This function will automatically be called if the focus is set to any other element (e.g by pressing the "),t("em",[e._v("Tab")]),e._v(" or the "),t("em",[e._v("App")]),e._v(" key).")])])]),e._v(" "),t("h2",{attrs:{id:"property-and-port-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#property-and-port-editor"}},[e._v("#")]),e._v(" Property and Port Editor")]),e._v(" "),t("p",[t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("G")]),e._v(" sets the focus to the property editor tab. Using the "),t("em",[e._v("Tab")]),e._v(" key sets the focus to the property editor, using the arrow keys allows to navigate to the other tabs (input and output ports, event triggers and listeners). Within the property editor, navigation will be handled using the "),t("em",[e._v("Tab")]),e._v(" key to select and edit the different properties. Within the input and output ports, the list of ports can be navigated using the arrow keys (so shown in screenshot 4).")]),e._v(" "),t("p",[t("img",{attrs:{src:n(469),alt:"Screenshot: Port Editor with opend and closed output ports",title:"Screenshot: Port Editor with opend and closed output ports"}})]),e._v(" "),t("p",[e._v("Screenshot: Port Editor with opend and closed output ports")]),e._v(" "),t("h2",{attrs:{id:"event-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-editor"}},[e._v("#")]),e._v(" Event Editor")]),e._v(" "),t("p",[e._v("With the Event Editor (reachable with the shortcut "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("E")]),e._v("), events within an event channel will be set. Once again, the navigation will be handled using the "),t("em",[e._v("Tab")]),e._v(" key. When a combobox is in focus, the value can be changed using the up an down arrow keys. Furthermore, the combobox can be opend using the "),t("em",[e._v("Enter")]),e._v(" key. Screenshot 5 shows the event editor with an opend combo box.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(470),alt:"Screenshot: Event Editor with opend combobox",title:"Screenshot: Event Editor with opend combobox"}})]),e._v(" "),t("p",[e._v("Screenshot: Event Editor with opend combobox")]),e._v(" "),t("h2",{attrs:{id:"keyboard-shortcuts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-shortcuts"}},[e._v("#")]),e._v(" Keyboard Shortcuts")]),e._v(" "),t("p",[e._v("Keyboard Shortcuts")]),e._v(" "),t("p",[e._v("Key")]),e._v(" "),t("p",[e._v("Command")]),e._v(" "),t("p",[e._v("F1")]),e._v(" "),t("p",[e._v("Open Help window")]),e._v(" "),t("p",[e._v("F5")]),e._v(" "),t("p",[e._v("Start the model")]),e._v(" "),t("p",[e._v("F6")]),e._v(" "),t("p",[e._v("Pause the model")]),e._v(" "),t("p",[e._v("F7")]),e._v(" "),t("p",[e._v("Stop the model")]),e._v(" "),t("p",[e._v("Ctrl + A")]),e._v(" "),t("p",[e._v("Select all elements in the drawing area")]),e._v(" "),t("p",[e._v("Ctrl + C")]),e._v(" "),t("p",[e._v("Copy all selected elements to the clipboard")]),e._v(" "),t("p",[e._v("Ctrl + X")]),e._v(" "),t("p",[e._v("Cut out all selected elements and copy them to the clipboard")]),e._v(" "),t("p",[e._v("Ctrl + V")]),e._v(" "),t("p",[e._v("Paste the elements from the clipcoard to the drawing area")]),e._v(" "),t("p",[e._v("Ctrl + Z")]),e._v(" "),t("p",[e._v("Undo last operation")]),e._v(" "),t("p",[e._v("Ctrl + Y")]),e._v(" "),t("p",[e._v("Redo last operation (after Undo)")]),e._v(" "),t("p",[e._v("Ctrl + S")]),e._v(" "),t("p",[e._v("Save the drawing")]),e._v(" "),t("p",[e._v("Del")]),e._v(" "),t("p",[e._v("Delete the selected elements")]),e._v(" "),t("p",[e._v("Ctrl + +")]),e._v(" "),t("p",[e._v("Zoom in")]),e._v(" "),t("p",[e._v("Ctrl + -")]),e._v(" "),t("p",[e._v("Zoom out")]),e._v(" "),t("p",[e._v("Ctrl + D")]),e._v(" "),t("p",[e._v("Set focus on the drawing area")]),e._v(" "),t("p",[e._v("Ctrl + G")]),e._v(" "),t("p",[e._v("Set focus on the GUI area")]),e._v(" "),t("p",[e._v("Ctrl + P")]),e._v(" "),t("p",[e._v("Set focus on the Property editor")]),e._v(" "),t("p",[e._v("Ctrl + E")]),e._v(" "),t("p",[e._v("Set focus on the Event editor")]),e._v(" "),t("p",[e._v("Alt")]),e._v(" "),t("p",[e._v("Display keyboard shortcuts of the menu elements")]),e._v(" "),t("p",[e._v("Tab")]),e._v(" "),t("p",[e._v("Navigate to the next element (in several areas)")]),e._v(" "),t("p",[e._v("Arrow Keys")]),e._v(" "),t("p",[e._v("Move Focus in several areas, also move in scroll areas")]),e._v(" "),t("p",[e._v("Alt + F4")]),e._v(" "),t("p",[e._v("Close the ACS")])])}),[],!1,null,null,null);t.default=s.exports},466:function(e,t,n){e.exports=n.p+"assets/img/keyboard-menu1.038c9a85.png"},467:function(e,t,n){e.exports=n.p+"assets/img/keyboard-menu2.e58dda53.png"},468:function(e,t,n){e.exports=n.p+"assets/img/keyboard-contextmenu.36dfb622.png"},469:function(e,t,n){e.exports=n.p+"assets/img/keyboard-output_ports.d1399fb9.png"},470:function(e,t){e.exports="data:image/png;base64,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"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{1019:function(e,t,n){"use strict";n.r(t);var o=n(2),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"keyboard-control"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-control"}},[e._v("#")]),e._v(" Keyboard Control")]),e._v(" "),t("p",[e._v("The AsTeRICS Configuration Suite is fully accessible by keyboard. The following sections describe the usage in the different parts of the ACS.")]),e._v(" "),t("h2",{attrs:{id:"menus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#menus"}},[e._v("#")]),e._v(" Menus")]),e._v(" "),t("p",[e._v("The whole ACS is fully accessible by keyboard. The menu items of the ACS menus can be acessed pressing the "),t("em",[e._v("Alt")]),e._v("-key, followed by the keys, being displayed. Screenshot 1 shows the menu after pressing "),t("em",[e._v("Alt")]),e._v(", Screenshot 2 shows the System menu after pressing "),t("em",[e._v("Alt")]),e._v(" folowed by pressing "),t("em",[e._v("Y")]),e._v(".")]),e._v(" "),t("p",[t("img",{attrs:{src:n(467),alt:"Screenshot: The menu after pressing Alt",title:"Screenshot: The menu after pressing Alt"}})]),e._v(" "),t("p",[e._v("Screenshot: The menu after pressing "),t("em",[e._v("Alt")])]),e._v(" "),t("p",[t("img",{attrs:{src:n(468),alt:"Screenshot: The menu after pressing Alt folowed by pressing Y",title:"Screenshot: The menu after pressing Alt folowed by pressing Y"}})]),e._v(" "),t("p",[e._v("Screenshot: The menu after pressing "),t("em",[e._v("Alt")]),e._v(" followed by pressing "),t("em",[e._v("Y")])]),e._v(" "),t("h2",{attrs:{id:"the-drawing-area"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-drawing-area"}},[e._v("#")]),e._v(" The Drawing Area")]),e._v(" "),t("p",[e._v("The drawing area can be reached, pressing "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("D")]),e._v(", the focus will be on the first element. The focus between the elements can be changed using the "),t("em",[e._v("Tab")]),e._v(" key or the Arrow keys. Elements can be selected using the "),t("em",[e._v("Space")]),e._v(" Key, multiple elements can be selected, pressing "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("Space")]),e._v(". Pressing the "),t("em",[e._v("App")]),e._v(" Key (also called Context Menu key) opens the context menu. Screenshot 3 shows a selected component with the opend context menu.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(469),alt:"Screenshot: Component with opend context menu",title:"Screenshot: Component with opend context menu"}})]),e._v(" "),t("p",[e._v("Screenshot: Component with opend context menu")]),e._v(" "),t("h3",{attrs:{id:"the-context-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-context-menu"}},[e._v("#")]),e._v(" The Context Menu")]),e._v(" "),t("ul",[t("li",[t("p",[t("em",[e._v("Add Channel")]),e._v(" creates a new channel. An output port must be selected to initiate a new channel.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Connect Channel")]),e._v(" sets the end point of the new channel. Select an empty input port to finish the channel")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Drop Channel")]),e._v(" deletes an initiated but unfinished channel")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Add Event Channel")]),e._v(" creates a new event channel. An event trigger must be selected to initiate a new event channel.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Connect Event Channel")]),e._v(" sets the end point of the new event channel. Select an event listener to finish the event channel. Afterwards, the events must be set in the Event Editor")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Drop Event Channel")]),e._v(" deletes an initiated but unfinished event channel")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Move Selection")]),e._v(" moves the selected elements on the drawing area by using the arrow keys. The move operation can be stopped by pressing "),t("em",[e._v("Enter")]),e._v(".")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Delete Selection")]),e._v(" deletes the selected components, channels and event channels.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Properties")]),e._v(" sets the focus to the Property Editor")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Show Component Status")]),e._v(" displays a component status window.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Remove Conflict Marker")]),e._v(" removes the marker, indicating a version conflict between the component collection of the ARE and the ACS.")])])]),e._v(" "),t("h2",{attrs:{id:"the-gui-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-gui-editor"}},[e._v("#")]),e._v(" The GUI Editor")]),e._v(" "),t("p",[e._v("Accessing the GUI Editor is quite similar to the Drawing area. Using the "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("G")]),e._v(" key combination sets the focus on the first element. The "),t("em",[e._v("App")]),e._v(" Key (also called Context Menu key) opens the context menu, offering the options of:")]),e._v(" "),t("ul",[t("li",[t("p",[t("em",[e._v("Resize")]),e._v(" chnages the width and hight of the GUI element by using the arrow keys.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Stop Resize")]),e._v(" stops the resize operation. This function will automatically be called if the focus is set to any other element (e.g by pressing the "),t("em",[e._v("Tab")]),e._v(" or the "),t("em",[e._v("App")]),e._v(" key).")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Move")]),e._v(" moves the GUI element on the GUI area by using the arrow keys.")])]),e._v(" "),t("li",[t("p",[t("em",[e._v("Stop Move")]),e._v(" stops the move operation. This function will automatically be called if the focus is set to any other element (e.g by pressing the "),t("em",[e._v("Tab")]),e._v(" or the "),t("em",[e._v("App")]),e._v(" key).")])])]),e._v(" "),t("h2",{attrs:{id:"property-and-port-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#property-and-port-editor"}},[e._v("#")]),e._v(" Property and Port Editor")]),e._v(" "),t("p",[t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("G")]),e._v(" sets the focus to the property editor tab. Using the "),t("em",[e._v("Tab")]),e._v(" key sets the focus to the property editor, using the arrow keys allows to navigate to the other tabs (input and output ports, event triggers and listeners). Within the property editor, navigation will be handled using the "),t("em",[e._v("Tab")]),e._v(" key to select and edit the different properties. Within the input and output ports, the list of ports can be navigated using the arrow keys (so shown in screenshot 4).")]),e._v(" "),t("p",[t("img",{attrs:{src:n(470),alt:"Screenshot: Port Editor with opend and closed output ports",title:"Screenshot: Port Editor with opend and closed output ports"}})]),e._v(" "),t("p",[e._v("Screenshot: Port Editor with opend and closed output ports")]),e._v(" "),t("h2",{attrs:{id:"event-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#event-editor"}},[e._v("#")]),e._v(" Event Editor")]),e._v(" "),t("p",[e._v("With the Event Editor (reachable with the shortcut "),t("em",[e._v("Ctrl")]),e._v("+"),t("em",[e._v("E")]),e._v("), events within an event channel will be set. Once again, the navigation will be handled using the "),t("em",[e._v("Tab")]),e._v(" key. When a combobox is in focus, the value can be changed using the up an down arrow keys. Furthermore, the combobox can be opend using the "),t("em",[e._v("Enter")]),e._v(" key. Screenshot 5 shows the event editor with an opend combo box.")]),e._v(" "),t("p",[t("img",{attrs:{src:n(471),alt:"Screenshot: Event Editor with opend combobox",title:"Screenshot: Event Editor with opend combobox"}})]),e._v(" "),t("p",[e._v("Screenshot: Event Editor with opend combobox")]),e._v(" "),t("h2",{attrs:{id:"keyboard-shortcuts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-shortcuts"}},[e._v("#")]),e._v(" Keyboard Shortcuts")]),e._v(" "),t("p",[e._v("Keyboard Shortcuts")]),e._v(" "),t("p",[e._v("Key")]),e._v(" "),t("p",[e._v("Command")]),e._v(" "),t("p",[e._v("F1")]),e._v(" "),t("p",[e._v("Open Help window")]),e._v(" "),t("p",[e._v("F5")]),e._v(" "),t("p",[e._v("Start the model")]),e._v(" "),t("p",[e._v("F6")]),e._v(" "),t("p",[e._v("Pause the model")]),e._v(" "),t("p",[e._v("F7")]),e._v(" "),t("p",[e._v("Stop the model")]),e._v(" "),t("p",[e._v("Ctrl + A")]),e._v(" "),t("p",[e._v("Select all elements in the drawing area")]),e._v(" "),t("p",[e._v("Ctrl + C")]),e._v(" "),t("p",[e._v("Copy all selected elements to the clipboard")]),e._v(" "),t("p",[e._v("Ctrl + X")]),e._v(" "),t("p",[e._v("Cut out all selected elements and copy them to the clipboard")]),e._v(" "),t("p",[e._v("Ctrl + V")]),e._v(" "),t("p",[e._v("Paste the elements from the clipcoard to the drawing area")]),e._v(" "),t("p",[e._v("Ctrl + Z")]),e._v(" "),t("p",[e._v("Undo last operation")]),e._v(" "),t("p",[e._v("Ctrl + Y")]),e._v(" "),t("p",[e._v("Redo last operation (after Undo)")]),e._v(" "),t("p",[e._v("Ctrl + S")]),e._v(" "),t("p",[e._v("Save the drawing")]),e._v(" "),t("p",[e._v("Del")]),e._v(" "),t("p",[e._v("Delete the selected elements")]),e._v(" "),t("p",[e._v("Ctrl + +")]),e._v(" "),t("p",[e._v("Zoom in")]),e._v(" "),t("p",[e._v("Ctrl + -")]),e._v(" "),t("p",[e._v("Zoom out")]),e._v(" "),t("p",[e._v("Ctrl + D")]),e._v(" "),t("p",[e._v("Set focus on the drawing area")]),e._v(" "),t("p",[e._v("Ctrl + G")]),e._v(" "),t("p",[e._v("Set focus on the GUI area")]),e._v(" "),t("p",[e._v("Ctrl + P")]),e._v(" "),t("p",[e._v("Set focus on the Property editor")]),e._v(" "),t("p",[e._v("Ctrl + E")]),e._v(" "),t("p",[e._v("Set focus on the Event editor")]),e._v(" "),t("p",[e._v("Alt")]),e._v(" "),t("p",[e._v("Display keyboard shortcuts of the menu elements")]),e._v(" "),t("p",[e._v("Tab")]),e._v(" "),t("p",[e._v("Navigate to the next element (in several areas)")]),e._v(" "),t("p",[e._v("Arrow Keys")]),e._v(" "),t("p",[e._v("Move Focus in several areas, also move in scroll areas")]),e._v(" "),t("p",[e._v("Alt + F4")]),e._v(" "),t("p",[e._v("Close the ACS")])])}),[],!1,null,null,null);t.default=s.exports},467:function(e,t,n){e.exports=n.p+"assets/img/keyboard-menu1.038c9a85.png"},468:function(e,t,n){e.exports=n.p+"assets/img/keyboard-menu2.e58dda53.png"},469:function(e,t,n){e.exports=n.p+"assets/img/keyboard-contextmenu.36dfb622.png"},470:function(e,t,n){e.exports=n.p+"assets/img/keyboard-output_ports.d1399fb9.png"},471:function(e,t){e.exports="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/299.b5c21d20.js b/assets/js/300.a6a31d6f.js similarity index 91% rename from assets/js/299.b5c21d20.js rename to assets/js/300.a6a31d6f.js index 2d5e382086..c70d150262 100644 --- a/assets/js/299.b5c21d20.js +++ b/assets/js/300.a6a31d6f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[299],{938:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-webserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver"}},[e._v("#")]),e._v(" ARE Webserver")]),e._v(" "),t("p",[e._v("The ARE provides a webserver with the document root at")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ARE/web/\n")])])]),t("p",[e._v("Then you can open the start page by")]),e._v(" "),t("p",[e._v("http://localhost:8081/")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[300],{941:function(e,t,a){"use strict";a.r(t);var r=a(2),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-webserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver"}},[e._v("#")]),e._v(" ARE Webserver")]),e._v(" "),t("p",[e._v("The ARE provides a webserver with the document root at")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ARE/web/\n")])])]),t("p",[e._v("Then you can open the start page by")]),e._v(" "),t("p",[e._v("http://localhost:8081/")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/300.29987222.js b/assets/js/301.c85bcbe2.js similarity index 92% rename from assets/js/300.29987222.js rename to assets/js/301.c85bcbe2.js index dc920c0070..cab9c632c5 100644 --- a/assets/js/300.29987222.js +++ b/assets/js/301.c85bcbe2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[300],{942:function(t,e,s){"use strict";s.r(e);var o=s(2),n=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"at-solutions-demos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-solutions-demos"}},[this._v("#")]),this._v(" AT Solutions Demos")]),this._v(" "),t("p",[this._v("Show github project search results here?\nWith preview??\nHow to open Web UI of AT solution (embedded or external tab?)")]),this._v(" "),t("p",[t("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/index.html#submenuSolutionDemos",target:"_blank",rel:"noopener noreferrer"}},[this._v("List of AT solution demos"),t("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[301],{945:function(t,e,s){"use strict";s.r(e);var o=s(2),n=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"at-solutions-demos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-solutions-demos"}},[this._v("#")]),this._v(" AT Solutions Demos")]),this._v(" "),t("p",[this._v("Show github project search results here?\nWith preview??\nHow to open Web UI of AT solution (embedded or external tab?)")]),this._v(" "),t("p",[t("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/index.html#submenuSolutionDemos",target:"_blank",rel:"noopener noreferrer"}},[this._v("List of AT solution demos"),t("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/301.dc11ebec.js b/assets/js/302.322e0d46.js similarity index 85% rename from assets/js/301.dc11ebec.js rename to assets/js/302.322e0d46.js index 62f3b14af7..728b4d2f16 100644 --- a/assets/js/301.dc11ebec.js +++ b/assets/js/302.322e0d46.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[301],{943:function(t,s,n){"use strict";n.r(s);var o=n(2),a=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"at-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-solution"}},[this._v("#")]),this._v(" AT Solution")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[302],{946:function(t,s,n){"use strict";n.r(s);var o=n(2),a=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"at-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-solution"}},[this._v("#")]),this._v(" AT Solution")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/302.06f3d56a.js b/assets/js/303.a4850de6.js similarity index 85% rename from assets/js/302.06f3d56a.js rename to assets/js/303.a4850de6.js index 11725ad0d4..d6070a66e7 100644 --- a/assets/js/302.06f3d56a.js +++ b/assets/js/303.a4850de6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[302],{944:function(t,s,i){"use strict";i.r(s);var n=i(2),e=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"coding-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coding-guidelines"}},[this._v("#")]),this._v(" Coding Guidelines")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[303],{947:function(t,s,i){"use strict";i.r(s);var n=i(2),e=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"coding-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coding-guidelines"}},[this._v("#")]),this._v(" Coding Guidelines")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/303.586d4a5a.js b/assets/js/304.eed36756.js similarity index 99% rename from assets/js/303.586d4a5a.js rename to assets/js/304.eed36756.js index 494a232f4c..75273fe578 100644 --- a/assets/js/303.586d4a5a.js +++ b/assets/js/304.eed36756.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[303],{946:function(t,s,a){"use strict";a.r(s);var n=a(2),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"plugin-tutorial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugin-tutorial"}},[t._v("#")]),t._v(" Plugin Tutorial")]),t._v(" "),s("h2",{attrs:{id:"step-by-step-implementation-averager-processor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-implementation-averager-processor"}},[t._v("#")]),t._v(" Step-by-Step implementation: Averager processor")]),t._v(" "),s("p",[t._v("In the following, the implementation on a simpe “averager” component is described. This component realizes some simple processing functionality: It collects its most recent input from one input port and produces its average at one output port. The number of samples to be stored and used for the computation of the average is controlled by a property.")]),t._v(" "),s("p",[t._v("The component shall have a single input port (named “in_1”), a single output port (named “out_1), and a single property (named “buffer-size”) which has the type “integer” and the default value “50”.")]),t._v(" "),s("p",[t._v("Using the PluginCreationWizard, the bundle descriptor, the Manifest file, the build script and the skeleton for the JAVA-code can be generated (see section3.1).")]),t._v(" "),s("p",[t._v("Then the actual Java-Code which implements the plugin’s functionality can be added.")]),t._v(" "),s("p",[t._v("The functionality of this component is quite simple: It takes as input integer values, which are queued in a buffer in a first in, first out order (FIFO). Whenever a new value is added, the average of the buffer value is computed and provided in the output. The size of the buffer is controlled by the “buffer-size” property. A possible implementation is shown below.")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DEFAULT_BUFFER_SIZE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LinkedList")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" buffer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LinkedList")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" bufferSize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DEFAULT_BUFFER_SIZE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimePropertyValue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" newValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buffer-size"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("equalsIgnoreCase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" oldValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" bufferSize"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newValue "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("instanceof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n bufferSize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" newValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// truncate unnecessary tail elements")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bufferSize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeLast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsErrorHandling")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Invalid property value for "')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("propertyName"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('":"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("newValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" oldValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addInt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" in"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addFirst")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" bufferSize"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeLast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")]),t._v(" sum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" sum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("round")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputPort1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("receiveData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" in "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("byteArrayToInt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n outputPort1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToByteArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addInt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OutputPort1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DefaultRuntimeOutputPort")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("The implementation details above build upon the code which is generated by the AsTeRICS PluginCreationWizard tool. Specifically, the above methods belong to the class of the desired “Averager” plugin, which extends and implements the abstract class “AbstractRuntimeComponentInstance”. This class provides some standard implementation of the lifecycle support methods.")])]),t._v(" "),s("p",[t._v("The implementations of the input and output ports implement or override that of the “IRuntimeInputPort” and “DefaultRuntimeOutputPort” respectively. In the first case, the “receiveData” method is overridden so that the input bytes are converted to an integer, then processed using the local, private method “addInt”, and finally delegated to the output port. The latter has actually no implementation. A dummy implementation is used to illustrated overriding the “sendData” method, although this could be avoided altogether.")]),t._v(" "),s("p",[t._v("The private method “addInt” realized the core functionality of the averager component. Finally, the get/set property value methods are implemented to allow for getting/setting the value of the “buffer-size” property, in a straightforward manner.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[304],{950:function(t,s,a){"use strict";a.r(s);var n=a(2),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"plugin-tutorial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugin-tutorial"}},[t._v("#")]),t._v(" Plugin Tutorial")]),t._v(" "),s("h2",{attrs:{id:"step-by-step-implementation-averager-processor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-implementation-averager-processor"}},[t._v("#")]),t._v(" Step-by-Step implementation: Averager processor")]),t._v(" "),s("p",[t._v("In the following, the implementation on a simpe “averager” component is described. This component realizes some simple processing functionality: It collects its most recent input from one input port and produces its average at one output port. The number of samples to be stored and used for the computation of the average is controlled by a property.")]),t._v(" "),s("p",[t._v("The component shall have a single input port (named “in_1”), a single output port (named “out_1), and a single property (named “buffer-size”) which has the type “integer” and the default value “50”.")]),t._v(" "),s("p",[t._v("Using the PluginCreationWizard, the bundle descriptor, the Manifest file, the build script and the skeleton for the JAVA-code can be generated (see section3.1).")]),t._v(" "),s("p",[t._v("Then the actual Java-Code which implements the plugin’s functionality can be added.")]),t._v(" "),s("p",[t._v("The functionality of this component is quite simple: It takes as input integer values, which are queued in a buffer in a first in, first out order (FIFO). Whenever a new value is added, the average of the buffer value is computed and provided in the output. The size of the buffer is controlled by the “buffer-size” property. A possible implementation is shown below.")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DEFAULT_BUFFER_SIZE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LinkedList")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" buffer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LinkedList")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" bufferSize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("DEFAULT_BUFFER_SIZE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimePropertyValue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" propertyName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" newValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buffer-size"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("equalsIgnoreCase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),t._v(" oldValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" bufferSize"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newValue "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("instanceof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n bufferSize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" newValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// truncate unnecessary tail elements")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bufferSize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeLast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AstericsErrorHandling")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("instance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reportError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Invalid property value for "')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("propertyName"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('":"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("newValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" oldValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addInt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" in"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addFirst")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" bufferSize"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeLast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")]),t._v(" sum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" sum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("round")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputPort1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IRuntimeInputPort")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("receiveData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" in "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("byteArrayToInt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n outputPort1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConversionUtils")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("intToByteArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addInt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("in"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OutputPort1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DefaultRuntimeOutputPort")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("The implementation details above build upon the code which is generated by the AsTeRICS PluginCreationWizard tool. Specifically, the above methods belong to the class of the desired “Averager” plugin, which extends and implements the abstract class “AbstractRuntimeComponentInstance”. This class provides some standard implementation of the lifecycle support methods.")])]),t._v(" "),s("p",[t._v("The implementations of the input and output ports implement or override that of the “IRuntimeInputPort” and “DefaultRuntimeOutputPort” respectively. In the first case, the “receiveData” method is overridden so that the input bytes are converted to an integer, then processed using the local, private method “addInt”, and finally delegated to the output port. The latter has actually no implementation. A dummy implementation is used to illustrated overriding the “sendData” method, although this could be avoided altogether.")]),t._v(" "),s("p",[t._v("The private method “addInt” realized the core functionality of the averager component. Finally, the get/set property value methods are implemented to allow for getting/setting the value of the “buffer-size” property, in a straightforward manner.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/304.ad9e83a1.js b/assets/js/305.2c248dd4.js similarity index 92% rename from assets/js/304.ad9e83a1.js rename to assets/js/305.2c248dd4.js index bd08c0eedd..c647e97a17 100644 --- a/assets/js/304.ad9e83a1.js +++ b/assets/js/305.2c248dd4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[304],{948:function(t,e,o){"use strict";o.r(e);var s=o(2),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"develop"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#develop"}},[t._v("#")]),t._v(" Develop")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("If you are a "),e("strong",[t._v("developer")]),t._v(" or an AT expert with "),e("strong",[t._v("technical background")]),t._v(", this is the right place for you.")]),t._v(" "),e("p",[t._v("In this section, you will find information for developing AsTeRICS or elements of it like plugins or AT solutions.")])])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[305],{954:function(t,e,o){"use strict";o.r(e);var s=o(2),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"develop"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#develop"}},[t._v("#")]),t._v(" Develop")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("If you are a "),e("strong",[t._v("developer")]),t._v(" or an AT expert with "),e("strong",[t._v("technical background")]),t._v(", this is the right place for you.")]),t._v(" "),e("p",[t._v("In this section, you will find information for developing AsTeRICS or elements of it like plugins or AT solutions.")])])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/305.b71d25bf.js b/assets/js/306.f5de698c.js similarity index 90% rename from assets/js/305.b71d25bf.js rename to assets/js/306.f5de698c.js index 1118008738..ff0a5b5433 100644 --- a/assets/js/305.b71d25bf.js +++ b/assets/js/306.f5de698c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[305],{950:function(t,s,r){"use strict";r.r(s);var e=r(2),a=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"rest-java-client-library"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rest-java-client-library"}},[this._v("#")]),this._v(" REST Java Client library")]),this._v(" "),t("p",[this._v("The source code can be found "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/ARE_RestAPIlibraries/JavaLibrary"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[306],{952:function(t,s,r){"use strict";r.r(s);var e=r(2),a=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"rest-java-client-library"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rest-java-client-library"}},[this._v("#")]),this._v(" REST Java Client library")]),this._v(" "),t("p",[this._v("The source code can be found "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/ARE_RestAPIlibraries/JavaLibrary"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/306.7827a9ee.js b/assets/js/307.2451ef72.js similarity index 91% rename from assets/js/306.7827a9ee.js rename to assets/js/307.2451ef72.js index 33689ce10d..39c738b8cc 100644 --- a/assets/js/306.7827a9ee.js +++ b/assets/js/307.2451ef72.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[306],{952:function(t,s,r){"use strict";r.r(s);var a=r(2),e=Object(a.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"javascript-rest-api-client-library"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript-rest-api-client-library"}},[this._v("#")]),this._v(" Javascript REST API client library")]),this._v(" "),t("p",[this._v("The source code can be found "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[307],{953:function(t,s,r){"use strict";r.r(s);var a=r(2),e=Object(a.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"javascript-rest-api-client-library"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript-rest-api-client-library"}},[this._v("#")]),this._v(" Javascript REST API client library")]),this._v(" "),t("p",[this._v("The source code can be found "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"}},[this._v("here")]),this._v(".")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/307.ee37afc2.js b/assets/js/308.57a3d67c.js similarity index 91% rename from assets/js/307.ee37afc2.js rename to assets/js/308.57a3d67c.js index 4009adf2c2..3f635fba1c 100644 --- a/assets/js/307.ee37afc2.js +++ b/assets/js/308.57a3d67c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[307],{951:function(t,a,n){"use strict";n.r(a);var i=n(2),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"javascript-model-manipulation-and-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript-model-manipulation-and-deployment"}},[this._v("#")]),this._v(" Javascript model manipulation and deployment")]),this._v(" "),t("ul",[t("li",[this._v("Javascript libraries for model manipulation and model deployment:\n"),t("ul",[t("li",[t("StaticLink",{attrs:{href:"APIs/js-modelManipulation_webAppUtils/index.html",text:"Model manipulation and deployment"}})],1)])])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[308],{955:function(t,a,n){"use strict";n.r(a);var i=n(2),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"javascript-model-manipulation-and-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript-model-manipulation-and-deployment"}},[this._v("#")]),this._v(" Javascript model manipulation and deployment")]),this._v(" "),t("ul",[t("li",[this._v("Javascript libraries for model manipulation and model deployment:\n"),t("ul",[t("li",[t("StaticLink",{attrs:{href:"APIs/js-modelManipulation_webAppUtils/index.html",text:"Model manipulation and deployment"}})],1)])])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/308.558ef3be.js b/assets/js/309.77902e17.js similarity index 97% rename from assets/js/308.558ef3be.js rename to assets/js/309.77902e17.js index 5b8e0495ee..fe8adc10a3 100644 --- a/assets/js/308.558ef3be.js +++ b/assets/js/309.77902e17.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[308],{953:function(t,e,a){"use strict";a.r(e);var r=a(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"rest-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-api"}},[t._v("#")]),t._v(" REST API")]),t._v(" "),e("h2",{attrs:{id:"general-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-information"}},[t._v("#")]),t._v(" General Information")]),t._v(" "),e("p",[t._v("The ARE provides a REST API with several functionalities. The base REST URI is:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("http://localhost:8081/rest/\n")])])]),e("p",[t._v("or")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("https://localhost:8083/rest/\n")])])]),e("p",[t._v("In order to get a list of all available rest methods use:\nhttp://localhost:8081/rest/restfunctions")]),t._v(" "),e("h2",{attrs:{id:"rest-api-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-api-links"}},[t._v("#")]),t._v(" REST API Links")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/#submenuRest",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST demo"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"./asterics-wiki/api/REST-API"}},[t._v("REST Tutorial")])]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/doc/lib-js-api/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper 2"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/ARE_RestAPIlibraries/JavaLibrary",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Java Client Wrapper"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[309],{956:function(t,e,a){"use strict";a.r(e);var r=a(2),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"rest-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-api"}},[t._v("#")]),t._v(" REST API")]),t._v(" "),e("h2",{attrs:{id:"general-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-information"}},[t._v("#")]),t._v(" General Information")]),t._v(" "),e("p",[t._v("The ARE provides a REST API with several functionalities. The base REST URI is:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("http://localhost:8081/rest/\n")])])]),e("p",[t._v("or")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("https://localhost:8083/rest/\n")])])]),e("p",[t._v("In order to get a list of all available rest methods use:\nhttp://localhost:8081/rest/restfunctions")]),t._v(" "),e("h2",{attrs:{id:"rest-api-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-api-links"}},[t._v("#")]),t._v(" REST API Links")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/#submenuRest",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST demo"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"./asterics-wiki/api/REST-API"}},[t._v("REST Tutorial")])]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/doc/lib-js-api/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper 2"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/ARE_RestAPIlibraries/JavaLibrary",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Java Client Wrapper"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/31.d8e4b622.js b/assets/js/31.7c5263b4.js similarity index 99% rename from assets/js/31.d8e4b622.js rename to assets/js/31.7c5263b4.js index 2ea03ed956..498c197d8b 100644 --- a/assets/js/31.d8e4b622.js +++ b/assets/js/31.7c5263b4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{1124:function(t,e,n){"use strict";n.r(e);var o=n(2),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"amazonechocontrol"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#amazonechocontrol"}},[t._v("#")]),t._v(" AmazonEchoControl")]),t._v(" "),e("p",[t._v("Component Type: Processors (Subcategory: Home Control)")]),t._v(" "),e("p",[t._v("This plugin is based on the openHAB plugin, but is only used to control the "),e("a",{attrs:{href:"https://www.openhab.org/addons/bindings/amazonechocontrol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("AmazonEchoControl binding"),e("OutboundLink")],1),t._v(" from openHAB.")]),t._v(" "),e("p",[t._v("See the "),e("a",{attrs:{href:"https://www.openhab.org/docs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("This component uses the provided "),e("a",{attrs:{href:"https://www.openhab.org/docs/configuration/restdocs.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API of openHAB"),e("OutboundLink")],1),t._v(" to read and write the state of different nodes (called items) within the openHAB system.")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The plugin expects")]),t._v(" "),e("ul",[e("li",[t._v("a functional "),e("a",{attrs:{href:"https://www.openhab.org/docs/installation/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB installation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://www.amazon.de/b?ie=UTF8&node=14100226031",target:"_blank",rel:"noopener noreferrer"}},[t._v("Amazon Echo or similar device"),e("OutboundLink")],1)])]),t._v(" "),e("h3",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("To run openHAB without password authentication, start openHAB with this command:")]),t._v(" "),e("h4",{attrs:{id:"linux-and-macos"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#linux-and-macos"}},[t._v("#")]),t._v(" Linux and macOS")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./start_debug.sh\n")])])]),e("p",[t._v("or on a debian-based system this should be:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" openhab-cli start\n")])])]),e("h4",{attrs:{id:"windows"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#windows"}},[t._v("#")]),t._v(" Windows")]),t._v(" "),e("p",[t._v("in the openHAB folder, double click on")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("start_debug.bat\n")])])]),e("p",[t._v("After installing and running openHAB, start the browser and use "),e("a",{attrs:{href:"https://localhost:8080",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://localhost:8080"),e("OutboundLink")],1),t._v(" for HTTP or "),e("a",{attrs:{href:"https://localhost:8443",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://localhost:8443"),e("OutboundLink")],1),t._v(" for HTTPS.")]),t._v(" "),e("p",[t._v("See the ("),e("a",{attrs:{href:"https://www.openhab.org/docs/installation/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB installation guide"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("h4",{attrs:{id:"initial-setup-of-openhab"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#initial-setup-of-openhab"}},[t._v("#")]),t._v(" Initial Setup of openHAB")]),t._v(" "),e("p",[t._v("Before this plugin can be used, the openHAB must be initialized and the AmazonEchoControl binding must be installed. The following steps, based on the "),e("a",{attrs:{href:"https://www.openhab.org/docs/tutorial/1sttimesetup.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB first-time setup"),e("OutboundLink")],1),t._v(", must be done")]),t._v(" "),e("h3",{attrs:{id:"connect-amazon-account"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-amazon-account"}},[t._v("#")]),t._v(" Connect Amazon Account")]),t._v(" "),e("ol",[e("li",[t._v("Select "),e("strong",[t._v("Standard (recommended setup)")]),t._v(", this step can take a while")]),t._v(" "),e("li",[t._v("Select the "),e("strong",[t._v("PAPER UI")])]),t._v(" "),e("li",[t._v("Go to "),e("strong",[t._v("Add-ons")]),t._v(" in the control panel and on Tab "),e("strong",[t._v("BINDINGS")]),t._v(" and search for "),e("strong",[t._v("Amazon Echo Control Binding")]),t._v(" and click install.")]),t._v(" "),e("li",[t._v("Go to "),e("strong",[t._v("Configuration")]),t._v(" and click on "),e("strong",[t._v("Things")]),t._v(" and click on "),e("code",[t._v("Amazon Echo Control Binding")]),t._v(".")]),t._v(" "),e("li",[t._v("Click on "),e("strong",[t._v("Amazon Account")]),t._v(" and accept it by pressing on the tick\n"),e("img",{attrs:{src:n(687),alt:"Screenshot Amazon Account Thing Creation"}})]),t._v(" "),e("li",[t._v("After that, use this link to connect openHAB with your "),e("strong",[t._v("Amazon Account")]),t._v(" ("),e("a",{attrs:{href:"http://localhost:8080/amazonechocontrol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8080/amazonechocontrol/"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("li",[t._v("Back in the "),e("strong",[t._v("Configuration")]),t._v(" menu click on "),e("strong",[t._v("Things")]),t._v(", the account should be online.")])]),t._v(" "),e("p",[t._v("if not, follow the instruction at: "),e("a",{attrs:{href:"https://www.openhab.org/addons/bindings/amazonechocontrol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB: AmazonEchoControl-Binding"),e("OutboundLink")],1)]),t._v(" "),e("p",[e("img",{attrs:{src:n(688),alt:"Screenshot: Amazon Account Online",title:"Screenshot: Amazon Account Online"}})]),t._v(" "),e("h5",{attrs:{id:"setup-amazon-device"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-amazon-device"}},[t._v("#")]),t._v(" Setup Amazon Device")]),t._v(" "),e("p",[t._v("The Amazon device must be setup within your "),e("a",{attrs:{href:"https://alexa.amazon.de",target:"_blank",rel:"noopener noreferrer"}},[t._v("amazon alexa account"),e("OutboundLink")],1),t._v(" or using the amazon alexa app.")]),t._v(" "),e("ol",{attrs:{start:"9"}},[e("li",[t._v("Switch on "),e("strong",[t._v("Simple Mode")]),t._v(" in "),e("strong",[t._v("Configuration/System")])]),t._v(" "),e("li",[t._v("If everything worked, go to "),e("strong",[t._v("Inbox")]),t._v(" and accept the new "),e("strong",[t._v("Things")]),t._v(".")]),t._v(" "),e("li",[t._v("The things will show up in the "),e("strong",[t._v("Control")]),t._v(" area.")]),t._v(" "),e("li",[t._v("Link all channels to make them available as items\n"),e("img",{attrs:{src:n(689),alt:"Screenshot of how to link amazon echo channels"}})])]),t._v(" "),e("h2",{attrs:{id:"amazonechocontrol-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#amazonechocontrol-plugin"}},[t._v("#")]),t._v(" AmazonEchoControl Plugin")]),t._v(" "),e("p",[e("img",{attrs:{src:n(690),alt:"Screenshot: AmazonEchoControl Plugin",title:"Screenshot: AmazonEchoControl Plugin"}})]),t._v(" "),e("h4",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("jsonCommand [string]:")]),t._v(" Set a new state of an item, e.g. "),e("code",[t._v('{"ItemSuffix": "player", "value": "PLAY"}')]),t._v("."),e("br"),t._v("\nThe field itemSuffix represents the suffix (from the last "),e("code",[t._v("_")]),t._v(" to the end of the item id) of an item only. The value represents the new state of the item. The itemsuffix has to be written lowercase and the value has to be written in uppercase. For a list of available items, see (http://localhost:8080/rest/items).\n_ "),e("strong",[t._v("Examples:")]),t._v("\n_ "),e("code",[t._v('{"ItemSuffix": "musicProviderId", "value": "SPOTIFY"}')]),t._v(" for changing the provider\n_ "),e("code",[t._v('{"ItemSuffix": "volume", "value": "50"}')]),t._v(" for changing the volume\n_ "),e("code",[t._v('{"ItemSuffix": "playMusicVoiceCommand", "value": "Yesterday from the Beatles"}')]),t._v(" for listening to a new song")])]),t._v(" "),e("h4",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("currentState:")]),t._v(" The current state of the item, which was changed with the latest "),e("strong",[t._v("jsonCommand")]),t._v(".")]),t._v(" "),e("li",[e("strong",[t._v("currentTitle:")]),t._v(" The title of the current song playing.")]),t._v(" "),e("li",[e("strong",[t._v("cmdResponse:")]),t._v(" The response of the latest "),e("strong",[t._v("jsonCommand")]),t._v(". Shows "),e("strong",[t._v("OK")]),t._v(" if the cmd was correct or "),e("strong",[t._v("ERROR")]),t._v(" if it was not (plus a more detailed error message)")])]),t._v(" "),e("h4",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("p",[e("img",{attrs:{src:n(691),alt:"Screenshot: List of Eventlistener names and their meaning. The listener names are playerPlay, playerPause, playerNext, playerPrevious, volumeMute, volume30, weather, tellStory, traffic, singASong, flashBriefing",title:"Screenshot: AmazonEchoControl Eventlistener"}})]),t._v(" "),e("h4",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("p",[t._v("This plugin has two event triggers:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("turnedOn:")]),t._v(" Sent, when the music starts")]),t._v(" "),e("li",[e("strong",[t._v("turnedOff:")]),t._v(" Sent, when the music is paused/stopped.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("updaterate [integer]:")]),t._v(" Time in milliseconds, which will ellapse between each status update. Default: 1s (1000ms)")]),t._v(" "),e("li",[e("strong",[t._v("hostname [string]:")]),t._v(" Hostname to connect to. It is possible to use a hostname, an IP adress or a FQDN")]),t._v(" "),e("li",[e("strong",[t._v("port [string]:")]),t._v(" Port of the openHAB installation. Defaults: 8080 for HTTP, 8443 for HTTPS. Please take care of any blocking firewall.")]),t._v(" "),e("li",[e("strong",[t._v("protocol:")]),t._v(" Protocol to connect to openHAB. Either http or https may be used (recommended: https).")]),t._v(" "),e("li",[e("strong",[t._v("lazyCertificates [boolean]:")]),t._v(" If this property is set, any SSL related certificate check will be removed for the given hostname. This affects the whole ARE.")]),t._v(" "),e("li",[e("strong",[t._v("username [string]:")]),t._v(" This property is used, if the HTTP basic authentication of openHAB is used. Provide the username here.")]),t._v(" "),e("li",[e("strong",[t._v("password [string]:")]),t._v(" This property is used, if the HTTP basic authentication of openHAB is used. Provide the password here.")])]),t._v(" "),e("h2",{attrs:{id:"additional-hints"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-hints"}},[t._v("#")]),t._v(" Additional hints")]),t._v(" "),e("ul",[e("li",[t._v("The model will stop with an error message, if one of the item names in the properties is not found.")]),t._v(" "),e("li",[t._v("There is no feedback for checking a successful state change. E.g.: if your write to a read-only item (temperature sensor), nothing will happen")]),t._v(" "),e("li",[t._v("Use the "),e("em",[t._v("lazyCertificates")]),t._v(" property with care, it will disable a major part of the SSL handshaking for the whole Java session. It should be limited to the given hostname only, but without warranty.")]),t._v(" "),e("li",[t._v("The username/password combination from the properties is saved in PLAINTEXT in the model file, so handle it with care.")])])])}),[],!1,null,null,null);e.default=a.exports},687:function(t,e,n){t.exports=n.p+"assets/img/amazonechocontrol-addthing-amazonaccount.071ee87a.png"},688:function(t,e,n){t.exports=n.p+"assets/img/amazonaccount.c8dd444d.JPG"},689:function(t,e,n){t.exports=n.p+"assets/img/amazonechocontrol-linkchannels.0c69eef9.png"},690:function(t,e){t.exports="data:image/png;base64,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"},691:function(t,e,n){t.exports=n.p+"assets/img/amazonechocontrol_eventlistener.1e5b29fc.PNG"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{1127:function(t,e,n){"use strict";n.r(e);var o=n(2),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"amazonechocontrol"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#amazonechocontrol"}},[t._v("#")]),t._v(" AmazonEchoControl")]),t._v(" "),e("p",[t._v("Component Type: Processors (Subcategory: Home Control)")]),t._v(" "),e("p",[t._v("This plugin is based on the openHAB plugin, but is only used to control the "),e("a",{attrs:{href:"https://www.openhab.org/addons/bindings/amazonechocontrol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("AmazonEchoControl binding"),e("OutboundLink")],1),t._v(" from openHAB.")]),t._v(" "),e("p",[t._v("See the "),e("a",{attrs:{href:"https://www.openhab.org/docs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("This component uses the provided "),e("a",{attrs:{href:"https://www.openhab.org/docs/configuration/restdocs.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API of openHAB"),e("OutboundLink")],1),t._v(" to read and write the state of different nodes (called items) within the openHAB system.")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The plugin expects")]),t._v(" "),e("ul",[e("li",[t._v("a functional "),e("a",{attrs:{href:"https://www.openhab.org/docs/installation/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB installation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://www.amazon.de/b?ie=UTF8&node=14100226031",target:"_blank",rel:"noopener noreferrer"}},[t._v("Amazon Echo or similar device"),e("OutboundLink")],1)])]),t._v(" "),e("h3",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("To run openHAB without password authentication, start openHAB with this command:")]),t._v(" "),e("h4",{attrs:{id:"linux-and-macos"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#linux-and-macos"}},[t._v("#")]),t._v(" Linux and macOS")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./start_debug.sh\n")])])]),e("p",[t._v("or on a debian-based system this should be:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" openhab-cli start\n")])])]),e("h4",{attrs:{id:"windows"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#windows"}},[t._v("#")]),t._v(" Windows")]),t._v(" "),e("p",[t._v("in the openHAB folder, double click on")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("start_debug.bat\n")])])]),e("p",[t._v("After installing and running openHAB, start the browser and use "),e("a",{attrs:{href:"https://localhost:8080",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://localhost:8080"),e("OutboundLink")],1),t._v(" for HTTP or "),e("a",{attrs:{href:"https://localhost:8443",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://localhost:8443"),e("OutboundLink")],1),t._v(" for HTTPS.")]),t._v(" "),e("p",[t._v("See the ("),e("a",{attrs:{href:"https://www.openhab.org/docs/installation/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB installation guide"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("h4",{attrs:{id:"initial-setup-of-openhab"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#initial-setup-of-openhab"}},[t._v("#")]),t._v(" Initial Setup of openHAB")]),t._v(" "),e("p",[t._v("Before this plugin can be used, the openHAB must be initialized and the AmazonEchoControl binding must be installed. The following steps, based on the "),e("a",{attrs:{href:"https://www.openhab.org/docs/tutorial/1sttimesetup.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB first-time setup"),e("OutboundLink")],1),t._v(", must be done")]),t._v(" "),e("h3",{attrs:{id:"connect-amazon-account"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-amazon-account"}},[t._v("#")]),t._v(" Connect Amazon Account")]),t._v(" "),e("ol",[e("li",[t._v("Select "),e("strong",[t._v("Standard (recommended setup)")]),t._v(", this step can take a while")]),t._v(" "),e("li",[t._v("Select the "),e("strong",[t._v("PAPER UI")])]),t._v(" "),e("li",[t._v("Go to "),e("strong",[t._v("Add-ons")]),t._v(" in the control panel and on Tab "),e("strong",[t._v("BINDINGS")]),t._v(" and search for "),e("strong",[t._v("Amazon Echo Control Binding")]),t._v(" and click install.")]),t._v(" "),e("li",[t._v("Go to "),e("strong",[t._v("Configuration")]),t._v(" and click on "),e("strong",[t._v("Things")]),t._v(" and click on "),e("code",[t._v("Amazon Echo Control Binding")]),t._v(".")]),t._v(" "),e("li",[t._v("Click on "),e("strong",[t._v("Amazon Account")]),t._v(" and accept it by pressing on the tick\n"),e("img",{attrs:{src:n(687),alt:"Screenshot Amazon Account Thing Creation"}})]),t._v(" "),e("li",[t._v("After that, use this link to connect openHAB with your "),e("strong",[t._v("Amazon Account")]),t._v(" ("),e("a",{attrs:{href:"http://localhost:8080/amazonechocontrol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8080/amazonechocontrol/"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("li",[t._v("Back in the "),e("strong",[t._v("Configuration")]),t._v(" menu click on "),e("strong",[t._v("Things")]),t._v(", the account should be online.")])]),t._v(" "),e("p",[t._v("if not, follow the instruction at: "),e("a",{attrs:{href:"https://www.openhab.org/addons/bindings/amazonechocontrol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openHAB: AmazonEchoControl-Binding"),e("OutboundLink")],1)]),t._v(" "),e("p",[e("img",{attrs:{src:n(688),alt:"Screenshot: Amazon Account Online",title:"Screenshot: Amazon Account Online"}})]),t._v(" "),e("h5",{attrs:{id:"setup-amazon-device"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-amazon-device"}},[t._v("#")]),t._v(" Setup Amazon Device")]),t._v(" "),e("p",[t._v("The Amazon device must be setup within your "),e("a",{attrs:{href:"https://alexa.amazon.de",target:"_blank",rel:"noopener noreferrer"}},[t._v("amazon alexa account"),e("OutboundLink")],1),t._v(" or using the amazon alexa app.")]),t._v(" "),e("ol",{attrs:{start:"9"}},[e("li",[t._v("Switch on "),e("strong",[t._v("Simple Mode")]),t._v(" in "),e("strong",[t._v("Configuration/System")])]),t._v(" "),e("li",[t._v("If everything worked, go to "),e("strong",[t._v("Inbox")]),t._v(" and accept the new "),e("strong",[t._v("Things")]),t._v(".")]),t._v(" "),e("li",[t._v("The things will show up in the "),e("strong",[t._v("Control")]),t._v(" area.")]),t._v(" "),e("li",[t._v("Link all channels to make them available as items\n"),e("img",{attrs:{src:n(689),alt:"Screenshot of how to link amazon echo channels"}})])]),t._v(" "),e("h2",{attrs:{id:"amazonechocontrol-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#amazonechocontrol-plugin"}},[t._v("#")]),t._v(" AmazonEchoControl Plugin")]),t._v(" "),e("p",[e("img",{attrs:{src:n(690),alt:"Screenshot: AmazonEchoControl Plugin",title:"Screenshot: AmazonEchoControl Plugin"}})]),t._v(" "),e("h4",{attrs:{id:"input-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#input-port-description"}},[t._v("#")]),t._v(" Input Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("jsonCommand [string]:")]),t._v(" Set a new state of an item, e.g. "),e("code",[t._v('{"ItemSuffix": "player", "value": "PLAY"}')]),t._v("."),e("br"),t._v("\nThe field itemSuffix represents the suffix (from the last "),e("code",[t._v("_")]),t._v(" to the end of the item id) of an item only. The value represents the new state of the item. The itemsuffix has to be written lowercase and the value has to be written in uppercase. For a list of available items, see (http://localhost:8080/rest/items).\n_ "),e("strong",[t._v("Examples:")]),t._v("\n_ "),e("code",[t._v('{"ItemSuffix": "musicProviderId", "value": "SPOTIFY"}')]),t._v(" for changing the provider\n_ "),e("code",[t._v('{"ItemSuffix": "volume", "value": "50"}')]),t._v(" for changing the volume\n_ "),e("code",[t._v('{"ItemSuffix": "playMusicVoiceCommand", "value": "Yesterday from the Beatles"}')]),t._v(" for listening to a new song")])]),t._v(" "),e("h4",{attrs:{id:"output-port-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-port-description"}},[t._v("#")]),t._v(" Output Port Description")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("currentState:")]),t._v(" The current state of the item, which was changed with the latest "),e("strong",[t._v("jsonCommand")]),t._v(".")]),t._v(" "),e("li",[e("strong",[t._v("currentTitle:")]),t._v(" The title of the current song playing.")]),t._v(" "),e("li",[e("strong",[t._v("cmdResponse:")]),t._v(" The response of the latest "),e("strong",[t._v("jsonCommand")]),t._v(". Shows "),e("strong",[t._v("OK")]),t._v(" if the cmd was correct or "),e("strong",[t._v("ERROR")]),t._v(" if it was not (plus a more detailed error message)")])]),t._v(" "),e("h4",{attrs:{id:"event-listener-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-listener-description"}},[t._v("#")]),t._v(" Event Listener Description")]),t._v(" "),e("p",[e("img",{attrs:{src:n(691),alt:"Screenshot: List of Eventlistener names and their meaning. The listener names are playerPlay, playerPause, playerNext, playerPrevious, volumeMute, volume30, weather, tellStory, traffic, singASong, flashBriefing",title:"Screenshot: AmazonEchoControl Eventlistener"}})]),t._v(" "),e("h4",{attrs:{id:"event-trigger-description"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#event-trigger-description"}},[t._v("#")]),t._v(" Event Trigger Description")]),t._v(" "),e("p",[t._v("This plugin has two event triggers:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("turnedOn:")]),t._v(" Sent, when the music starts")]),t._v(" "),e("li",[e("strong",[t._v("turnedOff:")]),t._v(" Sent, when the music is paused/stopped.")])]),t._v(" "),e("h2",{attrs:{id:"properties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" Properties")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("updaterate [integer]:")]),t._v(" Time in milliseconds, which will ellapse between each status update. Default: 1s (1000ms)")]),t._v(" "),e("li",[e("strong",[t._v("hostname [string]:")]),t._v(" Hostname to connect to. It is possible to use a hostname, an IP adress or a FQDN")]),t._v(" "),e("li",[e("strong",[t._v("port [string]:")]),t._v(" Port of the openHAB installation. Defaults: 8080 for HTTP, 8443 for HTTPS. Please take care of any blocking firewall.")]),t._v(" "),e("li",[e("strong",[t._v("protocol:")]),t._v(" Protocol to connect to openHAB. Either http or https may be used (recommended: https).")]),t._v(" "),e("li",[e("strong",[t._v("lazyCertificates [boolean]:")]),t._v(" If this property is set, any SSL related certificate check will be removed for the given hostname. This affects the whole ARE.")]),t._v(" "),e("li",[e("strong",[t._v("username [string]:")]),t._v(" This property is used, if the HTTP basic authentication of openHAB is used. Provide the username here.")]),t._v(" "),e("li",[e("strong",[t._v("password [string]:")]),t._v(" This property is used, if the HTTP basic authentication of openHAB is used. Provide the password here.")])]),t._v(" "),e("h2",{attrs:{id:"additional-hints"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-hints"}},[t._v("#")]),t._v(" Additional hints")]),t._v(" "),e("ul",[e("li",[t._v("The model will stop with an error message, if one of the item names in the properties is not found.")]),t._v(" "),e("li",[t._v("There is no feedback for checking a successful state change. E.g.: if your write to a read-only item (temperature sensor), nothing will happen")]),t._v(" "),e("li",[t._v("Use the "),e("em",[t._v("lazyCertificates")]),t._v(" property with care, it will disable a major part of the SSL handshaking for the whole Java session. It should be limited to the given hostname only, but without warranty.")]),t._v(" "),e("li",[t._v("The username/password combination from the properties is saved in PLAINTEXT in the model file, so handle it with care.")])])])}),[],!1,null,null,null);e.default=a.exports},687:function(t,e,n){t.exports=n.p+"assets/img/amazonechocontrol-addthing-amazonaccount.071ee87a.png"},688:function(t,e,n){t.exports=n.p+"assets/img/amazonaccount.c8dd444d.JPG"},689:function(t,e,n){t.exports=n.p+"assets/img/amazonechocontrol-linkchannels.0c69eef9.png"},690:function(t,e){t.exports="data:image/png;base64,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"},691:function(t,e,n){t.exports=n.p+"assets/img/amazonechocontrol_eventlistener.1e5b29fc.PNG"}}]); \ No newline at end of file diff --git a/assets/js/309.c72d0abc.js b/assets/js/310.40a47636.js similarity index 97% rename from assets/js/309.c72d0abc.js rename to assets/js/310.40a47636.js index bbe3b22fb9..afc5a86dcf 100644 --- a/assets/js/309.c72d0abc.js +++ b/assets/js/310.40a47636.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[309],{954:function(t,e,a){"use strict";a.r(e);var s=a(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"rest-demos-with-javascript-client-library"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-demos-with-javascript-client-library"}},[t._v("#")]),t._v(" REST demos with Javascript client library")]),t._v(" "),e("p",[t._v("The ARE provides a REST API with several functionalities. The base REST URI is:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("http://localhost:8081/rest/\n")])])]),e("p",[t._v("In order to get a list of all available rest methods use: "),e("StaticLink",{attrs:{href:"http://localhost:8081/rest/restfunctions",target:"_blank",text:"http://localhost:8081/rest/restfunctions"}})],1),t._v(" "),e("h2",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("One way to use the REST API ist to use the Javascript library "),e("a",{attrs:{target:"_blank",href:"./javascript/areCommunicator.js"}},[t._v("areCommunicator.js")]),t._v(". Use the following links to navigate to examples using this library:")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/are_repository.html",text:"ARE Repository"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("REST methods to interact with the ARE model repository (list, store, delete).")]),t._v(" "),e("ul",[e("li",[t._v('"/>:\n')])]),t._v(" "),e("p",[t._v("Interact with data channels and event channels of the ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_components.html",text:"ARE Model Components"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Interact with components of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_deployment.html",text:"ARE Model Deployment"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Deploy and upload ARE models.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_state.html",text:"ARE Model State"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Get information and change the state of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/sse.html",text:"Server Sent Events"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Subscribe to server sent events (SSE) of the current ARE model.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[310],{957:function(t,e,a){"use strict";a.r(e);var s=a(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"rest-demos-with-javascript-client-library"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-demos-with-javascript-client-library"}},[t._v("#")]),t._v(" REST demos with Javascript client library")]),t._v(" "),e("p",[t._v("The ARE provides a REST API with several functionalities. The base REST URI is:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("http://localhost:8081/rest/\n")])])]),e("p",[t._v("In order to get a list of all available rest methods use: "),e("StaticLink",{attrs:{href:"http://localhost:8081/rest/restfunctions",target:"_blank",text:"http://localhost:8081/rest/restfunctions"}})],1),t._v(" "),e("h2",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("One way to use the REST API ist to use the Javascript library "),e("a",{attrs:{target:"_blank",href:"./javascript/areCommunicator.js"}},[t._v("areCommunicator.js")]),t._v(". Use the following links to navigate to examples using this library:")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/are_repository.html",text:"ARE Repository"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("REST methods to interact with the ARE model repository (list, store, delete).")]),t._v(" "),e("ul",[e("li",[t._v('"/>:\n')])]),t._v(" "),e("p",[t._v("Interact with data channels and event channels of the ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_components.html",text:"ARE Model Components"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Interact with components of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_deployment.html",text:"ARE Model Deployment"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Deploy and upload ARE models.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_state.html",text:"ARE Model State"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Get information and change the state of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/sse.html",text:"Server Sent Events"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Subscribe to server sent events (SSE) of the current ARE model.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/310.fdcd464b.js b/assets/js/311.4815412d.js similarity index 85% rename from assets/js/310.fdcd464b.js rename to assets/js/311.4815412d.js index 7d852825f0..cf44e5bb94 100644 --- a/assets/js/310.fdcd464b.js +++ b/assets/js/311.4815412d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[310],{955:function(t,s,n){"use strict";n.r(s);var i=n(2),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"unit-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#unit-testing"}},[this._v("#")]),this._v(" Unit Testing")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[311],{958:function(t,s,n){"use strict";n.r(s);var i=n(2),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"unit-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#unit-testing"}},[this._v("#")]),this._v(" Unit Testing")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/311.f255310e.js b/assets/js/312.47dcedd9.js similarity index 91% rename from assets/js/311.f255310e.js rename to assets/js/312.47dcedd9.js index a64d6fdc9a..f24ac0e4c6 100644 --- a/assets/js/311.f255310e.js +++ b/assets/js/312.47dcedd9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[311],{956:function(e,t,r){"use strict";r.r(t);var s=r(2),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-remote-apis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-remote-apis"}},[e._v("#")]),e._v(" ARE Remote APIs")]),e._v(" "),t("p",[e._v("The ARE provides several web-based interfaces which will be explained in the following tutorials:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"./Webserver"}},[e._v("Webserver")])]),e._v(" "),t("li",[t("a",{attrs:{href:"./REST-API"}},[e._v("REST API")])]),e._v(" "),t("li",[t("a",{attrs:{href:"./Websocket"}},[e._v("Websocket")])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[312],{959:function(e,t,r){"use strict";r.r(t);var s=r(2),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-remote-apis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-remote-apis"}},[e._v("#")]),e._v(" ARE Remote APIs")]),e._v(" "),t("p",[e._v("The ARE provides several web-based interfaces which will be explained in the following tutorials:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"./Webserver"}},[e._v("Webserver")])]),e._v(" "),t("li",[t("a",{attrs:{href:"./REST-API"}},[e._v("REST API")])]),e._v(" "),t("li",[t("a",{attrs:{href:"./Websocket"}},[e._v("Websocket")])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/312.d1a5e2c0.js b/assets/js/313.15b15df8.js similarity index 99% rename from assets/js/312.d1a5e2c0.js rename to assets/js/313.15b15df8.js index f171dd6569..881a31988f 100644 --- a/assets/js/312.d1a5e2c0.js +++ b/assets/js/313.15b15df8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[312],{958:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"rest-api-tutorial"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rest-api-tutorial"}},[t._v("#")]),t._v(" REST API Tutorial")]),t._v(" "),a("p",[t._v("This tutorial demonstrates how to use the AsTeRICS REST API with the Javascript library provided with AsTeRICS 3.0.")]),t._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("To allow remote communication with the AsTeRICS Runtime Environment (ARE), the ARE REST API was developed. It allows manipulation of resources through a set of HTTP methods such as GET, POST, PUT and DELETE.\nApart from the regular REST functions, an event mechanism through "),a("a",{attrs:{href:"https://www.w3schools.com/html/html5_serversentevents.asp",target:"_blank",rel:"noopener noreferrer"}},[t._v("Server Sent Events (SSE)"),a("OutboundLink")],1),t._v(" is provided. With this mechanism, ARE can broadcast messages to anyone who subscribes and inform when an event occurs.\nThe API uses HTTP status codes to declare an error in a call. Specifically, when an error occurs, the response will contain a 500 HTTP status code (Internal Server Error) with an ARE-produced error message inside the HTTP response body.")]),t._v(" "),a("p",[t._v("The base URI for REST operations is:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("http://localhost:8081/rest/\n")])])]),a("p",[t._v("or")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("https://localhost:8083/rest/\n")])])]),a("p",[a("em",[t._v("The default port number is 8081, but can be overridden in the file "),a("code",[t._v("ARE/areProperties")])])]),t._v(" "),a("p",[t._v("In order to get a list of all available REST methods, use the "),a("code",[t._v("restfunctions")]),t._v(" http://localhost:8081/rest/restfunctions call.")]),t._v(" "),a("p",[t._v("There are client libraries facilitating the function calls for "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE_RestAPIlibraries/clientExample/javascript",target:"_blank",rel:"noopener noreferrer"}},[t._v("Javascript"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE_RestAPIlibraries/JavaLibrary",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed and ARE running"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE_RestAPIlibraries/clientExample/javascript",target:"_blank",rel:"noopener noreferrer"}},[t._v("areCommunicator.js, JSMap.js and jquery-3.2.1.min.js libraries"),a("OutboundLink")],1)])]),t._v(" "),a("h2",{attrs:{id:"example-1-model-start-stop"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-1-model-start-stop"}},[t._v("#")]),t._v(" Example 1 - Model start/stop")]),t._v(" "),a("p",[t._v("In this example you will learn how to stop and start the currently deployed ARE model.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-start_stop-model.html")]),t._v(" somewhere on your hard drive.")]),t._v(" "),a("li",[t._v("Open the file in a browser.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model stop/start"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("START_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("startModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//stopModel")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("STOP_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model stop/start"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("START_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Description: Changes the state of the deployed model to STARTED "),a("span",{pre:!0,attrs:{class:"token entity",title:" "}},[t._v(" ")]),t._v("Ouput: alert"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Start model "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("STOP_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Description: Changes the state of the deployed model to STOPPED "),a("span",{pre:!0,attrs:{class:"token entity",title:" "}},[t._v(" ")]),t._v("Ouput: alert"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Stop model "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"example-2-model-upload"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-2-model-upload"}},[t._v("#")]),t._v(" Example 2 - Model upload")]),t._v(" "),a("p",[t._v("This examples shows how a model (XML string) can be uploaded to the ARE.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-upload-model.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model upload"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//uploadModel")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("UPLOAD_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" modelInXML "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UMmodel"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("uploadModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelInXML"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model upload"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("UPLOAD_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Description: Deploys the model given as a parameter "),a("span",{pre:!0,attrs:{class:"token entity",title:" "}},[t._v(" ")]),t._v("Ouput: alert"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Upload model "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("modelInXML"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("UMmodel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Open the following "),a("a",{attrs:{href:"https://raw.githubusercontent.com/asterics/AsTeRICS/v3.0/bin/ARE/models/ImageDemo.acs",target:"_blank",rel:"noopener noreferrer"}},[t._v("model file"),a("OutboundLink")],1),t._v(" with a text editor and copy and paste the model xml string into the given field.")]),t._v(" "),a("li",[t._v("Click onto "),a("code",[t._v("Upload Model")])])]),t._v(" "),a("h2",{attrs:{id:"example-3-change-plugin-property-values"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-3-change-plugin-property-values"}},[t._v("#")]),t._v(" Example 3 - Change plugin property values")]),t._v(" "),a("p",[t._v("This example show how to parametrize a model by overriding default property values of plugins in a model. We use the default autostart model (ARE/models/autostart.acs) of the ARE, which is deployed and started automatically upon startup. The model contains a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/TextDisplay.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("TextDisplay plugin"),a("OutboundLink")],1),t._v(" with id "),a("code",[t._v("TextDisplay.1")]),t._v(" and a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&sensors/CellBoard.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("CellBoard plugin"),a("OutboundLink")],1),t._v(" with id "),a("code",[t._v("CellBoard.1")]),t._v(". With the function "),a("code",[t._v("setRuntimeComponentProperties")]),t._v(" you can provide a JSON string with plugin property key/value pairs.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-change-property-values.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Change property values"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SET_RUNTIME_COMPONENT_PROPERTIES")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//The JSON object must be sent as JSON string, the keys and values must be Strings as well.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" propertyMap"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Set the default property of the plugin with id TextDisplay.1")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"TextDisplay.1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"title"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Change the cellText1 and cellText2 properties of the plugin with id CellBoard.1")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"CellBoard.1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"cellText1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cellText1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"cellText2"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cellText2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimeComponentProperties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If the ARE could be reached and the method call was successful, the success callback is called.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//The variable data contains an array with key/value pairs of properties which could be set successfully.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If the length of the array == 0, no property could be set successfully. ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" errorMsg"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The property settings could not be applied."')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorMsg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'The following properties could be set: '")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" propertyMap"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Change property values"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SET_RUNTIME_COMPONENT_PROPERTIES")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Apply Settings "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Cell Text 1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("cellText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Cell Text 2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("cellText2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Change parameter values for title, cellText1 and cellText2 and click onto "),a("code",[t._v("Apply Settings")])]),t._v(" "),a("li",[t._v("Not all plugin properties can be changed live, so to ensure that the changes are active stop and start the model.")])]),t._v(" "),a("h2",{attrs:{id:"example-4-send-data-to-input-port"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-4-send-data-to-input-port"}},[t._v("#")]),t._v(" Example 4 - Send data to input port")]),t._v(" "),a("p",[t._v("In this example you will learn how to send data to an input port of a plugin. We will use the "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mouse plugin"),a("OutboundLink")],1),t._v(" and send absolute coordinates to the input ports (mouseX, mouseY) to change the absolute mouse position.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Open the "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/?areBaseURI=http://localhost:8081",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebACS"),a("OutboundLink")],1),t._v(" and create a model with a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mouse plugin"),a("OutboundLink")],1),t._v(" and an "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&sensors/EditBox.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("EditBox plugin"),a("OutboundLink")],1),t._v(", where the output port is connected to "),a("code",[t._v("mouseX")]),t._v(" and "),a("code",[t._v("mouseIn")]),t._v(" of the Mouse plugin (see pic below). The EditBox plugin is a workaround for the known "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/issues/230",target:"_blank",rel:"noopener noreferrer"}},[t._v("issue #230"),a("OutboundLink")],1),t._v(".")])]),t._v(" "),a("p",[a("img",{attrs:{src:"images/Mouse.JPG",alt:"Mouse plugin"}})]),t._v(" "),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Deploy and start the model")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-send-data-to-input-port.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Send Data to Input Ports"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SEND_DATA_TO_INPUT_PORT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Fetch values of input fields and send them to the input ports mouseX and mouseY of the Mouse plugin instance with id Mouse.1")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendDataToInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Mouse.1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'mouseX'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x-coordinate"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendDataToInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Mouse.1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'mouseY'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"y-coordinate"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Send Data to Input Ports"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SEND_DATA_TO_INPUT_PORT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Apply Settings "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter X coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("x-coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Y coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("y-coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Enter values for X and Y coordinate of the Mouse and press "),a("code",[t._v("Apply Settings")]),t._v(".")])]),t._v(" "),a("h2",{attrs:{id:"example-5-trigger-event-listener"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-5-trigger-event-listener"}},[t._v("#")]),t._v(" Example 5 - Trigger event listener")]),t._v(" "),a("p",[t._v("In this example you will learn how to trigger an event listener of a plugin. The "),a("a",{attrs:{href:"(http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm)"}},[t._v("Mouse plugin")]),t._v(" has event listener for triggering a mouse click (leftClick, middleClick, rightClick). The example triggers the "),a("code",[t._v("rightClick")]),t._v(" event listener.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Open the "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/?areBaseURI=http://localhost:8081",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebACS"),a("OutboundLink")],1),t._v(" and create a model with a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mouse plugin"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[t._v("Deploy and start the model")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-trigger-event-listener.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Trigger event listener"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("TRIGGER_EVENT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("triggerEvent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Mouse.1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rightClick'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Trigger event listener"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("TRIGGER_EVENT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Generate right click "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"5"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Click on the button "),a("code",[t._v("Generate right click")])])]),t._v(" "),a("h2",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/REST_API.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Complete REST API documentation"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/index.html#submenuRest",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API demo page"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/doc/lib-js-api/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper 2"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/ARE_RestAPIlibraries/JavaLibrary",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Java Client Wrapper"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[313],{960:function(t,a,s){"use strict";s.r(a);var n=s(2),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"rest-api-tutorial"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rest-api-tutorial"}},[t._v("#")]),t._v(" REST API Tutorial")]),t._v(" "),a("p",[t._v("This tutorial demonstrates how to use the AsTeRICS REST API with the Javascript library provided with AsTeRICS 3.0.")]),t._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("To allow remote communication with the AsTeRICS Runtime Environment (ARE), the ARE REST API was developed. It allows manipulation of resources through a set of HTTP methods such as GET, POST, PUT and DELETE.\nApart from the regular REST functions, an event mechanism through "),a("a",{attrs:{href:"https://www.w3schools.com/html/html5_serversentevents.asp",target:"_blank",rel:"noopener noreferrer"}},[t._v("Server Sent Events (SSE)"),a("OutboundLink")],1),t._v(" is provided. With this mechanism, ARE can broadcast messages to anyone who subscribes and inform when an event occurs.\nThe API uses HTTP status codes to declare an error in a call. Specifically, when an error occurs, the response will contain a 500 HTTP status code (Internal Server Error) with an ARE-produced error message inside the HTTP response body.")]),t._v(" "),a("p",[t._v("The base URI for REST operations is:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("http://localhost:8081/rest/\n")])])]),a("p",[t._v("or")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("https://localhost:8083/rest/\n")])])]),a("p",[a("em",[t._v("The default port number is 8081, but can be overridden in the file "),a("code",[t._v("ARE/areProperties")])])]),t._v(" "),a("p",[t._v("In order to get a list of all available REST methods, use the "),a("code",[t._v("restfunctions")]),t._v(" http://localhost:8081/rest/restfunctions call.")]),t._v(" "),a("p",[t._v("There are client libraries facilitating the function calls for "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE_RestAPIlibraries/clientExample/javascript",target:"_blank",rel:"noopener noreferrer"}},[t._v("Javascript"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE_RestAPIlibraries/JavaLibrary",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/releases/tag/v3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("AsTeRICS 3.0 installed and ARE running"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/v3.0/ARE_RestAPIlibraries/clientExample/javascript",target:"_blank",rel:"noopener noreferrer"}},[t._v("areCommunicator.js, JSMap.js and jquery-3.2.1.min.js libraries"),a("OutboundLink")],1)])]),t._v(" "),a("h2",{attrs:{id:"example-1-model-start-stop"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-1-model-start-stop"}},[t._v("#")]),t._v(" Example 1 - Model start/stop")]),t._v(" "),a("p",[t._v("In this example you will learn how to stop and start the currently deployed ARE model.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-start_stop-model.html")]),t._v(" somewhere on your hard drive.")]),t._v(" "),a("li",[t._v("Open the file in a browser.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model stop/start"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("START_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("startModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//stopModel")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("STOP_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model stop/start"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("START_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Description: Changes the state of the deployed model to STARTED "),a("span",{pre:!0,attrs:{class:"token entity",title:" "}},[t._v(" ")]),t._v("Ouput: alert"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Start model "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("STOP_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Description: Changes the state of the deployed model to STOPPED "),a("span",{pre:!0,attrs:{class:"token entity",title:" "}},[t._v(" ")]),t._v("Ouput: alert"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Stop model "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("h2",{attrs:{id:"example-2-model-upload"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-2-model-upload"}},[t._v("#")]),t._v(" Example 2 - Model upload")]),t._v(" "),a("p",[t._v("This examples shows how a model (XML string) can be uploaded to the ARE.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-upload-model.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model upload"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//uploadModel")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("UPLOAD_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" modelInXML "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UMmodel"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("uploadModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelInXML"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Model upload"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("UPLOAD_MODEL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Description: Deploys the model given as a parameter "),a("span",{pre:!0,attrs:{class:"token entity",title:" "}},[t._v(" ")]),t._v("Ouput: alert"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Upload model "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("modelInXML"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("UMmodel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Open the following "),a("a",{attrs:{href:"https://raw.githubusercontent.com/asterics/AsTeRICS/v3.0/bin/ARE/models/ImageDemo.acs",target:"_blank",rel:"noopener noreferrer"}},[t._v("model file"),a("OutboundLink")],1),t._v(" with a text editor and copy and paste the model xml string into the given field.")]),t._v(" "),a("li",[t._v("Click onto "),a("code",[t._v("Upload Model")])])]),t._v(" "),a("h2",{attrs:{id:"example-3-change-plugin-property-values"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-3-change-plugin-property-values"}},[t._v("#")]),t._v(" Example 3 - Change plugin property values")]),t._v(" "),a("p",[t._v("This example show how to parametrize a model by overriding default property values of plugins in a model. We use the default autostart model (ARE/models/autostart.acs) of the ARE, which is deployed and started automatically upon startup. The model contains a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/TextDisplay.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("TextDisplay plugin"),a("OutboundLink")],1),t._v(" with id "),a("code",[t._v("TextDisplay.1")]),t._v(" and a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&sensors/CellBoard.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("CellBoard plugin"),a("OutboundLink")],1),t._v(" with id "),a("code",[t._v("CellBoard.1")]),t._v(". With the function "),a("code",[t._v("setRuntimeComponentProperties")]),t._v(" you can provide a JSON string with plugin property key/value pairs.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-change-property-values.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Change property values"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SET_RUNTIME_COMPONENT_PROPERTIES")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//The JSON object must be sent as JSON string, the keys and values must be Strings as well.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" propertyMap"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Set the default property of the plugin with id TextDisplay.1")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"TextDisplay.1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"title"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Change the cellText1 and cellText2 properties of the plugin with id CellBoard.1")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"CellBoard.1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"cellText1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cellText1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"cellText2"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cellText2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRuntimeComponentProperties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If the ARE could be reached and the method call was successful, the success callback is called.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//The variable data contains an array with key/value pairs of properties which could be set successfully.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//If the length of the array == 0, no property could be set successfully. ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" errorMsg"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The property settings could not be applied."')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorMsg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'The following properties could be set: '")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" propertyMap"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Change property values"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SET_RUNTIME_COMPONENT_PROPERTIES")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Apply Settings "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Cell Text 1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("cellText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Cell Text 2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("cellText2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Change parameter values for title, cellText1 and cellText2 and click onto "),a("code",[t._v("Apply Settings")])]),t._v(" "),a("li",[t._v("Not all plugin properties can be changed live, so to ensure that the changes are active stop and start the model.")])]),t._v(" "),a("h2",{attrs:{id:"example-4-send-data-to-input-port"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-4-send-data-to-input-port"}},[t._v("#")]),t._v(" Example 4 - Send data to input port")]),t._v(" "),a("p",[t._v("In this example you will learn how to send data to an input port of a plugin. We will use the "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mouse plugin"),a("OutboundLink")],1),t._v(" and send absolute coordinates to the input ports (mouseX, mouseY) to change the absolute mouse position.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Open the "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/?areBaseURI=http://localhost:8081",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebACS"),a("OutboundLink")],1),t._v(" and create a model with a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mouse plugin"),a("OutboundLink")],1),t._v(" and an "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&sensors/EditBox.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("EditBox plugin"),a("OutboundLink")],1),t._v(", where the output port is connected to "),a("code",[t._v("mouseX")]),t._v(" and "),a("code",[t._v("mouseIn")]),t._v(" of the Mouse plugin (see pic below). The EditBox plugin is a workaround for the known "),a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/issues/230",target:"_blank",rel:"noopener noreferrer"}},[t._v("issue #230"),a("OutboundLink")],1),t._v(".")])]),t._v(" "),a("p",[a("img",{attrs:{src:"images/Mouse.JPG",alt:"Mouse plugin"}})]),t._v(" "),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Deploy and start the model")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-send-data-to-input-port.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Send Data to Input Ports"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SEND_DATA_TO_INPUT_PORT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Fetch values of input fields and send them to the input ports mouseX and mouseY of the Mouse plugin instance with id Mouse.1")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendDataToInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Mouse.1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'mouseX'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x-coordinate"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendDataToInputPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Mouse.1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'mouseY'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"y-coordinate"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Send Data to Input Ports"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SEND_DATA_TO_INPUT_PORT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Apply Settings "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter X coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("x-coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter Y coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("y-coordinate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Enter values for X and Y coordinate of the Mouse and press "),a("code",[t._v("Apply Settings")]),t._v(".")])]),t._v(" "),a("h2",{attrs:{id:"example-5-trigger-event-listener"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-5-trigger-event-listener"}},[t._v("#")]),t._v(" Example 5 - Trigger event listener")]),t._v(" "),a("p",[t._v("In this example you will learn how to trigger an event listener of a plugin. The "),a("a",{attrs:{href:"(http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm)"}},[t._v("Mouse plugin")]),t._v(" has event listener for triggering a mouse click (leftClick, middleClick, rightClick). The example triggers the "),a("code",[t._v("rightClick")]),t._v(" event listener.")]),t._v(" "),a("ol",[a("li",[t._v("Start the ARE (ARE.exe|start.bat|start.sh)")]),t._v(" "),a("li",[t._v("Open the "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/?areBaseURI=http://localhost:8081",target:"_blank",rel:"noopener noreferrer"}},[t._v("WebACS"),a("OutboundLink")],1),t._v(" and create a model with a "),a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/WebACS/help/index.html?plugins&actuators/Mouse.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mouse plugin"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[t._v("Deploy and start the model")]),t._v(" "),a("li",[t._v("Copy and paste the following HTML/Javascript snippet into a text editor, save it as "),a("code",[t._v("restapi-trigger-event-listener.html")]),t._v(" somewhere on your hard drive.")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("meta")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("http-equiv")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Content-Type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("content")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/html; charset=UTF-8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Include areCommunicator.js library and it's dependencies, you could also include jquery directly from their page. --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/jquery-3.2.1.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.rawgit.com/asterics/AsTeRICS/v3.0/ARE_RestAPIlibraries/clientExample/javascript/JSmap.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("title")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Trigger event listener"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* This is an example of how to use the ARE Javascipt framework for the communication\n with the ARE Restful Services.\n \n The location of the server should be defined with the 'setBaseURI()' method.\n \n A success-callback function and an error-callback function should be passed as an argument\n for every function.\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBaseURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/rest/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("TRIGGER_EVENT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("triggerEvent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defaultSuccessCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defaultErrorCallback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Mouse.1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rightClick'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Callback functions to be called in case of success or error.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultSuccessCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" HTTPstatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("defaultErrorCallback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("HTTPstatus"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" AREerrorMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error message: "')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("AREerrorMessage"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n ")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("REST client - Trigger event listener"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token special-attr"}},[a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onclick")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token value javascript language-javascript"}},[a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("TRIGGER_EVENT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" Generate right click "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"5"}},[a("li",[t._v("Open the file in a browser.")]),t._v(" "),a("li",[t._v("Click on the button "),a("code",[t._v("Generate right click")])])]),t._v(" "),a("h2",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/Documentation/REST_API.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Complete REST API documentation"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/index.html#submenuRest",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API demo page"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/blob/master/ARE_RestAPIlibraries/clientExample/javascript/areCommunicator.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"http://asterics.github.io/AsTeRICS/webapps/startpage/doc/lib-js-api/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Javascript Client Wrapper 2"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/ARE_RestAPIlibraries/JavaLibrary",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST Java Client Wrapper"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/313.8950823f.js b/assets/js/314.623180fc.js similarity index 97% rename from assets/js/313.8950823f.js rename to assets/js/314.623180fc.js index 42a651a81a..73231d4751 100644 --- a/assets/js/313.8950823f.js +++ b/assets/js/314.623180fc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[313],{957:function(t,e,a){"use strict";a.r(e);var s=a(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"rest-demos-with-javascript-client-library"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-demos-with-javascript-client-library"}},[t._v("#")]),t._v(" REST demos with Javascript client library")]),t._v(" "),e("p",[t._v("The ARE provides a REST API with several functionalities. The base REST URI is:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("http://localhost:8081/rest/\n")])])]),e("p",[t._v("In order to get a list of all available rest methods use: "),e("StaticLink",{attrs:{href:"http://localhost:8081/rest/restfunctions",target:"_blank",text:"http://localhost:8081/rest/restfunctions"}})],1),t._v(" "),e("h2",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("One way to use the REST API ist to use the Javascript library "),e("a",{attrs:{target:"_blank",href:"./javascript/areCommunicator.js"}},[t._v("areCommunicator.js")]),t._v(". Use the following links to navigate to examples using this library:")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/are_repository.html",text:"ARE Repository"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("REST methods to interact with the ARE model repository (list, store, delete).")]),t._v(" "),e("ul",[e("li",[t._v('"/>:\n')])]),t._v(" "),e("p",[t._v("Interact with data channels and event channels of the ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_components.html",text:"ARE Model Components"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Interact with components of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_deployment.html",text:"ARE Model Deployment"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Deploy and upload ARE models.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_state.html",text:"ARE Model State"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Get information and change the state of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/sse.html",text:"Server Sent Events"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Subscribe to server sent events (SSE) of the current ARE model.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[314],{963:function(t,e,a){"use strict";a.r(e);var s=a(2),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"rest-demos-with-javascript-client-library"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rest-demos-with-javascript-client-library"}},[t._v("#")]),t._v(" REST demos with Javascript client library")]),t._v(" "),e("p",[t._v("The ARE provides a REST API with several functionalities. The base REST URI is:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("http://localhost:8081/rest/\n")])])]),e("p",[t._v("In order to get a list of all available rest methods use: "),e("StaticLink",{attrs:{href:"http://localhost:8081/rest/restfunctions",target:"_blank",text:"http://localhost:8081/rest/restfunctions"}})],1),t._v(" "),e("h2",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("One way to use the REST API ist to use the Javascript library "),e("a",{attrs:{target:"_blank",href:"./javascript/areCommunicator.js"}},[t._v("areCommunicator.js")]),t._v(". Use the following links to navigate to examples using this library:")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/are_repository.html",text:"ARE Repository"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("REST methods to interact with the ARE model repository (list, store, delete).")]),t._v(" "),e("ul",[e("li",[t._v('"/>:\n')])]),t._v(" "),e("p",[t._v("Interact with data channels and event channels of the ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_components.html",text:"ARE Model Components"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Interact with components of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_deployment.html",text:"ARE Model Deployment"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Deploy and upload ARE models.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/runtime_model_state.html",text:"ARE Model State"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Get information and change the state of the current ARE model.")]),t._v(" "),e("ul",[e("li",[e("StaticLink",{attrs:{href:"demos/clientExample/sse.html",text:"Server Sent Events"}}),t._v(":\n")],1)]),t._v(" "),e("p",[t._v("Subscribe to server sent events (SSE) of the current ARE model.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/314.2471cb3b.js b/assets/js/315.86789e1f.js similarity index 98% rename from assets/js/314.2471cb3b.js rename to assets/js/315.86789e1f.js index 424281f4cb..6af74b989e 100644 --- a/assets/js/314.2471cb3b.js +++ b/assets/js/315.86789e1f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[314],{960:function(e,t,s){"use strict";s.r(t);var a=s(2),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-webserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver"}},[e._v("#")]),e._v(" ARE Webserver")]),e._v(" "),t("p",[e._v("The ARE provides a webserver with the document root at")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ARE/web/\n")])])]),t("p",[e._v("If you start the ARE, you can open the start page of the webserver by")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("http://localhost:8081/\n")])])]),t("p",[e._v("or")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("https://localhost:8083/\n")])])]),t("h2",{attrs:{id:"document-root-subpath-definitions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#document-root-subpath-definitions"}},[e._v("#")]),e._v(" Document root subpath definitions")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("/ or /index.html")]),e._v(": Landing page of the webserver. This URL provides some general informations about AsTeRICS and should link to the WebACS, REST demos and model demos. Can be overridden in case of an APE project. ("),t("em",[e._v("readonly")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("rest/")]),e._v(": This is the base path of the "),t("RouterLink",{attrs:{to:"/develop/are-remote-apis/REST-API.html"}},[e._v("REST interface")]),e._v(".\n("),t("em",[e._v("read, write")]),e._v(")")],1),e._v(" "),t("li",[t("strong",[e._v("ws/")]),e._v(": This is the base path of the websocket functionality. "),t("em",[e._v("(read, write)")])]),e._v(" "),t("li",[t("strong",[e._v("data/")]),e._v(": Reserved for providing access to the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/bin/ARE/data/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ARE/data"),t("OutboundLink")],1),e._v(" folder containing model data files, plugin config files, plugin images,… ("),t("em",[e._v("read, write")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("models/")]),e._v(": Reserved for providing access to "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/bin/ARE/models/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ARE/models"),t("OutboundLink")],1),e._v(". ("),t("em",[e._v("read, write")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("modelSettings/")]),e._v(": Reserved for static or dynamically generated settings dialogs of a model targeted for end users (users with disabilities or care takers, personal assistents, occupational therapists,…) ("),t("em",[e._v("readonly")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("componentCollections/")]),e._v(": Reserved for providing various component collections describing the set of plugins available on an ARE installation. ("),t("em",[e._v("readonly")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("webapps")]),e._v("/: Reserved for web applications. Could be used to extend web functionality by (optional) web applications. ("),t("em",[e._v("read, write")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("WebACS/")]),e._v(": Base URL of the webbased AsTeRICS Configuration Suite "),t("a",{attrs:{href:"https://github.com/asterics/WebACS",target:"_blank",rel:"noopener noreferrer"}},[e._v("(WebACS)"),t("OutboundLink")],1),e._v(" including help of WebACS "),t("strong",[e._v("without plugin help files")]),e._v(". ("),t("em",[e._v("read, write")]),e._v(")")])]),e._v(" "),t("h2",{attrs:{id:"physical-folder-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#physical-folder-structure"}},[e._v("#")]),e._v(" Physical folder structure")]),e._v(" "),t("p",[e._v("The virtual paths are represented by the following physical folder structure on the ARE:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ARE\n |-data/\n |-models/\n |-web/\n |index.html\n |-modelSettings/\n |-componentCollections/\n |-WebACS/\n |-webapps/\n")])])]),t("p",[e._v("The subpaths "),t("em",[e._v("rest/")]),e._v(" and "),t("em",[e._v("ws/")]),e._v(" are only virtual paths needed for the REST API and websocket functionalities.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[315],{961:function(e,t,s){"use strict";s.r(t);var a=s(2),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"are-webserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-webserver"}},[e._v("#")]),e._v(" ARE Webserver")]),e._v(" "),t("p",[e._v("The ARE provides a webserver with the document root at")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ARE/web/\n")])])]),t("p",[e._v("If you start the ARE, you can open the start page of the webserver by")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("http://localhost:8081/\n")])])]),t("p",[e._v("or")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("https://localhost:8083/\n")])])]),t("h2",{attrs:{id:"document-root-subpath-definitions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#document-root-subpath-definitions"}},[e._v("#")]),e._v(" Document root subpath definitions")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("/ or /index.html")]),e._v(": Landing page of the webserver. This URL provides some general informations about AsTeRICS and should link to the WebACS, REST demos and model demos. Can be overridden in case of an APE project. ("),t("em",[e._v("readonly")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("rest/")]),e._v(": This is the base path of the "),t("RouterLink",{attrs:{to:"/develop/are-remote-apis/REST-API.html"}},[e._v("REST interface")]),e._v(".\n("),t("em",[e._v("read, write")]),e._v(")")],1),e._v(" "),t("li",[t("strong",[e._v("ws/")]),e._v(": This is the base path of the websocket functionality. "),t("em",[e._v("(read, write)")])]),e._v(" "),t("li",[t("strong",[e._v("data/")]),e._v(": Reserved for providing access to the "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/bin/ARE/data/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ARE/data"),t("OutboundLink")],1),e._v(" folder containing model data files, plugin config files, plugin images,… ("),t("em",[e._v("read, write")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("models/")]),e._v(": Reserved for providing access to "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS/tree/master/bin/ARE/models/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ARE/models"),t("OutboundLink")],1),e._v(". ("),t("em",[e._v("read, write")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("modelSettings/")]),e._v(": Reserved for static or dynamically generated settings dialogs of a model targeted for end users (users with disabilities or care takers, personal assistents, occupational therapists,…) ("),t("em",[e._v("readonly")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("componentCollections/")]),e._v(": Reserved for providing various component collections describing the set of plugins available on an ARE installation. ("),t("em",[e._v("readonly")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("webapps")]),e._v("/: Reserved for web applications. Could be used to extend web functionality by (optional) web applications. ("),t("em",[e._v("read, write")]),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("WebACS/")]),e._v(": Base URL of the webbased AsTeRICS Configuration Suite "),t("a",{attrs:{href:"https://github.com/asterics/WebACS",target:"_blank",rel:"noopener noreferrer"}},[e._v("(WebACS)"),t("OutboundLink")],1),e._v(" including help of WebACS "),t("strong",[e._v("without plugin help files")]),e._v(". ("),t("em",[e._v("read, write")]),e._v(")")])]),e._v(" "),t("h2",{attrs:{id:"physical-folder-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#physical-folder-structure"}},[e._v("#")]),e._v(" Physical folder structure")]),e._v(" "),t("p",[e._v("The virtual paths are represented by the following physical folder structure on the ARE:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ARE\n |-data/\n |-models/\n |-web/\n |index.html\n |-modelSettings/\n |-componentCollections/\n |-WebACS/\n |-webapps/\n")])])]),t("p",[e._v("The subpaths "),t("em",[e._v("rest/")]),e._v(" and "),t("em",[e._v("ws/")]),e._v(" are only virtual paths needed for the REST API and websocket functionalities.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/315.e050d115.js b/assets/js/316.39f3e23c.js similarity index 99% rename from assets/js/315.e050d115.js rename to assets/js/316.39f3e23c.js index dd04ecf4ac..aed50066e8 100644 --- a/assets/js/315.e050d115.js +++ b/assets/js/316.39f3e23c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[315],{962:function(e,t,r){"use strict";r.r(t);var n=r(2),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#structure"}},[e._v("#")]),e._v(" Structure")]),e._v(" "),t("p",[e._v("This chapter is about the general structure of the AsTeRICS Grid project:")]),e._v(" "),t("ol",[t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/01_structure.html#project-structure"}},[e._v("Project structure")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/01_structure.html#sources-structure"}},[e._v("Sources structure")])],1)]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/develop/asterics-grid/"}},[e._v("Back to Overview")])],1),e._v(" "),t("h2",{attrs:{id:"project-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#project-structure"}},[e._v("#")]),e._v(" Project structure")]),e._v(" "),t("p",[e._v("The AsTeRICS Grid project is hosted on "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(". These are the main folders and files in the project:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("app/")]),e._v(": folder containing static and built resources for the actual AsTeRICS Grid application. Host this folder in addition to "),t("code",[e._v("../index.html")]),e._v(" in the root folder on webserver in order to and open the "),t("code",[e._v("../index.html")]),e._v(" file in order to start AsTeRICS Grid.")]),e._v(" "),t("li",[t("strong",[e._v("docs/")]),e._v(": folder containing various documentation resources, e.g. this manual")]),e._v(" "),t("li",[t("strong",[e._v("scripts/")]),e._v(": folder containing shell scripts, e.g. for releasing a new AsTeRICS Grid release")]),e._v(" "),t("li",[t("strong",[e._v("src/")]),e._v(": folder containing Javascript sources")]),e._v(" "),t("li",[t("strong",[e._v("superlogin/")]),e._v(": folder containing configuration of "),t("a",{attrs:{href:"https://github.com/sen-su/superlogin",target:"_blank",rel:"noopener noreferrer"}},[e._v("superlogin"),t("OutboundLink")],1),e._v(", a tool that handles users and databases for "),t("a",{attrs:{href:"http://couchdb.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CouchDB"),t("OutboundLink")],1),e._v(", the database backend used by AsTeRICS Grid.")]),e._v(" "),t("li",[t("strong",[e._v(".babelrc")]),e._v(": configuration for "),t("a",{attrs:{href:"https://babeljs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Babel"),t("OutboundLink")],1),e._v(" Javascript compiler, only needed for running "),t("a",{attrs:{href:"https://jestjs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Jest"),t("OutboundLink")],1),e._v(" tests, other Babel configuration is found in "),t("code",[e._v("webpack.config.js")])]),e._v(" "),t("li",[t("strong",[e._v(".gitignore")]),e._v(": file specifying which files to ignore by "),t("a",{attrs:{href:"https://git-scm.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Git"),t("OutboundLink")],1),e._v(" version control")]),e._v(" "),t("li",[t("strong",[e._v("CNAME")]),e._v(": configuration file of GitHub, specifying which alternative domain points to the version that is found on the GitHub "),t("a",{attrs:{href:"https://github.com/asterics/AsTeRICS-Grid/tree/gh-pages",target:"_blank",rel:"noopener noreferrer"}},[e._v("gh-pages branch"),t("OutboundLink")],1),e._v(". Therefore the version found on this branch is the version that is delivered when opening "),t("a",{attrs:{href:"https://grid.asterics.eu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://grid.asterics.eu/"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("index.html")]),e._v(": entry point of the application, uses resources from the "),t("code",[e._v("app/")]),e._v(" folder")]),e._v(" "),t("li",[t("strong",[e._v("LICENSE")]),e._v(": file specifying the license of AsTeRICS Grid which is "),t("a",{attrs:{href:"https://www.gnu.org/licenses/agpl-3.0.de.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("AGPL3"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("README.md")]),e._v(": markdown readme file for the GitHub project page")]),e._v(" "),t("li",[t("strong",[e._v("package.json")]),e._v(": "),t("a",{attrs:{href:"https://www.npmjs.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("npm"),t("OutboundLink")],1),e._v(" configuration file specifying dependencies and scripts for the AsTeRICS Grid project")]),e._v(" "),t("li",[t("strong",[e._v("package-lock.json")]),e._v(": file generated by "),t("a",{attrs:{href:"https://www.npmjs.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("npm"),t("OutboundLink")],1),e._v(" specifying the exact version of dependencies used in the project")]),e._v(" "),t("li",[t("strong",[e._v("webpack.config.js")]),e._v(": "),t("a",{attrs:{href:"https://webpack.js.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("webpack"),t("OutboundLink")],1),e._v(" configuration file specifying options for building and bundling the application")])]),e._v(" "),t("h2",{attrs:{id:"sources-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sources-structure"}},[e._v("#")]),e._v(" Sources structure")]),e._v(" "),t("p",[e._v("All custom sources are located in the "),t("code",[e._v("src")]),e._v(" folder which has the following structure:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("css/")]),e._v(": includes custom stylesheets")]),e._v(" "),t("li",[t("strong",[e._v("js/")]),e._v(": all pure Javascript sources\n"),t("ul",[t("li",[t("strong",[e._v("externals/")]),e._v(": folder including ES6 module wrapppers of libraries that are included externally within a "),t("code",[e._v(" + diff --git a/customize/environmental-control/index.html b/customize/environmental-control/index.html index f8f20f4ddd..e69c37be7b 100644 --- a/customize/environmental-control/index.html +++ b/customize/environmental-control/index.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

      - + diff --git a/customize/gaming-toys-music/index.html b/customize/gaming-toys-music/index.html index 19ae66b256..6ab652c7b1 100644 --- a/customize/gaming-toys-music/index.html +++ b/customize/gaming-toys-music/index.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

      - + diff --git a/customize/grid/Grid-Creation.html b/customize/grid/Grid-Creation.html index 8624cc48ee..cd76e5fb05 100644 --- a/customize/grid/Grid-Creation.html +++ b/customize/grid/Grid-Creation.html @@ -17,7 +17,7 @@ - + @@ -567,6 +567,6 @@ →

      - + diff --git a/customize/grid/Grid-Customization.html b/customize/grid/Grid-Customization.html index c8e90796a0..7d3b736f66 100644 --- a/customize/grid/Grid-Customization.html +++ b/customize/grid/Grid-Customization.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

      - + diff --git a/customize/grid/index.html b/customize/grid/index.html index c4f2a20b16..33d944d404 100644 --- a/customize/grid/index.html +++ b/customize/grid/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Customize Grid

In this section you will find short and simple tutorials about grid creation or the customization of an existing one.

Note

In case you need more detailed information, please check the AsTeRICS Grid user manual.

- + diff --git a/customize/index.html b/customize/index.html index 5723b7f947..16c19b6abc 100644 --- a/customize/index.html +++ b/customize/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Tutorials

Note

If you are an occupational therapist or an assistive technology professional or simply want to customize or create new solutions, this is the right place for you.

In this section you will find tutorials about model creation and editing.

If you would like to use a solution for a dedicated person with disabilities, go to the solutions page and start experimenting with solutions of the needed use case. Some solutions directly provide a settings page by clicking the Settings button. In case of the camera mouse this allows to configure the camera device, the mouse speed and other settings. Otherwise you will have to edit the underlying model directly. This can be done by clicking the Edit button.

# Go to

- + diff --git a/customize/model/Model-Creation.html b/customize/model/Model-Creation.html index 55c7babd5f..666a8c39a7 100644 --- a/customize/model/Model-Creation.html +++ b/customize/model/Model-Creation.html @@ -17,7 +17,7 @@ - + @@ -598,6 +598,6 @@ →

- + diff --git a/customize/model/Model-Customization.html b/customize/model/Model-Customization.html index 9280ecae15..604caf3752 100644 --- a/customize/model/Model-Customization.html +++ b/customize/model/Model-Customization.html @@ -17,7 +17,7 @@ - + @@ -558,6 +558,6 @@ →

- + diff --git a/customize/model/index.html b/customize/model/index.html index 55f09f6ba8..c69fd16550 100644 --- a/customize/model/index.html +++ b/customize/model/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Customize Model

In this section you will find tutorials about model creation or the customization of an existing one.

- + diff --git a/customize/other/index.html b/customize/other/index.html index 275c581318..f301c65d1f 100644 --- a/customize/other/index.html +++ b/customize/other/index.html @@ -17,7 +17,7 @@ - + @@ -558,6 +558,6 @@

- + diff --git a/develop/APE.html b/develop/APE.html index a7af0a0f53..30eaab7c2f 100644 --- a/develop/APE.html +++ b/develop/APE.html @@ -17,7 +17,7 @@ - + @@ -594,6 +594,6 @@ This can be changed by setting the property fx.deploy.nativeBundles to another value like deb. On Linux, although also a .rpm package could be created by JavaFX packaging technology, APE only supports debian packages because the ARE needs some postinstall and prerm operations in order to run on Linux.

# One model file, Mac OSX dmg installer

Run one of the above examples on Mac OSX to create a .dmg installer. The .dmg packaging dependencies should already be contained in your Mac OSX version.

# Properties for copying/extraction behaviour of APE

To change the behaviour of the ARE extraction with APE-copy, edit the following properties of APE.properties

  • ``APE.models```: Defines model files and folder containing model files to use
  • APE.dataCopyMode: Define if all the data files of the <ARE.baseURI>/data folder should be copied or just some.
  • APE.servicesFiles: Define if optional service configuration files should be used.

# Properties for installer creation

The provided build files only support a subset of the whole functionality of JavaFX packaging (opens new window). To change the behaviour of the installer creation, consider the following properties in APE.properties

  • fx.deploy.nativeBundles: To define installer type to create
  • fx.application.* and fx.info.*: To describe meta information of your application
  • fx.preferences.*: To define the desktop integration of the application
  • APE.embedJava and fx.platform.basedir: To embed a Java Runtime Environment into your native installer. The embedded java is linked to the native application launcher. If it is not embedded the default system java is used (only on Windows and Mac OSX).

# ARE customization

The ARE can be customized by replacing single files/resources (images, model files, component and services jars and the respective configurations,…) of the ARE installation with custom files of the folder <APE.projectDir>/custom/bin/ARE. You only must ensure to use the same relative file paths.

# Skipping non-used ARE services

If you want to exclude some of the ARE services (e.g. javacv-*.jar or cimcommunication*.jar), simply copy the services configuration files of <ARE.baseURI>/profile/*.ini to the <APE.projectDir>/custom/bin/ARE/profile folder and edit them. You can exclude a service by commenting it out (prepending #) in the respective .ini file.

# Installer customization

If you want to customize installer-specific configuration files (.e.g .iss for .exe installer) or add your own application icon. Use the respective platform-specific subfolder in the package folder. There you can place replacement files for the default ones. To find out the supported files, that can be replaced, enable verbosity by setting fx.deploy.verbose=true in the APE.properties file.

Summurized, the following steps are necessary:

  1. Enable verbose mode in APE.properties: fx.deploy.verbose=true
  2. Run ant deploy
  3. Copy the resources (e.g. .iss or icon files) from the temp folder of the installer creation to the package/<os> folder
  4. Edit the custom files
  5. Rerun ant deploy

If you want to know more, read Customizing the Package Using Drop-In Resources (opens new window).

# ant build files

The template directory contains two ant build files: build.xml and imported.xml. The file build.xml contains some targets left for customization of the deployment build process. The targets before-deploy, before-deploy-windows, before-deploy-linux and before-deploy-macosx are called after the APE-copy target and before the deploy target. This way generic and platform-specific task can be added before the installer creation is triggered. You can use it to delete files which are not needed for a certain target platform (e.g. ARE.exe on Linux or javacv-*-macosx on Windows). The second build-file imported.xml contains the internal targets and should not be modified except you really know, what you do.

- + diff --git a/develop/ARE API.html b/develop/ARE API.html index fa91f02ca4..42d3b0f7f9 100644 --- a/develop/ARE API.html +++ b/develop/ARE API.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# ARE Middleware

The ARE middleware is responsible for executing a model and transfering data and events from one plugin to a subsequent one. The ARE provides many services and utils which should be used when developing code for the ARE middleware or ARE plugins.

# Logging

# Model execution

# Event propagation

# Data propagation & conversion

# ARE Threading

# Threading concept

# Thread pool

# ARE Desktop (GUI)

- + diff --git a/develop/ARE-HW-Interfacing-CIM.html b/develop/ARE-HW-Interfacing-CIM.html index cb6b957937..7cff4fac16 100644 --- a/develop/ARE-HW-Interfacing-CIM.html +++ b/develop/ARE-HW-Interfacing-CIM.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Interfacing AsTeRICS HW using the CIM protocol

The tutorials can be found here here.

- + diff --git a/develop/ARE-Keyboard-Mouse-Services.html b/develop/ARE-Keyboard-Mouse-Services.html index 69e40ac78f..4499accb63 100644 --- a/develop/ARE-Keyboard-Mouse-Services.html +++ b/develop/ARE-Keyboard-Mouse-Services.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# ARE Keyboard and Mouse Services

The source code can be found here.

- + diff --git a/develop/ARE-Webserver.html b/develop/ARE-Webserver.html index 825f03fbfb..ddcfcbd033 100644 --- a/develop/ARE-Webserver.html +++ b/develop/ARE-Webserver.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# ARE Webserver

The ARE provides a webserver with the document root at

ARE/web/
 

Then you can open the start page by

http://localhost:8081/

- + diff --git a/develop/ARE.html b/develop/ARE.html index c1179b7056..1391269fec 100644 --- a/develop/ARE.html +++ b/develop/ARE.html @@ -17,7 +17,7 @@ - + @@ -898,6 +898,6 @@

This native C-code needs to be compiled into a .dll, the JNI header files and libraries have to be specified to the compiler and linker respectively. An example for the Microsoft Visual Studio build tools looks as follows:

cl -c -I "C:\Program Files (x86)\java\jdk1.6.0_21\include" -I "C:\Program Files (x86)\java\jdk1.6.0_21\include\win32" -I ".\3rdparylib" my_c_file.cpp /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue 
 link my_c_file.obj /DLL /OUT:".\my_c_file.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"libmsvc" /LIBPATH:"3rdparylib" "odbc32.lib" "odbccp32.lib" "comctl32.lib" "winmm.lib" "opengl32.lib" "ole32.lib" "strmiids.lib" "uuid.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "oleaut32.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"atlthunk" /NODEFAULTLIB:"LIBCMT"  /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:QUEUE
 

TIP

The compiler and linker switches may differ depending on the nature of your dependency libraries and setup.

# AsTeRICS Packaging Environment (APE)

The APE let’s you select a set of AsTeRICS model files and create a downstripped (minimum size) version of the ARE including plugins, configuration files and data files to execute the models. Optionally, the APE allows the creation of native installers for Windows, Linux incl. Raspberry Pi and Mac OSX using JavaFX packaging technology (opens new window).

See APE documentation (opens new window).

- + diff --git a/develop/ARE/ARE-Development-Manual.html b/develop/ARE/ARE-Development-Manual.html index d9a9069f0e..d0f3070b46 100644 --- a/develop/ARE/ARE-Development-Manual.html +++ b/develop/ARE/ARE-Development-Manual.html @@ -17,7 +17,7 @@ - + @@ -905,6 +905,6 @@ →

- + diff --git a/develop/ARE/index.html b/develop/ARE/index.html index f285c321f0..f118f59663 100644 --- a/develop/ARE/index.html +++ b/develop/ARE/index.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# ARE Development Overview

# The AsTeRICS Runtime Environment

The AsTeRICS Runtime environment (ARE) is an OSGi-based middleware [3] which allows software plugins to run in parallel. The plugins usually represent a sensor or an actuator and are implemented as independent OSGi bundles. The runtime environment identifies AsTeRICS plugins from other OSGi bundles based on metadata defined inside the plugins.

The ARE expects from plugin-developers to define the structure of their plugins (properties, inputs, outputs and event ports) in XML files. Based on these XMLs, the middleware constructs a runtime representation of each installed AsTeRICS plugin.

Furthermore, the ARE expects a runtime model (system model) which usually comes from the AsTeRICS Configuration Suite (ACS). The ACS is running on a Windows Personal Computer (.net 4.0 required) and mainly used to graphically design the layout of the system as a network of interconnected components. The system model is another XML file that defines the components participating in a specific application, connections between them, events and other properties. Based on this file, ARE knows which plugins to activate and how to define the data flow between them. Since the system model represents the main communication means between the ACS and the ARE, it is expected to be a serialisable object, easy to transfer and translate. ARE and ACS communicate through an appropriate TCP/IP-based communication protocol named ASAPI.

The ARE also provides “services” to plugin developers (for example communication support for COM ports) and it allows reporting errors on the runtime environment, registering event listeners and interacting with its graphical user interface (ARE GUI).

The ARE GUI is a simple graphical environment developed to allow end-users to interact directly with the runtime environment. It may be used to modify runtime parameters of a model via buttons or sliders, and to monitor live signals and events of the running model.

# ARE Components

The ARE consist of the following main parts:

  • The ARE middleware

  • ARE plugins (also referred to as “components”) – sensor, processor and actuator modules which provide functional building blocks for assistive functionalities

  • A service layer which provides infrastructure to the ARE components,
    for example COM port and communication management for connection of the Communication Interface Modules (CIMs)

The ARE is commonly deployed on an embedded device, running an appropriate operating system (OS), typically an embedded variant of Windows. On top of the OS, an appropriate Java Virtual Machine (JVM) is used to host the OSGi component framework which provides support for modularity and dynamic loading/unloading of components.

All the core components of the framework (described in detail later) are defined as OSGi modules. Certain components that need to access legacy code (e.g., written in C or C++) are also deployed on top of OSGi, and are interfaced to the native code using Java Native Interface (JNI) as needed. In this regard, and with the exception of the pluggable components that use native code interfaces with platform-specific JNI bindings, the ARE middleware is expected to be platform independent.

The implementation requires basically JAVA 1.7 (JDK/JRE 7) and an OSGi framework (which is part of the source code downloads).

# About OSGi

The Open Service Gateway initiative (OSGi) is an open specification that enables the modular assembly of software built with the Java technology [3]. The OSGi Service Platform facilitates the componentization of software modules and applications and assures interoperability of applications and services over a variety of networked devices.

OSGi technology is the dynamic module system for Java™. Java provides the portability that is required to support products on many different platforms. The OSGi technology provides the standardized primitives that allow applications to be constructed from small, reusable and collaborative components. These components can be composed into an application and deployed; The OSGi Service Platform provides a service-oriented architecture that enables these components to dynamically discover each other for collaboration, and thereby forms the optimal basis for the AsTeRICS middleware.

- + diff --git a/develop/AT-solution-demos.html b/develop/AT-solution-demos.html index 854f74c3d0..26bc485f55 100644 --- a/develop/AT-solution-demos.html +++ b/develop/AT-solution-demos.html @@ -17,7 +17,7 @@ - + @@ -556,6 +556,6 @@ (opens new window)

# AT Solutions Demos

Show github project search results here? With preview?? How to open Web UI of AT solution (embedded or external tab?)

List of AT solution demos (opens new window)

- + diff --git a/develop/AT_solution_development.html b/develop/AT_solution_development.html index f1250ff630..1f5c4fd3d7 100644 --- a/develop/AT_solution_development.html +++ b/develop/AT_solution_development.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# AT Solution

- + diff --git a/develop/Coding-Guidelines.html b/develop/Coding-Guidelines.html index 56ba4399f9..ddfea2e444 100644 --- a/develop/Coding-Guidelines.html +++ b/develop/Coding-Guidelines.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Coding Guidelines

- + diff --git a/develop/Development-Environment.html b/develop/Development-Environment.html index 2229667364..e0cf7d7513 100644 --- a/develop/Development-Environment.html +++ b/develop/Development-Environment.html @@ -17,7 +17,7 @@ - + @@ -566,6 +566,6 @@

# Eclipse Setup

The AsTeRICS framework is not bound to a specific IDE, but Eclipse IDE for Enterprise Java Developers (opens new window) is recommended. This will provide editing support for diverse file types (java, html, Js, CSS, xml). Alternately you can install Eclipse IDE for Java Developers and later install addons for web development.

# Java Project

You must create a Java Project first:

Choose File -> New -> JavaProject in the Eclipse main menu, disable the option “Use default location” and browse to the ARE subfolder:

Then you should see something like this:

Eclipse provides different views (Window -> Show View), where the Navigator and the Package Explorer are most useful for Java source code development.

Note that the “Refresh” command (F5) synchronizes the Navigator view with changes in the local file system.

# Character encoding

Incorrect character encoding settings can cause problems with ANT-based builds in eclipse, especially if special characters like ö, ä, etc. are used in the source code. Be sure to use ISO-8859-1 as character encoding in Configuations and Lauch settings (in the Common tab) as shown in the screenshot (note that this is not the default setting in some versions of eclipse):

# Editing Model Files (windows-only)

You can configure the Eclipse editor to open the ACS editor for AsTeRICS model files (.acs).

  1. Right click on a model file, select Open with/Other
  2. Check External programs and browse to C:\Program Files (x86)\AsTeRICS\ACS\ACS.bat (Note: ACS.bat)
  3. Check Use it for all `*.acs file
  4. Click onto Ok

# Ant within Eclipse

You can run the ant targets of the AsTeRICS build system from within Eclipse.

# Run default target

  1. Right click onto file build.xml
  2. Select Run As/Ant Build (first entry)

# Run selected targets

  1. Right click onto file build.xml
  2. Select Run As/Ant Build... (second entry)
  3. Click onto targets to run
  4. Select order of execution at the bottom
  5. Click onto Apply and Run

The screenshot below shows the dialog for build target selection: Screenshot of ant build target selection

- + diff --git a/develop/Plugin-Advanced.html b/develop/Plugin-Advanced.html index 896894f0ff..96451d9848 100644 --- a/develop/Plugin-Advanced.html +++ b/develop/Plugin-Advanced.html @@ -17,7 +17,7 @@ - + @@ -717,6 +717,6 @@ }); }

# Contributing a developed plugin (git pull request)

The AsTeRICS platform is designed as an open and modular platform. The idea is to make it easy for others to develop assistive plugins any end-user in the world could benefit from. Hence, we would love to get your contribution back to the github repository to be able to ship the new plugin with future releases. For this purpose, please send a pull request.

https://help.github.com/articles/using-pull-requests/ (opens new window)

- + diff --git a/develop/Plugin-Introduction.html b/develop/Plugin-Introduction.html index a88fa1e54a..def445183e 100644 --- a/develop/Plugin-Introduction.html +++ b/develop/Plugin-Introduction.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Plugin Introduction

# A Quick Guide to AsTeRICS Plugin Development

This section describes the AsTeRICS Plugin-Creation tool and the plugin-activation process. These tools make it easy to create new plugins and make them available in ACS and ARE. They can be started manually from their location in the AsTeRICS_runtime.zip package (folder: “ACS/tools”) – or they can be launched from the “Misc.” – Tab in the main menu of the ACS:

The creation of a new AsTeRICS plugin for the runtime environment involves several steps:

  • creating the folder structure to store the plugin files

  • creating the ANT build script file

  • creating the manifest file

  • creating the bundle-descriptor, which specifies the ports and properties of the plugin

  • creating the source code file of the JavaInstance

    • defining the ports and properties and implementing the get- and set-methods for input-, output-, eventListener- and evenTrigger ports

    • implementing the get- and set- methods for property values and the input ports receive handlers

  • creating the license files for the plugin and third-party libraries in the LICENSE subfolder

This process is similar for each plugin, and involves much work and sources of errors, especially for people who work with the AsTeRICS framework for the first time.

Usually, you look for a plugin with similar specifications, copy its folder structure and then rename and change the files as desired. But also this process needs some effort and errors/typos can be introduced very easily.

The purpose of the AsTeRICS Plugin Creation Tools is to make it easy to create new plugins, by providing the necessary folder structure, the bundle descriptor and a template for the JAVA source code.

# The Plugin Creation Wizard

The plugin Creation wizard allows definition of characteristics of a new plugin and creates the needed folders and files for the Eclipse build flow, including the JAVA source code skeleton and the plugin’s bundle descriptor.

As can be seen in the above figure, desired input- and output ports, data types, properties and plugin-features are simply selected and added to list boxes on the screen.

Important Notes:

  • the path to the target folder has to exist in the local file system, and must point to the ARE/components directory where all plugin source files are located, e.g.: “C:\asterics\bin\components\”.

  • The plugin name must be specified in CamelCase letters (capital first letter), e.g. “MyPlugin”. Type and Subcategory have to be specified - they define the location where the plugin will appear in the ACS Components menu.

  • It is possible to create a list of possible text-selections in a combo-box in the ACS property editor. The data type for this property must be integer, the property gets the number of the selected item. Text-captions for the combo-box entries must be separated with double slash, e.g: “Mode 1//Mode 2//Mode 3”.

# Created files and folders

After “Create Plugin!” has been pressed and the plugin creation was completed successfully, following sub-folders and files are begin created:

The root folder contains the build script, which can be executed inside Eclipse to compile and build the plugin (.jar) file:

The META-INF folder contains the manifest file

The “resources” folder contains the bundle descriptor (bundle_descriptor.xml):

The source code folder src/main/java/eu/asterics/component/<pluginType>/<pluginName> contains a template for the plugin source code in JAVA, including the definitions of the selected ports and properties and the needed get- and set- methods for ports and property values. The code skeleton complies to the AsTeRICS coding guidelines and contains the AsTeRICS source file header (only a small portion is shown in the following screenshot).

After the Eclipse IDE has been opened, Eclipse must be pushed to refresh the folder structure by pushing F5. Furthermore, the path src/main/java must be configured as source folder.

The plugin code can be built using the provided build script (right-click build.xml -> RunAs -> Ant Build in the plugin’s folder)

To see the plugin in the ACS editor window and/or start it inside the runtime environment, the Plugin Activation Tool can be used (see section 3).

# Plugin Activation in ACS and ARE

To use a new AsTeRICS plugin which has been built using the Eclipse build flow and exists as executable .jar file/OSGI bundle, one step is necessary:

  1. The Plugin has to be announced to the ACS – so that it gets visible in the graphical editor and can be used for the creation of deployment models. This is done by adding the bundle descriptor of the new plugin to a component-collection file (extension “.abd”) in the ACS-folder. These component collections contain all bundle-descriptors of components which can be used in the ACS. The new plugin section can be added either manually or can be downloaded from the running ARE via the ACS’ Component-Collection Manager (recommended, see 3.2.1). Using the Component Collection Manger, the downloaded collection can be stored as “default Component Collection” for the ACS, so that all components will be available when the ACS is started next time.

Subsequently, the plugin can be selected in the “components” menu of the ACS, and the ARE will activate the plugin at startup.

# Component-Collection Management in the ACS

The ACS provides a function for downloading the bundle descriptions of all active plugins directly from a running ARE and creating a component collection file from this information. (“System”- tab, Button “Download Component Collection”):

The component collection will be stored as “.abd” – file in the ACS folder, subfolder “componentcollections”. The new component collection can be used right after download, but will not be available after an ACS restart.

Within the ACS Component-Collection Manager (in the “Miscellaneous” tab), component collections can be selected or set as default collection for the ACS startup. For details see the User Manual, ACS section.

Please note that the “loader.ini” – file has to be updated manually in the ARE’s “profile” subfolder, by addition of the new .jar filename. After restart of the ARE and connection to the ACS, the component collection can be downloaded.

# Plugin License Declaration

Since AsTeRICS version 2.8 the licenses (including licenses of third-party libraries) of a plugin must be provided as .txt files in the LICENSE subfolder. The filenames must follow a defined naming convention, which is:

A contributor must add the respective license file for the component (either LICENSE_MITOrGPLv3WithException.txt or one of the two dual license options) to the component/LICENSE folder. Furthermore, for each thirdparty library used, the license file must be added with the following naming convention (Please use CamelCase notation for the library and license names):

THIRDPARTY_NameOfLibrary_LicenseNameInclVersionInfo.txt

- + diff --git a/develop/Plugin-Tutorial.html b/develop/Plugin-Tutorial.html index d98921a77d..a7134328a5 100644 --- a/develop/Plugin-Tutorial.html +++ b/develop/Plugin-Tutorial.html @@ -17,7 +17,7 @@ - + @@ -619,6 +619,6 @@ } }

TIP

The implementation details above build upon the code which is generated by the AsTeRICS PluginCreationWizard tool. Specifically, the above methods belong to the class of the desired “Averager” plugin, which extends and implements the abstract class “AbstractRuntimeComponentInstance”. This class provides some standard implementation of the lifecycle support methods.

The implementations of the input and output ports implement or override that of the “IRuntimeInputPort” and “DefaultRuntimeOutputPort” respectively. In the first case, the “receiveData” method is overridden so that the input bytes are converted to an integer, then processed using the local, private method “addInt”, and finally delegated to the output port. The latter has actually no implementation. A dummy implementation is used to illustrated overriding the “sendData” method, although this could be avoided altogether.

The private method “addInt” realized the core functionality of the averager component. Finally, the get/set property value methods are implemented to allow for getting/setting the value of the “buffer-size” property, in a straightforward manner.

- + diff --git a/develop/REST-API-java-client.html b/develop/REST-API-java-client.html index 8d6adaa25e..45776c6403 100644 --- a/develop/REST-API-java-client.html +++ b/develop/REST-API-java-client.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# REST Java Client library

The source code can be found here.

- + diff --git a/develop/REST-API-js-areCommunicator.html b/develop/REST-API-js-areCommunicator.html index 49442c4680..ab20d2818f 100644 --- a/develop/REST-API-js-areCommunicator.html +++ b/develop/REST-API-js-areCommunicator.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Javascript REST API client library

The source code can be found here.

- + diff --git a/develop/REST-API-js-wrapper-ext.html b/develop/REST-API-js-wrapper-ext.html index 9f024c5312..c24f2d869f 100644 --- a/develop/REST-API-js-wrapper-ext.html +++ b/develop/REST-API-js-wrapper-ext.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# Javascript model manipulation and deployment

  • Javascript libraries for model manipulation and model deployment:
- + diff --git a/develop/REST-API.html b/develop/REST-API.html index 7412ca4645..ddb337c3f3 100644 --- a/develop/REST-API.html +++ b/develop/REST-API.html @@ -17,7 +17,7 @@ - + @@ -557,6 +557,6 @@

or

https://localhost:8083/rest/<restmethod>
 

In order to get a list of all available rest methods use: http://localhost:8081/rest/restfunctions

- + diff --git a/develop/REST-demos.html b/develop/REST-demos.html index 2136b15441..c376bb9c22 100644 --- a/develop/REST-demos.html +++ b/develop/REST-demos.html @@ -17,7 +17,7 @@ - + @@ -561,6 +561,6 @@

Deploy and upload ARE models.

  • :

Get information and change the state of the current ARE model.

  • :

Subscribe to server sent events (SSE) of the current ARE model.

- + diff --git a/develop/Unit-Testing.html b/develop/Unit-Testing.html index 26759335fa..3bc874706b 100644 --- a/develop/Unit-Testing.html +++ b/develop/Unit-Testing.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Unit Testing

- + diff --git a/develop/are-remote-apis/REST-API.html b/develop/are-remote-apis/REST-API.html index 6cf1939856..f5777a8b9a 100644 --- a/develop/are-remote-apis/REST-API.html +++ b/develop/are-remote-apis/REST-API.html @@ -17,7 +17,7 @@ - + @@ -801,6 +801,6 @@ →

- + diff --git a/develop/are-remote-apis/REST-demos.html b/develop/are-remote-apis/REST-demos.html index 95842be6f5..2b116360ad 100644 --- a/develop/are-remote-apis/REST-demos.html +++ b/develop/are-remote-apis/REST-demos.html @@ -17,7 +17,7 @@ - + @@ -561,6 +561,6 @@

Deploy and upload ARE models.

  • :

Get information and change the state of the current ARE model.

  • :

Subscribe to server sent events (SSE) of the current ARE model.

- + diff --git a/develop/are-remote-apis/Webserver.html b/develop/are-remote-apis/Webserver.html index fc2f8c3efb..c419fd6ac4 100644 --- a/develop/are-remote-apis/Webserver.html +++ b/develop/are-remote-apis/Webserver.html @@ -17,7 +17,7 @@ - + @@ -575,6 +575,6 @@ →

- + diff --git a/develop/are-remote-apis/Websocket.html b/develop/are-remote-apis/Websocket.html index 6a09075f69..4e146a21d3 100644 --- a/develop/are-remote-apis/Websocket.html +++ b/develop/are-remote-apis/Websocket.html @@ -17,7 +17,7 @@ - + @@ -666,6 +666,6 @@ →

- + diff --git a/develop/are-remote-apis/index.html b/develop/are-remote-apis/index.html index 602c185a65..43f6accf4a 100644 --- a/develop/are-remote-apis/index.html +++ b/develop/are-remote-apis/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# ARE Remote APIs

The ARE provides several web-based interfaces which will be explained in the following tutorials:

- + diff --git a/develop/asterics-grid/01_structure.html b/develop/asterics-grid/01_structure.html index 13290cc1f1..38021e3309 100644 --- a/develop/asterics-grid/01_structure.html +++ b/develop/asterics-grid/01_structure.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/develop/asterics-grid/02_tools.html b/develop/asterics-grid/02_tools.html index a1a6d3b3d1..93785dd993 100644 --- a/develop/asterics-grid/02_tools.html +++ b/develop/asterics-grid/02_tools.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/develop/asterics-grid/03_grid.html b/develop/asterics-grid/03_grid.html index ca50779ae8..d75f902e98 100644 --- a/develop/asterics-grid/03_grid.html +++ b/develop/asterics-grid/03_grid.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/develop/asterics-grid/04_vuejs.html b/develop/asterics-grid/04_vuejs.html index 6de1802b58..00eb1a41cc 100644 --- a/develop/asterics-grid/04_vuejs.html +++ b/develop/asterics-grid/04_vuejs.html @@ -17,7 +17,7 @@ - + @@ -566,6 +566,6 @@ →

- + diff --git a/develop/asterics-grid/05_datamodel.html b/develop/asterics-grid/05_datamodel.html index 204411f091..b8e68e26da 100644 --- a/develop/asterics-grid/05_datamodel.html +++ b/develop/asterics-grid/05_datamodel.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/develop/asterics-grid/06_data_storage.html b/develop/asterics-grid/06_data_storage.html index dcb462c110..cefc60f1fd 100644 --- a/develop/asterics-grid/06_data_storage.html +++ b/develop/asterics-grid/06_data_storage.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/develop/asterics-grid/07_i18n.html b/develop/asterics-grid/07_i18n.html index dd9c96d3da..9494613ec0 100644 --- a/develop/asterics-grid/07_i18n.html +++ b/develop/asterics-grid/07_i18n.html @@ -17,7 +17,7 @@ - + @@ -569,6 +569,6 @@

- + diff --git a/develop/asterics-grid/collaboration.html b/develop/asterics-grid/collaboration.html index fca282910b..856c8aeee8 100644 --- a/develop/asterics-grid/collaboration.html +++ b/develop/asterics-grid/collaboration.html @@ -17,7 +17,7 @@ - + @@ -574,6 +574,6 @@

In general try to point people with requests to Github discussions, by adding a line like this at the end of your response:

We're trying to create a community around AsTeRICS Grid on Github discussions: https://github.com/asterics/AsTeRICS-Grid/discussions
 If you want to register on Github and you think your question (and it's answer) could be usable for other people, please consider posting your question there.
 

# Checking the server

Please go to grid.asterics.eu (opens new window) regularly and check if login with an existing online user is working. On the bottom left you should see the cloud symbol with a checkmark. If not, contact office@asterics-foundation.org

Back to Overview

- + diff --git a/develop/asterics-grid/index.html b/develop/asterics-grid/index.html index 30739a285a..c73a5775ad 100644 --- a/develop/asterics-grid/index.html +++ b/develop/asterics-grid/index.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# AsTeRICS Grid developer documentation

This is the developer documentation for AsTeRICS Grid, a web-based tool for augmented and alternative communication (AAC) with integration of the AsTeRICS Framework. For clarification of used terms see chapter Terms of the user documentation.

The following docs do not include interface documentation about all Javascript modules and their public methods. They can be found in (surely not always perfect) JSDoc (opens new window) format in the AsTeRICS Grid sources (opens new window).

This documentation is divided in the following parts:

  1. Project structure
  2. Used tools and libraries
  3. Dynamic grid
  4. Vue.js
  5. Data model
  6. Data storage
  7. Internationalization
  8. Testing
  9. Development setup
  10. Production setup

For general info about collaboration possibilities, see collaboration.md

- + diff --git a/develop/asterics-wiki/api/AsTeRICS Websocket.html b/develop/asterics-wiki/api/AsTeRICS Websocket.html index 446de4f9b0..41acf4352e 100644 --- a/develop/asterics-wiki/api/AsTeRICS Websocket.html +++ b/develop/asterics-wiki/api/AsTeRICS Websocket.html @@ -17,7 +17,7 @@ - + @@ -658,6 +658,6 @@ DISCONNECTED

In case of an error check if the ARE is running and the model with the WebSocket plugin is deployed and started.

# Example 2 - Web socket demo with signal data live chart

To try a more advanced web socket demo receiving signal data and visualizing it, please visit this web socket demo (opens new window) to see how it works. You can also clone and edit the corresponding git repository (opens new window).

# References

- + diff --git a/develop/asterics-wiki/api/REST-API.html b/develop/asterics-wiki/api/REST-API.html index f90343718a..47fcc3c759 100644 --- a/develop/asterics-wiki/api/REST-API.html +++ b/develop/asterics-wiki/api/REST-API.html @@ -17,7 +17,7 @@ - + @@ -791,6 +791,6 @@ </body> </html>
  1. Open the file in a browser.
  2. Click on the button Generate right click

# References

- + diff --git a/develop/asterics-wiki/api/Resource Handling.html b/develop/asterics-wiki/api/Resource Handling.html index 256c5b1721..aa5d638b2f 100644 --- a/develop/asterics-wiki/api/Resource Handling.html +++ b/develop/asterics-wiki/api/Resource Handling.html @@ -17,7 +17,7 @@ - + @@ -631,6 +631,6 @@ //If the element's type must be of String, you can convert it List<String> modelListAsStrings=ResourceRegistry.getInstance().toStringList(modelList);

The parameter of getModelList or getDataList defines, if the paths should be relative or absolute.

# References

- + diff --git a/develop/asterics-wiki/coding_instructions/AsTeRICS Solutions.html b/develop/asterics-wiki/coding_instructions/AsTeRICS Solutions.html index 6e80854896..c90a789c0a 100644 --- a/develop/asterics-wiki/coding_instructions/AsTeRICS Solutions.html +++ b/develop/asterics-wiki/coding_instructions/AsTeRICS Solutions.html @@ -17,7 +17,7 @@ - + @@ -597,6 +597,6 @@ </div> </header>
  1. Save files and run project

# Eclipse installation and setup

As APE uses the ant build framework, the repository can also be used with your preferred IDE. Subsequently some recommendations of how to install and setup Eclipse for an asterics solution repository.

  1. Install Eclipse for Java EE developers (opens new window) (Select same bitness as your JDK!! (x86 <-> x86 or x86_64 <-> x86_64))

# Eclipse project setup

  1. Click on File/New/Project
  2. Then click on Next, uncheck Use default location and browse to your asterics solution folder.
  3. Set a Project name
  4. Click onto Finish

Now you have an eclipse project with ant support.

# Configure editor for model files (.acs)

  1. Right click on model file, select Open with/Other
  2. Check External programs and browse to C:\Program Files (x86)\AsTeRICS\ACS\ACS.bat (Note: ACS.bat)
  3. Check Use it for all `*.acs file
  4. Click onto Ok

# Using ant within eclipse

# Run default target

This is synonymous to ant on the command line:

  1. Right click onto file build.xml
  2. Select Run As/Ant Build (first entry)

# Run selected targets

  1. Right click onto file build.xml
  2. Select Run As/Ant Build (second entry)
  3. Click onto targets to run
  4. Select order of execution at the bottom
  5. Click onto Apply and Run

From now on, the selected targets are the default ones for subsequent calls.

# References

- + diff --git a/develop/asterics-wiki/coding_instructions/AsTeRICS Webserver Document Root.html b/develop/asterics-wiki/coding_instructions/AsTeRICS Webserver Document Root.html index 22d3438961..6013380099 100644 --- a/develop/asterics-wiki/coding_instructions/AsTeRICS Webserver Document Root.html +++ b/develop/asterics-wiki/coding_instructions/AsTeRICS Webserver Document Root.html @@ -17,7 +17,7 @@ - + @@ -569,6 +569,6 @@ |-WebACS/ |-AsTeRICS-Ergo/

The subpaths rest/ and ws/ are only virtual paths needed for the REST API and websocket functionalities.

- + diff --git a/develop/asterics-wiki/coding_instructions/JavaCV.html b/develop/asterics-wiki/coding_instructions/JavaCV.html index ac613f65ef..3c1ce41712 100644 --- a/develop/asterics-wiki/coding_instructions/JavaCV.html +++ b/develop/asterics-wiki/coding_instructions/JavaCV.html @@ -17,7 +17,7 @@ - + @@ -655,6 +655,6 @@ e.printStackTrace(); }

# References

- + diff --git a/develop/asterics-wiki/coding_instructions/Unit Tests.html b/develop/asterics-wiki/coding_instructions/Unit Tests.html index 0eaa47f6af..6a19eb83f9 100644 --- a/develop/asterics-wiki/coding_instructions/Unit Tests.html +++ b/develop/asterics-wiki/coding_instructions/Unit Tests.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

Here you will find information for writing unit tests for ARE functionality.

- + diff --git a/develop/asterics-wiki/components/AsTeRICS Plugins.html b/develop/asterics-wiki/components/AsTeRICS Plugins.html index 28f801e7f2..b1ae6e375b 100644 --- a/develop/asterics-wiki/components/AsTeRICS Plugins.html +++ b/develop/asterics-wiki/components/AsTeRICS Plugins.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

Here you can find a quickstart guide for plugin development (opens new window).

Please also consult the Developer Manual (opens new window) for more details.

We would be happy to get your plugin contribution and add it to the repository. Send us a pull request or an e-mail as you like.

- + diff --git a/develop/at-solution/APE.html b/develop/at-solution/APE.html index 2440228fca..41c0776808 100644 --- a/develop/at-solution/APE.html +++ b/develop/at-solution/APE.html @@ -17,7 +17,7 @@ - + @@ -598,6 +598,6 @@

- + diff --git a/develop/at-solution/AT-solution-tutorial.html b/develop/at-solution/AT-solution-tutorial.html index 36317c6047..9c71449dbc 100644 --- a/develop/at-solution/AT-solution-tutorial.html +++ b/develop/at-solution/AT-solution-tutorial.html @@ -17,7 +17,7 @@ - + @@ -605,6 +605,6 @@ →

- + diff --git a/develop/at-solution/index.html b/develop/at-solution/index.html index 44b6d11299..03e44d0dac 100644 --- a/develop/at-solution/index.html +++ b/develop/at-solution/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# AT Solution Introduction (Demos)

An AT solution is an AsTeRICS based solution consisting of one or more model files and other resources like images, web pages and config files. You can see it as a standalone SW-project which can be mantained as a git repository.

Here is a list of AT solution examples:

List of AT solution demos (opens new window)

An AT solution uses the AsTeRICS Packaging Environment (APE) as build infrastructure and is based on the AsTeRICS Solution Template Repository (opens new window), which provides the needed folder structure.

- + diff --git a/develop/get-started/Coding-Guidelines.html b/develop/get-started/Coding-Guidelines.html index 9b1fa55af2..b48508a6bc 100644 --- a/develop/get-started/Coding-Guidelines.html +++ b/develop/get-started/Coding-Guidelines.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/develop/get-started/Development-Environment.html b/develop/get-started/Development-Environment.html index b3fb403c11..e5cfa985ff 100644 --- a/develop/get-started/Development-Environment.html +++ b/develop/get-started/Development-Environment.html @@ -17,7 +17,7 @@ - + @@ -570,6 +570,6 @@ →

- + diff --git a/develop/get-started/index.html b/develop/get-started/index.html index 39fc48f5d6..b11418397d 100644 --- a/develop/get-started/index.html +++ b/develop/get-started/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Development Environment Introduction

In this section you will find information on how to setup your development environment in order to develop AsTeRICS plugins or the ARE core.

- + diff --git a/develop/index.html b/develop/index.html index d4f8679dd5..6c1c8f219b 100644 --- a/develop/index.html +++ b/develop/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Develop

Note

If you are a developer or an AT expert with technical background, this is the right place for you.

In this section, you will find information for developing AsTeRICS or elements of it like plugins or AT solutions.

- + diff --git a/develop/plugin/Computer-Vision.html b/develop/plugin/Computer-Vision.html index 6960c977ba..e641ebf44a 100644 --- a/develop/plugin/Computer-Vision.html +++ b/develop/plugin/Computer-Vision.html @@ -17,7 +17,7 @@ - + @@ -663,6 +663,6 @@ →

- + diff --git a/develop/plugin/Plugin-Advanced.html b/develop/plugin/Plugin-Advanced.html index 140edb9fc1..9399082c8a 100644 --- a/develop/plugin/Plugin-Advanced.html +++ b/develop/plugin/Plugin-Advanced.html @@ -17,7 +17,7 @@ - + @@ -725,6 +725,6 @@ →

- + diff --git a/develop/plugin/Plugin-Averager.html b/develop/plugin/Plugin-Averager.html index e26b1cc938..617a3d9da2 100644 --- a/develop/plugin/Plugin-Averager.html +++ b/develop/plugin/Plugin-Averager.html @@ -17,7 +17,7 @@ - + @@ -627,6 +627,6 @@ →

- + diff --git a/develop/plugin/Resource-Handling.html b/develop/plugin/Resource-Handling.html index 0e75342abb..baeaa5121d 100644 --- a/develop/plugin/Resource-Handling.html +++ b/develop/plugin/Resource-Handling.html @@ -17,7 +17,7 @@ - + @@ -639,6 +639,6 @@ →

- + diff --git a/develop/plugin/index.html b/develop/plugin/index.html index 64fcf206ca..e4d356699d 100644 --- a/develop/plugin/index.html +++ b/develop/plugin/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Plugin Development

# A Quick Guide to AsTeRICS Plugin Development

This section describes the AsTeRICS Plugin-Creation tool and the plugin-activation process. These tools make it easy to create new plugins and make them available in ACS and ARE. They can be started manually from their location in the AsTeRICS_runtime.zip package (folder: “ACS/tools”) – or they can be launched from the “Misc.” – Tab in the main menu of the ACS:

The creation of a new AsTeRICS plugin for the runtime environment involves several steps:

  • creating the folder structure to store the plugin files

  • creating the ANT build script file

  • creating the manifest file

  • creating the bundle-descriptor, which specifies the ports and properties of the plugin

  • creating the source code file of the JavaInstance

    • defining the ports and properties and implementing the get- and set-methods for input-, output-, eventListener- and evenTrigger ports

    • implementing the get- and set- methods for property values and the input ports receive handlers

  • creating the license files for the plugin and third-party libraries in the LICENSE subfolder

This process is similar for each plugin, and involves much work and sources of errors, especially for people who work with the AsTeRICS framework for the first time.

Usually, you look for a plugin with similar specifications, copy its folder structure and then rename and change the files as desired. But also this process needs some effort and errors/typos can be introduced very easily.

The purpose of the AsTeRICS Plugin Creation Tools is to make it easy to create new plugins, by providing the necessary folder structure, the bundle descriptor and a template for the JAVA source code.

# The Plugin Creation Wizard

The plugin Creation wizard allows definition of characteristics of a new plugin and creates the needed folders and files for the Eclipse build flow, including the JAVA source code skeleton and the plugin’s bundle descriptor.

As can be seen in the above figure, desired input- and output ports, data types, properties and plugin-features are simply selected and added to list boxes on the screen.

Important Notes:

  • the path to the target folder has to exist in the local file system, and must point to the ARE/components directory where all plugin source files are located, e.g.: “C:\asterics\bin\components\”.

  • The plugin name must be specified in CamelCase letters (capital first letter), e.g. “MyPlugin”. Type and Subcategory have to be specified - they define the location where the plugin will appear in the ACS Components menu.

  • It is possible to create a list of possible text-selections in a combo-box in the ACS property editor. The data type for this property must be integer, the property gets the number of the selected item. Text-captions for the combo-box entries must be separated with double slash, e.g: “Mode 1//Mode 2//Mode 3”.

# Created files and folders

After “Create Plugin!” has been pressed and the plugin creation was completed successfully, following sub-folders and files are begin created:

The root folder contains the build script, which can be executed inside Eclipse to compile and build the plugin (.jar) file:

The META-INF folder contains the manifest file

The “resources” folder contains the bundle descriptor (bundle_descriptor.xml):

The source code folder src/main/java/eu/asterics/component/<pluginType>/<pluginName> contains a template for the plugin source code in JAVA, including the definitions of the selected ports and properties and the needed get- and set- methods for ports and property values. The code skeleton complies to the AsTeRICS coding guidelines and contains the AsTeRICS source file header (only a small portion is shown in the following screenshot).

After the Eclipse IDE has been opened, Eclipse must be pushed to refresh the folder structure by pushing F5. Furthermore, the path src/main/java must be configured as source folder.

The plugin code can be built using the provided build script (right-click build.xml -> RunAs -> Ant Build in the plugin’s folder)

To see the plugin in the ACS editor window and/or start it inside the runtime environment, the Plugin Activation Tool can be used (see section 3).

# Plugin Activation in ACS and ARE

To use a new AsTeRICS plugin which has been built using the Eclipse build flow and exists as executable .jar file/OSGI bundle, one step is necessary:

  1. The Plugin has to be announced to the ACS – so that it gets visible in the graphical editor and can be used for the creation of deployment models. This is done by adding the bundle descriptor of the new plugin to a component-collection file (extension “.abd”) in the ACS-folder. These component collections contain all bundle-descriptors of components which can be used in the ACS. The new plugin section can be added either manually or can be downloaded from the running ARE via the ACS’ Component-Collection Manager (recommended, see 3.2.1). Using the Component Collection Manger, the downloaded collection can be stored as “default Component Collection” for the ACS, so that all components will be available when the ACS is started next time.

Subsequently, the plugin can be selected in the “components” menu of the ACS, and the ARE will activate the plugin at startup.

# Component-Collection Management in the ACS

The ACS provides a function for downloading the bundle descriptions of all active plugins directly from a running ARE and creating a component collection file from this information. (“System”- tab, Button “Download Component Collection”):

The component collection will be stored as “.abd” – file in the ACS folder, subfolder “componentcollections”. The new component collection can be used right after download, but will not be available after an ACS restart.

Within the ACS Component-Collection Manager (in the “Miscellaneous” tab), component collections can be selected or set as default collection for the ACS startup. For details see the User Manual, ACS section.

Please note that the “loader.ini” – file has to be updated manually in the ARE’s “profile” subfolder, by addition of the new .jar filename. After restart of the ARE and connection to the ACS, the component collection can be downloaded.

# Plugin License Declaration

Since AsTeRICS version 2.8 the licenses (including licenses of third-party libraries) of a plugin must be provided as .txt files in the LICENSE subfolder. The filenames must follow a defined naming convention, which is:

A contributor must add the respective license file for the component (either LICENSE_MITOrGPLv3WithException.txt or one of the two dual license options) to the component/LICENSE folder. Furthermore, for each thirdparty library used, the license file must be added with the following naming convention (Please use CamelCase notation for the library and license names):

THIRDPARTY_NameOfLibrary_LicenseNameInclVersionInfo.txt

- + diff --git a/get-involved/About-us.html b/get-involved/About-us.html index 0be46262ee..29388a9d91 100644 --- a/get-involved/About-us.html +++ b/get-involved/About-us.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# About Us

The AsTeRICS framework was initially developed from 2010 to 2013 by an international consortium. The project was funded by the European Commission under the Seventh Framework Programme for Research and Technological Development (FP7 - 2007-2013). G.A.No. 247730. Please go to the AsTeRICS project (opens new window) web page for more details.

Since 2013 there were many follow-up projects, with important improvements to the AsTeRICS framework. Please find below a list of the involved projects in chronological order:

# AsTeRICS Foundation

In Feb. 2017 the AsTeRICS Foundation (opens new window) was founded with the objective of bringing the project results to people with disabilities, to organize workshops and to coordinate new projects in that field.

New contributions are managed by the members (opens new window) of the foundation.

If you have any questions, comments, suggestions about the AsTeRICS framework, feel free to contact us (opens new window).

If you want to contribute to the project, please read the contribute page first.

# Partner Organizations

The projects above were initiated and executed by the following partner organizations:

- + diff --git a/get-involved/Contact.html b/get-involved/Contact.html index d43d0ad54a..c8e551b069 100644 --- a/get-involved/Contact.html +++ b/get-involved/Contact.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Contact

If you have any questions, comments, suggestions about the AsTeRICS framework, feel free to contact us (opens new window).

If you want to contribute to the project, please read the contribute page first.

For information about publisher and editorial responsibility, please read the legal-notice.

- + diff --git a/get-involved/Contribute.html b/get-involved/Contribute.html index d7d95609bc..96ed5d1843 100644 --- a/get-involved/Contribute.html +++ b/get-involved/Contribute.html @@ -17,7 +17,7 @@ - + @@ -556,6 +556,6 @@ (opens new window)

# Contribute

The AsTeRICS framework is Open Source and mainly driven by funded projects and the AsTeRICS foundation.

Contributions from the community are absolutely welcome and could be in form of documentation, issue or code.

# Donation

We need donations in order to continue the development and maintainance of the tools and to continuously provide the hosting of AsTeRICS grid and the consulting and assembly of Assistive solutions. The donation will go to the non-profit organization Asterics Foundation (opens new window) which maintains the project results and continues development of assistive tools.

# Documentation

This web page is orchestrated in the asterics-docs (opens new window) repository which again fetches documentation from other repositories of the AsTeRICS framework. Most of the content is documented in AsTeRICS/Documentation/docs (opens new window).

If you see any typo, missing or wrong information on a page, please click onto the Edit this page on GitHub link, which can be found on the bottom of each page. You will be autmatically redirected to the respective markdown document in the source repository. After editing please send a pull request to the respective repository.

Additionally, you can find the links to the Editors Guide , the Markdown Guide and the Developer Guide , next to every edit link.

# Issue / Bug Report

If you find a bug or would like to suggest a feature, please go to the issue tracking page of the respective repository.

Please use the following issue tracker, regarding

# Code

If you want to contribute code, please fork the respective respository and send a pull request to us.

Please use the following repositories, regarding

- + diff --git a/get-involved/Legal-Notice.html b/get-involved/Legal-Notice.html index 9da0eae11b..3eb77d9bd8 100644 --- a/get-involved/Legal-Notice.html +++ b/get-involved/Legal-Notice.html @@ -17,7 +17,7 @@ - + @@ -557,6 +557,6 @@ 1060 Vienna

T: +43 1 588 39-0 F: +43 1 588 39-49

E-Mail

# Management

Gabriele Költringer, EMBA (Managing Director)

# Managing Comitee

Dr. Ulrike Baumgartner-Gabitzer, Mag. Wilhelm Grosseibl, DI Dr. Kurt Hofstädter (vice chairman), Dr. Kari Kapsch, DI Anton Plimon, Dr. Lothar Roitner (chairman), Mag. Dr. Gerhard Riemer

# Basic objective

Internet presence to promote and support activities of the organization.

# Responsible for Content & Webmaster

Project: StudyATHome Internationally (opens new window)
Lead: Martin Deinhofer,E-Mail

# Disclaimer

The UAS Technikum Wien makes every effort to ensure that the material contained on its website is current, complete and correct. Despite this, errors and mistakes cannot be completely ruled out. The UAS Technikum Wien does not accept liability for the relevance, accuracy or completeness of the information and material offered on its website.

Links to external websites have been chosen carefully. As they are outside the control of the UAS Technikum Wien, the UAS Technikum Wien accepts no responsibility for these sites.

Copyright and legal right of use for texts, graphics, design, und source code belong to the UAS Technikum Wien, so does the legal right for the photos, if not linked from external websites.

Issuing, usage and disclosure of information for not commercial reasons is enabled, as long as the content remains unchanged and the source is mentioned (Source: UAS Technikum Wien). The layout of the homepage, graphics and pictures used and the collection of individual contributions are protected by copyright.

- + diff --git a/get-involved/index.html b/get-involved/index.html index 9e67931f5f..d16b282d22 100644 --- a/get-involved/index.html +++ b/get-involved/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)
- + diff --git a/get-started/Demos.html b/get-started/Demos.html index 61c3962f47..eaae40e74e 100644 --- a/get-started/Demos.html +++ b/get-started/Demos.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)
- + diff --git a/get-started/Installation.html b/get-started/Installation.html index 3c0937b4f1..9c5160b56b 100644 --- a/get-started/Installation.html +++ b/get-started/Installation.html @@ -17,7 +17,7 @@ - + @@ -580,6 +580,6 @@

- + diff --git a/get-started/Overview.html b/get-started/Overview.html index 1da69152a6..b65e15e69c 100644 --- a/get-started/Overview.html +++ b/get-started/Overview.html @@ -17,7 +17,7 @@ - + @@ -559,6 +559,6 @@ →

- + diff --git a/get-started/index.html b/get-started/index.html index ef4c9464be..2878577f84 100644 --- a/get-started/index.html +++ b/get-started/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Get Started

Note

If you are a person with disabilities, an occupational therapist or someone who simply wants to use existing solutions, this is the right place for you.

In this section you will get an overview of AsTeRICS elements and learn how to install it and find existing solutions.

# Go to

  • Overview to get an overview of AsTeRICS elements and executables.
  • Installation to learn how to install AsTeRICS on your platform.
  • Solutions to discover existing solutions for people with disabilities.
  • Customize to modify existing solutions or create new ones.
- + diff --git a/guide/docs.html b/guide/docs.html index 064773863d..dabd685a7b 100644 --- a/guide/docs.html +++ b/guide/docs.html @@ -17,7 +17,7 @@ - + @@ -678,6 +678,6 @@ type sourceConfig = normalSourcesConfig;
- + diff --git a/guide/editor.html b/guide/editor.html index 8df65ee98f..adb3428e1e 100644 --- a/guide/editor.html +++ b/guide/editor.html @@ -17,7 +17,7 @@ - + @@ -570,6 +570,6 @@ When saving changes inside those files, a new build is triggered and the content displayed in the browser is updated, automatically.

After finishing editing the files, you need to create a pull request or commit and push your changes to the source repository. Please check the developer guide for this purpose.

# Publishing Updates

You can’t publish new builds of the website by yourself. The developers of this website integrate incoming pull request regularly. After adding the pull request, the website is built and published with the most recent content.

- + diff --git a/guide/markdown.html b/guide/markdown.html index ca46a678c0..b82b2893e8 100644 --- a/guide/markdown.html +++ b/guide/markdown.html @@ -17,7 +17,7 @@ - + @@ -648,6 +648,6 @@ image: /plugins/actuators/android.svg ---

# subcategory

  • Type: string
  • Default: null

Sub category of the plugin.

  • Type: boolean
  • Default: false

Diplay plugin in featured selection.

# image

  • Type: string
  • Default: null

Image in search overview for the plugin.

Note

If no image or FontAwesome icon (fa-icon, fas-icon, far-icon, fab-icon) is specified, the AsTeRICS logo is displayed instead.

# fa-icon

  • Type: string
  • Default: null

FontAwesome (opens new window) (solid (opens new window)) icon.

# fas-icon

  • Type: string
  • Default: null

FontAwesome (solid (opens new window)) icon.

# far-icon

  • Type: string
  • Default: null

FontAwesome (regular (opens new window)) icon.

# fab-icon

FontAwesome (brand (opens new window)) icon.

- + diff --git a/index.html b/index.html index 344dc20485..76f757c767 100644 --- a/index.html +++ b/index.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@
Emulate mouse, keyboard or joystick for playing games or remote control toy helicopters or cars.
Accessible Music
Generate sounds or play adapted music instruments.

# Why AsTeRICS?

There are many Assistive Technologies available on the market, but in many cases they are too expensive or not suitable for a certain combination of disabilities.

AsTeRICS

  • provides support for many consumer devices which can be used as input devices (e.g. switches, eye-tracker, webcam, …).
  • let’s you combine several input devices depending on your capabilities (e.g. 2 switches + 1 eye-tracker).
  • provides support for many use cases (e.g. computer control, environmental control).
  • has more than 160 plugins.
  • allows easily customizing existing solutions or designing new ones.
  • is Open Source, which means that it is free forever and others can contribute to the framework.

# Partners & Funding

The AsTeRICS project was funded by international and national research grants. AsTeRICS was initiated by KI-I Linz (opens new window) and the UAS Technikum Wien (opens new window). The creation of this web page was funded by the City of Vienna, MA23, in course of the project StudyATHome Internationally (Grant Nr. 22-07). In Feb. 2017 the AsTeRICS Foundation (opens new window) was founded to bring the project results to people with disabilities, to organize workshops and to maintain project results, see About Us.

  • MA23, City of Vienna - Logo
  • UAS Technikum Wien - Logo
  • ToRaDes - Project Logo
  • KI-I
  • StudyATHome Internationally - Project Logo

# Donation

We need donations in order to continue the development and maintainance of the tools and to continuously provide the hosting of AsTeRICS grid and the consulting and assembly of Assistive solutions. The donation will go to the non-profit organization Asterics Foundation (opens new window) which maintains the project results and continues development of assistive tools.

# AsTeRICS Project Web Page

This is a newly created web page to present AsTeRICS technologies and corresponding documentation. If you are looking for the web page of the original AsTeRICS project, please go to https://project.asterics.eu (opens new window).

- + diff --git a/manuals/ACS/Actuators.html b/manuals/ACS/Actuators.html index 6f20d3ed9b..7f274ce162 100644 --- a/manuals/ACS/Actuators.html +++ b/manuals/ACS/Actuators.html @@ -17,7 +17,7 @@ - + @@ -558,6 +558,6 @@ →

- + diff --git a/manuals/ACS/Channels.html b/manuals/ACS/Channels.html index ce212060eb..c85c6705b4 100644 --- a/manuals/ACS/Channels.html +++ b/manuals/ACS/Channels.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Colours_settings.html b/manuals/ACS/Colours_settings.html index 51878a7460..f9ecd376c3 100644 --- a/manuals/ACS/Colours_settings.html +++ b/manuals/ACS/Colours_settings.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Component_Collection_Manager.html b/manuals/ACS/Component_Collection_Manager.html index 088b11e710..53ba5c8b48 100644 --- a/manuals/ACS/Component_Collection_Manager.html +++ b/manuals/ACS/Component_Collection_Manager.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Component_Context_Menu.html b/manuals/ACS/Component_Context_Menu.html index 6a83210dab..79a195dbec 100644 --- a/manuals/ACS/Component_Context_Menu.html +++ b/manuals/ACS/Component_Context_Menu.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Connected.html b/manuals/ACS/Connected.html index cbddec79f1..83b8d0254e 100644 --- a/manuals/ACS/Connected.html +++ b/manuals/ACS/Connected.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Control_the_ARE.html b/manuals/ACS/Control_the_ARE.html index 8fa3be5ca4..0d7125a69a 100644 --- a/manuals/ACS/Control_the_ARE.html +++ b/manuals/ACS/Control_the_ARE.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Create_and_Edit_a_Model.html b/manuals/ACS/Create_and_Edit_a_Model.html index 335b590e0b..d312727e9a 100644 --- a/manuals/ACS/Create_and_Edit_a_Model.html +++ b/manuals/ACS/Create_and_Edit_a_Model.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Dialogs_settings.html b/manuals/ACS/Dialogs_settings.html index 25f27bc1f0..8c4dcf79d4 100644 --- a/manuals/ACS/Dialogs_settings.html +++ b/manuals/ACS/Dialogs_settings.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Disconnected.html b/manuals/ACS/Disconnected.html index 218d941a13..32c31255a4 100644 --- a/manuals/ACS/Disconnected.html +++ b/manuals/ACS/Disconnected.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Events.html b/manuals/ACS/Events.html index 28e8b7f1b9..6966664561 100644 --- a/manuals/ACS/Events.html +++ b/manuals/ACS/Events.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/External_Tools.html b/manuals/ACS/External_Tools.html index 44e2d52209..6e4aeba08d 100644 --- a/manuals/ACS/External_Tools.html +++ b/manuals/ACS/External_Tools.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/manuals/ACS/External_Tools_Options.html b/manuals/ACS/External_Tools_Options.html index ed0f08eca9..cfe2c43462 100644 --- a/manuals/ACS/External_Tools_Options.html +++ b/manuals/ACS/External_Tools_Options.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/GUI_Designer.html b/manuals/ACS/GUI_Designer.html index e92439a6b7..70b4c94473 100644 --- a/manuals/ACS/GUI_Designer.html +++ b/manuals/ACS/GUI_Designer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/General_settings.html b/manuals/ACS/General_settings.html index 1c493392d7..d278e9b7a1 100644 --- a/manuals/ACS/General_settings.html +++ b/manuals/ACS/General_settings.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Keyboard_control.html b/manuals/ACS/Keyboard_control.html index 08b48c182e..ebf9f53f5a 100644 --- a/manuals/ACS/Keyboard_control.html +++ b/manuals/ACS/Keyboard_control.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Load_and_Save_Models.html b/manuals/ACS/Load_and_Save_Models.html index 9650db41cc..1e125c817c 100644 --- a/manuals/ACS/Load_and_Save_Models.html +++ b/manuals/ACS/Load_and_Save_Models.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Miscellaneous.html b/manuals/ACS/Miscellaneous.html index 682e586c2b..506057a2f5 100644 --- a/manuals/ACS/Miscellaneous.html +++ b/manuals/ACS/Miscellaneous.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Modes.html b/manuals/ACS/Modes.html index 3d109cdb64..af3ed6f089 100644 --- a/manuals/ACS/Modes.html +++ b/manuals/ACS/Modes.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Options.html b/manuals/ACS/Options.html index 2e6a00d976..852b06ad76 100644 --- a/manuals/ACS/Options.html +++ b/manuals/ACS/Options.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Pause.html b/manuals/ACS/Pause.html index 8c9c9031ab..750b57e066 100644 --- a/manuals/ACS/Pause.html +++ b/manuals/ACS/Pause.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Print.html b/manuals/ACS/Print.html index 588da6f082..c23e04e20e 100644 --- a/manuals/ACS/Print.html +++ b/manuals/ACS/Print.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Processors.html b/manuals/ACS/Processors.html index 63c010643e..c125d4ace7 100644 --- a/manuals/ACS/Processors.html +++ b/manuals/ACS/Processors.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Running.html b/manuals/ACS/Running.html index 7d61130a85..4cc8cc81f1 100644 --- a/manuals/ACS/Running.html +++ b/manuals/ACS/Running.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Sensors.html b/manuals/ACS/Sensors.html index 95bc522843..a476d09f68 100644 --- a/manuals/ACS/Sensors.html +++ b/manuals/ACS/Sensors.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Setting_the_Properties.html b/manuals/ACS/Setting_the_Properties.html index 0435bce98b..13b79c0744 100644 --- a/manuals/ACS/Setting_the_Properties.html +++ b/manuals/ACS/Setting_the_Properties.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Status_Reporting_and_Error_Logging.html b/manuals/ACS/Status_Reporting_and_Error_Logging.html index 3471238fb0..91ec65d94c 100644 --- a/manuals/ACS/Status_Reporting_and_Error_Logging.html +++ b/manuals/ACS/Status_Reporting_and_Error_Logging.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Synchronized.html b/manuals/ACS/Synchronized.html index 8e8195afdc..2c15a882fb 100644 --- a/manuals/ACS/Synchronized.html +++ b/manuals/ACS/Synchronized.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/The_Edit_Tab.html b/manuals/ACS/The_Edit_Tab.html index 45fea8cc4e..40ff1eee29 100644 --- a/manuals/ACS/The_Edit_Tab.html +++ b/manuals/ACS/The_Edit_Tab.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/ACS/Tooltips.html b/manuals/ACS/Tooltips.html index 80e9899334..84a4e7acb0 100644 --- a/manuals/ACS/Tooltips.html +++ b/manuals/ACS/Tooltips.html @@ -17,7 +17,7 @@ - + @@ -558,6 +558,6 @@

- + diff --git a/manuals/ACS/index.html b/manuals/ACS/index.html index 2cfefa8b8e..b87c57507a 100644 --- a/manuals/ACS/index.html +++ b/manuals/ACS/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# ACS Manual

The figure below shows the main panel of the AsTeRICS Configuration Suite after the application has started. The screen is divided in four main areas, the menu area (1), the Deployment area (2) (where the drawing will be done), the GUI Designer area (3), switchable with the Deployment area and the Properties area (4), where the settings of the components can be adapted.

Screenshot: ACS after startup

ACS after Startup

Additionally, the main menu will open, if the AsTeRICS-Button is pressed in the menu bar - see figure below. All functions of the main menu are also reachable via buttons in the tabs, except the About and the Print dialog. This dialog shows general information about the ACS and the AsTeRICS project.

Screenshot: Menu Bar with Open Main Menu

Menu Bar with Open Main Menu

- + diff --git a/manuals/ARE/index.html b/manuals/ARE/index.html index dd0273cb63..ec680cc237 100644 --- a/manuals/ARE/index.html +++ b/manuals/ARE/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# ARE Manual

Note

This is the user manual of the ARE program.

- + diff --git a/manuals/WebACS/AREStatus.html b/manuals/WebACS/AREStatus.html index 686c34c5aa..f704fd2560 100644 --- a/manuals/WebACS/AREStatus.html +++ b/manuals/WebACS/AREStatus.html @@ -17,7 +17,7 @@ - + @@ -558,6 +558,6 @@ →

- + diff --git a/manuals/WebACS/Channels.html b/manuals/WebACS/Channels.html index 312356e8a0..d53e2a2548 100644 --- a/manuals/WebACS/Channels.html +++ b/manuals/WebACS/Channels.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/Control_the_ARE.html b/manuals/WebACS/Control_the_ARE.html index b6dd74a3fc..7856e62505 100644 --- a/manuals/WebACS/Control_the_ARE.html +++ b/manuals/WebACS/Control_the_ARE.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/Create_and_Edit_a_Model.html b/manuals/WebACS/Create_and_Edit_a_Model.html index 5b1124c73a..e668042e45 100644 --- a/manuals/WebACS/Create_and_Edit_a_Model.html +++ b/manuals/WebACS/Create_and_Edit_a_Model.html @@ -17,7 +17,7 @@ - + @@ -566,6 +566,6 @@ →

- + diff --git a/manuals/WebACS/Events.html b/manuals/WebACS/Events.html index d9e702e413..04ab1ce5ba 100644 --- a/manuals/WebACS/Events.html +++ b/manuals/WebACS/Events.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/GUI_Designer.html b/manuals/WebACS/GUI_Designer.html index 597b88dd97..2ef505c67f 100644 --- a/manuals/WebACS/GUI_Designer.html +++ b/manuals/WebACS/GUI_Designer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/Keyboard_control.html b/manuals/WebACS/Keyboard_control.html index bbfe180ec4..f234439efd 100644 --- a/manuals/WebACS/Keyboard_control.html +++ b/manuals/WebACS/Keyboard_control.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/manuals/WebACS/List_View.html b/manuals/WebACS/List_View.html index 0acb3b1b6f..2bcd7cdbf4 100644 --- a/manuals/WebACS/List_View.html +++ b/manuals/WebACS/List_View.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/manuals/WebACS/Miscellaneous.html b/manuals/WebACS/Miscellaneous.html index 71188af164..eef1142316 100644 --- a/manuals/WebACS/Miscellaneous.html +++ b/manuals/WebACS/Miscellaneous.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/Open_and_Save_Models.html b/manuals/WebACS/Open_and_Save_Models.html index 9b4f4c3691..7ff65d3cb6 100644 --- a/manuals/WebACS/Open_and_Save_Models.html +++ b/manuals/WebACS/Open_and_Save_Models.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/Setting_the_Properties.html b/manuals/WebACS/Setting_the_Properties.html index ddf2f7e026..8dd0d0f647 100644 --- a/manuals/WebACS/Setting_the_Properties.html +++ b/manuals/WebACS/Setting_the_Properties.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/manuals/WebACS/The_Edit_Tab.html b/manuals/WebACS/The_Edit_Tab.html index 33609cdddc..26d3766d88 100644 --- a/manuals/WebACS/The_Edit_Tab.html +++ b/manuals/WebACS/The_Edit_Tab.html @@ -17,7 +17,7 @@ - + @@ -558,6 +558,6 @@

- + diff --git a/manuals/WebACS/index.html b/manuals/WebACS/index.html index e20713d5b4..4ff7297077 100644 --- a/manuals/WebACS/index.html +++ b/manuals/WebACS/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# ACS Basic Functions

The AsTeRICS Configuration Suite (ACS) is a web application, which can be run either locally (by simply opening index.html in a webbrowser) or inside a webserver (by entering the respective URL in the webbrowser). Note that the WebACS is currently optimised for usage with Mozilla Firefox 56 or later.

The figure below shows the WebACS after startup. The red numbers point out the most important areas:

  1. Menu
  2. Model Designer: graphical representation of current AsTeRICS model
  3. GUI Designer: graphical editor for runtime user interface
  4. List View: current AsTeRICS model as a list of elements and their interrelations
  5. Property Editor: for adapting the properties of the selected element

Screenshot: ACS after startup

ACS after Startup

- + diff --git a/manuals/asterics-grid/010_settings.html b/manuals/asterics-grid/010_settings.html index 2babd80f60..0b50a9428e 100644 --- a/manuals/asterics-grid/010_settings.html +++ b/manuals/asterics-grid/010_settings.html @@ -17,7 +17,7 @@ - + @@ -553,11 +553,11 @@ Yorùbá (opens new window)

# Settings

Please have a look at the ARASAAC user manual / settings page (opens new window).

# Settings

Please have a look at the ARASAAC user manual / settings page (opens new window).

- + diff --git a/manuals/asterics-grid/01_terms.html b/manuals/asterics-grid/01_terms.html index 6ca22de501..64e9a59767 100644 --- a/manuals/asterics-grid/01_terms.html +++ b/manuals/asterics-grid/01_terms.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Terms

This chapter explains the most important terms used in relation to the AsTeRICS Grid.

Back to Overview

# AsTeRICS Grid

Web-based application for AAC solutions, runs in the browser (e.g. Firefox, Chrome, Edge, Internet Explorer, mobile Browsers).

# AsTeRICS Framework

Java-based software suite that runs on a computer and makes it possible to trigger additional actions using the AsTeRICS Grid, e.g. controlling a TV (environmental control). See AsTeRICS Framework (opens new window) on the web.

# AsTeRICS model

An AsTeRICS model is a configuration for the AsTeRICS Framework which realizes a certain use-case, e.g. environmental control, camera based head-tracking or eye-tracking. A model that runs in the AsTeRICS Framework can interact with the AsTeRICS Grid.

# Grid

Term for a single page in the AsTeRICS Grid, consisting of several grid elements. The number of elements a grid contains is flexible.

# Grid element

A grid element is part of a grid and normally consists of a label and/or an image. Selecting a grid element normally triggers an action, e.g. navigating to another grid.

There are 3 types of grid elements:

  1. Normal: an element consisting of a label and/or an image
  2. Collect element: an element that collects the labels of previously selected elements and therefore makes it possible to construct e.g. sentences out of single word elements.
  3. Prediction element: an element that is dynamically filled up with word predictions based on previously selected normal elements.

# Action

An action that is performed if a grid element is selected, e.g. navigate to another grid, speak some text or some external action like turning on a light. See Grid element actions.

# Input

In the context of AsTeRICS Grid “input” refers to the mean of selecting a grid element. This can be e.g. a normal mouse click, hovering or scanning. See Input options.

# Dictionary

A dictionary is a set of words that is used to fill up prediction grid elements. By default a dictionary including the most frequent english/german words is used, but also custom dictionaries can be used. See Dictionaries.

# User

In AsTeRICS Grid a “user” refers to a username and a set of grids, which in sum realize a solution for an actual user. There are two types of users in AsTeRICS Grid:

  1. Offline users: are users whose grids are only stored locally on the used device.
  2. Online users: are users whose grids are stored locally on the device and online in the cloud. In contrast to offline users they also have a password that is used to encrypt all grids before saving them online.

For more information see Users.

Next Chapter →

Back to Overview

# Terms

This chapter explains the most important terms used in relation to the AsTeRICS Grid.

Back to Overview

# AsTeRICS Grid

Web-based application for AAC solutions, runs in the browser (e.g. Firefox, Chrome, Edge, Internet Explorer, mobile Browsers).

# AsTeRICS Framework

Java-based software suite that runs on a computer and makes it possible to trigger additional actions using the AsTeRICS Grid, e.g. controlling a TV (environmental control). See AsTeRICS Framework (opens new window) on the web.

# AsTeRICS model

An AsTeRICS model is a configuration for the AsTeRICS Framework which realizes a certain use-case, e.g. environmental control, camera based head-tracking or eye-tracking. A model that runs in the AsTeRICS Framework can interact with the AsTeRICS Grid.

# Grid

Term for a single page in the AsTeRICS Grid, consisting of several grid elements. The number of elements a grid contains is flexible.

# Grid element

A grid element is part of a grid and normally consists of a label and/or an image. Selecting a grid element normally triggers an action, e.g. navigating to another grid.

There are 3 types of grid elements:

  1. Normal: an element consisting of a label and/or an image
  2. Collect element: an element that collects the labels of previously selected elements and therefore makes it possible to construct e.g. sentences out of single word elements.
  3. Prediction element: an element that is dynamically filled up with word predictions based on previously selected normal elements.

# Action

An action that is performed if a grid element is selected, e.g. navigate to another grid, speak some text or some external action like turning on a light. See Grid element actions.

# Input

In the context of AsTeRICS Grid “input” refers to the mean of selecting a grid element. This can be e.g. a normal mouse click, hovering or scanning. See Input options.

# Dictionary

A dictionary is a set of words that is used to fill up prediction grid elements. By default a dictionary including the most frequent english/german words is used, but also custom dictionaries can be used. See Dictionaries.

# User

In AsTeRICS Grid a “user” refers to a username and a set of grids, which in sum realize a solution for an actual user. There are two types of users in AsTeRICS Grid:

  1. Offline users: are users whose grids are only stored locally on the used device.
  2. Online users: are users whose grids are stored locally on the device and online in the cloud. In contrast to offline users they also have a password that is used to encrypt all grids before saving them online.

For more information see Users.

Next Chapter →

Back to Overview

- + diff --git a/manuals/asterics-grid/02_navigation.html b/manuals/asterics-grid/02_navigation.html index 379a080963..b2ad9d2d0e 100644 --- a/manuals/asterics-grid/02_navigation.html +++ b/manuals/asterics-grid/02_navigation.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Navigation and basic functionality

This chapter is about general appearance, navigation and basic functionality of the different views in AsTeRICS Grid:

  1. Welcome view: intial view shown at first usage
  2. Main view: starting view showing the recently used grid and navigation
  3. Edit view: view that allows modification of a grid
  4. Manage grids view: show all grids, create new ones, create a backup
  5. Manage dictionaries view: show, edit and create new dictionaries
  6. Change user view: switch users or login an existing one

Back to Overview

# Welcome view

Video on YouTube: First Start (opens new window) (German, but auto-translated subtitles available)

AsTeRICS Grid initially starts with a welcome view giving the choice between:

  1. Use AsTeRICS Grid without registration: choose this option in order to create a local default user and directly start using AsTeRICS Grid.
  2. Register now: choose this option in order to sign up for an online user, which makes it possible to synchronize the grids across devices.

See Terms for more information about offline/online users.

# “Main” - view

Videos on YouTube: Demo configuration (opens new window), Fullscreen and lock mode (opens new window) (German, but auto-translated subtitles available)

Once taken a decision in the welcome view AsTeRICS Grid subsequently starts in the “main view” which looks like Figure 1 (desktop view on the left, mobile view on the right):

main view Fig. 1: “Main” - view (desktop view on the left, mobile view on the right)

The elements have this functionality:

  1. Open or close the left navigation sidebar
  2. Main: navigate to the main view (currently shown)
  3. Manage grids: show all grids of the current user, add new ones or backup them to a file, manage the global grid
  4. Manage Dictionaries: show all saved dictionaries, edit them or add new empty ones or import existing dictionaries
  5. Change User: switch between saved users or log in an existing online user
  6. Add online user: register a new online user (synchronized across devices), see Users
  7. Add offline users: add a new offline user (only for this device)
  8. Settings: select between general settings like application language and user settings like grid content language, voice or colors
  9. About AsTeRICS Grid: Show general information, links, contact address
  10. Help: find the AsTeRICS Grid user manuel, the ARASAAC tutorial or video tutorials
  11. Editing on: edit the layout of the grid, add new elements, actions for grid elements
  12. Input options: Options about how to select grid elements (e.g. click, hover, scanning)
  13. Fullscreen: hide the sidebar and the bar on the top, only showing the current grid
  14. Lock: lock the screen in order to prevent unintended input or changes beside using and navigating the grid
  15. Grid: demo grid consisting of some grid elements which are navigating to other grids if selected (possible for those which show the grey symbol in the upper right corner)

# Edit view - “Editing on”

Video on YouTube: Add and edit elements (opens new window) (German, but auto-translated subtitles available)

Clicking on Button “Editing on” (Fig. 1, number 11) opens the edit view where a grid can be adapted, see Figure 2:

edit view Fig.2: “Editing on” - view (desktop view on the left, mobile view on the right)

The following elements are available in the edit view:

  1. Open or close the navigation sidebar

  2. Editing off: navigate back to main view

  3. Undo: reverts the last action

  4. Redo: redoes the last action after reverting it

  5. More: opens a menu with additional actions, e.g adding new elements

  6. Right click on a grid element: opens a menu for editing / deleting / etc. the element (open it with long tap on a mobile device/touchscreen)

    Reposition grid element / Edit area: Grid elements can be repositioned by dragging them (drag & drop). On the right bottom corner it’s possible to resize a grid element.

See page Edit grid appearance and layout for more details about editing a grid.

# “Manage grids” - view

Video on YouTube: Manage grids (opens new window) (German, but auto-translated subtitles available)

The manage grids view provides an overview about the current grids of a user, see Figure 3:

manage grids view Fig.3: “Manage grids” - view (desktop view on the left, mobile view on the right)

The following elements are available in the manage grids view:

  1. Open or close the navigation sidebar
  2. Name of grid: type name of the grid and confirm by clicking on the tick
  3. New grid: add a new, empty grid
  4. more: shows menu with additional actions, e.g. backup the grids to file or restore backups from file
  5. Show: open this grid in main view
  6. Edit: open this grid in edit view
  7. Clone: duplicate this grid, creating a copy of it with a different name
  8. Delete: delete this grid
  9. Export: saves and downloads this specific grid to a .grd file creating a backup of it (saves only this single grid, see “More” menu (Number 4) to backup all grids)
  10. Save as PDF: saves and downloades the grid as PDF
  11. Grids to show: select which grids shall be shown in the grid list
  12. Sort grids by: select how the grids in the grid list shall be sorted

# “more” button - Additional options

Clicking on Button “more” (Fig. 3, number 4) opens menu with additional options:

manage grids more menu

Fig.3.1: “Manage grids” - view - “more” button

These are the possible options:

  1. New Grid: creates a new and empty grid, same as Fig. 3, number 3
  2. Save backup to file: creates and downloads a .grd file containing a backup of all current grids, dictionaries and input configuration. In this case, a file called asterics-grid-backup.grd is downloaded that can be renamed to more easily identify the contents of the copy
  3. Save custom data to file: creates and downloads a backup copy as well, but data can be customized with the following options: + (opens new window)

# Navigation and basic functionality

This chapter is about general appearance, navigation and basic functionality of the different views in AsTeRICS Grid:

  1. Welcome view: intial view shown at first usage
  2. Main view: starting view showing the recently used grid and navigation
  3. Edit view: view that allows modification of a grid
  4. Manage grids view: show all grids, create new ones, create a backup
  5. Manage dictionaries view: show, edit and create new dictionaries
  6. Change user view: switch users or login an existing one

Back to Overview

# Welcome view

Video on YouTube: First Start (opens new window) (German, but auto-translated subtitles available)

AsTeRICS Grid initially starts with a welcome view giving the choice between:

  1. Use AsTeRICS Grid without registration: choose this option in order to create a local default user and directly start using AsTeRICS Grid.
  2. Register now: choose this option in order to sign up for an online user, which makes it possible to synchronize the grids across devices.

See Terms for more information about offline/online users.

# “Main” - view

Videos on YouTube: Demo configuration (opens new window), Fullscreen and lock mode (opens new window) (German, but auto-translated subtitles available)

Once taken a decision in the welcome view AsTeRICS Grid subsequently starts in the “main view” which looks like Figure 1 (desktop view on the left, mobile view on the right):

main view Fig. 1: “Main” - view (desktop view on the left, mobile view on the right)

The elements have this functionality:

  1. Open or close the left navigation sidebar
  2. Main: navigate to the main view (currently shown)
  3. Manage grids: show all grids of the current user, add new ones or backup them to a file, manage the global grid
  4. Manage Dictionaries: show all saved dictionaries, edit them or add new empty ones or import existing dictionaries
  5. Change User: switch between saved users or log in an existing online user
  6. Add online user: register a new online user (synchronized across devices), see Users
  7. Add offline users: add a new offline user (only for this device)
  8. Settings: select between general settings like application language and user settings like grid content language, voice or colors
  9. About AsTeRICS Grid: Show general information, links, contact address
  10. Help: find the AsTeRICS Grid user manuel, the ARASAAC tutorial or video tutorials
  11. Editing on: edit the layout of the grid, add new elements, actions for grid elements
  12. Input options: Options about how to select grid elements (e.g. click, hover, scanning)
  13. Fullscreen: hide the sidebar and the bar on the top, only showing the current grid
  14. Lock: lock the screen in order to prevent unintended input or changes beside using and navigating the grid
  15. Grid: demo grid consisting of some grid elements which are navigating to other grids if selected (possible for those which show the grey symbol in the upper right corner)

# Edit view - “Editing on”

Video on YouTube: Add and edit elements (opens new window) (German, but auto-translated subtitles available)

Clicking on Button “Editing on” (Fig. 1, number 11) opens the edit view where a grid can be adapted, see Figure 2:

edit view Fig.2: “Editing on” - view (desktop view on the left, mobile view on the right)

The following elements are available in the edit view:

  1. Open or close the navigation sidebar

  2. Editing off: navigate back to main view

  3. Undo: reverts the last action

  4. Redo: redoes the last action after reverting it

  5. More: opens a menu with additional actions, e.g adding new elements

  6. Right click on a grid element: opens a menu for editing / deleting / etc. the element (open it with long tap on a mobile device/touchscreen)

    Reposition grid element / Edit area: Grid elements can be repositioned by dragging them (drag & drop). On the right bottom corner it’s possible to resize a grid element.

See page Edit grid appearance and layout for more details about editing a grid.

# “Manage grids” - view

Video on YouTube: Manage grids (opens new window) (German, but auto-translated subtitles available)

The manage grids view provides an overview about the current grids of a user, see Figure 3:

manage grids view Fig.3: “Manage grids” - view (desktop view on the left, mobile view on the right)

The following elements are available in the manage grids view:

  1. Open or close the navigation sidebar
  2. Name of grid: type name of the grid and confirm by clicking on the tick
  3. New grid: add a new, empty grid
  4. more: shows menu with additional actions, e.g. backup the grids to file or restore backups from file
  5. Show: open this grid in main view
  6. Edit: open this grid in edit view
  7. Clone: duplicate this grid, creating a copy of it with a different name
  8. Delete: delete this grid
  9. Export: saves and downloads this specific grid to a .grd file creating a backup of it (saves only this single grid, see “More” menu (Number 4) to backup all grids)
  10. Save as PDF: saves and downloades the grid as PDF
  11. Grids to show: select which grids shall be shown in the grid list
  12. Sort grids by: select how the grids in the grid list shall be sorted

# “more” button - Additional options

Clicking on Button “more” (Fig. 3, number 4) opens menu with additional options:

manage grids more menu

Fig.3.1: “Manage grids” - view - “more” button

These are the possible options:

  1. New Grid: creates a new and empty grid, same as Fig. 3, number 3
  2. Save backup to file: creates and downloads a .grd file containing a backup of all current grids, dictionaries and input configuration. In this case, a file called asterics-grid-backup.grd is downloaded that can be renamed to more easily identify the contents of the copy
  3. Save custom data to file: creates and downloads a backup copy as well, but data can be customized with the following options:
    1. Select grid: export a specific (group of) grid(s) or all available grids
    2. Export languages: select wheter to export all the languages in which the communicator is translated or only one of them (current content language)
    3. Export dictionaries: can be activated / deactivated
    4. Export user settings and input configuration: can be activated / deactivated (preserves specific adjustments like color settings, content language or input settings (scanning or direct slection))
    5. Export global grid: can be activated / deactivated
  4. Save grids to PDF: creates and downloads a .pdf file of one or all grids, which can be used for later printing
  5. Restore backup from file: deletes the existing configuration and replaces it with data from a .grd file
  6. Import custom data from file: imports data from a .grd file as well, but data can be customized. You can choose if you want to import dictionaries, of you want to import user settings and input configuration and if oyu want to delet existing data before importing.
  7. Reset to default configuration: deletes all current grids and replaces them with the default demo configuration

Info about Open Board Format (OBF): OBF is an open format for exchanging grids across different AAC tools and is specified on the official website (opens new window). AsTeRICS Grid supports importing OBF files (.obf and .obz) using the options Restore backup from file or Import custom data from file.

Video on YouTube: Complex grids and OBF (opens new window) (German, but auto-translated subtitles available)

# Global grid

Video on YouTube: Global Grid (opens new window) (German, but auto-translated subtitles available)

A global grid is a grid that is visible on every grid page. It may contain general elements that make sense within every grid like e.g. a “Home” grid element that navigates to the start page. A global grid could also contain some kind of core vocabulary that should be visible any time. The global grid of the main page of figure 1 contains the following elements:

global grid

Fig.3.2: Global Grid

All the elements shown here are elements contained within the global grid. They are visible on every grid page. While editing the global grid it’s possible to define its height by opening More -> Change grid dimensions and setting the value for height of first global grid row.

The global grid can be activated/deactivated and edited in the “Manage Grids” view at the bottom or by More -> Edit global grid while editing any other grid:

de/activate global grid

Fig.3.3: “Manage grids” - view - Global Grid

# Home grid

At the bottom of “Manage grids” it’s possible to define a Home grid. This grid is automatically opened at startup of AsTeRICS Grid. If no home grid is defined, the last opened grid is opened.

Navigate to home grid after selecting an element can be selected in order to automatically navigate to home grid after any element (which doesn’t navigate to an other grid) is selected. This can speed up the construction of sentences in more complex communicator interfaces.

It’s possible to define an action that navigates to the home grid, see action “Navigate to other grid”.

# “Manage Dictionaries” - view

Video on YouTube: Manage dictionaries (opens new window) (German, but auto-translated subtitles available)

In the manage dictionaries view currently saved dictionaries that are used for filling prediction elements (see Terms) can be shown and adapted (Figure 4):

manage dictionaries view Fig. 4: “Manage dictionaries” - view (desktop view on the left, mobile view on the right)

The following elements are available in the manage dictionaries view:

  1. Open or close the navigation sidebar
  2. Import dictionary: imports a dictionary from online dictionaries or from a .json file
  3. New empty dictionary: add a new, empty dictionary
  4. Edit: show, edit and add new words to the dictionary
  5. Clone: create a copy of the dictionary
  6. Delete: removes the dictionary
  7. Save: saves the dictionary as .json file
  8. Edit dictionary name: change the name of a dictionary

For more information about using dictionaries see Dictionaries.

# “Change User” - view

Video on YouTube: Offline and online users (opens new window) (German, but auto-translated subtitles available)

In the “Change User” - view it’s possible to switch between users or login an existing one (Figure 5):

change user view Fig. 5: “Change user” - view (desktop view on the left, mobile view on the right)

The following elements are available in the change users view:

  1. Open or close the navigation sidebar
  2. Active offline user: the currently active user is recognizable by a black user symbol and the word “active” next to the username. The active user is the user whose grids and configuration are currently used and shown in all other views.
  3. Inactive online user: The little cloud symbol indicates an online user (see Terms) and the gray user symbol that he is currently inactive, meaning that the user’s grids are currently not used.
  4. Inactive offline user: The gray user symbol without a cloud indicates an inactive offline user (see Terms)
  5. Open: sets the user “active” and opens the main view, showing the user’s grid(s). Sets all other users inactive, there is always only one active user.
  6. Delete: deletes the user and all of his grids and configuration. Use with caution, this action cannot be undone. This option is only available for offline users.
  7. Logout: deletes the user and all of his grids and configuration, but only on the current device. Data in the cloud and on other devices that are logged in with the same user will not be deleted. This option is only available for online users.
  8. Login with other user: put in username and password of an existing online user in order to add it to the current device. In order to create a new online or offline user, follow one of the links below.
  9. Remember checkbox: if checked, the newly logged in online user will be saved to the device and listed in the list of users in the current user view. If unchecked the user will only be opened temporarily and no user data will be saved on the device (recommended for logging in on foreign devices).

For information about offline or online users and how to add them see Users.

# Search function

These are the possibilities to open the dialog for searching for grid elements in the current configuration:

  1. Click the button Search in the top bar in the Main View
  2. Press Ctrl + F on the keyboard in one of these views: “Main”, “Manage Grids” or “Edit grid”
  3. Click on More -> Search in the top bar of “Edit grid” view
  4. Grid element action navigate to other grid with navigation type Open search dialog (e.g. to be added to global grid in order to be able to open the search dialog in fullscreen mode).

change user view Fig. 6: Search dialog and search results

Figure 6 shows the search dialog:

  1. search term: text input field for the search term
  2. result image: directly navigates to the selected element and highlights it. Keyboard shortcut for first search result: [Enter]
  3. result path: navigates to the selected element step-by-step by highlighting the path beginning from the home grid. Keyboard shortcut for first search result: [Ctrl + Enter]

← Previous Chapter Next Chapter →

Back to Overview

- + diff --git a/manuals/asterics-grid/03_appearance_layout.html b/manuals/asterics-grid/03_appearance_layout.html index 09b1854a72..506c286dea 100644 --- a/manuals/asterics-grid/03_appearance_layout.html +++ b/manuals/asterics-grid/03_appearance_layout.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Grid appearance and layout

Videos on YouTube: Layout options (opens new window), Collect elements (opens new window), Prediction elements (opens new window) (German, but auto-translated subtitles available)

This chapter is about a grid’s layout and appearance and how to edit it:

  1. Adding elements and change the layout
  2. Editing grid elements menu
  3. Edit modal: changing label and image

Back to Overview

# Adding elements and layout options

In the Edit view (“Editing on”) the following menu opens on a click on “more”:

edit view - more menu Fig. 1: Edit view - menu “more”

These are the actions to select in the menu:

  1. New → New Element: creates a normal new element, opening a dialog where label and image can be defined
  2. New → Many new elements: creates multiple new normal elements at once, opening a dialog where multiple elements can be defined and inserted into the grid
  3. New → New collect element: creates a new collect element, see Terms
  4. New → New prediction element: creates a new prediction element, see Terms
  5. New → New YouTube Player: creates a new YouTube Player element
  6. Delete all elements: removes all grid elements from the grid
  7. Change grid dimensions: set grid size (number of rows and minimum number of columns)
  8. Translate grid: select which grid(s) to translate and in which language the texts shall be translated
  9. Fill gaps: moves all grid elements as far left as possible, closing gaps as the following image shows: + (opens new window)

# Grid appearance and layout

Videos on YouTube: Layout options (opens new window), Collect elements (opens new window), Prediction elements (opens new window) (German, but auto-translated subtitles available)

This chapter is about a grid’s layout and appearance and how to edit it:

  1. Adding elements and change the layout
  2. Editing grid elements menu
  3. Edit modal: changing label and image

Back to Overview

# Adding elements and layout options

In the Edit view (“Editing on”) the following menu opens on a click on “more”:

edit view - more menu Fig. 1: Edit view - menu “more”

These are the actions to select in the menu:

  1. New → New Element: creates a normal new element, opening a dialog where label and image can be defined
  2. New → Many new elements: creates multiple new normal elements at once, opening a dialog where multiple elements can be defined and inserted into the grid
  3. New → New collect element: creates a new collect element, see Terms
  4. New → New prediction element: creates a new prediction element, see Terms
  5. New → New YouTube Player: creates a new YouTube Player element
  6. Delete all elements: removes all grid elements from the grid
  7. Change grid dimensions: set grid size (number of rows and minimum number of columns)
  8. Translate grid: select which grid(s) to translate and in which language the texts shall be translated
  9. Fill gaps: moves all grid elements as far left as possible, closing gaps as the following image shows:
    fill gaps
  10. Edit global grid: directly go to the page, where the global grid can be edited (otherwise go to Manage grids → Edit global Grid (at the bottom))

# Editing grid elements

A right click (or long tap) on a grid element in edit view (“editing on”) opens the following menu:

edit view - element menu Fig. 2: Grid element menu in “Editing on” - view

These are the options to select:

  1. Edit: opens a dialog to edit the label and the image of this element (“Edit modal”)
  2. Delete: deletes this element
  3. More → Clone: inserts a copy of this element to the grid
  4. More → Do element action: performs the actions that are assigned to this grid element, e.g. speaking the label or navigating to another grid
  5. More → Move element to other grid: moves the element to another grid which can be selected

# “Edit grid item” modal

Video on YouTube: Add and edit elements (opens new window) (German, but auto-translated subtitles available)

The “Edit”-modal is opened by a right click (or long tap) on a grid element in edit view (“editing on”) and subsequent clicking on “Edit”. The “Edit”-modal has three tabs (General, Image and Actions):

# Tab “General”

Clicking on “Edit” in the grid element menu (Fig. 2) opens the following modal (Tab General) shown in Figure 3:

edit grid element general Fig. 3: “Edit grid item” modal - Tab “General”

These are the elements in the modal of Figure 3 (Edit grid item - Tab General):

  1. Label: change the label of the element shown under the image, can be empty
  2. Color category: choose the color category (Noun, Verb, etc.)
  3. Search for images: change to the Image-Tab.
  4. Costum background color: choose a different backgroud color
  5. Hide element: the element will only be visible in the “Editing on”-view. After clicking “Editing off”, it will not be visible.
  6. Cancel: discard all changes and close the modal
  7. OK: save all changes and close the modal
  8. OK, edit previous: save all changes, edit the previous grid element in the “Edit grid item” modal - Tab “General”
  9. OK, edit next: save all changes, edit the next grid element in the “Edit grid item” modal - Tab “General”

# Tab “Image”

edit grid element image Fig. 4: “Edit grid item” modal - Tab “Image”

  1. Choose file: opens a file dialog to choose a different image
  2. Search by label: image search is done by label
  3. Clear image: deletes the currently chosen image
  4. Drop area: drag and drop image files in this area to select them. It’s possible to drag and drop files from a file explorer or also other programs like e.g. METACOM MetaSearch*. ![fill gaps](file://C:\Users\Agnes Scheibenreif\OneDrive - FH Technikum Wien\Projekte\WBT\Github codes\AsTeRICS-Grid\docs\documentation_user\img\drag_metacom.gif)
  5. Image Search: type in the name of which images shall be looked for
  6. Search Provider: select the provider for the image search
  7. Settings for image search: select additional settings like Plural or Color (skin color, hair color,…)

# Tab “Actions”

edit grid element actions

Fig. 5: “Edit grid item” modal - Tab “Actions”

  1. New Action: select type of new action in the combobox (e.g. Speak label, Navigate to other grid)
  2. Add action: add the selected type of action to the grid
  3. Current actions: actions currently assigned to the current grid element are shown here
  4. Edit: open additional drop down menus to edit and configure the particular action
  5. Delete: delete this action from the current grid element
  6. Test: tests the action, e.g. speaks the label. This button is not available for all types of actions.
  7. Cancel: discard all changes and close the modal
  8. OK: save all changes and close the modal
  9. OK, edit previous: save all changes, edit the previous grid element in the “Edit grid item” modal - Tab “Actions”
  10. OK, edit next: save all changes, edit the next grid element in the “Edit grid item” modal - Tab “Actions”

*METACOM and MetaSearch © Annette Kitzinger

← Previous Chapter Next Chapter →

Back to Overview

- + diff --git a/manuals/asterics-grid/04_input_options.html b/manuals/asterics-grid/04_input_options.html index 42c8093cad..1d48f42eec 100644 --- a/manuals/asterics-grid/04_input_options.html +++ b/manuals/asterics-grid/04_input_options.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Input Options

Video on YouTube: Overview input options (opens new window) (German, but auto-translated subtitles available)

This chapter is about how grid elements can be selected with different input modalities.

Back to Overview

Clicking on Button “Input Options” in Main view opens a menu with the following entries:

  • Mouse/Touch input: options for input types like normal mouse click, tap or hovering
  • Scanning: Input method for 1-2 input events, subsequently select groups of elements until one element is chosen
  • Direction input: Input method for 2-5 input events, 1-4 input events for navigating in different directions, 1 input event for selecting an element
  • Huffman input: 2-9 input events, assigns a code to each grid element which consists of an ordered sequence of the available input events
  • Sequential input: 2 input events, one for navigating to the next element one for selecting the current element

# Introduction to input events

Video on YouTube: Input actions and input events (opens new window) (German, but auto-translated subtitles available)

An input event in general is any kind of defined, single user interaction. AsTeRICS Grid currently supports the following input event types:

  • Keypress, Mouseclick, Tap: event of pressing a key on the keyboard, click on the mouse or tap on the screen, also can be an external button press using additional external hardware
  • Microphone input: event from microphone input, e.g. reaching a threshold of microphone input volume at a specific frequency.
  • AsTeRICS ARE event: any event that is generated by a running model within the AsTeRICS Framework. This type of event is very flexible and can be e.g. eye movement, head movement or a signal of an EMG muscle activity sensor.

These types of input events can be used in all input methods except Mouse/Touch input where the input events are mouse movements and click/tap events.

# “Keypress, Mouseclick, Tap” input events

Figure 1 shows the configuration possibilities of a “keypress, mouseclick, tap” event (f.e. choose Scanning as Input option and enable Scanning):

input event keypress options

Fig. 1: Configuration of a “keypress, mouseclick, tap” input event

These are the shown elements and options:

  1. Dropdown: allows to choose between Keypress, Mouseclick, Tap, Microphone input or AsTeRICS ARE event (or not defined)
  2. Record action: click in order to start action record mode. A subsequent keypress on the keyboard, mouse click or tap on the screen will be recorded and defines which user action is used for the event.
  3. Current action: prints the currently recorded/used (e.g. Space).
  4. More: an accordion of additional options that can be opened/closed by a click
  5. Timeout: minimum pause in milliseconds between two subsequent actions (if faster, the second action is ignored). Mandatory if different Repetitions are set for the same key in order to wait for possible upcoming repetitions before performing the action.
  6. Repetitions: the number of times the key has to be pressed in order to perform the action
  7. Hold duration: time in milliseconds how long a key has to be pressed in order to perform the action

Note that it’s not possible to set both Repetitions greater 1 and Hold duration greater 0 at the same time.

# Usage examples

Here are some examples for the properties Timeout, Repetitions and Hold duration that could be useful in real use cases:

  • Different actions with same key (e.g. Space), distinction by hold duration:
    • Action 1: Timeout=0, Repetitions=1, Hold Duration=0
    • Action 2: Timeout=0, Repetitions=1, Hold Duration=400
    • Pressing the key once performs action 1, Pressing and holding the key for 400ms performs action 2
    • This is the default configuration for input method Scanning where this configuration can be tested
  • Different actions with same key (e.g. Space), distinction by repetition:
    • Action 1: Timeout=0, Repetitions=1, Hold Duration=0
    • Action 2: Timeout=300, Repetitions=2, Hold Duration=0
    • Pressing the key once and waiting 300ms performs action 1, pressing the key twice (with less than 300ms pause) performs action 2
  • Filter unintended keypresses
    • all actions: Timeout=0, Repetitions=1, Hold Duration=300
    • any unintended keypresses are ignored and actions are only performed if a key is pressed longer than 300ms

# Microphone input events

Figure 2 shows the configuration possibilities of a microphone input event:

input event keypress options

Fig. 2: Configuration of a microphone input event

These are the shown elements and options:

  1. Start/stop recording: starts or stops recording from microphone. At the first time the browser will ask for permission to access the microphone. It’s required to see the live volume and frequency values below.
  2. Volume threshold high: the volume threshold for triggering a microphone event. If the volume level rises above this threshold, the microphone event is triggered.
  3. Volume current value: the current volume level recorded from microphone.
  4. Volume threshold low: after triggering a microphone event, the volume has to drop below this lower threshold before another microphone event will be triggered.
  5. Frequency threshold high: a microphone event is only triggered, if the frequency with the maximum volume is between threshold low and threshold high. In this way it’s to some extent possible to distinguish between different sounds for triggering different actions.
  6. Frequency current value: the frequency of the current microphone input, where the volume is highest. Playing a 440 Hz note on a guitar will result in a value similar to 440 Hz.
  7. Frequency threshold low: see Frequency threshold high above.

# AsTeRICS ARE input events

Video on YouTube: AsTeRICS input events (opens new window) (German, but auto-translated subtitles available)

AsTeRICS ARE input events are triggered by external events of a running model within the AsTeRICS Framework.

input event asterics are options

Fig. 3: Configuration of an AsTeRICS ARE input event

Figure 3 shows the configuration of an AsTeRICS ARE input event (AsTeRICS ARE Event is selected as select element in Figure 1, (1)):

  1. Dropdown: allows to choose between Keypress or AsTeRICS ARE event (or not defined). Here, the AsTeRICS ARE event is selected.
  2. Record ARE event: start recording of AsTeRICS ARE events. Subsequently trigger the desired event in ARE in order to be recorded.
  3. ARE URL: the URL of the running AsTeRICS instance. If AsTeRICS ARE is running on the same computer this field can be empty.
  4. List of events: list of recorded ARE events. Any of these events triggers the currently configured action.
  5. Recycle bin symbols: a click on the recycle bin symbol next to a recorded event deletes it

# Example of using an AsTeRICS ARE event

Follow these steps in order to set up an AsTeRICS Grid input method while using AsTeRICS ARE event for input:

  1. Open the settings modal for the desired input method in AsTeRICS Grid
  2. Start AsTeRICS ARE
  3. Select AsTeRICS ARE event for the desired input action in AsTeRICS Grid
  4. Click on “Record ARE event” to start recording
  5. Do any action in AsTeRICS ARE that tiggers an event, e.g. clicking on a button
  6. The recorded event should be shown in AsTeRICS Grid
  7. Save and close the input options in AsTeRICS Grid by clicking “OK”
  8. Redo the same action in AsTeRICS ARE as before - it should trigger the configured input action in AsTeRICS Grid

# Input options modals

Each input option dialog opened by “Main view - Input options” has about the same structure, see Figure 4 (can be seen as shown below when input option (here: Scanning) is enabled):

general structure of an input option dialog

Fig. 4: General structure of an input option dialog, when input option is enabled

These are the basic elements of an input option dialog as in figure 4:

  1. Enable checkbox: Generally enable or disable this input method. The subsequent sections are only visible if the input method is enabled.
  2. Input section: configure input actions like described in section Introduction to input events
  3. Advanced settings: configure advanced settings for this input method
  4. Test configuration: opens a 10x10 test grid where the current input configuration can be tested
  5. Cancel: close the dialog discarding changes
  6. OK: close the dialog saving and applying changes

# Mouse/Touch input

Video on YouTube: Mouse and touch input (opens new window) (German, but auto-translated subtitles available)

Mouse/Touch input has the following options:

  • Select with mouse click (or tap): if checked, elements can be selected by a simple mouse click or tap on a touchscreen
  • Select with double click (or tap): if checked, elements can be selected by a double mouse click or tap on a touchscreen
  • Enable hovering: enables hovering where elements are selected by moving the mouse on the element (=hovering) and waiting for some time. Hovering also works on touchscreens where the finger is held on an element for some time. + (opens new window)

# Input Options

Video on YouTube: Overview input options (opens new window) (German, but auto-translated subtitles available)

This chapter is about how grid elements can be selected with different input modalities.

Back to Overview

Clicking on Button “Input Options” in Main view opens a menu with the following entries:

  • Mouse/Touch input: options for input types like normal mouse click, tap or hovering
  • Scanning: Input method for 1-2 input events, subsequently select groups of elements until one element is chosen
  • Direction input: Input method for 2-5 input events, 1-4 input events for navigating in different directions, 1 input event for selecting an element
  • Huffman input: 2-9 input events, assigns a code to each grid element which consists of an ordered sequence of the available input events
  • Sequential input: 2 input events, one for navigating to the next element one for selecting the current element

# Introduction to input events

Video on YouTube: Input actions and input events (opens new window) (German, but auto-translated subtitles available)

An input event in general is any kind of defined, single user interaction. AsTeRICS Grid currently supports the following input event types:

  • Keypress, Mouseclick, Tap: event of pressing a key on the keyboard, click on the mouse or tap on the screen, also can be an external button press using additional external hardware
  • Microphone input: event from microphone input, e.g. reaching a threshold of microphone input volume at a specific frequency.
  • AsTeRICS ARE event: any event that is generated by a running model within the AsTeRICS Framework. This type of event is very flexible and can be e.g. eye movement, head movement or a signal of an EMG muscle activity sensor.

These types of input events can be used in all input methods except Mouse/Touch input where the input events are mouse movements and click/tap events.

# “Keypress, Mouseclick, Tap” input events

Figure 1 shows the configuration possibilities of a “keypress, mouseclick, tap” event (f.e. choose Scanning as Input option and enable Scanning):

input event keypress options

Fig. 1: Configuration of a “keypress, mouseclick, tap” input event

These are the shown elements and options:

  1. Dropdown: allows to choose between Keypress, Mouseclick, Tap, Microphone input or AsTeRICS ARE event (or not defined)
  2. Record action: click in order to start action record mode. A subsequent keypress on the keyboard, mouse click or tap on the screen will be recorded and defines which user action is used for the event.
  3. Current action: prints the currently recorded/used (e.g. Space).
  4. More: an accordion of additional options that can be opened/closed by a click
  5. Timeout: minimum pause in milliseconds between two subsequent actions (if faster, the second action is ignored). Mandatory if different Repetitions are set for the same key in order to wait for possible upcoming repetitions before performing the action.
  6. Repetitions: the number of times the key has to be pressed in order to perform the action
  7. Hold duration: time in milliseconds how long a key has to be pressed in order to perform the action

Note that it’s not possible to set both Repetitions greater 1 and Hold duration greater 0 at the same time.

# Usage examples

Here are some examples for the properties Timeout, Repetitions and Hold duration that could be useful in real use cases:

  • Different actions with same key (e.g. Space), distinction by hold duration:
    • Action 1: Timeout=0, Repetitions=1, Hold Duration=0
    • Action 2: Timeout=0, Repetitions=1, Hold Duration=400
    • Pressing the key once performs action 1, Pressing and holding the key for 400ms performs action 2
    • This is the default configuration for input method Scanning where this configuration can be tested
  • Different actions with same key (e.g. Space), distinction by repetition:
    • Action 1: Timeout=0, Repetitions=1, Hold Duration=0
    • Action 2: Timeout=300, Repetitions=2, Hold Duration=0
    • Pressing the key once and waiting 300ms performs action 1, pressing the key twice (with less than 300ms pause) performs action 2
  • Filter unintended keypresses
    • all actions: Timeout=0, Repetitions=1, Hold Duration=300
    • any unintended keypresses are ignored and actions are only performed if a key is pressed longer than 300ms

# Microphone input events

Figure 2 shows the configuration possibilities of a microphone input event:

input event keypress options

Fig. 2: Configuration of a microphone input event

These are the shown elements and options:

  1. Start/stop recording: starts or stops recording from microphone. At the first time the browser will ask for permission to access the microphone. It’s required to see the live volume and frequency values below.
  2. Volume threshold high: the volume threshold for triggering a microphone event. If the volume level rises above this threshold, the microphone event is triggered.
  3. Volume current value: the current volume level recorded from microphone.
  4. Volume threshold low: after triggering a microphone event, the volume has to drop below this lower threshold before another microphone event will be triggered.
  5. Frequency threshold high: a microphone event is only triggered, if the frequency with the maximum volume is between threshold low and threshold high. In this way it’s to some extent possible to distinguish between different sounds for triggering different actions.
  6. Frequency current value: the frequency of the current microphone input, where the volume is highest. Playing a 440 Hz note on a guitar will result in a value similar to 440 Hz.
  7. Frequency threshold low: see Frequency threshold high above.

# AsTeRICS ARE input events

Video on YouTube: AsTeRICS input events (opens new window) (German, but auto-translated subtitles available)

AsTeRICS ARE input events are triggered by external events of a running model within the AsTeRICS Framework.

input event asterics are options

Fig. 3: Configuration of an AsTeRICS ARE input event

Figure 3 shows the configuration of an AsTeRICS ARE input event (AsTeRICS ARE Event is selected as select element in Figure 1, (1)):

  1. Dropdown: allows to choose between Keypress or AsTeRICS ARE event (or not defined). Here, the AsTeRICS ARE event is selected.
  2. Record ARE event: start recording of AsTeRICS ARE events. Subsequently trigger the desired event in ARE in order to be recorded.
  3. ARE URL: the URL of the running AsTeRICS instance. If AsTeRICS ARE is running on the same computer this field can be empty.
  4. List of events: list of recorded ARE events. Any of these events triggers the currently configured action.
  5. Recycle bin symbols: a click on the recycle bin symbol next to a recorded event deletes it

# Example of using an AsTeRICS ARE event

Follow these steps in order to set up an AsTeRICS Grid input method while using AsTeRICS ARE event for input:

  1. Open the settings modal for the desired input method in AsTeRICS Grid
  2. Start AsTeRICS ARE
  3. Select AsTeRICS ARE event for the desired input action in AsTeRICS Grid
  4. Click on “Record ARE event” to start recording
  5. Do any action in AsTeRICS ARE that tiggers an event, e.g. clicking on a button
  6. The recorded event should be shown in AsTeRICS Grid
  7. Save and close the input options in AsTeRICS Grid by clicking “OK”
  8. Redo the same action in AsTeRICS ARE as before - it should trigger the configured input action in AsTeRICS Grid

# Input options modals

Each input option dialog opened by “Main view - Input options” has about the same structure, see Figure 4 (can be seen as shown below when input option (here: Scanning) is enabled):

general structure of an input option dialog

Fig. 4: General structure of an input option dialog, when input option is enabled

These are the basic elements of an input option dialog as in figure 4:

  1. Enable checkbox: Generally enable or disable this input method. The subsequent sections are only visible if the input method is enabled.
  2. Input section: configure input actions like described in section Introduction to input events
  3. Advanced settings: configure advanced settings for this input method
  4. Test configuration: opens a 10x10 test grid where the current input configuration can be tested
  5. Cancel: close the dialog discarding changes
  6. OK: close the dialog saving and applying changes

# Mouse/Touch input

Video on YouTube: Mouse and touch input (opens new window) (German, but auto-translated subtitles available)

Mouse/Touch input has the following options:

  • Select with mouse click (or tap): if checked, elements can be selected by a simple mouse click or tap on a touchscreen
  • Select with double click (or tap): if checked, elements can be selected by a double mouse click or tap on a touchscreen
  • Enable hovering: enables hovering where elements are selected by moving the mouse on the element (=hovering) and waiting for some time. Hovering also works on touchscreens where the finger is held on an element for some time.
    • Hover time: time in milliseconds to wait until a hovered element is selected. The value 0 means that the hovered element is never selected.
    • Hide cursor: if checked the cursor is hidden and not visible while hovering above elements. This can be useful e.g. for eye-tracking where the cursor may be distracting.
    • Read out active element: if checked the label of the hovered element is directly read out if the active element has changed
    • Disable hover pane: Normally (without activating this option) it is possible to continue hovering after navigation to another grid without lifting the finger (on a touchscreen). Technically this function is implented by a global invisible hover pane., normally for hovering a global invisible hover pane is inserted. However this hover pane can cause problems in combination with a software controlled mouse cursor (emulated software mouse), because click actions may not reach the actual elements. In this case it might be useful / necessary to activate the function Disable hover pane.

# Advanced setting “directly select element”

In Advanced Settings there is the additional option “Directly select element on pressing mouse button (not waiting for complete click)”. If it is enabled, the element is selected when pressing the mouse button, not when releasing the mouse button (which is default). For Touchscreens it’s similar: an element is selected directly at touching the screen, not after lifting the finger again (which is default). This can make sense for:

  • facilitating operation for people which can’t reliably “tap” (quickly put finger on and lifting the finger afterwards) on the touchscreen.
  • when using AsTeRICS Grid with an eyetracker and an additional button for clicking / selecting. Since the mouse controlled via an eyetracker always moves a little bit, in default mode it can happen that instead of selecting an element, the image of an element is dragged. This can be prevented if the selection of the element is done directly at pressing the mouse button.

# Scanning

Video on YouTube: Input method scanning (opens new window) (German, but auto-translated subtitles available)

The input method Scanning is suited to be used with 1-2 input events. It works as follows:

  1. Available elements are divided into groups
  2. One group is highlighted
  3. Group containing the desired element is selected
  4. Remaining elements are again divided into groups
  5. Steps 3 and 4 are repeated until the single desired element is selected

# Input events

These are the possible input events for Scanning:

  • Select element: The select element selects the current group or element, it can be chosen by clicking on Record key and afterwards clicking on the desired key.
  • Next scanning group: Here, the key for moveing the focus to the next group or element can be chosen. This input event is optional and can be omitted if timed scanning is activated (see Advanced settings). As above, the desired key shall be tapped after clicking on Record key.

# Advanced Settings

These are the advanced settings for Scanning:

  • Vertical scanning: determines the orientation element groups are build:
    • vertical (checked): groups are built vertical, moving left to right
      vertical scanning
    • horizontal (unchecked): groups are built horizontal, moving top to bottom
      horizontal scanning
  • Binary scanning: defines if scanning groups are rows/columns or one half of existing elements:
    • binary (checked): groups are built by separating remaining elements in two halves each scanning step
      binary scanning
    • non-binary (unchecked): groups are built row/column by row/column
      non-binary scanning
  • Start manually by user input event: if checked, scanning will only start after a user input event, e.g. pressing a key / button.
  • Scanning rounds until going back: the number of times the current scanning elements are iterated, until scanning goes back one step. For row/column scanning a value of 3 means that after selecting a row, the selected row is iterated 3 times and if no element is selected, scanning restarts for selecting a different row. If start manually by user event is checked, this number also defines the number of iterations on the top level until scanning is stopped.
  • Automatic (timed) scanning: if checked the active scanning group is automatically changed after a specific time, making it possible to use scanning just with a single input event @@ -567,6 +567,6 @@ →

- + diff --git a/manuals/asterics-grid/05_actions.html b/manuals/asterics-grid/05_actions.html index 0e40029aad..bb5f0174e8 100644 --- a/manuals/asterics-grid/05_actions.html +++ b/manuals/asterics-grid/05_actions.html @@ -17,7 +17,7 @@ - + @@ -553,13 +553,22 @@ Yorùbá (opens new window)

# Grid element actions

Video on YouTube: Edit actions (opens new window) (German, but auto-translated subtitles available)

This chapter is about actions that can be performed if a grid element is selected and how to configure them:

  1. Edit actions modal
  2. Action Types

Back to Overview

# Edit actions modal

edit element menu

Fig. 1: Grid element menu

Choosing “Edit” in the Edit grid element menu (Fig.1) and clicking on the Actions Tab opens the following configuration modal (Fig. 2):

edit grid element actions

Fig. 2: Edit Actions modal

This modal configures the actions that will be performed if the grid element is selected. These are the elements in the action modal:

  1. New action: select a new action to the grid, in the combobox the action type has to be selected
  2. Add action: adds the selected action type as a new action to the grid
  3. Current actions: list of currently configured actions that will be performed if the grid element is selected
  4. Edit: edit and configure the particular action
  5. Delete: delete the action from this grid element
  6. Test: tests the action, e.g. speaks the label. This button is not available for all types of actions.
  7. Cancel: discard any changes and close the modal
  8. OK: save all changes and close the modal
  9. OK, edit previous: save all changes and edit the actions of the previous element
  10. OK, edit next: save all changes and edit the actions of the next element

# Action types

These are the types of actions that are selectable (Fig. 2, number 1):

  • Speak label: speaks the label of the element using a computer voice (text-to-speech)
  • Navigate to other grid: navigates to another grid
  • Speak custom text: speaks a customizeable text using a computer voice (text-to-speech)
  • Play recorded audio: plays custom audio, previously recorded via the microphone of the device
  • Fill prediction elements: fills all prediction elements in the current grid with word suggestions
  • Collect element action: performs actions on collect elements in the current grid, e.g. clearing it or copying it’s text to clipboard
  • AsTeRICS Action: does an action in a running model in the AsTeRICS Framework
  • Web radio action: plays a web radio station
  • YouTube action: links to a YouTube video and shows it without leaving the communicator
  • Change content language: changes the content language (description of grid elements / language of the communicator grid(s))
  • Open web page in new tab: allows to assign an external web page to a cell and opens it in a new tab

# Speak label

Clicking on “Edit” of a “speak label” action (or creating a new one by clicking on Add action) shows the following configuration possibilities (Fig. 3):

action speak label

Fig. 3: Configuration possibilites of “Speak label”

By default the language of the browser/system is selected. Available languages can differ depending on the browser, from experience Google Chrome (opens new window) offers most languages. Clicking on the “Test” button speaks the label in the selected language.

You can change the language and voice settings in the Settings menu.

Note: Some browsers like Internet Explorer (old default Windows browser) do not support text-to-speech. In these browsers, speak actions will do nothing. In contrast, the Microsoft Edge browser (new default Windows browser) supports many text-to-speech voices.

Note: In case of problems when speaking the label (e.g. no spoken label or bad quality voice), check the FAQ page.

action navigate to other grid

Fig. 4: Configuration possibilites of “Navigate to other grid”

Clicking on “Edit” of a “navigate to other grid” action (or creating a new one) shows the following configuration possibilities (Fig. 4):

  • Navigation type: allows to choose which type of navigation should be performed: + (opens new window)

# Grid element actions

Video on YouTube: Edit actions (opens new window) (German, but auto-translated subtitles available)

This chapter is about actions that can be performed if a grid element is selected and how to configure them:

  1. Edit actions modal
  2. Action Types

Back to Overview

# Edit actions modal

edit element menu

Fig. 1: Grid element menu

Choosing “Edit” in the Edit grid element menu (Fig.1) and clicking on the Actions Tab opens the following configuration modal (Fig. 2):

edit grid element actions

Fig. 2: Edit Actions modal

This modal configures the actions that will be performed if the grid element is selected. These are the elements in the action modal:

  1. New action: select a new action to the grid, in the combobox the action type has to be selected
  2. Add action: adds the selected action type as a new action to the grid
  3. Current actions: list of currently configured actions that will be performed if the grid element is selected
  4. Edit: edit and configure the particular action
  5. Delete: delete the action from this grid element
  6. Test: tests the action, e.g. speaks the label. This button is not available for all types of actions.
  7. Cancel: discard any changes and close the modal
  8. OK: save all changes and close the modal
  9. OK, edit previous: save all changes and edit the actions of the previous element
  10. OK, edit next: save all changes and edit the actions of the next element

# Action types

These are the types of actions that are selectable (Fig. 2, number 1):

  • Speak label: speaks the label of the element using a computer voice (text-to-speech)
  • Navigate to other grid: navigates to another grid
  • Speak custom text: speaks a customizeable text using a computer voice (text-to-speech)
  • Play recorded audio: plays custom audio, previously recorded via the microphone of the device
  • Fill prediction elements: fills all prediction elements in the current grid with word suggestions
  • Collect element action: performs actions on collect elements in the current grid, e.g. clearing it or copying it’s text to clipboard
  • AsTeRICS Action: does an action in a running model in the AsTeRICS Framework
  • Web radio action: plays a web radio station
  • YouTube action: links to a YouTube video and shows it without leaving the communicator
  • Change content language: changes the content language (description of grid elements / language of the communicator grid(s))
  • Open web page in new tab: allows to assign an external web page to a cell and opens it in a new tab

# Speak label

Clicking on “Edit” of a “speak label” action (or creating a new one by clicking on Add action) shows the following configuration possibilities (Fig. 3):

action speak label

Fig. 3: Configuration possibilites of “Speak label”

By default the language of the browser/system is selected. Available languages can differ depending on the browser, from experience Google Chrome (opens new window) offers most languages. Clicking on the “Test” button speaks the label in the selected language.

You can change the language and voice settings in the Settings menu.

Note: Some browsers like Internet Explorer (old default Windows browser) do not support text-to-speech. In these browsers, speak actions will do nothing. In contrast, the Microsoft Edge browser (new default Windows browser) supports many text-to-speech voices.

Note: In case of problems when speaking the label (e.g. no spoken label or bad quality voice), check the FAQ page.

action navigate to other grid

Fig. 4: Configuration possibilites of “Navigate to other grid”

Clicking on “Edit” of a “navigate to other grid” action (or creating a new one) shows the following configuration possibilities (Fig. 4):

  • Navigation type: allows to choose which type of navigation should be performed:
    • Navigate to grid: navigates to any other grid that is selected by name. This type has this additional property:
      • Navigate to grid: allows you to select the grid to switch to if this action is performed. The combobox contains a list of the names of all available grids of the current user.
    • Navigate to home grid: navigates to the home grid, see documentation for home grid
    • Navigate to last opened grid: navigates to the previously opened grid, can be used for a “back” functionality
    • Open search dialog: opens the search dialog, which allows to navigate to any element in the current configuration, see documentation of search function. This type has these additional properties:
      • Search for custom text: if specified the custom text is used to pre-fill the text in the search bar (optional)
      • Search for collected text: if checked the currently collected text of the collect element is used to pre-fill the search bar
  • Add this element to collection elements despite navigating: if checked, this element is added to the collect element, despite the fact that it navigates to another grid.

# Speak custom text

Clicking on “Edit” of a “speak custom text” action (or creating a new one) shows the following configuration possibilities:

Speak custom text

Fig. 5: Configuration possibilites of “Speak custom text”

For language selection the same conditions as for speak label actions apply. “Text to speak” is the custom text that should be spoken. The button “Test” tests the configuration and speaks the current text.

# Play recorded audio

Play recorded audio

Fig. 6: Configuration possibilities of action “Play recorded audio”

After clicking Record for the first time, the browser will show a confirmation popup to ask if it’s allowed to access the microphone. After confirmation the record starts and can be stopped by clicking on the same button again.

With the button Play an existing recording can be played.

Notes:

  • an existing action containing recorded audio has priority over actions Speak label and Speak custom text. So if an action with recorded audio is present, these types of actions won’t be performed.
  • if items are collected in collect elements, recorded audio is only played for collect element actions in mode “speak separately”, see Collect element action.

# Fill prediction elements

Video on YouTube: Prediction elements (opens new window) (German, but auto-translated subtitles available)

The action “fill prediction elements” fills all prediction elements in the grid with word suggestions. Suggestions are calculated on the basis of the label of the current element, so an “fill prediction elements” action of an element with label “A” will fill the prediction elements with the most common words starting with character “A”:

fill prediction elements animation

Clicking on “Edit” on a “fill prediction elements” action (or creating a new one) shows the following configuration possibilities:

fill prediction elements action options

Fig. 7: Configuration possibilites of “Fill prediction elements”

Dictionary to use: select the dictionary you want to use (see manage dictionaries). If nothing selected words from all available dictionaries will be suggested.

# Collect element action

Video on YouTube: Collect elements (opens new window) (German, but auto-translated subtitles available)

Collect element actions are various actions that are related to collect elements.

Clicking on “Edit” of a “collect element action” action (or creating a new one) shows the following configuration possibilities:

Collect element action options

Fig. 8: Configuration possibilites of “Collect element action”

The possible actions to choose are (when opening the combo box):

  1. Speak collect element content (separately): speaks out the content of the collect element, where each collected element is spoken one by one, highlighting the currently spoken element.
  2. Speak collect element content (continuously): speaks out the content of the collect element as continuous text, not highlighting the currently spoken element.
  3. Speak collect element content (separately) and clear afterwards: see above, clears collect element content after speaking
  4. Speak collect element content (continuously) and clear afterwards: see above, clears collect element content after speaking
  5. Clear collect element empties the collect element
  6. Delete last word/image deletes the last word/image of the collection elements:
    Delete last word animation
  7. Delete last character:
    Delete last character animation
  8. Copy text to clipboard: copies the current text of the collect element to clipboard in order to be available for paste in other programs
  9. Append text to clipboard: appends the current text of the collect element to clipboard making it possible to collect longer texts in the clipboard which can be used in another program afterwards
  10. Clear clipboard: empties the clipboard
  11. Search text on YouTube: searches the currently collected text on YouTube and loads the first video of the result in a YouTube player element. The YouTube player element can be located within the current grid or within another one to which is concurrently navigated to.

# AsTeRICS Action

Video on YouTube: AsTeRICS actions (opens new window) (German, but auto-translated subtitles available)

An “AsTeRICS action” performs an action in a running model in the AsTeRICS Framework. This can be any action that is possible with the AsTeRICS Framework, e.g. controlling a TV or performing computer actions like opening a program.

Figure 8 shows how an AsTeRICS action that controls a TV is working in more detail:

asterics action detail concept Fig. 9: AsTeRICS action concept, example of controlling a TV

The following steps are shown in Figure 8:

  1. A user selects a grid element with an associated AsTeRICS action. An AsTeRICS model which can perform the desired action (e.g. controlling a TV) is saved within the current grid.
  2. The AsTeRICS model is uploaded to a running instance of the AsTeRICS Framework (ARE) and afterwards started. The model contains so-called “plugins” which are elements capable of communicating with external hardware, e.g. attached to the computer or accessible via network. In the example the “IrTrans” plugin is capable of communicating with an IrTrans device, which is a replacement for infrared remotes.
  3. After uploading and starting the model on the AsTeRICS Framework, data is sent to a plugin contained in the model. In Fig. 9 some data is sent to the “action” port of the IrTrans plugin.
  4. Sending data to the plugin causes the AsTeRICS Framework to communicate with the external real “IrTrans” hardware. The action contains the needed information to perform the desired action, for instance sending a “Volume down” command to a TV.
  5. Finally the IrTrans device sends the infrared signal to the TV causing it to reduce the volume.

Clicking on “Edit” on a “AsTeRICS action” action (or creating a new one) shows the following configuration possibilities:

asterics action options

Fig. 10: Configuration possibilites of “AsTeRICS action”

These are the possibilities while configuring an AsTeRICS action:

  1. ARE URL: the URL of a running ARE (AsTeRICS Framework) to connect with. Standard URL is http://127.0.0.1:8081/rest/ for a locally running ARE.
  2. Test URL: click in order to test the current URL. A tick (✓) or times (×) symbol will indicate if the test was successful or has failed.
  3. ARE Model: if there is already a model of this action defined, the name of it is shown here. A click on the link downloads the model.
  4. Download from ARE: downloads the currently running model from a running AsTeRICS Framework (ARE) instance and saves it to the grid. The current ARE model is replaced by this action.
  5. Upload to ARE: uploads the saved model to a running AsTeRICS Framework (ARE) for testing purpose or in order to adapt it.
  6. Component: selection of the component (plugin) of the selected model that should be used
  7. Send data to port: define port the data should be sent
  8. Data: define data that should be sent to the port determined above (number 7)
  9. Event-Port: define the event that should be triggered (optional)
  10. Cancel: discard any changes and close the modal
  11. OK: save all changes and close the modal
  12. OK, edit previous: save all changes and edit the actions of the previous element
  13. OK, edit next: save all changes and edit the actions of the next element
  14. End edit: apply changes and close edit mode of this AsTeRICS action
  15. Delete: delete this action from this grid element
  16. Test: performs the defined AsTeRICS action for testing, same as will be later performed if the grid element is selected

Trigger event: selects an event that should be triggered on the selected component (optional, either “send data”, “trigger event” or both can be used)

# Web radio action

Video on YouTube: Web radio (opens new window) (German, but auto-translated subtitles available)

AsTeRICS Grid is capable of searching and playing web radio stations. The station search capabilities are powered by the API of radio-browser.info.

Clicking on “Edit” on a “Web radio action” (or creating a new one) shows the following configuration possibilities:

Web radio action options

Fig. 11: Configuration possibilites of “Web radio action”

These are the elements in this configuration dialog:

  1. End edit: apply changes and close edit mode of this Web radio action
  2. Delete: delete this action from this grid element
  3. Test: performs the defined Web radio action for testing, same as will be later performed if the grid element is selected
  4. Web radio action: chooses the type of web radio action to perform which can be one of the following:
    • Turn radio on: turns on the radio with the channel selected at Webradio to play
    • Turn radio on/off: toggles the radio on/off state with the channel selected at Webradio to play
    • Turn radio off: turns the radio off
    • Next radio channel: moves to next radio channel in the list of selected radio stations, see (4)
    • Previous radio channel: moves to previous radio channel in the list of selected radio stations, see (4)
    • Radio volume up: increases the radio volume
    • Radio volume down: decreases the radio volume
  5. Webradio to play: chooses which radio to play (only visible for Turn radio on and Turn radio on/off), possible channels to select are defined in selected radio stations list, see (4)
  6. Manage webradio list: accordion which folds/unfolds the section where radio stations can be searched and selected
  7. Create grid elements for webradios: As many radio stations selected, as many grid elements will be created, each element corresponding to one of the selected radio stations
  8. Selected radio stations list: list of selected radio stations which are available within the current grid
  9. Up: moves the station up in the list (reordering)
  10. Play: plays the radio channel
  11. Remove: removes the radio channel from the list of selected radio stations
  12. Search term input: search bar for searching new radio stations. By default search is done for radio station name, but the following additional properties are possible (see API documentation (opens new window)): name (default), country, state, language, tag, tagList, order. To use this additional properties they have to be added with semicolon to the search term.
    • Examples: The search term for looking for austrian radio stations with name Hitradio would be: name:Hitradio country:austria. If the search term is just Hitradio search will be done for radio stations with this name.
  13. Webradio search result list: result list for the current search term
  14. Play: plays the radio station
  15. Select: adds the radio station to the list of selected radio stations, see (8)
  16. Previous page: navigates to the previous page of search results (if available)
  17. Next page: navigates to the next page of search results (if available)

# YouTube Action

The YouTube Action allows you to link videos from this web page to the communicator and view them without leavting the communicator. Different control functions can be assigned to the cells for the display of the videos.

Clicking on “Edit” of a “YouTube” action (or creating a new one by clicking on Add action) shows the following configuration possibilities (Fig. 12):

Fig. 12: Configuration possibilites of “YouTube Action”

The possible actions/functions to choose are (when opening the combo box):

  1. Play video
    • Play type (Play single video, Play playlist, Play videos from search query, Play videos from channel)
    • Video link: insert the YouTube Video link here
    • Show video subtitles (if available): can be de/activated
    • Start video muted: can be de/activated
    • Perfrom action after navigation: can be de/activated
  2. Pause video
  3. Play/Pause video: same options like in Play video
  4. Restart video: same options like in Play video
  5. Stop video
  6. Step forward within video
    • Step forward within video (seconds): the number typed in represents the time in seconds the video will be fast-forwarded
  7. Step backward within video
    • Step backward within video (seconds): the number typed in represents the time in seconds the video will be rewound
  8. Next video
  9. Previous video
  10. Show video in fullscreen
  11. Video volume up
    • Vido volume up (percent): the number typed in represents the percentage the volume will be volumed up
  12. Video volume down
    • Vido volume down (percent): the number typed in represents the percentage the volume will be volumed down
  13. Mute/unmute video

To add a “YouTube Grid”, one grid element hast to be a “YouTube Player”, which can be created in the “Editing on view” in the menu “more” → ‘New’ → " New You Tube Player", as can be seen in Figure 12:

action youtubeplayer

Fig. 13: Creating a New YouTube Player element"

Other (“normal”) grid elements can be assigned with the functions listed above and a corresponding image can be chosen in the Image Tab. In ARASAAC, a collection of multimedia buttons is prepared, just type the word button in the Image search field of the Image Tab. If different grid elements are assigned with the Play video functions and are linked to different YouTube videos, the selected video will be played in the “YouTube Player” element, which has been created as shown in Figure 10.

# Change Content Language

This action is used to change the language of the communicator grid(s) by clicking on a grid element that we have configured to perform this action.

Clicking on “Edit” of a “Change content language” action (or creating a new one by clicking on Add action) shows the following configuration possibilities (Fig. 14):

Fig. 14: Configuration possibilites of “Change content language - Action”

The language in which the application language shall be changed to can be selected in the corresponding combobox.

In the following two figures an example is show, where the content language can be switched from english to french or inversely by clicking on the corresponding flag (Fig. 15 and 16).

action changecontentEN

Fig. 15: Content language in English

action changecontentEN

Fig. 16: Content language in French

First of all, you have to check if the grid content can already be translated in the desired language. To do that, you click on the “more” button in the “Edtiting on” view and select the Translate grid option as shown in Fig. 17:

action changecontentEN

Fig. 17: Translate grid option

After clicking on the “Translate grid” option, the following window opens (Fig. 18):

action translategrid1

Fig. 18: Translate grid - select language and translate the content

Here, the language, in which the grid content shall be translated, can be chosen. The right column shows the translations which are already stored in the application. Missing translations have to be filled in here.

# Open webpage in new tab

This action allows to assign an external web page to a grid element and, by clicking on it, to access the information contained therein.

Clicking on “Edit” of a “Open webpage in new tab” action (or creating a new one by clicking on Add action) shows the following configuration possibilities (Fig. 19):

Fig. 19: Configuration possibilites of “Open webpage in new tab”

  • Webpage URL: copy the URL of the desired webpage and enter it here
  • Automatically close timeout in seconds: enter time in seconds you want the tab remains open. After this time, the web page will close and the communicator grid will be displayed again

By clicking on the grid elemnt this action is assigned to, the chosen webpage is accessed and the user can navigate in it for the time which was set. After this time, the webpage will be closed and the user will return to the communicator.

# openHAB Action

AsTeRICS Grid is capable of controlling a local openHAB installation through the browser. This action utilizes the REST -API of openHAB (see openHAB API documentation (opens new window)).

# Accessing openHAB via http/https

By default, the actions searches for a local openHAB instance on port 8080. +API of openHAB (see openHAB API documentation (opens new window)).

Figure 20 shows the configuration possibilities of an openHAB action:

openHAB action options

Fig. 20: Defining a new openHAB action

These are the elements in this configuration dialog:

  1. openHAB URL: the URL of a running openHAB instance to connect with. Standard URL is http://127.0.0.1:8080/rest/items/ for a local openHAB instance.
  2. Fetch Items: click in order to fetch all available items from the current URL. A tick (✓) or times (×) symbol will indicate if fetching was successful or has failed.
  3. Filter through item types: filter fetched items with its item type (see controllable Items for what items are controllable). By default, all items are selected.
  4. Search for items by name: search for items by name.
  5. Select item: all or filtered items will be listed in a dropdown menu.
  6. Choose command to send: according to the item type, a selection of commands will be available.
  7. Create grid elements: this button allows to create grid elements for all actions of the currently selected items. Note that generated grid elements will only appear after clicking “OK” in the grid element edit modal.
  8. Choose custom value for item (optional): some items (Dimmer, Color, Roller shutter, Temperature) can be controlled with custom values (e.g.: absolute value for dimmer, custom color). The input variant for the specific item will change accordingly.

When editing an already created action, selecting a new item will be disabled and only the action for the current command can be changed. +If the item should be changed, it is required to fetch the items again. +After the items are fetched, the action can be configured as if it was created new.

# Controllable items

Following items are implemented and controllable via the action:

  • Switch: +Includes items like light switches, switches for automations, switches for outlets, …
  • Dimmer: +Includes all dimmable lights
  • Roller shutter: +Includes all roller shutter and blinds
  • Color: +Includes all multicolor lights
  • Temperature: +Inlcudes items with a setable temperature like thermostats
  • Media player: +Includes all media player devices

An item must be implemented in openHAB in order to be accessible via the action.

# Notes:

  • In order to use this action, CORS must be enabled by your openHAB installation. Otherwise, openHAB will deny the +action calls.
  • You must be in the same network as your openHAB installation.
  • Basic Authentication is not supported.

# Accessing openHAB via http/https

By default, the action searches for a local openHAB instance on port 8080. If the openHAB installation is hosted in the local network, there are two possible ways to access it via the browser:

  • http: If you are using openHAB over http with port 8080, you need to allow your browser to use mixed content. Otherwise, the browser has no permission to access your local network. @@ -571,16 +580,7 @@ In order to use the REST-API, a new tab with the address https://<openHAB-IP-address>:8443/rest/items must be opened. Firefox/Safari will prompt that this resource is insecure. By allowing to show the content of this website, an exception is created to allow general connections to the resource. After granting this exception, the -openHAB-Action can access openHAB via https. Figure 20 shows an example of such a security prompt.

Fig. 20: Example of a security prompt by Firefox

Creating a new openHAB action shows the following configuration possibilities:

openHAB action options

These are the elements in this configuration dialog:

  1. openHAB URL: the URL of a running openHAB instance to connect with. Standard URL is http://127.0.0.1:8080/rest/items/ for a local openHAB instance.
  2. Fetch Items: click in order to fetch all available items from the current URL. A tick (✓) or times (×) symbol will indicate if fetching was successful or has failed.
  3. Filter through item types: filter fetched items with its item type (see controllable Items for what items are controllable). By default, all items are selected.
  4. Search for items by name: search for items by name.
  5. Select item: all or filtered items will be listed in a dropdown menu.
  6. Choose command to send: according to the item type, a selection of commands will be available.
  7. Create grid elements: this button allows to create grid elements for all actions of the currently selected items. Note that generated grid elements will only appear after clicking “OK” in the grid element edit modal.
  8. Choose custom value for item (optional): some items (Dimmer, Color, Roller shutter, Temperature) can be controlled with custom values (e.g.: absolute value for dimmer, custom color). The input variant for the specific item will change accordingly.

When editing an already created action, selecting a new item will be disabled and only the action for the current command can be changed. -If the item should be changed, it is required to fetch the items again. -After the items are fetched, the action can be configured as if it was created new.

# Controllable items

Following items are implemented and controllable via the action:

  • Switch: -Includes items like light switches, switches for automations, switches for outlets, …
  • Dimmer: -Includes all dimmable lights
  • Roller shutter: -Includes all roller shutter and blinds
  • Color: -Includes all multicolor lights
  • Temperature: -Inlcudes items with a setable temperature like thermostats
  • Media player: -Includes all media player devices

An item must be implemented in openHAB in order to be accessible via the action.

# Notes:

  • In order to use this action, CORS must be enabled by your openHAB installation. Otherwise, openHAB will deny the -action calls.
  • You must be in the same network as your openHAB installation.
  • Basic Authentication is not supported.

← Previous Chapter Next Chapter →

Back to Overview

- + diff --git a/manuals/asterics-grid/06_users.html b/manuals/asterics-grid/06_users.html index ee98f7a310..d9562d3069 100644 --- a/manuals/asterics-grid/06_users.html +++ b/manuals/asterics-grid/06_users.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Users

Video on YouTube: Offline and online users (opens new window) (German, but auto-translated subtitles available)

This chapter is about offline and online users, their differences and how to add or register them.

Back to Overview

In AsTeRICS Grid a user in general holds a set of grids which realize a specific solution for this user. A user doesn’t necessarily have to be a real person, it’s also possible to create a “user” for a specific usecase, for instance a specific smart home control interface.

# Internet connection requirements

Despite being a web-application that runs in an internet browser, AsTeRICS Grid is designed to be usable also without internet connection.

Internet connection is required for:

  1. First usage of AsTeRICS Grid. Initially opening https://grid.asterics.eu/ automatically downloads the whole application to browser cache and therefore AsTeRICS Grid is usable offline afterwards.
  2. Synchronizing configuration of online users

Without internet access it is possible to:

  1. Use AsTeRICS Grid by just re-opening https://grid.asterics.eu/ in the browser (only initial access needs internet access).
  2. switch between all saved users, which can be both offline and online users

# Online users

Online users are users whose configuration is automatically synchronized with a cloud storage. Therefore it’s possible to this user to log in on different devices while the configuration is always up-to-date on each device.

In view “add online user” it’s possible to register a new online user, Figure 6:

add online user view Fig. 6: Add online user view - register

The following information is important for registering an online user:

  • The only data that is needed are a username and a password. The username is needed for uniquely identifying a user and the password for securing his account and encrypting the data.
  • If you want to use AsTeRICS Grid completely anonymously just use a username without any relation to your person.
  • Since all data is end-to-end encrypted only the user itself can ever see his data and configuration, no server admin or anyone else.
  • End-to-end encryption is great for privacy, however it has the drawback that the data is lost, if you logout your online account on all devices and forget your password. In this case there is no possibility of password recovery, so remember your password carefully. It’s also recommended to do backups of your grids (see Manage grids view).
  • Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.

# Synchronization states

Online users can have the following synchronization states which are shown at the bottom of the navigation bar:

online user - synchronizing symbol Synchronizing: configuration is currently synchronizing with the cloud

online user - synchronized symbol Synchronized: configuration is up-to-date with the cloud storage

online user - synchronized symbol Synchronization failed: synchronization not possible, no internet connection

online user - synchronized symbol Synchronization paused: synchronization paused for a short time and will be resumed shortly

online user - synchronized symbol Online only: user is logged in online-only, meaning that configuration is not saved on the current device. Changes still will be saved in the cloud and therefore also be synchronized to other devices where this user is logged in. Users will be logged in online-only if the “remember checkbox” is unchecked when logging in (see change user view).

# Offline users

Offline users are users whose configuration is only saved offline in the storage of the currently used browser. This type of users are perfectly suited for use cases where AsTeRICS Grid is only used on a single device.

In view “add offline user” it’s possible to add a new offline user (see Terms), Figure 7:

add offline user view Fig. 7: Add offline user view

The following information is important regarding offline users:

  • All data of an offline user never leaves the device, it’s stored in a browser-internal database.
  • Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.

# Backup

Regardless which type of users are used, we highly recommend to do backups if you are using AsTeRICS Grid on a regular basis and have put some effort into customizing own grids for your use-case. See manage grids view for instructions how to create and restore backups.

This is why backups are important:

  1. Offline users: since all data is only stored in an browser-internal storage, any browser crash or failure of your device could cause data loss.
  2. Online users: Although online users are not susceptible to device or browser errors, data loss is still possible because of the encryption of the user data. If the user forgets his password or decryption fails because of any kind of programming error the data cannot be recovered. Backups as described in manage grids view are saved to an unencrypted file and therefore can recover the user data in such a case.

← Previous Chapter Next Chapter →

Back to Overview

# Users

Video on YouTube: Offline and online users (opens new window) (German, but auto-translated subtitles available)

This chapter is about offline and online users, their differences and how to add or register them.

Back to Overview

In AsTeRICS Grid a user in general holds a set of grids which realize a specific solution for this user. A user doesn’t necessarily have to be a real person, it’s also possible to create a “user” for a specific usecase, for instance a specific smart home control interface.

# Internet connection requirements

Despite being a web-application that runs in an internet browser, AsTeRICS Grid is designed to be usable also without internet connection.

Internet connection is required for:

  1. First usage of AsTeRICS Grid. Initially opening https://grid.asterics.eu/ automatically downloads the whole application to browser cache and therefore AsTeRICS Grid is usable offline afterwards.
  2. Synchronizing configuration of online users

Without internet access it is possible to:

  1. Use AsTeRICS Grid by just re-opening https://grid.asterics.eu/ in the browser (only initial access needs internet access).
  2. switch between all saved users, which can be both offline and online users

# Online users

Online users are users whose configuration is automatically synchronized with a cloud storage. Therefore it’s possible to this user to log in on different devices while the configuration is always up-to-date on each device.

In view “add online user” it’s possible to register a new online user, Figure 6:

add online user view Fig. 6: Add online user view - register

The following information is important for registering an online user:

  • The only data that is needed are a username and a password. The username is needed for uniquely identifying a user and the password for securing his account and encrypting the data.
  • If you want to use AsTeRICS Grid completely anonymously just use a username without any relation to your person.
  • Since all data is end-to-end encrypted only the user itself can ever see his data and configuration, no server admin or anyone else.
  • End-to-end encryption is great for privacy, however it has the drawback that the data is lost, if you logout your online account on all devices and forget your password. In this case there is no possibility of password recovery, so remember your password carefully. It’s also recommended to do backups of your grids (see Manage grids view).
  • Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.

# Synchronization states

Online users can have the following synchronization states which are shown at the bottom of the navigation bar:

online user - synchronizing symbol Synchronizing: configuration is currently synchronizing with the cloud

online user - synchronized symbol Synchronized: configuration is up-to-date with the cloud storage

online user - synchronized symbol Synchronization failed: synchronization not possible, no internet connection

online user - synchronized symbol Synchronization paused: synchronization paused for a short time and will be resumed shortly

online user - synchronized symbol Online only: user is logged in online-only, meaning that configuration is not saved on the current device. Changes still will be saved in the cloud and therefore also be synchronized to other devices where this user is logged in. Users will be logged in online-only if the “remember checkbox” is unchecked when logging in (see change user view).

# Offline users

Offline users are users whose configuration is only saved offline in the storage of the currently used browser. This type of users are perfectly suited for use cases where AsTeRICS Grid is only used on a single device.

In view “add offline user” it’s possible to add a new offline user (see Terms), Figure 7:

add offline user view Fig. 7: Add offline user view

The following information is important regarding offline users:

  • All data of an offline user never leaves the device, it’s stored in a browser-internal database.
  • Usernames must start lowercase, valid characters are [a-z], [0-9] and ["-", “_”], valid length is 3-50 characters.

# Backup

Regardless which type of users are used, we highly recommend to do backups if you are using AsTeRICS Grid on a regular basis and have put some effort into customizing own grids for your use-case. See manage grids view for instructions how to create and restore backups.

This is why backups are important:

  1. Offline users: since all data is only stored in an browser-internal storage, any browser crash or failure of your device could cause data loss.
  2. Online users: Although online users are not susceptible to device or browser errors, data loss is still possible because of the encryption of the user data. If the user forgets his password or decryption fails because of any kind of programming error the data cannot be recovered. Backups as described in manage grids view are saved to an unencrypted file and therefore can recover the user data in such a case.

← Previous Chapter Next Chapter →

Back to Overview

- + diff --git a/manuals/asterics-grid/07_dictionaries.html b/manuals/asterics-grid/07_dictionaries.html index 052e8a4ebb..8d82520651 100644 --- a/manuals/asterics-grid/07_dictionaries.html +++ b/manuals/asterics-grid/07_dictionaries.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Dictionaries

Video on YouTube: Manage dictionaries (opens new window) (German, but auto-translated subtitles available)

This chapter is about dictionaries and how to manage and use them within AsTeRICS Grid.

Back to Overview

A dictionary is a collection of words and their relations that is saved within AsTeRICS Grid in order to fill prediction elements.

# Edit dictionaries

The basic functionality of the manage dictionaries view was already described in chapter navigation and basic functionality.

In the manage dictionaries view clicking on “Edit” in the list of dictionaries allows to see the details of a dictionary and editing it:

edit a dictionary Figure 1: Edit a dictionary

Typing a word or a part of it in the search field filters the list of shown words. Clicking on the recycle bin symbol next to a word deletes it from the dictionary.

# Add words

Clicking on the “Import words” in Figure 1 button opens a modal:

import words to dictionary Figure 2: Import words modal

These are the elements of the “import words” modal:

  1. Advanced options: click to toggle visibility of advanced import options (Fig. 2, advanced options are shown on the left, hidden on the right)
  2. Input field: field to input or paste words that should be imported to the dictionary
  3. Recognized words: live-updated list of recognized words based on the input options and words typed into the textfield
  4. Cancel: discard changes and close the modal
  5. Insert words: import the recognized words to the dictionary and close the modal
  6. Element separator: separator between words to recognize, can be either a single character or Javascript RegExp syntax. Default value is the Javascript RegExp [\n; ] meaning that line breaks, semicolons and spaces can be used to divide words.
  7. In-element separator (optional): single character or Javascript RegExp expression that re-splits elements that are recognized by “element separator”. This is needed if the imported data consists of words and and a rank specifying the position of the word based on it’s frequency.
  8. Word index: if “in-element separator” is set this property specifies the position of the word
  9. Rank index: if “in-element separator” is set this property specifies the position of the rank

# Example: import a big word list

This example shows how to import a big list of words, for instance a list of the most frequent 25000 words from Corpus leeds.

The format of the list looks like this:

1 43116.72 the
+   (opens new window)

# Dictionaries

Video on YouTube: Manage dictionaries (opens new window) (German, but auto-translated subtitles available)

This chapter is about dictionaries and how to manage and use them within AsTeRICS Grid.

Back to Overview

A dictionary is a collection of words and their relations that is saved within AsTeRICS Grid in order to fill prediction elements.

# Edit dictionaries

The basic functionality of the manage dictionaries view was already described in chapter navigation and basic functionality.

In the manage dictionaries view clicking on “Edit” in the list of dictionaries allows to see the details of a dictionary and editing it:

edit a dictionary Figure 1: Edit a dictionary

Typing a word or a part of it in the search field filters the list of shown words. Clicking on the recycle bin symbol next to a word deletes it from the dictionary.

# Add words

Clicking on the “Import words” in Figure 1 button opens a modal:

import words to dictionary Figure 2: Import words modal

These are the elements of the “import words” modal:

  1. Advanced options: click to toggle visibility of advanced import options (Fig. 2, advanced options are shown on the left, hidden on the right)
  2. Input field: field to input or paste words that should be imported to the dictionary
  3. Recognized words: live-updated list of recognized words based on the input options and words typed into the textfield
  4. Cancel: discard changes and close the modal
  5. Insert words: import the recognized words to the dictionary and close the modal
  6. Element separator: separator between words to recognize, can be either a single character or Javascript RegExp syntax. Default value is the Javascript RegExp [\n; ] meaning that line breaks, semicolons and spaces can be used to divide words.
  7. In-element separator (optional): single character or Javascript RegExp expression that re-splits elements that are recognized by “element separator”. This is needed if the imported data consists of words and and a rank specifying the position of the word based on it’s frequency.
  8. Word index: if “in-element separator” is set this property specifies the position of the word
  9. Rank index: if “in-element separator” is set this property specifies the position of the rank

# Example: import a big word list

This example shows how to import a big list of words, for instance a list of the most frequent 25000 words from Corpus leeds.

The format of the list looks like this:

1 43116.72 the
 2 25428.07 of
 3 22833.85 to
 ...
@@ -566,6 +566,6 @@
       
       →
     

- + diff --git a/manuals/asterics-grid/08_keyboard_shortcuts.html b/manuals/asterics-grid/08_keyboard_shortcuts.html index a9b3d40227..db3d85c2be 100644 --- a/manuals/asterics-grid/08_keyboard_shortcuts.html +++ b/manuals/asterics-grid/08_keyboard_shortcuts.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Keyboard Shortcuts

These are the global keyboard shortcuts available in AsTeRICS Grid:

  • Ctrl + Alt + Arrow Right: Change to the next stored user
  • Ctrl + Backspace: Navigate to the last grid
  • Ctrl + Pos1: Navigate to the main/home grid. Only works if a global grid with an element navigating to home/main is defined.

← Previous Chapter

Back to Overview

# Keyboard Shortcuts

These are the global keyboard shortcuts available in AsTeRICS Grid:

  • Ctrl + Alt + Arrow Right: Change to the next stored user
  • Ctrl + Backspace: Navigate to the last grid
  • Ctrl + Pos1: Navigate to the main/home grid. Only works if a global grid with an element navigating to home/main is defined.

← Previous Chapter

Back to Overview

- + diff --git a/manuals/asterics-grid/09_translation.html b/manuals/asterics-grid/09_translation.html index 22adcf3d76..ead818e57d 100644 --- a/manuals/asterics-grid/09_translation.html +++ b/manuals/asterics-grid/09_translation.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# Translation of AsTeRICS Grid

AsTeRICS Grid supports multiple languages. In general there are two things that can be translated:

  • Application language: the language of the user interface, e.g. labels of buttons or texts within the menus.
  • Grid content language: the language of the grids, i.e. texts within grid elements or spoken custom texts.

In the Settings menu it’s possible to change these languages: + (opens new window)

# Translation of AsTeRICS Grid

AsTeRICS Grid supports multiple languages. In general there are two things that can be translated:

  • Application language: the language of the user interface, e.g. labels of buttons or texts within the menus.
  • Grid content language: the language of the grids, i.e. texts within grid elements or spoken custom texts.

In the Settings menu it’s possible to change these languages:

The grid content language can also be changed via an action attached to a grid element.

We are thankful for any support translating the application of the grid contents!

# Translation of the application

The application can be translated via the online service crowdin, see: AsTeRICS Grid on crowdin (opens new window). In order to contribute translations on this platform, follow these steps:

  • Create a user/log in at crowdin
  • Select the language where you want to contribute and click on “Translate all”:
  • In a stepwise process, translate all the captions, messages and menu items (you may use suggested words and phrases by crowdin which makes the job much easier)
  • Translations are automatically transferred to the application and are released at some time (this can take a while)

# Translation of the content

AsTeRICS Grid can offer multilingual as well as monolingual standard gridsets (templates that can be imported). These templates can be imported after creating a new user or using AsTeRICS Grid the first time, for instance:

  • AsTeRICS Grid default (multilingual): is a default gridset created by UAS Technikum Wien which is a demo for many possibilities that AsTeRICS Grid offers. It’s one configuration which is translated to many languages. This means that the language can be switched by the user, since all translations are included within this configuration.
  • Global-Core Communicator ARASAAC: is a communicator that is offered monolingual. This means that the configuration only contains one language and it’s not possible to switch the language within this configuration. However it’s still possible to translate the configuration and make it available in a separate monolingual configuration.

In general multilingual and monolingual gridsets are appropriate in different use cases:

  • Multilingual: use cases where users should to be able to switch languages, e.g. a configuration used in a hospital which is used by different users speaking different languages.
  • Monolingual: if a configuration is used by a single user speaking only one language, a monolingual configuration suits better. It also has the advantage that the structure of the grids (e.g. a keyboard grid) can be adapted to best fit a single language, which can be difficult for multilingual configurations.

# Translation of a multilingual default gridset

Follow these steps to translate an existing multilingual default gridset (e.g. AsTeRICS Grid default):

  • Create a new offline user with any username
  • Import the default gridset you want to translate
  • Use Editing on -> More (right top corner) -> Translate grid to translate all grids to the target language
  • Hint: you can select show all grids and use the buttons Copy column and Paste column to copy/paste elements from/to a translation service like Google tranlsate. This can greatly speed up the translation process.
  • Important: don’t change anything else in the configuration (e.g. adding new grid elements)
  • Create a backup with the new language via Manage grids -> More (right top corner) -> Save backup to file
  • Send the file to office@asterics-foundation.org and we can add this translation to the default gridset!

# Creation of a new monolingual default gridset

If you want to create a new default gridset for a single language, follow these steps:

  • Create a new offline user with any username
  • Import an existing default gridset if you want to build upon it or start with an empty configuration if you want to build something new
  • Set the correct content language under “Settings”:
  • Adjust configuration as you like and how it works best for the desired language. This can also be something completely different than the base gridset.
  • Export the finished configuration using Manage grids -> More (right top corner) -> Save custom data to file and there select these options: @@ -567,6 +567,6 @@ →

- + diff --git a/manuals/asterics-grid/10_faq.html b/manuals/asterics-grid/10_faq.html index a3116b1974..f920405d7a 100644 --- a/manuals/asterics-grid/10_faq.html +++ b/manuals/asterics-grid/10_faq.html @@ -17,7 +17,7 @@ - + @@ -553,14 +553,18 @@ Yorùbá (opens new window)

# Frequently asked questions

This page contains information about frequently asked questions about AsTeRICS Grid.

# Issues with online text-to-speech voices (lags, not working)

AsTeRICS Grid uses voices from these sources:

  • offline: voices installed on the operating system (differs depending on platform, Windows has different voices than Android or iOS), e.g. Microsoft David - English, offline on a Windows computer
  • online (best quality): voices from Microsoft, e.g. Microsoft Eric Online (Natural), online. These voices are only available in the Microsoft Edge Browser on a Windows computer.
  • online (good quality):, Google voices, e.g. Google Deutsch, online. These voices are only available in Google Chrome browser.
  • online (average quality and sometimes problems with availability): When using voices from responsivevoice.org (opens new window), e.g. Spanish Female, online, there can be some delay (e.g. 5 seconds or more) until the label is spoken. There are also random errors accessing the voice service.

As stated the quality and availability of these voices differs, in general offline voices should be preferred, because they are most reliable and not depending on an internet connection. Most problems occur with voices from responsivevoice.org (opens new window), which is why they only should be used if no alternatives are available.

# Installing additional voices

On most operating systems it’s possible to install additional offline voices and afterwards use them in AsTeRICS Grid.

# Microsoft Windows 10

On Windows 10 follow these steps to install additional voices:

  1. go to language system settings

  2. click on add language

  3. search for the language you want to install

  4. if there is a speech balloon icon next to the language it indicates that a text-to-speech (TTS) voice is available for this language: + (opens new window)

# Frequently asked questions

This page contains information about frequently asked questions about AsTeRICS Grid.

# Issues with online text-to-speech voices (lags, not working)

AsTeRICS Grid uses voices from these sources:

  • offline: voices installed on the operating system (differs depending on platform, Windows has different voices than Android or iOS), e.g. Microsoft David - English, offline on a Windows computer
  • online (best quality): voices from Microsoft, e.g. Microsoft Eric Online (Natural), online. These voices are only available in the Microsoft Edge Browser on a Windows computer.
  • online (good quality):, Google voices, e.g. Google Deutsch, online. These voices are only available in Google Chrome browser.
  • online (average quality and sometimes problems with availability): When using voices from responsivevoice.org (opens new window), e.g. Spanish Female, online, there can be some delay (e.g. 5 seconds or more) until the label is spoken. There are also random errors accessing the voice service.

As stated the quality and availability of these voices differs, in general offline voices should be preferred, because they are most reliable and not depending on an internet connection. Most problems occur with voices from responsivevoice.org (opens new window), which is why they only should be used if no alternatives are available.

# Installing additional voices

On most operating systems it’s possible to install additional offline voices and afterwards use them in AsTeRICS Grid.

# Microsoft Windows 10

On Windows 10 follow these steps to install additional voices:

  1. go to language system settings

  2. click on add language

  3. search for the language you want to install

  4. if there is a speech balloon icon next to the language it indicates that a text-to-speech (TTS) voice is available for this language:

  5. If a TTS voice is available for your language, install it!

  6. Restart the computer: Afterwards the new offline voices should be available in AsTeRICS Grid

# Android

Please follow this tutorial from ARASAAC to read about possibilities to install additional offline voices on an Android device: ARASAAC tutorial for installing voices on Android (opens new window)

# iOS

With iOS 15 it was possible to use all voices installed on the device within AsTeRICS Grid. With iOS 16 Apple seems to have decided to remove the possibility to use high quality voices within web applications and therefore also to remove them from AsTeRICS Grid. See this issue on Github about iOS voices (opens new window) and this question in the Apple developer forum (opens new window) which shows that this isn’t a bug, but is behaviour that’s intended by Apple. We’ve contacted Apple directly and asked them to revert this change, but didn’t receive an answer. If you’re experiencing this issue, you can send feedback to Apple directly: send feedback to Apple (opens new window)

Update: with iOS 17 the situation became better again, now for most languages at least one higher quality voice is available for AsTeRICS Grid, also see https://github.com/asterics/AsTeRICS-Grid/issues/223#issuecomment-1729299302

# Can I recover the password of my online user?

We care about the protection of private data that can be inserted into grids, e.g. images or sound recordings. Therefore we’ve designed AsTeRICS Grid in a way where only the user itself can see his/her data, nobody else. All data of online users is encrypted using the password of the user. So even if we have access to the database, we cannot see anything but encrypted, unreadable data. While that’s great for privacy, it also has this major drawback:

It’s not possible to reset or recover the password of an online user. If the password of an online user is lost, also the data of this user is lost and cannot be recovered.

So there are two things that are important in order to prevent loosing data:

  • keep the usernames and passwords of your online users safe, write them down somewhere or use a password safe software for saving them.
  • regularily download backups of your user’s data to file. AsTeRICS Grid automatically reminds for downloading backups, but it can be done at any time by going to Manage grids -> More (right top) -> Save backup to file. Backups saved to file are not encrypted and therefore can be used and imported for a new user.

# Transfer data to new user

If you’ve lost the password of a user and you’re still logged in with this user on any device, just make a backup to file, create a new user and import the data from the backup there. Follow these steps:

  • Go to Manage grids -> More (top right corner) -> Save backup to file
  • Create a new online user (and note your new password somewhere)
  • Select Restore backup from file at the bottom:
  • Continue to use the new online user on other devices

# The global grid disappeared or the “Home” button doesn’t work

If the global grid (first line including navigation to “Home” and “Back” and line for collecting elements) disappears or doesn’t work as expected any more, try this:

  • go to “Manage Grids”
  • scroll all down to the bottom of the page
  • select the correct home grid at Select Home grid for creating global Grid
  • Click on Reset global grid to default

Also see this screenshot: grafik

# Allow mixed content (http/https)

In order to be allowed to access a local network (e.g. OpenHAB for environmental control), it may be necessary to allow mixed content in the current page. You can do according to the following steps:

# Allow mixed content Firefox

With the OpenHAB editing action opened,

  1. Click on the lock symbol left to the address bar.
  2. Click on Connection secure
  3. Click on Disable protection for now

image

# Allow mixed content Chrome

With the OpenHAB editing action opened,

  1. Click on Not secure left to the address bar.
  2. Click on Site settings
  3. Allow Insecure contents

image

- + + 10 Word Forms + + → +

+ diff --git a/manuals/asterics-grid/10_word_forms.html b/manuals/asterics-grid/10_word_forms.html new file mode 100644 index 0000000000..20c1e3a458 --- /dev/null +++ b/manuals/asterics-grid/10_word_forms.html @@ -0,0 +1,564 @@ + + + + + + Word forms in AsTeRICS Grid | AsTeRICS + + + + + + + + + + + + + + + + + +

# Word forms in AsTeRICS Grid

For simple communication boards it’s sufficient to use static labels (in different languages) for grid elements. However, for more advanced communicators “word forms” can be used in order to allow grammatically correct communication.

# General

Word forms can be defined for each element in the dialog for editing grid elements. The tab Word forms allows to define and edit word forms (see Fig.1).

edit view Fig.1: Dialog for defining and editing word forms

The dialog in Figure 1 shows the following options:

  1. Language: (optional) language of the new word form
  2. Tags: (optional) tags assigned to the new word form (e.g. 1.PERS or PLURAL)
  3. Word form: the value of the new word form
  4. Pronunciation: (optional) alternative pronunciation for the new word form
  5. Add word form: adds the newly defined word form to the list
  6. Import/export data to/from all grids: if activated, word forms are not only imported/exported for the current element, but for all elements within all grids. This options helps to quickly edit all word forms (e.g. managed in an external spreadsheet). Note that data can only be imported to all grids (globally) if the data to import contains the fourth column ID (see below) and the target elements contain a word form with tag BASE (which is used for mapping the word forms correctly).
  7. Override existing word forms: if activated, all existing word forms are overwritten at import. Always activated if importing globally.
  8. Import from clipboard: imports word forms from the clipboard, copied from an external spreadsheet. The columns that can be imported are: WORD FORM, LANG (2 digits), TAGS (comma separated), ID, PRONUNCIATION. The order of columns is important, but not all have to be existing, so it’s also possible to copy only the first ones. The value ID is only relevant for importing elements to all grids (globally) and it’s automatically generated at exporting from all grids globally.
  9. Copy to clipboard: copies word forms to the clipboard in a format that can be pasted to a spreadsheet.
  10. Language filter: dropdown for selecting a language for filtering the list of word forms
  11. Delete all: deletes all word forms of the current element
  12. Edit button: enable/disable edit mode for a specific word form in the list
  13. Trash button: delete a specific word form
  14. Up button: moves the word form up within the list
  15. Down button: moves the word form down within the list

# Word form actions

Once word forms are defined for different elements, they can be used and selected using the action type change word forms in tab Actions of the modal for editing a grid element (see Fig. 1). Figure 2 shows the possibilities for configuring this action.

edit view Fig.2: Configuring an action of type “Change word forms”.

# General function

In general most action types for change word forms allow it to define tags (Figure 2.2) which are added to an internal (hidden) list of current tags, if the action is performed.

Example 1: for example there could be the following elements within a grid:

  • Element “You”: has action change word forms with tag 2.PERS.
  • Element “Past”: has action change word forms with tag PAST.
  • Element “to be”: has defined various word forms with tags like am [1.PERS, PRESENT], are [2.PERS, PRESENT], were [2.PERS, PAST].

Now using these elements would work as follows:

  1. Select element “You”: tag 2.PERS is added to internal list, word forms are changed in order to match this tag -> element “to be” is changed to are because it’s the first word form including the tag 2.PERS
  2. Select element “Past”: tag PAST is added to internal list, which now includes 2.PERS, PAST. Word forms are changed to match these tags -> element “to be” is changed to were because it’s the first word form including the tags 2.PERS and PAST.

# Action types

These are the action types for change word forms (Fig. 2.1):

  • Change word form in grid elements: changes the labels of grid elements to the word form that best matches the current internal list of tags.
  • Change word form in collection element: changes the last element in the collection element to the word form that best matches the current internal list of tags.
  • Change word form everywhere: changes word forms both within grid elements and within the last word of the collect element.
  • Change this element to next word form: doesn’t use tags for selecting word forms, but simply iterates through the list of word forms defined within this element. Example usage: word forms contain a list of names, clicking on the element several times allows to select one of the names.
  • Reset currently displayed word forms: resets the word forms, clears the tags currently stored within the internal list. This is done automatically each time an element is selected which doesn’t include any change word form action.

Figure 2.3 shows an additional option Toggle tags on selecting it multiple times. If this option is activated, selecting this element several times in a row, toggles the tags of this action in the internal list. So in example 1 (see above) selecting the element “Past” multiple times would add and remove the tag PAST from the internal list, causing to toggle between the words are and were.

The action type change this element to next word form also has an option secondary action type. If selected, the tags of the current word form are used for a secondary action. Example usage: an element has 2 word forms I [1.PERS] and You [2.PERS]. Iterating through these values using change this element to next word form with secondary action type = change word form in grid elements will cause changing all other grid elements to 1.PERS after selecting I and to 2.PERS after selecting You.

# Example configuration

A grid configuration including examples for all word form features can be downloaded here: +Grid configuration with word form examples (use right click and “save target as”). It contains examples for all different action types of change word forms.

+ + + diff --git a/manuals/asterics-grid/index.html b/manuals/asterics-grid/index.html index 6e01924597..e76f10a43e 100644 --- a/manuals/asterics-grid/index.html +++ b/manuals/asterics-grid/index.html @@ -17,7 +17,7 @@ - + @@ -553,7 +553,7 @@ Yorùbá (opens new window)

# AsTeRICS Grid user documentation

This is the user documentation for AsTeRICS Grid, a web-based tool for augmented and alternative communication (AAC). Integration with the AsTeRICS Framework makes it possible to realize additional functionalities like environmental or computer control.

The documentation is divided in the following parts:

  1. Terms
  2. Navigation and basic functionality
  3. Grid appearance and layout
  4. Input options
  5. Grid element actions
  6. Users
  7. Dictionaries
  8. Keyboard Shortcuts
  9. Translation
  10. FAQ - frequently asked questions

Hint: Most of the content of this documentation is also available in this video playlist (opens new window) on YouTube. The videos are in German, but auto-translated subtitles are available.

- + (opens new window)

# AsTeRICS Grid user documentation

This is the user documentation for AsTeRICS Grid, a web-based tool for augmented and alternative communication (AAC). Integration with the AsTeRICS Framework makes it possible to realize additional functionalities like environmental or computer control.

The documentation is divided in the following parts:

  1. Terms
  2. Navigation and basic functionality
  3. Grid appearance and layout
  4. Input options
  5. Grid element actions
  6. Users
  7. Dictionaries
  8. Keyboard Shortcuts
  9. Translation
  10. Word forms
  11. FAQ - frequently asked questions

Hint: Most of the content of this documentation is also available in this video playlist (opens new window) on YouTube. The videos are in German, but auto-translated subtitles are available.

+ diff --git a/manuals/fabi/index.html b/manuals/fabi/index.html index ea4868d2af..e0f71dc950 100644 --- a/manuals/fabi/index.html +++ b/manuals/fabi/index.html @@ -17,7 +17,7 @@ - + @@ -580,6 +580,6 @@ →

- + diff --git a/manuals/flipmouse/index.html b/manuals/flipmouse/index.html index fd19e76a4a..58e96d9993 100644 --- a/manuals/flipmouse/index.html +++ b/manuals/flipmouse/index.html @@ -17,7 +17,7 @@ - + @@ -635,6 +635,6 @@

- + diff --git a/manuals/index.html b/manuals/index.html index 922e6729c4..7fa418cfd6 100644 --- a/manuals/index.html +++ b/manuals/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Manuals

In this section you will find the user manuals of selected AsTeRICS programs.

- + diff --git a/plugins/actuators/AREWindow.html b/plugins/actuators/AREWindow.html index 98df367e74..846ddc7bfe 100644 --- a/plugins/actuators/AREWindow.html +++ b/plugins/actuators/AREWindow.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/AnalogOut.html b/plugins/actuators/AnalogOut.html index 1f7ac7ad18..d5ae1c1893 100644 --- a/plugins/actuators/AnalogOut.html +++ b/plugins/actuators/AnalogOut.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/actuators/AndroidPhoneControl.html b/plugins/actuators/AndroidPhoneControl.html index d4ba95199c..7026d72e64 100644 --- a/plugins/actuators/AndroidPhoneControl.html +++ b/plugins/actuators/AndroidPhoneControl.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/actuators/Android_connection.html b/plugins/actuators/Android_connection.html index 24b484d445..89000f8c66 100644 --- a/plugins/actuators/Android_connection.html +++ b/plugins/actuators/Android_connection.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/AngularCursorControl.html b/plugins/actuators/AngularCursorControl.html index 10ec20571f..55abe4aaf9 100644 --- a/plugins/actuators/AngularCursorControl.html +++ b/plugins/actuators/AngularCursorControl.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/ApplicationLauncher.html b/plugins/actuators/ApplicationLauncher.html index 6a45cc1e1f..77dc3f25ae 100644 --- a/plugins/actuators/ApplicationLauncher.html +++ b/plugins/actuators/ApplicationLauncher.html @@ -17,7 +17,7 @@ - + @@ -566,6 +566,6 @@ →

- + diff --git a/plugins/actuators/BarDisplay.html b/plugins/actuators/BarDisplay.html index cf635e838e..0e2484608b 100644 --- a/plugins/actuators/BarDisplay.html +++ b/plugins/actuators/BarDisplay.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/CrosshairCursorControl.html b/plugins/actuators/CrosshairCursorControl.html index 3f8b16b6c4..7f789eaf3e 100644 --- a/plugins/actuators/CrosshairCursorControl.html +++ b/plugins/actuators/CrosshairCursorControl.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/DialogBox.html b/plugins/actuators/DialogBox.html index c839862d2e..9750350f5a 100644 --- a/plugins/actuators/DialogBox.html +++ b/plugins/actuators/DialogBox.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/DigitalOut.html b/plugins/actuators/DigitalOut.html index 7102c2f072..e7a79a6ae0 100644 --- a/plugins/actuators/DigitalOut.html +++ b/plugins/actuators/DigitalOut.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/DotMeter.html b/plugins/actuators/DotMeter.html index 30d49b9f8d..9a450afbd6 100644 --- a/plugins/actuators/DotMeter.html +++ b/plugins/actuators/DotMeter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/EasyHomeControl.html b/plugins/actuators/EasyHomeControl.html index 88d904d534..dff76f1725 100644 --- a/plugins/actuators/EasyHomeControl.html +++ b/plugins/actuators/EasyHomeControl.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/EmulateFaultyPlugin.html b/plugins/actuators/EmulateFaultyPlugin.html index ec4ef0d0e7..8ae4a6f7cc 100644 --- a/plugins/actuators/EmulateFaultyPlugin.html +++ b/plugins/actuators/EmulateFaultyPlugin.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/EnobioDisplay.html b/plugins/actuators/EnobioDisplay.html index 04e4015ee9..3492eb861a 100644 --- a/plugins/actuators/EnobioDisplay.html +++ b/plugins/actuators/EnobioDisplay.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/Enocean.html b/plugins/actuators/Enocean.html index 67000f8c60..2b73351068 100644 --- a/plugins/actuators/Enocean.html +++ b/plugins/actuators/Enocean.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/EventVisualizer.html b/plugins/actuators/EventVisualizer.html index b9ae172500..9ca6d38a62 100644 --- a/plugins/actuators/EventVisualizer.html +++ b/plugins/actuators/EventVisualizer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/FS20Sender.html b/plugins/actuators/FS20Sender.html index d8e5f0de4d..29d16b6cf9 100644 --- a/plugins/actuators/FS20Sender.html +++ b/plugins/actuators/FS20Sender.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/actuators/FileWriter.html b/plugins/actuators/FileWriter.html index ce6db03845..090b152bd5 100644 --- a/plugins/actuators/FileWriter.html +++ b/plugins/actuators/FileWriter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/FlickeringLightStimulator.html b/plugins/actuators/FlickeringLightStimulator.html index 09adb65fe5..2b757eebad 100644 --- a/plugins/actuators/FlickeringLightStimulator.html +++ b/plugins/actuators/FlickeringLightStimulator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/GMailShortcuts.html b/plugins/actuators/GMailShortcuts.html index 888661e5bc..ab2d00a396 100644 --- a/plugins/actuators/GMailShortcuts.html +++ b/plugins/actuators/GMailShortcuts.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/GSMModem.html b/plugins/actuators/GSMModem.html index 5cce3f937d..2162bfcf30 100644 --- a/plugins/actuators/GSMModem.html +++ b/plugins/actuators/GSMModem.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/IRTrans.html b/plugins/actuators/IRTrans.html index 97ed928985..8c194a230b 100644 --- a/plugins/actuators/IRTrans.html +++ b/plugins/actuators/IRTrans.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/actuators/ImageBox.html b/plugins/actuators/ImageBox.html index 587ad7f66b..34ef6ab88d 100644 --- a/plugins/actuators/ImageBox.html +++ b/plugins/actuators/ImageBox.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/Keyboard.html b/plugins/actuators/Keyboard.html index 964ffa95c7..acda72c1d2 100644 --- a/plugins/actuators/Keyboard.html +++ b/plugins/actuators/Keyboard.html @@ -17,7 +17,7 @@ - + @@ -600,6 +600,6 @@ →

- + diff --git a/plugins/actuators/Knx.html b/plugins/actuators/Knx.html index 48c381f375..8741155ded 100644 --- a/plugins/actuators/Knx.html +++ b/plugins/actuators/Knx.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/LegacyDigitalOut.html b/plugins/actuators/LegacyDigitalOut.html index 795bdd22bf..0f0256a169 100644 --- a/plugins/actuators/LegacyDigitalOut.html +++ b/plugins/actuators/LegacyDigitalOut.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/LineWriter.html b/plugins/actuators/LineWriter.html index 680f8ff4a2..0e93715c65 100644 --- a/plugins/actuators/LineWriter.html +++ b/plugins/actuators/LineWriter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/MediaPlayer.html b/plugins/actuators/MediaPlayer.html index d6d6be40aa..b10d95cbf9 100644 --- a/plugins/actuators/MediaPlayer.html +++ b/plugins/actuators/MediaPlayer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/MidiPlayer.html b/plugins/actuators/MidiPlayer.html index 841cc71a81..beaa566746 100644 --- a/plugins/actuators/MidiPlayer.html +++ b/plugins/actuators/MidiPlayer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/ModelSwitcher.html b/plugins/actuators/ModelSwitcher.html index 2a3cc36947..04485ca189 100644 --- a/plugins/actuators/ModelSwitcher.html +++ b/plugins/actuators/ModelSwitcher.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/Mouse.html b/plugins/actuators/Mouse.html index d9466c77d0..a2057f578f 100644 --- a/plugins/actuators/Mouse.html +++ b/plugins/actuators/Mouse.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/MousecursorIcon.html b/plugins/actuators/MousecursorIcon.html index 5585df1a55..72d6753a2f 100644 --- a/plugins/actuators/MousecursorIcon.html +++ b/plugins/actuators/MousecursorIcon.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/NetConnection.html b/plugins/actuators/NetConnection.html index a94be4fd97..c76d5afe33 100644 --- a/plugins/actuators/NetConnection.html +++ b/plugins/actuators/NetConnection.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/OscOutClient.html b/plugins/actuators/OscOutClient.html index e396dda88c..8b11063feb 100644 --- a/plugins/actuators/OscOutClient.html +++ b/plugins/actuators/OscOutClient.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/Oscilloscope.html b/plugins/actuators/Oscilloscope.html index 406c273a35..2f3849d81b 100644 --- a/plugins/actuators/Oscilloscope.html +++ b/plugins/actuators/Oscilloscope.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/PhilipsHue.html b/plugins/actuators/PhilipsHue.html index a2f2a95409..0a950751c2 100644 --- a/plugins/actuators/PhilipsHue.html +++ b/plugins/actuators/PhilipsHue.html @@ -17,7 +17,7 @@ - + @@ -575,6 +575,6 @@ →

- + diff --git a/plugins/actuators/PhoneControl.html b/plugins/actuators/PhoneControl.html index 9e7fae83b1..56abaf5648 100644 --- a/plugins/actuators/PhoneControl.html +++ b/plugins/actuators/PhoneControl.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/PicoTTS.html b/plugins/actuators/PicoTTS.html index 2c8fe58b83..742b0acd0d 100644 --- a/plugins/actuators/PicoTTS.html +++ b/plugins/actuators/PicoTTS.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/actuators/PlatformDigitalOut.html b/plugins/actuators/PlatformDigitalOut.html index 686e6f562a..6d1f645dc5 100644 --- a/plugins/actuators/PlatformDigitalOut.html +++ b/plugins/actuators/PlatformDigitalOut.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/PlatformLCD.html b/plugins/actuators/PlatformLCD.html index 830ecd06a3..3de8d339ea 100644 --- a/plugins/actuators/PlatformLCD.html +++ b/plugins/actuators/PlatformLCD.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/PongGame.html b/plugins/actuators/PongGame.html index f991dc5c83..2f9a18db6f 100644 --- a/plugins/actuators/PongGame.html +++ b/plugins/actuators/PongGame.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/RemoteJoystick.html b/plugins/actuators/RemoteJoystick.html index 935f67e773..ad3e466e5f 100644 --- a/plugins/actuators/RemoteJoystick.html +++ b/plugins/actuators/RemoteJoystick.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/RemoteKeyboard.html b/plugins/actuators/RemoteKeyboard.html index ec4183da34..835aaee8e9 100644 --- a/plugins/actuators/RemoteKeyboard.html +++ b/plugins/actuators/RemoteKeyboard.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/RemoteMouse.html b/plugins/actuators/RemoteMouse.html index 3fc876b7d0..3985c2cf2a 100644 --- a/plugins/actuators/RemoteMouse.html +++ b/plugins/actuators/RemoteMouse.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/RemoteTablet.html b/plugins/actuators/RemoteTablet.html index e6cd2b2b8e..430e5ab70e 100644 --- a/plugins/actuators/RemoteTablet.html +++ b/plugins/actuators/RemoteTablet.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/RemoteWindow.html b/plugins/actuators/RemoteWindow.html index dfecf04afc..4a6d73d13f 100644 --- a/plugins/actuators/RemoteWindow.html +++ b/plugins/actuators/RemoteWindow.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/SSVEPFileWriter.html b/plugins/actuators/SSVEPFileWriter.html index 3fe759e309..f40c6d425e 100644 --- a/plugins/actuators/SSVEPFileWriter.html +++ b/plugins/actuators/SSVEPFileWriter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/SSVEPStimulator.html b/plugins/actuators/SSVEPStimulator.html index ca74c086e1..8bcd4bf5d8 100644 --- a/plugins/actuators/SSVEPStimulator.html +++ b/plugins/actuators/SSVEPStimulator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/SerialSender.html b/plugins/actuators/SerialSender.html index 9106736fe5..f89317633f 100644 --- a/plugins/actuators/SerialSender.html +++ b/plugins/actuators/SerialSender.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/SkyWatcherMount.html b/plugins/actuators/SkyWatcherMount.html index a97ab0236c..9034ffcb04 100644 --- a/plugins/actuators/SkyWatcherMount.html +++ b/plugins/actuators/SkyWatcherMount.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/SyntheticVoice.html b/plugins/actuators/SyntheticVoice.html index 136a3a6823..1e99fc4592 100644 --- a/plugins/actuators/SyntheticVoice.html +++ b/plugins/actuators/SyntheticVoice.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/TeensyRCPrototype.html b/plugins/actuators/TeensyRCPrototype.html index 0dbb72ff2a..04f1844d49 100644 --- a/plugins/actuators/TeensyRCPrototype.html +++ b/plugins/actuators/TeensyRCPrototype.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/TextArea.html b/plugins/actuators/TextArea.html index 4949c157fb..d01ca19f0a 100644 --- a/plugins/actuators/TextArea.html +++ b/plugins/actuators/TextArea.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/TextDisplay.html b/plugins/actuators/TextDisplay.html index e923bd3dcf..d20d50154e 100644 --- a/plugins/actuators/TextDisplay.html +++ b/plugins/actuators/TextDisplay.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/ToneGenerator.html b/plugins/actuators/ToneGenerator.html index dc2bc2ee48..7311423047 100644 --- a/plugins/actuators/ToneGenerator.html +++ b/plugins/actuators/ToneGenerator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/Tooltip.html b/plugins/actuators/Tooltip.html index e0b2c0aa67..bd7e1192aa 100644 --- a/plugins/actuators/Tooltip.html +++ b/plugins/actuators/Tooltip.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/actuators/WavefilePlayer.html b/plugins/actuators/WavefilePlayer.html index 835a544088..e64de4ace0 100644 --- a/plugins/actuators/WavefilePlayer.html +++ b/plugins/actuators/WavefilePlayer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/WriteCSV.html b/plugins/actuators/WriteCSV.html index 145a614623..14294049a2 100644 --- a/plugins/actuators/WriteCSV.html +++ b/plugins/actuators/WriteCSV.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/actuators/WriteEDF.html b/plugins/actuators/WriteEDF.html index d5e559b9df..f1a8b592d9 100644 --- a/plugins/actuators/WriteEDF.html +++ b/plugins/actuators/WriteEDF.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/index.html b/plugins/index.html index ce34008e61..07716d724c 100644 --- a/plugins/index.html +++ b/plugins/index.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Plugins

The plugins represent the functional blocks of AsTeRICS. They can be combined to tailored Assistive Technology setups via the graphical AsTeRICS Configuration Suite (ACS) software, where plugins can be selected, connected via channels, and parameterized. Thus, the ACS can be considered as a user friendly environment to arrange the plugins. The result of this configuration process is an .xml file containing the deployment model for the AsTeRICS Runtime Environment (ARE).

- + diff --git a/plugins/processors/AcousticScanning.html b/plugins/processors/AcousticScanning.html index 92c62c77fd..27390002a4 100644 --- a/plugins/processors/AcousticScanning.html +++ b/plugins/processors/AcousticScanning.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/processors/AdjustmentCurve.html b/plugins/processors/AdjustmentCurve.html index 452a4c3e02..c1aa003e6a 100644 --- a/plugins/processors/AdjustmentCurve.html +++ b/plugins/processors/AdjustmentCurve.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/processors/AmazonEchoControl.html b/plugins/processors/AmazonEchoControl.html index c35b5778c2..d098721d2a 100644 --- a/plugins/processors/AmazonEchoControl.html +++ b/plugins/processors/AmazonEchoControl.html @@ -17,7 +17,7 @@ - + @@ -572,6 +572,6 @@ →

- + diff --git a/plugins/processors/Amplifier.html b/plugins/processors/Amplifier.html index 03d4ab4c37..241161b004 100644 --- a/plugins/processors/Amplifier.html +++ b/plugins/processors/Amplifier.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Arduino.html b/plugins/processors/Arduino.html index 49fc978584..a63a56f8e5 100644 --- a/plugins/processors/Arduino.html +++ b/plugins/processors/Arduino.html @@ -17,7 +17,7 @@ - + @@ -578,6 +578,6 @@ →

- + diff --git a/plugins/processors/AudioSelector.html b/plugins/processors/AudioSelector.html index 5d85068b97..3617c871d2 100644 --- a/plugins/processors/AudioSelector.html +++ b/plugins/processors/AudioSelector.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Averager.html b/plugins/processors/Averager.html index abb7328372..975b049198 100644 --- a/plugins/processors/Averager.html +++ b/plugins/processors/Averager.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/processors/BasicTRalgorithms.html b/plugins/processors/BasicTRalgorithms.html index fdb022a445..7b523d161e 100644 --- a/plugins/processors/BasicTRalgorithms.html +++ b/plugins/processors/BasicTRalgorithms.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Benchmark.html b/plugins/processors/Benchmark.html index d821f6f03f..c068e6376d 100644 --- a/plugins/processors/Benchmark.html +++ b/plugins/processors/Benchmark.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/BlinkChangeDetector.html b/plugins/processors/BlinkChangeDetector.html index 1aadbbd142..d2a0213d5a 100644 --- a/plugins/processors/BlinkChangeDetector.html +++ b/plugins/processors/BlinkChangeDetector.html @@ -17,7 +17,7 @@ - + @@ -606,6 +606,6 @@ →

- + diff --git a/plugins/processors/BlinkDetection.html b/plugins/processors/BlinkDetection.html index e272776a79..006747a5c3 100644 --- a/plugins/processors/BlinkDetection.html +++ b/plugins/processors/BlinkDetection.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/BlinkDetector.html b/plugins/processors/BlinkDetector.html index aab2ecc02f..d17310a7c1 100644 --- a/plugins/processors/BlinkDetector.html +++ b/plugins/processors/BlinkDetector.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/processors/BlinkDetectorTrainer.html b/plugins/processors/BlinkDetectorTrainer.html index ea75a79f60..a437de8b37 100644 --- a/plugins/processors/BlinkDetectorTrainer.html +++ b/plugins/processors/BlinkDetectorTrainer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/ComPort.html b/plugins/processors/ComPort.html index f2a768472a..80122e6642 100644 --- a/plugins/processors/ComPort.html +++ b/plugins/processors/ComPort.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Comparator.html b/plugins/processors/Comparator.html index 8d664fbe44..33cbca3dfa 100644 --- a/plugins/processors/Comparator.html +++ b/plugins/processors/Comparator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/ComputeBandpower.html b/plugins/processors/ComputeBandpower.html index efab7663c8..92040d2954 100644 --- a/plugins/processors/ComputeBandpower.html +++ b/plugins/processors/ComputeBandpower.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/ConstantDispatcher.html b/plugins/processors/ConstantDispatcher.html index a632e00e4a..19c64f1ca9 100644 --- a/plugins/processors/ConstantDispatcher.html +++ b/plugins/processors/ConstantDispatcher.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/DataType.html b/plugins/processors/DataType.html index 16da3fc449..d373fc4e47 100644 --- a/plugins/processors/DataType.html +++ b/plugins/processors/DataType.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/DateToDouble.html b/plugins/processors/DateToDouble.html index c1ebb6e6ca..b456e19faf 100644 --- a/plugins/processors/DateToDouble.html +++ b/plugins/processors/DateToDouble.html @@ -17,7 +17,7 @@ - + @@ -566,6 +566,6 @@ →

- + diff --git a/plugins/processors/Deadzone.html b/plugins/processors/Deadzone.html index 09ad590c80..71df1fbdb9 100644 --- a/plugins/processors/Deadzone.html +++ b/plugins/processors/Deadzone.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/processors/Decimation.html b/plugins/processors/Decimation.html index 0a5329a6f9..079c44a207 100644 --- a/plugins/processors/Decimation.html +++ b/plugins/processors/Decimation.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Delay.html b/plugins/processors/Delay.html index cc13d76e5b..695714d99e 100644 --- a/plugins/processors/Delay.html +++ b/plugins/processors/Delay.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Derivative.html b/plugins/processors/Derivative.html index 26072ad362..ad051b2bc0 100644 --- a/plugins/processors/Derivative.html +++ b/plugins/processors/Derivative.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Differentiate.html b/plugins/processors/Differentiate.html index 57973ff2ae..a11e156b80 100644 --- a/plugins/processors/Differentiate.html +++ b/plugins/processors/Differentiate.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Dissimilarity.html b/plugins/processors/Dissimilarity.html index 9068fc0c6d..88b0a1b080 100644 --- a/plugins/processors/Dissimilarity.html +++ b/plugins/processors/Dissimilarity.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/DoubleToString.html b/plugins/processors/DoubleToString.html index b1d89f3951..d0d3d97c36 100644 --- a/plugins/processors/DoubleToString.html +++ b/plugins/processors/DoubleToString.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/ECMAScriptInterpreter.html b/plugins/processors/ECMAScriptInterpreter.html index 88816c7897..6e4e74d560 100644 --- a/plugins/processors/ECMAScriptInterpreter.html +++ b/plugins/processors/ECMAScriptInterpreter.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/processors/EventBlock.html b/plugins/processors/EventBlock.html index d1e4eab4ff..7d4d323330 100644 --- a/plugins/processors/EventBlock.html +++ b/plugins/processors/EventBlock.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventCascade.html b/plugins/processors/EventCascade.html index 1c036fd553..5a56cf50c7 100644 --- a/plugins/processors/EventCascade.html +++ b/plugins/processors/EventCascade.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventCounter.html b/plugins/processors/EventCounter.html index 0b7d160a5e..386893de6d 100644 --- a/plugins/processors/EventCounter.html +++ b/plugins/processors/EventCounter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventDelay.html b/plugins/processors/EventDelay.html index 269f6edd03..3f9fa4fd85 100644 --- a/plugins/processors/EventDelay.html +++ b/plugins/processors/EventDelay.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventDispatcher.html b/plugins/processors/EventDispatcher.html index 43ede40d45..879cbc681d 100644 --- a/plugins/processors/EventDispatcher.html +++ b/plugins/processors/EventDispatcher.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventFlipFlop.html b/plugins/processors/EventFlipFlop.html index ee4f9af4b3..1ef03f6736 100644 --- a/plugins/processors/EventFlipFlop.html +++ b/plugins/processors/EventFlipFlop.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventRouter.html b/plugins/processors/EventRouter.html index 5f08f4951a..c0b8f40bc1 100644 --- a/plugins/processors/EventRouter.html +++ b/plugins/processors/EventRouter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/EventStateMachine.html b/plugins/processors/EventStateMachine.html index acc4d1245b..0b93fe3379 100644 --- a/plugins/processors/EventStateMachine.html +++ b/plugins/processors/EventStateMachine.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/FABI.html b/plugins/processors/FABI.html index d2b97c8501..2976d7988d 100644 --- a/plugins/processors/FABI.html +++ b/plugins/processors/FABI.html @@ -17,7 +17,7 @@ - + @@ -600,6 +600,6 @@ →

- + diff --git a/plugins/processors/FS20CommandInterpreter.html b/plugins/processors/FS20CommandInterpreter.html index 7704330af8..c2b45c3ecf 100644 --- a/plugins/processors/FS20CommandInterpreter.html +++ b/plugins/processors/FS20CommandInterpreter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/FabiCronusMax.html b/plugins/processors/FabiCronusMax.html index b29352c201..1a84074b65 100644 --- a/plugins/processors/FabiCronusMax.html +++ b/plugins/processors/FabiCronusMax.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/processors/Filter.html b/plugins/processors/Filter.html index e08b1fec77..15d28079d3 100644 --- a/plugins/processors/Filter.html +++ b/plugins/processors/Filter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/HRVAnalysis.html b/plugins/processors/HRVAnalysis.html index cd0f6069e6..f9f628b1f9 100644 --- a/plugins/processors/HRVAnalysis.html +++ b/plugins/processors/HRVAnalysis.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/HRVRmssdFromRR.html b/plugins/processors/HRVRmssdFromRR.html index 497e31710f..56e07d246d 100644 --- a/plugins/processors/HRVRmssdFromRR.html +++ b/plugins/processors/HRVRmssdFromRR.html @@ -17,7 +17,7 @@ - + @@ -568,6 +568,6 @@ →

- + diff --git a/plugins/processors/IIRFilter.html b/plugins/processors/IIRFilter.html index 9eefb50215..9121694dea 100644 --- a/plugins/processors/IIRFilter.html +++ b/plugins/processors/IIRFilter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/IntToString.html b/plugins/processors/IntToString.html index 0186bd3522..80f57b9625 100644 --- a/plugins/processors/IntToString.html +++ b/plugins/processors/IntToString.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Integrate.html b/plugins/processors/Integrate.html index d917a58333..8bfa7a810f 100644 --- a/plugins/processors/Integrate.html +++ b/plugins/processors/Integrate.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/IrMicro.html b/plugins/processors/IrMicro.html index 543d292ee8..76a702c7c8 100644 --- a/plugins/processors/IrMicro.html +++ b/plugins/processors/IrMicro.html @@ -17,7 +17,7 @@ - + @@ -567,6 +567,6 @@ →

- + diff --git a/plugins/processors/JsonParser.html b/plugins/processors/JsonParser.html index 25415bfff0..4ea39a2d5e 100644 --- a/plugins/processors/JsonParser.html +++ b/plugins/processors/JsonParser.html @@ -17,7 +17,7 @@ - + @@ -576,6 +576,6 @@ →

- + diff --git a/plugins/processors/MathEvaluator.html b/plugins/processors/MathEvaluator.html index b9d5f9ee7d..cdf95327a7 100644 --- a/plugins/processors/MathEvaluator.html +++ b/plugins/processors/MathEvaluator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/MinMax.html b/plugins/processors/MinMax.html index 30fb8532c0..9ad16247c8 100644 --- a/plugins/processors/MinMax.html +++ b/plugins/processors/MinMax.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/MotionAnalysis.html b/plugins/processors/MotionAnalysis.html index 71f3b25362..df665d525e 100644 --- a/plugins/processors/MotionAnalysis.html +++ b/plugins/processors/MotionAnalysis.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/MultiSource.html b/plugins/processors/MultiSource.html index c4604a04d0..98a9d26024 100644 --- a/plugins/processors/MultiSource.html +++ b/plugins/processors/MultiSource.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/MultiSourceString.html b/plugins/processors/MultiSourceString.html index f0b5bfee54..f7add6e069 100644 --- a/plugins/processors/MultiSourceString.html +++ b/plugins/processors/MultiSourceString.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/NeuralNetworkLoader.html b/plugins/processors/NeuralNetworkLoader.html index 79e4f7a4b7..faf4392036 100644 --- a/plugins/processors/NeuralNetworkLoader.html +++ b/plugins/processors/NeuralNetworkLoader.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/NexusConnector.html b/plugins/processors/NexusConnector.html index 9bc65d3ff9..66e358635e 100644 --- a/plugins/processors/NexusConnector.html +++ b/plugins/processors/NexusConnector.html @@ -17,7 +17,7 @@ - + @@ -587,6 +587,6 @@ →

- + diff --git a/plugins/processors/OneEventManyActions.html b/plugins/processors/OneEventManyActions.html index 5609a47116..8fc6eb2ed5 100644 --- a/plugins/processors/OneEventManyActions.html +++ b/plugins/processors/OneEventManyActions.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/OpenHAB.html b/plugins/processors/OpenHAB.html index 86ead070cc..db5eb821ff 100644 --- a/plugins/processors/OpenHAB.html +++ b/plugins/processors/OpenHAB.html @@ -17,7 +17,7 @@ - + @@ -567,6 +567,6 @@ →

- + diff --git a/plugins/processors/OscGestureFollower.html b/plugins/processors/OscGestureFollower.html index affd4b31a1..868ef446c9 100644 --- a/plugins/processors/OscGestureFollower.html +++ b/plugins/processors/OscGestureFollower.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/OskaExternalScanning1D.html b/plugins/processors/OskaExternalScanning1D.html index e98584e900..6dcf4b9f41 100644 --- a/plugins/processors/OskaExternalScanning1D.html +++ b/plugins/processors/OskaExternalScanning1D.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/OskaExternalScanning2D.html b/plugins/processors/OskaExternalScanning2D.html index 6c9160f199..c0a072df55 100644 --- a/plugins/processors/OskaExternalScanning2D.html +++ b/plugins/processors/OskaExternalScanning2D.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/OskaInternalScanning.html b/plugins/processors/OskaInternalScanning.html index 68f8380fdc..e5fc199230 100644 --- a/plugins/processors/OskaInternalScanning.html +++ b/plugins/processors/OskaInternalScanning.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/PathMultiplexer.html b/plugins/processors/PathMultiplexer.html index e81c88454b..395aca3113 100644 --- a/plugins/processors/PathMultiplexer.html +++ b/plugins/processors/PathMultiplexer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Pathselector.html b/plugins/processors/Pathselector.html index 3e5addd2cc..3409dcd620 100644 --- a/plugins/processors/Pathselector.html +++ b/plugins/processors/Pathselector.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/PeakDetector.html b/plugins/processors/PeakDetector.html index 7a1ba9b910..d2bb6a3150 100644 --- a/plugins/processors/PeakDetector.html +++ b/plugins/processors/PeakDetector.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/ProtocolSSVEPTrain.html b/plugins/processors/ProtocolSSVEPTrain.html index 9be8f2b0dd..cf61cfdfdf 100644 --- a/plugins/processors/ProtocolSSVEPTrain.html +++ b/plugins/processors/ProtocolSSVEPTrain.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Quantizer.html b/plugins/processors/Quantizer.html index 570052fa15..d06f06ff60 100644 --- a/plugins/processors/Quantizer.html +++ b/plugins/processors/Quantizer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/RegularExpression.html b/plugins/processors/RegularExpression.html index 4df4c758f7..5f6704e679 100644 --- a/plugins/processors/RegularExpression.html +++ b/plugins/processors/RegularExpression.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/RelativeMoveSampler.html b/plugins/processors/RelativeMoveSampler.html index c0f5881c1c..b8dc445a89 100644 --- a/plugins/processors/RelativeMoveSampler.html +++ b/plugins/processors/RelativeMoveSampler.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/SSVEPDetect.html b/plugins/processors/SSVEPDetect.html index c41a403777..fc4b0a8ede 100644 --- a/plugins/processors/SSVEPDetect.html +++ b/plugins/processors/SSVEPDetect.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/SampleAndHold.html b/plugins/processors/SampleAndHold.html index c4cd75cf3f..a7257594cf 100644 --- a/plugins/processors/SampleAndHold.html +++ b/plugins/processors/SampleAndHold.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Sampler.html b/plugins/processors/Sampler.html index 7cbd59fdbf..d896792aba 100644 --- a/plugins/processors/Sampler.html +++ b/plugins/processors/Sampler.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/SerialPort.html b/plugins/processors/SerialPort.html index f05ff6dee3..149348c5ec 100644 --- a/plugins/processors/SerialPort.html +++ b/plugins/processors/SerialPort.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/processors/SerialSender.html b/plugins/processors/SerialSender.html index dff621e4aa..411ca00d86 100644 --- a/plugins/processors/SerialSender.html +++ b/plugins/processors/SerialSender.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/SignalTranslation.html b/plugins/processors/SignalTranslation.html index ce316b9786..1546f5d490 100644 --- a/plugins/processors/SignalTranslation.html +++ b/plugins/processors/SignalTranslation.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/SpeechProcessor.html b/plugins/processors/SpeechProcessor.html index dbdf2c0308..2f75137a6f 100644 --- a/plugins/processors/SpeechProcessor.html +++ b/plugins/processors/SpeechProcessor.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/processors/StringAppend.html b/plugins/processors/StringAppend.html index 3e0a44c7ca..4f72a18b01 100644 --- a/plugins/processors/StringAppend.html +++ b/plugins/processors/StringAppend.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringDelay.html b/plugins/processors/StringDelay.html index e5769e9cd5..fc5c9b62f4 100644 --- a/plugins/processors/StringDelay.html +++ b/plugins/processors/StringDelay.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringDispatcher.html b/plugins/processors/StringDispatcher.html index 8b3d447562..37be0e252b 100644 --- a/plugins/processors/StringDispatcher.html +++ b/plugins/processors/StringDispatcher.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringExpander.html b/plugins/processors/StringExpander.html index 61ba348701..00d2208f0c 100644 --- a/plugins/processors/StringExpander.html +++ b/plugins/processors/StringExpander.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringExtractor.html b/plugins/processors/StringExtractor.html index 49a852f5b6..ed9bd0616e 100644 --- a/plugins/processors/StringExtractor.html +++ b/plugins/processors/StringExtractor.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/processors/StringFilter.html b/plugins/processors/StringFilter.html index e0ec41b377..b9c4bf006f 100644 --- a/plugins/processors/StringFilter.html +++ b/plugins/processors/StringFilter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringFormatter.html b/plugins/processors/StringFormatter.html index 24b99a2294..6a5820da1a 100644 --- a/plugins/processors/StringFormatter.html +++ b/plugins/processors/StringFormatter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringPathMultiplexer.html b/plugins/processors/StringPathMultiplexer.html index d87590c139..a0cc410d32 100644 --- a/plugins/processors/StringPathMultiplexer.html +++ b/plugins/processors/StringPathMultiplexer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringPathSelector.html b/plugins/processors/StringPathSelector.html index c1b878e66c..00eba4f4be 100644 --- a/plugins/processors/StringPathSelector.html +++ b/plugins/processors/StringPathSelector.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringSplitter.html b/plugins/processors/StringSplitter.html index e7df809c2d..a35031e64e 100644 --- a/plugins/processors/StringSplitter.html +++ b/plugins/processors/StringSplitter.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringToDouble.html b/plugins/processors/StringToDouble.html index 262d327f69..1bbf20b9d0 100644 --- a/plugins/processors/StringToDouble.html +++ b/plugins/processors/StringToDouble.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/StringToInt.html b/plugins/processors/StringToInt.html index 0492d8d2dd..466deab421 100644 --- a/plugins/processors/StringToInt.html +++ b/plugins/processors/StringToInt.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/TextSender.html b/plugins/processors/TextSender.html index 350af0c55d..878b05bdd0 100644 --- a/plugins/processors/TextSender.html +++ b/plugins/processors/TextSender.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Threshold.html b/plugins/processors/Threshold.html index b091959716..5413457cd7 100644 --- a/plugins/processors/Threshold.html +++ b/plugins/processors/Threshold.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/processors/TimestampWriter.html b/plugins/processors/TimestampWriter.html index 07711af5d8..7e49788a46 100644 --- a/plugins/processors/TimestampWriter.html +++ b/plugins/processors/TimestampWriter.html @@ -17,7 +17,7 @@ - + @@ -569,6 +569,6 @@ →

- + diff --git a/plugins/processors/UniversalRemoteControl.html b/plugins/processors/UniversalRemoteControl.html index e627f6ed85..0f960623a1 100644 --- a/plugins/processors/UniversalRemoteControl.html +++ b/plugins/processors/UniversalRemoteControl.html @@ -17,7 +17,7 @@ - + @@ -566,6 +566,6 @@ →

- + diff --git a/plugins/processors/WebSocket.html b/plugins/processors/WebSocket.html index f8b4ee228e..6181c4dc12 100644 --- a/plugins/processors/WebSocket.html +++ b/plugins/processors/WebSocket.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/Yaak.html b/plugins/processors/Yaak.html index 9f4c9fe5b5..178b102149 100644 --- a/plugins/processors/Yaak.html +++ b/plugins/processors/Yaak.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/processors/eg_example.html b/plugins/processors/eg_example.html index 1fda7c0d1c..123927999e 100644 --- a/plugins/processors/eg_example.html +++ b/plugins/processors/eg_example.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Acceleration.html b/plugins/sensors/Acceleration.html index dc511b8334..2fea776cfa 100644 --- a/plugins/sensors/Acceleration.html +++ b/plugins/sensors/Acceleration.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/AnalogIn.html b/plugins/sensors/AnalogIn.html index 593834cd4b..da66fecb2f 100644 --- a/plugins/sensors/AnalogIn.html +++ b/plugins/sensors/AnalogIn.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/AutostartEvent.html b/plugins/sensors/AutostartEvent.html index 193e1525aa..1ca9770a76 100644 --- a/plugins/sensors/AutostartEvent.html +++ b/plugins/sensors/AutostartEvent.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/ButtonGrid.html b/plugins/sensors/ButtonGrid.html index 08f86dd43a..9f9f67f104 100644 --- a/plugins/sensors/ButtonGrid.html +++ b/plugins/sensors/ButtonGrid.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/CellBoard.html b/plugins/sensors/CellBoard.html index 9630504b08..d5a426feb7 100644 --- a/plugins/sensors/CellBoard.html +++ b/plugins/sensors/CellBoard.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/sensors/DigitalIn.html b/plugins/sensors/DigitalIn.html index fadb115715..32599087df 100644 --- a/plugins/sensors/DigitalIn.html +++ b/plugins/sensors/DigitalIn.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/EOG.html b/plugins/sensors/EOG.html index 3bd503d9c6..944f80e147 100644 --- a/plugins/sensors/EOG.html +++ b/plugins/sensors/EOG.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/sensors/EShoe.html b/plugins/sensors/EShoe.html index b4ab6557c2..2004ff9fcf 100644 --- a/plugins/sensors/EShoe.html +++ b/plugins/sensors/EShoe.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/sensors/EditBox.html b/plugins/sensors/EditBox.html index c13792fae3..8201435e30 100644 --- a/plugins/sensors/EditBox.html +++ b/plugins/sensors/EditBox.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Enobio.html b/plugins/sensors/Enobio.html index 66ccfb39d6..4be9bb2250 100644 --- a/plugins/sensors/Enobio.html +++ b/plugins/sensors/Enobio.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/EventGenerator.html b/plugins/sensors/EventGenerator.html index ea0a87f8b9..d28da5a3f4 100644 --- a/plugins/sensors/EventGenerator.html +++ b/plugins/sensors/EventGenerator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/EyeTribe.html b/plugins/sensors/EyeTribe.html index 40d5c70353..6e33e4797c 100644 --- a/plugins/sensors/EyeTribe.html +++ b/plugins/sensors/EyeTribe.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/sensors/EyeX.html b/plugins/sensors/EyeX.html index b926d8d74c..61aa9aa23d 100644 --- a/plugins/sensors/EyeX.html +++ b/plugins/sensors/EyeX.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/sensors/Eyetracker.html b/plugins/sensors/Eyetracker.html index aec4e0594f..83558f5eeb 100644 --- a/plugins/sensors/Eyetracker.html +++ b/plugins/sensors/Eyetracker.html @@ -17,7 +17,7 @@ - + @@ -565,6 +565,6 @@ →

- + diff --git a/plugins/sensors/FS20Receiver.html b/plugins/sensors/FS20Receiver.html index bc640177ae..0d88aa03b8 100644 --- a/plugins/sensors/FS20Receiver.html +++ b/plugins/sensors/FS20Receiver.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/sensors/FacetrackerCLM.html b/plugins/sensors/FacetrackerCLM.html index 6e466cbd8b..2dec2b4537 100644 --- a/plugins/sensors/FacetrackerCLM.html +++ b/plugins/sensors/FacetrackerCLM.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/FacetrackerLK.html b/plugins/sensors/FacetrackerLK.html index e9010245b0..ff63ba6d8f 100644 --- a/plugins/sensors/FacetrackerLK.html +++ b/plugins/sensors/FacetrackerLK.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/FolderBrowser.html b/plugins/sensors/FolderBrowser.html index a78d23e871..3fb06c700c 100644 --- a/plugins/sensors/FolderBrowser.html +++ b/plugins/sensors/FolderBrowser.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/HeadPositionHC.html b/plugins/sensors/HeadPositionHC.html index d2da77fec1..78b8f1d3e3 100644 --- a/plugins/sensors/HeadPositionHC.html +++ b/plugins/sensors/HeadPositionHC.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/HoverPanel.html b/plugins/sensors/HoverPanel.html index dc07cbb9a9..d03d62f350 100644 --- a/plugins/sensors/HoverPanel.html +++ b/plugins/sensors/HoverPanel.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/IntelRealSense.html b/plugins/sensors/IntelRealSense.html index f02860116c..40e7642f70 100644 --- a/plugins/sensors/IntelRealSense.html +++ b/plugins/sensors/IntelRealSense.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/JoystickCapture.html b/plugins/sensors/JoystickCapture.html index ed7a50b882..f06d1187af 100644 --- a/plugins/sensors/JoystickCapture.html +++ b/plugins/sensors/JoystickCapture.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/KeyCapture.html b/plugins/sensors/KeyCapture.html index 8d25ccb839..c6cc4cf209 100644 --- a/plugins/sensors/KeyCapture.html +++ b/plugins/sensors/KeyCapture.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/KeyboardCapture.html b/plugins/sensors/KeyboardCapture.html index 664887c839..0db9113a64 100644 --- a/plugins/sensors/KeyboardCapture.html +++ b/plugins/sensors/KeyboardCapture.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Kinect.html b/plugins/sensors/Kinect.html index ab558a524f..66ee63d61a 100644 --- a/plugins/sensors/Kinect.html +++ b/plugins/sensors/Kinect.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/KinectJ4K.html b/plugins/sensors/KinectJ4K.html index 18a94dfeb0..bcebe74bb3 100644 --- a/plugins/sensors/KinectJ4K.html +++ b/plugins/sensors/KinectJ4K.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/LegacyAnalogIn.html b/plugins/sensors/LegacyAnalogIn.html index 2f8121b5b8..01bece0771 100644 --- a/plugins/sensors/LegacyAnalogIn.html +++ b/plugins/sensors/LegacyAnalogIn.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/LegacyDigitalIn.html b/plugins/sensors/LegacyDigitalIn.html index 7c940a9982..90f579ead6 100644 --- a/plugins/sensors/LegacyDigitalIn.html +++ b/plugins/sensors/LegacyDigitalIn.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Lightscore.html b/plugins/sensors/Lightscore.html index 681d17ba93..47b13aee26 100644 --- a/plugins/sensors/Lightscore.html +++ b/plugins/sensors/Lightscore.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/LineReader.html b/plugins/sensors/LineReader.html index 51c0be6aa2..92984029ef 100644 --- a/plugins/sensors/LineReader.html +++ b/plugins/sensors/LineReader.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Lipmouse.html b/plugins/sensors/Lipmouse.html index 5bb989b3fa..a1e4910bc1 100644 --- a/plugins/sensors/Lipmouse.html +++ b/plugins/sensors/Lipmouse.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/LipmouseIR.html b/plugins/sensors/LipmouseIR.html index 2cb4c62c50..a2e228905a 100644 --- a/plugins/sensors/LipmouseIR.html +++ b/plugins/sensors/LipmouseIR.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/sensors/MicGPI.html b/plugins/sensors/MicGPI.html index 81f687fec0..9b23557be4 100644 --- a/plugins/sensors/MicGPI.html +++ b/plugins/sensors/MicGPI.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/MouseCapture.html b/plugins/sensors/MouseCapture.html index 5e70948e3d..5fb3ac7acc 100644 --- a/plugins/sensors/MouseCapture.html +++ b/plugins/sensors/MouseCapture.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/OpenBCI.html b/plugins/sensors/OpenBCI.html index 1ff0dd7e69..c3ec1919e3 100644 --- a/plugins/sensors/OpenBCI.html +++ b/plugins/sensors/OpenBCI.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/OpenVibe.html b/plugins/sensors/OpenVibe.html index d8359dd71f..cfe2a6126e 100644 --- a/plugins/sensors/OpenVibe.html +++ b/plugins/sensors/OpenVibe.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/sensors/OscServer.html b/plugins/sensors/OscServer.html index 866d29ed5e..9c4357aecb 100644 --- a/plugins/sensors/OscServer.html +++ b/plugins/sensors/OscServer.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/P2_Parser.html b/plugins/sensors/P2_Parser.html index 8a0696ee71..c85082793f 100644 --- a/plugins/sensors/P2_Parser.html +++ b/plugins/sensors/P2_Parser.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/PhilipsHueSensor.html b/plugins/sensors/PhilipsHueSensor.html index 439e78fef9..0f8baf574f 100644 --- a/plugins/sensors/PhilipsHueSensor.html +++ b/plugins/sensors/PhilipsHueSensor.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/sensors/PlatformAnalogIn.html b/plugins/sensors/PlatformAnalogIn.html index f9d5f7d187..12ae793a7d 100644 --- a/plugins/sensors/PlatformAnalogIn.html +++ b/plugins/sensors/PlatformAnalogIn.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/PlatformDigitalIn.html b/plugins/sensors/PlatformDigitalIn.html index 676a1ca1d9..279c555202 100644 --- a/plugins/sensors/PlatformDigitalIn.html +++ b/plugins/sensors/PlatformDigitalIn.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Proximity.html b/plugins/sensors/Proximity.html index e818b6d384..f8cd866d6a 100644 --- a/plugins/sensors/Proximity.html +++ b/plugins/sensors/Proximity.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/RFIDReader.html b/plugins/sensors/RFIDReader.html index 76fc3bf242..607d0a8db7 100644 --- a/plugins/sensors/RFIDReader.html +++ b/plugins/sensors/RFIDReader.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/RandomNumber.html b/plugins/sensors/RandomNumber.html index 4b04abec0e..b41c07fbab 100644 --- a/plugins/sensors/RandomNumber.html +++ b/plugins/sensors/RandomNumber.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/RazorIMU.html b/plugins/sensors/RazorIMU.html index 5f3f7c4a26..c021339fba 100644 --- a/plugins/sensors/RazorIMU.html +++ b/plugins/sensors/RazorIMU.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/ReadCSV.html b/plugins/sensors/ReadCSV.html index 3beeb29910..6afe2d7ec0 100644 --- a/plugins/sensors/ReadCSV.html +++ b/plugins/sensors/ReadCSV.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/ReadEDF.html b/plugins/sensors/ReadEDF.html index 2896e04938..c00fe0d517 100644 --- a/plugins/sensors/ReadEDF.html +++ b/plugins/sensors/ReadEDF.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Sensorboard.html b/plugins/sensors/Sensorboard.html index 41f4b0629f..206ede0fa7 100644 --- a/plugins/sensors/Sensorboard.html +++ b/plugins/sensors/Sensorboard.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/sensors/SignalGenerator.html b/plugins/sensors/SignalGenerator.html index 740291a065..962cecfde5 100644 --- a/plugins/sensors/SignalGenerator.html +++ b/plugins/sensors/SignalGenerator.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/SignalShaper.html b/plugins/sensors/SignalShaper.html index 158070e7b7..bdd8eadbc1 100644 --- a/plugins/sensors/SignalShaper.html +++ b/plugins/sensors/SignalShaper.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Slider.html b/plugins/sensors/Slider.html index cf105176b8..2e22efcb28 100644 --- a/plugins/sensors/Slider.html +++ b/plugins/sensors/Slider.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/SpaceNavigator3DMouse.html b/plugins/sensors/SpaceNavigator3DMouse.html index a321515d45..eb9c7763df 100644 --- a/plugins/sensors/SpaceNavigator3DMouse.html +++ b/plugins/sensors/SpaceNavigator3DMouse.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/TextfieldReader.html b/plugins/sensors/TextfieldReader.html index 7c713e3596..9b33d7aeda 100644 --- a/plugins/sensors/TextfieldReader.html +++ b/plugins/sensors/TextfieldReader.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Timer.html b/plugins/sensors/Timer.html index b82534143b..5333732341 100644 --- a/plugins/sensors/Timer.html +++ b/plugins/sensors/Timer.html @@ -17,7 +17,7 @@ - + @@ -563,6 +563,6 @@ →

- + diff --git a/plugins/sensors/TobiTic.html b/plugins/sensors/TobiTic.html index 58cec0b59f..c95a3ad5b9 100644 --- a/plugins/sensors/TobiTic.html +++ b/plugins/sensors/TobiTic.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/Tobii4CHeadTracker.html b/plugins/sensors/Tobii4CHeadTracker.html index 091da395fe..b8b5dfcd59 100644 --- a/plugins/sensors/Tobii4CHeadTracker.html +++ b/plugins/sensors/Tobii4CHeadTracker.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/TrackIR.html b/plugins/sensors/TrackIR.html index df5ff39350..da2e0c895a 100644 --- a/plugins/sensors/TrackIR.html +++ b/plugins/sensors/TrackIR.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@ →

- + diff --git a/plugins/sensors/TuioReactivision.html b/plugins/sensors/TuioReactivision.html index 6a75db504c..77ca3fb03e 100644 --- a/plugins/sensors/TuioReactivision.html +++ b/plugins/sensors/TuioReactivision.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/WiiMote.html b/plugins/sensors/WiiMote.html index 18bce2b887..14ee350a95 100644 --- a/plugins/sensors/WiiMote.html +++ b/plugins/sensors/WiiMote.html @@ -17,7 +17,7 @@ - + @@ -562,6 +562,6 @@ →

- + diff --git a/plugins/sensors/XFacetrackerLK.html b/plugins/sensors/XFacetrackerLK.html index 6473e6c866..ba99556221 100644 --- a/plugins/sensors/XFacetrackerLK.html +++ b/plugins/sensors/XFacetrackerLK.html @@ -17,7 +17,7 @@ - + @@ -561,6 +561,6 @@

- + diff --git a/solutions/AAC-Basic.html b/solutions/AAC-Basic.html index 181a943558..893f15d17e 100644 --- a/solutions/AAC-Basic.html +++ b/solutions/AAC-Basic.html @@ -17,7 +17,7 @@ - + @@ -556,6 +556,6 @@ (opens new window)

# Basic AAC Grid Solution

# Objective

Basic grid for Alternative and Augmentative Communication including a simple on-screen keyboard with speech synthesis.

# Description

The grid provides cells with basic communication topics (e.g. Help, Eating, Environment) and also provides a basic on-screen keyboard. A cell can be triggered by several modalities depending on the capabilities of the user. Currently the input options clicking, scanning (for switch-based control) or hovering (for eye-tracking based control) are supported. If clicking is enabled, the solution can also be operated by the Camera Mouse Solution or Eye Tracking Solution. Additionally, the grid text and images can be edited. Each grid has a unique link and is automatically synchronized when using the same link on different end devices.

Symbol based grid for communication

# Requirements

  • Web browser (Chrome and Firefox preferred)

# Optional Requirements

# Major Plugins

- + diff --git a/solutions/Camera-Mouse.html b/solutions/Camera-Mouse.html index d51c721ea8..6fddb0ae28 100644 --- a/solutions/Camera-Mouse.html +++ b/solutions/Camera-Mouse.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Camera Mouse Solution

# Objective

Mouse control (moving mouse cursor, clicking and dragging) by head movements.

# Description

By moving the head up/down or left/right the mouse cursor should move accordingly. A left click is performed by dwelling (stopping movement and waiting for some time). To do a right, double or drag click select the respective button in the ARE GUI and move the cursor to the location where the click should be performed at. The camera device, the mouse speed and other settings can be changed by clicking onto the Settings button. Additionally, external switches can be configured for clicking and an on-screen keyboard of choice can be defined.

Face with tracking marks.

# Requirements

  • Integrated Webcam or USB camera
  • AsTeRICS installed and ARE running
  • OS: Windows, Linux (incl. RPi), Mac OSX

# Major Plugins

Model Creation - Camera Mouse Simple

- + diff --git a/solutions/Eye-Tracking-Mouse.html b/solutions/Eye-Tracking-Mouse.html index 43088b442d..044b11a54b 100644 --- a/solutions/Eye-Tracking-Mouse.html +++ b/solutions/Eye-Tracking-Mouse.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Eye Tracking Mouse Solution

# Objective

Mouse control (moving mouse cursor, clicking and dragging) by eye movements.

# Description

By moving the eyes up/down or left/right the mouse cursor should move accordingly. A left click is performed by dwelling (stopping movement and waiting for some time). To do a right, double or drag click select the respective button in the ARE GUI and move the cursor to the location where the click should be performed at. The mouse speed and other settings can be changed by clicking onto the Settings button. Additionally, external switches can be configured for clicking and an on-screen keyboard of choice can be defined.

# Requirements

# Major Plugins

- + diff --git a/solutions/Head-Sound.html b/solutions/Head-Sound.html index fbd8dd16d3..74630e7ffa 100644 --- a/solutions/Head-Sound.html +++ b/solutions/Head-Sound.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Head Sound Solution

# Objective

Generate sounds according to head movement.

# Description

By moving the head left/right, the tone scale should go up and down accordingly. Additionally, by moving the head up/down, the volume can be changed.

ARE GUI with tone scale and graph for tone scale and volume.

# Requirements

  • Integrated Webcam or USB camera
  • AsTeRICS installed and ARE running
  • OS: Windows, Linux (incl. RPi), Mac OSX

# Major Plugins

- + diff --git a/solutions/Switch-Mouse.html b/solutions/Switch-Mouse.html index 75e0edf916..c9667ff5f6 100644 --- a/solutions/Switch-Mouse.html +++ b/solutions/Switch-Mouse.html @@ -17,7 +17,7 @@ - + @@ -556,6 +556,6 @@ (opens new window)

# Switch Mouse Solution

# Objective

Mouse control by switch input. This model demonstrates mouse cursor control via 2 switches or (alternatively) 2 keyboard keys. (There are other models for single-switch (opens new window) or 4-switch (opens new window) cursor control available in the ARE/models (opens new window) folder.) Instead of a mouse cursor, a crosshair indicator is displayed on the screen, scanning from the top to the bottom and from the left to the right.

# Mouse movement

By pressing the right cursor key the crosshair should move accordingly from the left to the right as long as you keep the key pressed. Subsequently, press the down cursor key to move the cross from the top to the bottom. As soon as the keys are released, the left click is performed by dwelling (stopping movement and waiting for some time). When the crosshair exits the screen, it wraps around and enters the screen from the other side. Thus, every position on the screen can be reached.

Cross marking the click position on the screen

Fig. 1: Crosshair indicating the current mouse position. Red horizontal line indicating a movement from top to bottom.

# Tooltips

In order to perform special clicks, so called “tooltips” are available: Press right and down cursor keys simultaneously in order to show the tooltips, which look like this:

Cross marking the click position on the screen

Fig. 2: Tooltip next to the crosshair, shows symbol for double click

By pressing one of right or down cursor keys again it’s possible to navigate through the tooltips where functions like double click, right click, dragging or keyboard shortcuts like Ctrl + C and Ctrl + V can be chosen.

# Requirements

  • Switch
    • Keyboard key (Cursor right, Cursor down) or
    • external Switch (e.g. FABI (opens new window)) attached and configured to emulate Cursor rightand Cursor down keys.
  • AsTeRICS installed and ARE running
  • OS: Windows, Linux (incl. RPi), Mac OSX

# Major Plugins

- + diff --git a/solutions/index.html b/solutions/index.html index 522d9a04c8..4f726496ab 100644 --- a/solutions/index.html +++ b/solutions/index.html @@ -17,7 +17,7 @@ - + @@ -564,6 +564,6 @@
Basic AAC Grid
Windows
Linux
macOS
Android
iOS
Basic communication and simple on-screen keyboard with speech synthesis.
Occupational Therapy
Sounds by Head Movement
Windows
Linux
macOS
Webcam
Creates sounds according to head movement.
- + diff --git a/webapps/AT-solution-IDE.html b/webapps/AT-solution-IDE.html index f71cdeaf0a..87d40e936f 100644 --- a/webapps/AT-solution-IDE.html +++ b/webapps/AT-solution-IDE.html @@ -17,7 +17,7 @@ - + @@ -555,6 +555,6 @@ isiZulu (opens new window)

# Create new AT solution

Create new AT solution project in WebIDE instance? AT solution template (opens new window)

- + diff --git a/webapps/Plugin-IDE.html b/webapps/Plugin-IDE.html index ad61937e5d..51ddb6cc64 100644 --- a/webapps/Plugin-IDE.html +++ b/webapps/Plugin-IDE.html @@ -17,7 +17,7 @@ - + @@ -554,6 +554,6 @@ (opens new window)

# Create new plugin

Create new project in WebIDE instance

- + diff --git a/webapps/startpage/ReadMe.md b/webapps/startpage/ReadMe.md new file mode 100644 index 0000000000..1fdf62568c --- /dev/null +++ b/webapps/startpage/ReadMe.md @@ -0,0 +1,3 @@ +# AsTeRICS web server start page + +Modify start.html to redirect to your web application if necessary. \ No newline at end of file diff --git a/webapps/startpage/lib/modelManipulation.js b/webapps/startpage/lib/modelManipulation.js new file mode 100644 index 0000000000..06a2b0e2ba --- /dev/null +++ b/webapps/startpage/lib/modelManipulation.js @@ -0,0 +1,88 @@ +/** + * @file + * This Javascript library provides functions that simplify manipulation of an AsTeRICS model in XML representation. + * The lib provides functions for setting and getting a property value. + * + * @author Martin Deinhofer + * @version 0.1 + */ + +/** + * Sets the property componentKey.propertyKey to the given propertyValue. + * @param {string} componentKey - The component instance id. + * @param {string} propertyKey - The property key of the component. + * @param {string} propertyValue - The new value. + * @param {string} xmlDoc - The XML model as string to be updated. + */ +function setPropertyValueInXMLModel(componentKey, propertyKey, propertyValue, xmlDoc) { + var commandPanel=xmlDoc.getElementsByTagName('component'); + + var found=false; + for(var i=0;i model synchronization, up/download/start models, setting/getting properties of deployed model. + * + * @requires jquery-3.2.1.min.js (or maybe lower versions also) + * @requires JSmap.js (AsTeRICS 3.0) + * @requires areCommunicator.js (AsTeRICS 3.0) + * + * @author Martin Deinhofer + * @version 0.1 + */ + +/** + * Sets the areBaseURI either with a default value for the protocol of the hosting webserver (http, https) or with the value given by a queryParameter. + */ +function initAreBaseURI() { + //Set the base URI of the running ARE instance. + + //Use default value, depending on the protocol we are hosted on. + const urlParams = new URLSearchParams(window.location.search); + var areBaseURI = + window.location.protocol === "http:" + ? "http://127.0.0.1:8081/rest/" + : "https://127.0.0.1:8083/rest/"; + console.log("webserver protocol:" + window.location.protocol); + + //If the areBaseURI is set by a given queryparameter, use that one. + if (urlParams.has("areBaseURI") === true) { + areBaseURI = urlParams.get("areBaseURI") + "/rest/"; + } + console.log("Setting areBaseURI: " + areBaseURI); + setBaseURI(areBaseURI); +} + +/** + * Loads a file hosted on the same webserver as this file and returns the contents as plain text. + * @param {string} relFilePath - The path to the file relative to http:///subpath/. + * @param {function(fileContentsAsString)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ +function loadFileFromWebServer(relFilePath, successCallback, errorCallback) { + //assign default callback functions if none was provided. + successCallback = getSuccessCallback(successCallback); + errorCallback = getErrorCallback(errorCallback); + + var httpReq = new XMLHttpRequest(); + console.log("location.origin: " + location.origin); + + var pathFix = ""; + if ( + Object.is(location.origin, "https://asterics.github.io") || + Object.is(location.origin, "http://asterics.github.io") + ) { + pathFix = "/AsTeRICS"; + console.log("Adding pathFix: " + pathFix); + } + relFilePath = location.origin + pathFix + "/" + relFilePath; + console.log("Fetching file from webserver: " + relFilePath); + + /* + //With jQuery you could use something like this to fetch the file easily, nevertheless to be independent we use the hard approach. + $.get(relFilePath).then(function(response) { + successCallback(response); + });*/ + + httpReq.onreadystatechange = function() { + if ( + httpReq.readyState === XMLHttpRequest.DONE && + (httpReq.status === 404 || httpReq.status === 0) + ) { + alert("Could not find requested file: " + relFilePath); + } else if ( + httpReq.readyState === XMLHttpRequest.DONE && + httpReq.status === 200 + ) { + //success, so call success-callback + console.log("File from Webserver successfully loaded: " + relFilePath); + successCallback(httpReq.responseText); + } + }; + httpReq.open("GET", relFilePath, true); + httpReq.send(); +} + +/** + * Deploys a model file hosted on the same webserver as this file to a running ARE instance e.g. on localhost. + * @param {string} relFilePath - The path to the file relative to http://location.origin/subpath/. + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ +function deployModelFromWebserver(relFilePath, successCallback, errorCallback) { + //assign default callback functions if none was provided. + successCallback = getSuccessCallback(successCallback); + errorCallback = getErrorCallback(errorCallback); + + loadFileFromWebServer(relFilePath, function(modelInXML) { + uploadModel(successCallback, errorCallback, modelInXML); + }); +} + +/** + * Deploys a model file hosted on the same webserver as this file to a running ARE instance e.g. on localhost. + * Additionally applies the property settings in the given propertyMap and if successful starts the model. + * @param {string} relFilePath - The path to the file relative to http://location.origin/subpath/. + * @param {string } propertyMap - A JSON string of property keys and values (see function setRuntimeComponentProperties) in the format: + + { + "Component_id_1":{ + "key_1_1":"val_1_1", + "key_1_2":"val_1_2" + }, + "Component_id_2":{ + "key_2_1":"val_2_1", + "key_2_2":"val_2_2" + } +} + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ +function deployModelFromWebserverApplySettingsAndStartModel( + relFilePath, + propertyMap, + successCallback, + errorCallback +) { + //assign default callback functions if none was provided. + successCallback = getSuccessCallback(successCallback); + errorCallback = getErrorCallback(errorCallback); + + deployModelFromWebserver(relFilePath, function() { + setRuntimeComponentProperties( + function(data, HTTPstatus) { + if (JSON.parse(data).length == 0) { + var errorMsg = "The property settings could not be applied."; + alert(errorMsg); + } + console.log("The following properties could be set: " + data); + + startModel(successCallback, errorCallback); + }, + errorCallback, + propertyMap + ); + }); +} + +/** + * Stores the file hosted on the same webserver as this file at a running ARE instance e.g. on localhost and the given relFilePathARE. + * @param {string} relFilePath - The path of the file relative to http://location.origin/subpath/. + * @param {string} relFilePathARE - The store path of the file on the ARE relative to ARE/data. + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ +function storeFileFromWebserverOnARE( + relFilePath, + relFilePathARE, + successCallback, + errorCallback +) { + //assign default callback functions if none was provided. + successCallback = getSuccessCallback(successCallback); + errorCallback = getErrorCallback(errorCallback); + + loadFileFromWebServer(relFilePath, function(fileContentsAsString) { + storeData( + successCallback, + errorCallback, + relFilePathARE, + fileContentsAsString + ); + }); +} + +/** + * Download the model file (modelFilePathOnWebserver) hosted on a web server, apply all settings to the XML model, + * which have a defined binding (data-asterics-model-binding-1,...) to a model property and finally start the model. + * @param {string} modelFilePathOnWebserver - The path of the file relative to http://location.origin/subpath/. + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ + +function applySettingsInXMLModelAndStart( + modelFilePathOnWebserver, + successCallback, + errorCallback +) { + //assign default callback functions if none was provided. + successCallback = getSuccessCallback(successCallback); + errorCallback = getErrorCallback(errorCallback); + + loadFileFromWebServer(modelFilePathOnWebserver, function(modelInXML) { + modelInXML = updateModelPropertiesFromWidgets(modelInXML); + + //Finally upload and start modified model. + uploadModel( + function(data, HTTPstatus) { + startModel(function(data, HTTPStatus) { + successCallback(data, HTTPStatus); + }, errorCallback); + }, + errorCallback, + modelInXML + ); + }); +} + +/** + * Download the currently deployed model from the ARE and update all widgets with the property values in the XML model, + * which have a defined binding (data-asterics-model-binding-1,...) to a model property. + * @param {string} modelFilePathOnWebserver - The path of the file relative to http://location.origin/subpath/. + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ + +function updateWidgetsFromDeployedModel(successCallback, errorCallback) { + //assign default callback functions if none was provided. + successCallback = getSuccessCallback(successCallback); + errorCallback = getErrorCallback(errorCallback); + + downloadDeployedModel(function(data, HTTPStatus) { + //TODO: Check if the modelName is identical to the modelName of the template model, otherwise we should not + //update the widgets from a wrong model. + updateWidgetsFromModelProperties(data); + }, successCallback); +} + +/** + * Applies the settings to the model modelFilePathOnWebserver and saves it as autostart model on the ARE. + * @param {string} modelFilePathOnWebserver - The path of the file relative to http://location.origin/subpath/. + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be called with the file contents. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- Callback function in case of an error. + */ + +function saveSettingsAsAutostartModel( + modelFilePathOnWebserver, + successCallback, + errorCallback +) { + //assign default callback functions if none was provided. + if (typeof successCallback !== "function") { + successCallback = function(data, HTTPStatus) { + alert("Successfully saved settings as autostart!"); + }; + } + errorCallback = getErrorCallback(errorCallback); + + loadFileFromWebServer(modelFilePathOnWebserver, function(modelInXML) { + modelInXML = updateModelPropertiesFromWidgets(modelInXML); + storeModel(successCallback, errorCallback, "autostart.acs", modelInXML); + }); +} + +/** + * @const {string} + * @description HTML5 data attribute to define binding to AsTeRICS model + */ +var dataAttrAstericsModelBinding = "data-asterics-model-binding-1"; + +/** + * Updates the property values of the given modelInXML string with the currently set widget values. + * @param {string} modelInXML - The AsTeRICS model as XML string. + * @returns {string} The modified XML model as string. + */ +function updateModelPropertiesFromWidgets(modelInXML) { + widgetIdToPropertyKeyMap = generateWidgetIdToPropertyKeyMap(); + console.log( + "Updating " + + widgetIdToPropertyKeyMap.length + + " widgets from model properties." + ); + + //parse template modelInXML to document object + var xmlDoc = $.parseXML(modelInXML); + + //Update property values with values of input widgets. + for (var i = 0; i < widgetIdToPropertyKeyMap.length; i++) { + var widgetVal = $(widgetIdToPropertyKeyMap[i]["widgetId"]).val(); + if (typeof widgetVal != "undefined") { + console.log( + "Updating modelProperty <" + + widgetIdToPropertyKeyMap[i]["componentKey"] + + "." + + widgetIdToPropertyKeyMap[i]["propertyKey"] + + "=" + + widgetVal + + ">" + ); + setPropertyValueInXMLModel( + widgetIdToPropertyKeyMap[i]["componentKey"], + widgetIdToPropertyKeyMap[i]["propertyKey"], + widgetVal, + xmlDoc + ); + } else { + console.log( + "widgetId <" + widgetIdToPropertyKeyMap[i]["widgetId"] + "=undefined>" + ); + } + } + + //Convert back XML document to XML string. + modelInXML = xmlToString(xmlDoc); + return modelInXML; +} + +/** + * Updates the widgets (HTML input elements) with the property values of the given modelInXML string. + * @param {string} modelInXML - The AsTeRICS model as XML string. + */ +function updateWidgetsFromModelProperties(modelInXML) { + widgetIdToPropertyKeyMap = generateWidgetIdToPropertyKeyMap(); + console.log( + "Updating " + + widgetIdToPropertyKeyMap.length + + " widgets from model properties." + ); + + //parse template modelInXML to document object + var xmlDoc = $.parseXML(modelInXML); + + //Update property values with values of input widgets. + for (var i = 0; i < widgetIdToPropertyKeyMap.length; i++) { + var propVal = getPropertyValueFromXMLModel( + widgetIdToPropertyKeyMap[i]["componentKey"], + widgetIdToPropertyKeyMap[i]["propertyKey"], + xmlDoc + ); + if (typeof propVal != "undefined") { + console.log( + "Updating widget <" + + widgetIdToPropertyKeyMap[i]["widgetId"] + + "=" + + propVal + + ">" + ); + $(widgetIdToPropertyKeyMap[i]["widgetId"]).val(propVal); + } + } +} + +/** + * Generates an array describing the bindings between all widgetIds (id of HTML5 input tag) and their respective model properties. + * @returns {Array} - Array with Javascript object elements. + */ +function generateWidgetIdToPropertyKeyMap() { + var widgetIdToPropertyKeyMap = []; + var widgetList = $("[" + dataAttrAstericsModelBinding + "]"); + for (var i = 0; i < widgetList.length; i++) { + var bindings = $(widgetList[i]).data(); + for (binding in bindings) { + var bindingObj = { + widgetId: "#" + $(widgetList[i]).attr("id"), + componentKey: bindings[binding]["componentKey"], + propertyKey: bindings[binding]["propertyKey"] + }; + widgetIdToPropertyKeyMap.push(bindingObj); + } + } + return widgetIdToPropertyKeyMap; +} + +/** + * Returns a valid callback function - either successCallback if != undefined or {defaultSuccessCallback}. + * @param {function(data, HTTPstatus)} [successCallback=defaultSuccessCallback] - The callback function to be used. + * @returns {function(data, HTTPstatus)} - Either successCallback or defaultSuccessCallback. + */ + +function getSuccessCallback(successCallback) { + if (typeof successCallback !== "function") { + return defaultSuccessCallback; + } + return successCallback; +} + +/** + * Returns a valid callback function - either errorCallback if != undefined or {defaultErrorCallback}. + * @param {function(HTTPstatus, errorMessage)} [errorCallback=defaultErrorCallback]- The callback function to be used. + * @returns {function(HTTPstatus, errorMessage)} - Either errorCallback or defaultErrorCallback. + */ + +function getErrorCallback(errorCallback) { + if (typeof errorCallback !== "function") { + return defaultErrorCallback; + } + return errorCallback; +} + +/* generic callback handler */ +/** + * This is the default success callback. + * By default nothing is done. + * + * @callback defaultSuccessCallback + * @param {data} - response text or message. + * @param {HTTPstatus} - HTTP status code if applicable. + */ +function defaultSuccessCallback(data, HTTPstatus) {} +/** + * This is the default error callback. + * By default an error dialog (alert) is opened. + * + * @callback defaultErrorCallback + * @param {HTTPstatus} - HTTP status code if applicable. + * @param {errorMessage} - The error message to be shown. + + */ +function defaultErrorCallback(HTTPstatus, errorMessage) { + alert( + "An error occured: " + + errorMessage + + "\nPlease ensure to install AsTeRICS and start the ARE!" + ); +} diff --git a/webapps/startpage/start.html b/webapps/startpage/start.html new file mode 100644 index 0000000000..99b6365ff5 --- /dev/null +++ b/webapps/startpage/start.html @@ -0,0 +1,13 @@ + + + + + + ARE Webservice Homepage + + + + +

Redirect to your demo webapp subpath here

+ + \ No newline at end of file