2014年9月13日 星期六

[kinect]安裝Kinect for Processing 大絕招

1、安裝包:ZigSOpenNI2、SimpleOpenNI丟Processing3、安裝Kinect SDK 1.7
2、以Processing 2.1.2版本測試

2014年8月27日 星期三

[Web]JS表單篇


  • 圖片送出按鈕

<a href="javascript:form1.submit();">    <img src="img.jpg"</a>


  • 重設按鈕

<a href="javascript:form1.reset();">    <img src="img.jpg"</a>


  • 允許/禁止 訪問表單
document.form1.disabled = true / false;

讀取表單所有名稱
form1.elements.lengthform1.elements[i].name


  • 驗證是否輸入是否為數字
var num = "0123456789"var str = form.id.value;for(i=0;i<str.length;i++){    if(num.indexOf(str.charAt(i))== -1)}


  • 使用鍵盤快速選取欄位
<form>    <label for="Namebox" accessKey="N"><u>N</u>ame:</label>    <input type="text" id="Namebox"></form>


  • 文字欄位取得focus
<input type="text" id="txID">form.txID.focus();



  • 選取文字欄位中的文字
form.ID.focus();form.ID.select();


  • 改變文字欄位中的顏色
<input type="text" value="HERE" onMouseOver = "this.style.color = 'red' ">



  • 改變文字欄位中的背景顏色
<input type="text" value="HERE" onMouseOver = "this.style.background= 'red' ">


  • 改變文字欄位中的1邊框顏色
<input type="text" value="HERE" onMouseOver = "this.style.borderColor= 'red' ">



  • 文字欄位自動調整大小

onKeyPress = "autoWidth()"str = form.ID.value;if(str.length !=0){    form.ID.size = str.length;}


  • 改變文字欄位中的對齊方式
form.Id.style.textAlign = left/center/right;


  • 製作Google搜尋表單
<form id="fm1_Id" action="http://www.google.com/search"> <input name="q" id="searchWord" > <br> <input type="submit" value="搜尋"></form>



  • 檢驗一組按鈕的選擇狀態
<form id="form1"><input name="sex" type="radio" checked>男<input name="sex" type="radio" >女</form>
form1.sex[0].checked  form1.sex[1].checked  



  • 核取方塊狀態

form1.id[i].checked


  • 帶標籤的核取方塊

<input type="checkbox" id="ch1"><label for="ch1" > 標籤 </label>



  • 取得下拉選單中選取的值

<form id="form1"><select id="sel1" onChange="get()"><option value="第一項">第一項</option><option value="第二項">第二項</option><option value="第三項">第三項</option></form>
form1.sel1.value




  • 取得下拉選單的索引值
form1.sel1.selectedIndex




  • 取得選單中的多個值

<select id="sel1" multiple>form.id[i].selected  // 看看有沒有被選到form.id[i].value


  • 在新視窗中開啓網頁

open()取代window.loction()open(http://www.google.com);



  • 取得檔案位置(含路徑)


<form id="form2" enctype="multipart/form-data" ><input type="file" id="file">  <input type="button" onClick="get()" value="FileName"></form>
form2.id.value



  • 取得檔案名稱(不含路徑)

取得檔案路徑後,用split()將路徑以“\”切割,再存入陣列中,最後取出陣列的最後一項在JavaScript中插入一個反斜線必須用雙斜線表示。var fName  = form2.id.value;var fileName = new Array();fileName = fName.split("\\");fileName[fileName.length-1]


  • 取得選取檔案的副檔名

取得檔案路徑後,用split()將路徑以“.”切割,再存入陣列中,最後取出陣列的最後一項
fileName = fName.split(".");



  • 將選取的檔案圖片顯示出來

先判斷是不是圖檔
extname.toUpperCase() =="JPG"pic.src = fileName;  //完整路徑


  • 取得選取圖片的檔案大小

先建立圖片物件,並為圖片物件指定來源,再使用物件屬性取得size
img = new Image();
img.src = fileName;
size = img.fileSize / 1024 ;  //將圖片大小轉成KB


  • 取得選取圖片的寬高

img.widthimg.height


  • 選取圖片作為網頁背景


document.body.backgronund = imgURL;
















2014年8月24日 星期日

[Web]JS網頁事件篇


  • 進入、離開網頁顯示訊息

<body onLoad="alert('歡贏')" onUnload="alert('謝謝')">

  • 單擊、雙擊滑鼠事件

<input type="button" onClick="alert('單擊')"><input type="button" onDbClick="alert('雙擊')">

  • 取得滑鼠的按鍵

function getButton(){    switch(event.button)    {        case 0 : alert("左鍵");break;        case 1 : alert("右鍵");break;        case 2 : alert("中鍵");break;    }}document.onmousedown  =  getButton;   //監聽器



  • 滑鼠按下事件

<body onmousedown="alert('點擊')">


  • 絕對禁止按滑鼠右鍵

<body onContextMenu="alert('NO') ;  return false" >


  •  滑鼠控制文字滾動

<marquee direction="up" onMouseOver="this.stop()"onMosueOut="this.start()">



  • 取得滑鼠座標

function getMouse(){    event.x;    event.y;}document.onmousemove = getMouse;



  • 交換式圖片按鈕

<img src="img1" onMouseOver = " this.src = ' img2 ' " onMouseOut = " this.src = ' img1 ' " >



  • 顯示或隱藏圖片

picID.style.visibility = 'visible'picID.style.visibility = 'hidden'



  • 取得按鍵ASCII編碼

function getkeyCode(){    asc = event.keyCode;    key = String.fromCharCode(asc);}document.onkeydown = getkeyCode;  // 可以取得所有按鍵,但無法分辨大小寫document.onkeypress = getkeyCode;  //可分辨大小寫



  • 前往某網頁

window.loaction.href =  "www.google.com";


  • 將按下的按鍵顯示在網頁上

asc = event.keyCode;key = String.fromCharCode(asc);str += key;txt.innerHTML = str;document.onkeypress = showkey;



  • 顯示不同滑鼠樣式

<div onMouseOver = "this.style.cursor='hand'">手形指標</div>




  • 使用外部滑鼠樣式

靜態指標:this.style.cursor='url(img.cur)'動態指標:this.style.cursor='url(img.ani)'

  • 登入密碼驗證
看網頁原始碼就破解
var password = prompt("請輸入密碼","");


  • 取得頁面所有超連結地址

陣列 = document.all.tags("A");























[Web]JS實用範例辭典-視窗篇

視窗篇

  • 警告對話方塊
alert("HI你好");


  • 確認對話方塊
ret = confirm("可以加你朋友嗎");  //ret回傳值(true/false)


  • 顯示網頁對話方塊
可以顯示一個對話方塊,此對話方塊是另一個網頁的內容
features = "dialogWidth:300px;dialogHeight:200px;status=no";  // 設定對話方塊CSS 
showModalDialog("dialog.html",window,features);



  • 以頂層模式顯示網頁對話方塊
不同於showModalDialog的地方是,顯示對話方塊後還可以同時操作原本後面的網頁視窗 
features = "dialogWidth:300px;dialogHeight:300px;status-no"; 
showModelessDialog(dialog.html,window,features); 


  • 取得瀏覽器視窗大小

var width = document.body.clientWidth;
var height = document.body.clientHeight + 125;  //瀏覽器網址,工具列...


  • 取得螢幕大小

var width = screen.width;
var height = screen.height;


  • 不能改變大小的視窗

一但改變視窗大小就觸發<body> onResize事件
<body onResize="window.resize(400,300)">


  • 指定瀏覽器視窗位置

window.moveTo(200,100);  //(距離螢幕左邊的距離,距離螢幕頂部的距離)


  • 震動的視窗

window.top.moveBy(0,i);    //相對移動


  • 視窗縮小效果(IE)

resizeTo(width,height);
moveTo( (screen.height-height)/2 , (screen.width-width)/2 );


  • 視窗自動捲動

window.scrollBy(1,0);  // 0 , 正 , 負  值的六種組合方向
<body onLoad="setInterval('window.scrollBy(0,1)',50)">


  • 去掉視窗捲軸

定義body的CSS
body{overflow:scroll;overflow-x:hidden;overflow-y:hidden;}



  • 讓捲軸從左邊出現

<body dir="rtl">



  • 改變捲軸的樣式CSS


body
{
    scrollbar-face-color : # ffd0d0  //捲軸表單顏色
    scrollbar-highlight-color : ffffff   //高光顏色
}


  • 視窗失焦事件

body
{onBlur="alert('out of focus')"}


  • 彈出新網頁視窗

window.open("newPage.html");


  • 彈出無屬性列網頁視窗

window.open("newPage.html","","top=100,left=300,width=300,height=200");


  • 彈出視窗狀態

window.open("newPage.html',"","HERE");
fullscreen=yes  //全螢幕
menubar=yes   //功能表
toolbar=yes    //標準按鈕列,下一頁
location=yes  //網址
status=yes     //底下狀態列
scrollbar = yes  //有捲軸
resize=yes  //允許調整視窗


  • 關閉視窗

self.close()
window.close()


  • 在主視窗關閉彈出視窗

p = window.open('newPage.html');
p.close();


  • 在彈出視窗關閉主視窗

opener.close();



  • 將主視窗的資料輸出到彈出視窗

var p = window.open("receive.html","","width=300,height=200,top=300,left=800");
var msg = textID.value;
p.document.write("<p>" + msg + "</p>");



  • 自動關閉視窗

setTimeout(self.close(),5000);

setTimeout(myfunction,5000);  //不可myfunction()


  • Reference

JavaScript實用範例辭典-孫俊平





2014年8月5日 星期二

[unity]tag Detect


  • 大綱

現在有一場景,上面有很多遊戲物件,當滑鼠點擊畫面時,我們可以得到以下資訊:1、點擊位置的座標(screenspace、worldspace)2、是否點擊到物件3、點擊到哪個物件



  • 說明

場景中有很多物件,要做當滑鼠點擊物件時,知道是點到哪個物件。先將遊戲物件標籤,以供程式判斷;gameobject.tag

使用到Input.GetMouseButtonDown來觸發,接下來是將點擊到的位置由Screenspace轉成遊戲世界的World space
  • var ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
將由攝影機投射出光線,包含著位置與方向資訊。
  • Physics.Raycast(ray,hit);
如果攝影機射出的光線,有碰擊到遊戲物件(collider),回返回true,然後hit會得到光線與collider在哪個位置被碰到的物件資訊。
  • point = hit.point; (哪個位置)  
  • object = hit.transform.gameObject;(哪個物件)



  • Code : 

#pragma strict 
var Ball : GameObject; 
var object: GameObject; 
var point: Vector3; 
function Start () { 

}
 

function Update () {
 
if(Input.GetMouseButtonDown(0)) 
{ 
//Instantiate(Ball,Input.mousePosition,transform.rotation); 
//print(Input.mousePosition); 
var hit: RaycastHit; 
        var ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
if (Physics.Raycast(ray, hit)) 
{ 
point = hit.point; 
            object = hit.transform.gameObject; 
            //print(object.tag); 
            print(point); 
            Instantiate(Ball,point,transform.rotation); 
} 
else 
{ 
print("SHIT"); 
} 
} 
} 



  • Reference
Unity Document

2014年8月2日 星期六

[unity]Input

在Unity 中使用input 物件來偵測滑鼠,鍵盤事件。
偵測情況基本上有三種:1、GetKey : 當按下時會持續作用2、GetKeyDown : 當按下那一刻才會作用3,GetKeyUp : 當按下後放開那一刻才會作用


Example:


  • 偵測滑鼠左中右鍵


if(Input.GetMouseButton(0))
Debug.Log("Pressed left click.");
if(Input.GetMouseButton(1))
Debug.Log("Pressed right click.");
if(Input.GetMouseButton(2))
Debug.Log("Pressed middle click.");

  • 三種不同的方式偵測是否按下"A"


if(Input.GetKey(KeyCode.A))    // print continue when press key 
{
print("A");
}
if(Input.GetKeyDown(KeyCode.A))   // print once when press key
{
print("press A");
}

if(Input.GetKeyUp(KeyCode.A))   // print once when release key
{
print("press A");
}


  • 按下任意鍵

if(Input.anyKeyDown)
{
print("anyKey");
}


Refernce:













2014年8月1日 星期五

[unity]onMouseDown

利用onMouseDowm 呈現當滑鼠按到遊戲物件時,開關燈光。
有兩種方式,


1、先製造一個cube GameObject然後在cube GameObject上附加燈光元件,所以程式是將onMouseDown依附在cube上,然後在程式碼中指定燈的強弱,因為是附加在cube的關係,在程式碼中,以gameObject.light.intensity即可存取。







#pragma strict

var lightSW = true;
function Start () {
print("Hello World");
}
function Update () {
gameObject.transform.Rotate(0,30*Time.deltaTime,0);
}
function OnMouseDown()
{
if(lightSW)
       {
gameObject.light.intensity = 5;
lightSW = false;
}
else{
gameObject.light.intensity = 0;
lightSW = true;
}
}








2、製造一個cube GameObject 與 一個spotlight GameObject ,將onMouseDowm附加在cube上,
因為兩個gameObject相互獨立,所以cube的程式要控制spotlight的話,必須將spotlight 以 gameObject(var GB_light:GameObject;)的方式讀進程式,然後再加以控制。





#pragma strict
var GB_light:GameObject;
var lightSW = true;
function Start () {
print("Hello World");
}
function Update () {
gameObject.transform.Rotate(0,30*Time.deltaTime,0);
}
function OnMouseDown()
{
if(lightSW)
       {
GB_light.light.intensity = 5;
lightSW = false;
}
else{
GB_light.light.intensity = 0;
lightSW = true;
}
}




Reference











[unity]JavaScrpt遊戲物件基本操作


  • 移動GmaeObject到指定位置


gameObject.transform.position = Vector3(x,y,z);



  • 使GameObject向指定方向移動


gameObject.transform.Translate(x,y,z);



  • 一秒轉30度


gameObject.transform.Rotate(0,30*Time.deltaTime,0);


  • 旋轉到指定角度

gameObject.transform.rotation = Quaternion.Euler(0,30,0);



  • 透過滑鼠指定啟動不同Camera

public var Camera3 : GameObject;Camera1.active = true;
Input.GetMouseButtonDown(1)



  • 動態生成物件(Instantiate) : 先製造prefab,經過某個事件後才生成物件

var prefabObj : GameObject;Instantiate(prefabObj,transform.position,transform.rotation);


  • 切換場景:可以場景檔名或引數呼叫(需在Sences In Build建立順序)
Application.LoadLevel("Sence2") 
Application.LoadLevel(0);
 Refence

























  • 超連結

Application.OpenURL("www.google.com");




  • AudioSource

建立空元件,並加上audiosource component,將mp3拉進audiosource 
var audio_A : AduioSource; 
aduio.play(); 
more 


  • screen shot(png)

Application.CaptureScreenShot("filename.png");





  • Reference 

CG數位學習網
彥霖實驗筆記 

[unity]基本效果-看圖說故事






particle system 
terrain
prefab
fog    (Edit->Render Settings)
ambient Light    (Edit->Render Settings)
skyBox    (Edit->Render Settings)






light
flare
materials
shadder






particle system (import)





Referece : Unity CG數位學習網




2014年7月21日 星期一

創意雕塑


Mustangs By Robert Glen, Las Colinas, Texas, USA
城市中表達奔騰的馬,利用水與幫浦






Expansion by Paige Bradley, New York, USA
如果要在雕像上加入光的元素



結合雕像意象與城市中的現有景
People Of The River By Chong Fah Cheong, Singapore



結合現實景,充滿隱喻性
The Shoes On The Danube Bank by Can Togay & Gyula Pauer, Budapest, Hungary


將雕像與場景結合
Les Voyageurs, Marseilles, France





將一瞬間,表達出來
De Vaartkapoen, Brussels, Belgium




將城市的表面,化為上層面
Sinking Building Outside State Library, Melbourne, Australia


天空與雕朔的結合
Man Hanging Out, Prague, Czech Republic


結合城市中的垃圾桶,思考一下,公共空間中,有什麼可以拿來用。

把一個超現實的樣子,放在現實的公共空間中















2014年7月16日 星期三

[arduino]MakeyMakey

1、先下載Makey Addon 

2、下載後解壓縮將Makey資料夾放進Arduino資料夾裡的dardware資料夾

3、下載Makey code

4、打開ArduinoIDE 變更Board ,更改成Makey Makey



















5、打開code,在setting.h設定自定義按鍵























6、在主程式碼設定腳位狀態





















7、Using the output Header : 用來控制外部物件
當有按鍵被按下,D14輸出高電位(5V)否則輸出低電位(0V)
當滑鼠被按下,D16輸出高電位(5V)否則輸出低電位(0V)











Reference:
Spark Fun Makey Makey





















2014年6月29日 星期日

[G4P]CoolSliders


  • Detailed Description


是一種使用者可以自行規劃外型(skin)的Slider
Library 提供5種skin

  • grey_blue(default skin)
  • green_red20px
  • red_yellow18px
  • blue18px
  • purple18px 


skin 需要5個圖檔來描述slider的部分:
1、滑桿左邊(end_left.???)
2、滑桿右邊(end_right.???)
3、滑桿棍子(centre.???)
4、滑標(handle.???)
5、滑鼠碰到滑標後(handlemouseover.???)
(???:png,jpg,gif,tga)




  • Some Method


import g4p_controls.*;  
//import library

GCustomSlider sdr1;  
//宣告slider物件

sdr1 = new GCustomSlider(this,20,20,260,50,null);
//(this,x,y,width,height,移標種類,可以在G4p->src->data找到)

sdr1.setShowDecor(false,true,true,true);    
//setShowDecor(顯示背景?,顯示前後端線?,顯示目前數值?,顯示前後端數值?
(預設0~1));

sdr1.setNbrTicks(5);    
//將Slider分成個區段(5)

sdr1.setLimits(40, -100, 100);    
//設定預設位置數值與前後段值setLimit(目前指定值,後端值,前端值)

sdr1.setNumberFormat(G4P.DECIMAL,3);
//定義滑桿數值形態,取到小數點後(3)位

sdr1.setNumberFormat(G4P.EXPONENT,1);
//exponent形態,底數取到小數後1位

sdr1.setShowValue(false);
//設定是否顯示滑桿目前數值

sdr1.setEasing(25);
//滑桿拖曳滑行效果,數值越大越明顯

sdr1.setStickToTicks(true);
//設定滑桿強制停在離它最近的區段線上

sdr1.getValueI();
//取得滑桿值(整數形態)

sdr1.getValueF();
//取得滑桿值(浮點數形態)

sdr1.setShowTicks(true/false);
//顯示ticks

sdr1.Alpha(int alpha);
//設定透明度

sdr1.setRotation(float angle);
//旋轉滑軌

sdr1.setVisble()
//設定是否可見

sdr1.setOpaque()
//是否有背景

sdr1.isDragging()
//是否被拖曳

sdr1.setEnabled(true/false);
//設定致能/失能





  • 建立滑軌自定義字串下標籤

String[] tickLabels = new String[]{"A","B","C","D","E"};
//先建立下標字串陣列,看要放什麼字

sdr = new GCustomSlider(this,320,160,260,70,"green_red20px");
//實作Slider物件

sdr.setShowDecor(false,true,true,true);
//設定滑桿值狀態

sdr.setTickLabels(tickLabels);
//為滑桿附加上自定義標籤






  • Slider 操作事件
public void handleSliderEvents(GValueControl Slider , GEvent event)
{
    println(sdr.getValueS() + "   " + event);
    //印出目前值,與值是在改變中還是已經穩定了(有Easing 效果才有)
    // Value is changing  or  Value has reached a steady state
}



  • Library Download

  • Reference














2014年5月23日 星期五

[Arduino]物件導向

建立類別

class Dog
{
  private:    //私有屬性,無法直接存取
             int age;
             String name;
  public:
             Dog()   //預設無參數建構子
           {
                age = 10;
                name = "Happy";
           }
           Dog(int a,String n)   //指定傳參數建構子
           {
                age = a;
                name = n;
           }
           
           void getAtt()
           {
               Serial.print("Age:");
               Serial.println(age);
               Serial.print("Name:");
               Serial.println(name);
           }
};


實作物件


Dog happy = Dog();    //預設建構子
Dog yellow = Dog(20,"Yellow") ;    //指定建構子


呼叫物件方法

//物件名稱.方法名稱
happy.getAtt();
yellow.getAtt();




參考來源

  • http://forum.arduino.cc/index.php/topic,42377.0.html


2014年5月19日 星期一

[arduino]ArduinoThread分時多工

ArduinoThread



A simple way to run multiple stuff in Arduino.
一個簡單方式來使Arduino達到分時多工功能

NO, Arduino does not support “REAL” parallel tasks, but we can make use of this Class to improve our code, and easily schedule tasks with fixed (or variable) time between runs.
Arduino並非真的有平行運算功能,但我們能透過這個Class來改進程式碼,將工作做排程的動作,透過快速切換來個別執行,達到【類】多工現象。

Instalation


1、下載Library
2、放進Arduino libraries 資料夾


Getting Started

There are basicaly, two Classes included in this Library:
【Thread】 and 【ThreadController】 (that inherits from Thread).
這個Library有兩個Class【Thread】與【ThreadController】(繼承自Thread)



【Thread class】
This is the basic class, witch contains methods to set and run callbacks, check if the Thread should be runned, and also creates a unique ThreadID on the instantiation.
這是基本的Class,包含了方法去設定callbacks並執行,確認Thread 是否應該被啟動;
並且實作時創造一個獨有的ThreadID。



【ThreadController class】
Responsable for “holding” multiple Threads. Can also be called as “a group of Threads”, and is used to perform run in every Thread ONLY when needed.




  • 【The instantiation of a Thread class】

實作Thread 類別

Thread myThread = Thread();
// or, if initializing a pointer 初始化一個指標
Thread* myThread = new Thread();


  • 【Setting up a thread is essential. You can configure many things】:

設定 thread
myThread.enabled = true; 
// Default enabled value is true
//【.enabled】,是Thread開關
myThread.setInterval(10); 
// Setts the wanted interval to be 10ms
//用【setInterval(ms)】來設定間隔為10ms


myThread.ThreadName = "myThread tag";
/*
This is useful for debugging
(Thread Name is disabled by default, to use less memory)
(Enable it by definint USE_THREAD_NAMES on 'Thread.h')
         【.ThreadName】建立ThreadName可以方便Debugging,
         通常ThreadName被預設關閉,
         較不消耗記憶體
*/
myThread.onRun(callback_function); 
// This will set the callback of the Thread: "What should I run"?
//【.onRun(functionName)】來告訴Thread該執行哪個Callbackfunction




【using Thread and ThreadController】

Ok, creating Threads are not so hard. But what do we do with them now?
製造一個Thread 並不太難但我們該怎麼用她?
First, let’s see how Threads should work, to understand what a ThreadController is and does
首先,要了解ThreadController怎麼運作,從看Thread怎麼運作開始。

// First check if our Thread "should" be runned
//執行【.shouldRun()】來確認這個Thread是否該被啟動
if(myThread.shouldRun()){
  // Yes, the Thread should be runned, let's run it
  //用【.run()】來啟動Thread
  myThread.run();
}


Now that you got the idea, let’s think a little bit: What if i have 3, 5, 100 Threads. Do I need to check EACH one?!?
如果我有很多個Thread,那我得一個一個檢查嗎?
The answer is: NO. Create a ThreadController, and put all your boring-complex Threads inside it!
答案是NO,創造一個ThreadController來管理很多Thread,她像個箱子,將Thread丟進去。


// Instantiate a new ThreadController
//實作一個 ThreadController
ThreadController controller = ThreadController();
// Now, put a bunch of Threads inside it, FEED it!
//透過【.add(&Thread)】將Thread餵給ThreadController
// Notice the & before the thread, IF it's not instantied as a pointer.
//注意:如果Thread在實作時並"非"以指標形式時,應該前加上"&"
controller.add(&myThread); 
controller.add(&hisThread);
controller.add(&sensorReadings);


You have created, configured, grouped it. What is missing? Yes, whe should RUN it!
你已經將一群Thread群組化了,但你還得RUN ThreadController
controller.run();

TIPs and Warnings


  • ThreadController is not a LinkedList. It’s “MAXIMUM” size (the maximum Threads that it can store) is defined on ThreadController.h (default is 15)

ThreadController不是鏈結串列,她最大的size可以儲存15個Thread

  • !!!! VERY IMPORTANT !!!! When extending Thread class and implementing the function run(), always remember to put runned(); after all, otherwhise the Thread will ALWAYS run.
重要!當擴建Thread class 並 實作run() function時,記得放runned(),否則Thread一直處於Run狀態。


  • It’s a good idea, to create a Timer interrupt and call a ThreadController.run() there. That way, you don’t need to worry about reading sensors and doing time-sensitive stuff on your main code (loop). Check ControllerWithTimer example.

建立中斷計時器去呼叫ThreadController.run()。
這樣你的main loop可以專心處理讀取sensors數值或是處理即時性工作。


  • Inheriting from Thread or even ThreadController is always a good idea. For example, I always create base classes of sensors that extends Thread, so that I can “register” the sensors inside a ThreadController, and forget about really reading sensors, just getting theirs values within my main code. Checkout SensorThread example.




  • Remember that ThreadController is in fact, a Thread. If you want to enable or disable a GROUP of Threads, think about putting all of them inside a ThreadController, and adding this ThreadController to another ThreadController (YES! One ThreadController inside another). Check ControllerInController example.


  • Things must do stuff quickly. Waiting too loooong on a interrupt, means waiting too loooong on the main code (loop).

不能在interrupt callbackfunction 執行太久的工作,否則做到一半就又進入中斷,main code將一直不被執行,陷入無限迴圈。


Library Reference


【bool Thread::enabled】
Enables or disables the Thread. (do not stop it from running, but will return false 
when shouldRun() is called)
啟動/關閉Thread

【void Thread::setInterval()】
Setts the desired interval for the Thread (in Ms).
設定多久進入Thread callback

【bool Thread::shouldRun()】
Returns true, if the Thread should be runned. (Basicaly, the logic is: (reached time AND is enabled?).
Check Thread是否正在run

【void Thread::onRun(void (*callback)(void))】
The target callback function to be called.
設定Thread處理的callback function

【void Thread::run()】
This will run the Thread (call the callback function).
執行Thread

【int Thread::ThreadID】
Theoretically, it’s the address of memory. It’s unique, and can be used to compare if two threads are identical.
獨一的ID,用來比較Thread 是否相同。
【int Thread::ThreadName】
A human-redable thread name. Default is “Thread ThreadID” eg.: “Thread 141515”; Note that to enable this attribute, you must uncomment the line that disables it on ‘Thread.h’;
看不懂

【protected: void Thread::runned()】
Used to reset internal timer of the Thread. This is automaticaly called AFTER a call to run().
用來重設Thread 的間隔時間(重算),通常在執行完run()後,會自動執行

【void ThreadController::run()】
This will run the all Threads within the ThreadController, only if needed (if shouldRun returns true);
執行ThreadController 中所有Thread ,當Thread.shouldRun() returns true

【bool ThreadController::add(Thread* _thread)】
This will add a the thread to the ThreadController, and return true if suceeded (it the array is full, returns false).
將Thread 加入 ThreadController中

【void ThreadController::remove(Thread* _thread)】
This will remove the Thread from the ThreadController.
從ThreadController 中移除 某個Thread(透過名稱)

【void ThreadController::remove(int index)】
This will remove the thread on the position index.
從ThreadController 中移除 某個Thread(透過index)

【void ThreadController::clear()】
This will remove ALL threads from the ThreadController array.
移除所有Thread

【void ThreadController::size(bool cached = true)】
Returns how many Threads are allocated inside the ThreadController. If cached is false, will force the calculation of threads.
看ThreadController中有幾個Thread


【Thread* ThreadController::get(int index)】

Returns the Thread on the position index.
看Thread在ThreadController的哪個位置中





  • 參考來源:https://github.com/ivanseidel/ArduinoThread