2009年6月8日 星期一

自動尋徑室內導航系統-讀後感想

我覺得他們的整個的報告架構非常的完整,內容而言也很流暢,一步步導引讀者接續的繼續閱讀下去,專業部分的文字敘述也不會太冗長,圖文並用相輔相成,我覺得很好,此外利用演算法找出最短的路徑,也考慮到有輪椅的部分,對於其他障礙者有多方面的設想,還有那幾張示意圖真的很厲害,很清楚的表達出概念,很值得我們學習。

另外我想說關於手持裝備,是否也可以用在不一樣的平台,如手機等等的,還有關於QR code的部分還可以多做些介紹,對於第一次接觸的人可以讓他們清楚知道其功用,另外在藍芽的部分著墨不多,知道是個發射端,之後讀到後面藍芽給的印象都不見了。另外提示的部分是語音影像,不過文中都是談論影像,到是很少提到語音的實際效益。

後面加入三創時的比賽,更提高可看性,也增加了此研究的可行性,我覺得真的很厲害,是我們要看齊的。

用於輔助認知障礙者就業之行動定位社會網路-讀後看法

利用GPS衛星定位系統結合手持裝置幫助認知障礙者們,在科技的幫助下更能讓學員們接受人群,走入社會。一開始明確的開頭法讓讀者很容易產生概念。
到是在開頭提到的行動定位社會網路(MLSN)似乎沒有解釋的很清楚,不懂的人可能看得會有點含糊。

在介紹行動網路的部分也很仔細的分析了研究可能會用到的網路,也都能提跟手持結合後的效果跟問題,到是我覺得可以用個比較各模式的優缺點,這樣也比較清楚的。

在文中提到的Skype API 能夠發送簡訊給就輔員,這點很在我們的研究計畫裡也會有這樣的功能,希望跟夠多多的跟你們學習。

在系統架構圖方面,我想這一看就能一目瞭然是我們值得學習的地方,不過文字解釋的部分不夠明確,我覺得圖片是增加文字的閱讀印象,應該還可以多做些說明。在學員、伺服器與就輔員的流程這張圖,單單看黃色的部分可以大概知道其功用,不過外加了那些箭頭有點擾亂了架構,而且沒有標示出箭頭的功用。
另外圖的編號跟內文的圖X沒有對到唷!!



以上是我的一些看法,還希望能夠向你們多多學習!!

2009年6月7日 星期日

新式認知障礙者室內導航系統-讀後心得

這份報告寫的內容很流暢,第一次掃讀的時候就能夠很清楚的知道他們在做甚麼了,圖文搭配的剛剛好,圖片增強文字的敘述的效果,而研究的目的主要是幫助認知障礙者的室內導航,輔助的科技是藍芽及PDA,兩者相輔相成,該介紹到的都有提到,很容易的讓不懂的或第一次接觸的人進入狀況,到是在系統設計的地方我覺得可以用簡單的架構圖來表示認知障礙者與PDA,藍芽及操作後的關係模式,還有剛開始看到主題時新式認知障礙者室內導航系統,因為有提到新式,讓我自然而然的想到會有舊式的,想看看是否有兩種的比較之類的,這樣才能更明確的知道為何要開發出此系統,以上是我個人的一點點看法。

程式碼coordinator 812~1625解釋

/****************************************************************************
*
* NAME: vProcessKeys
*
* DESCRIPTION:
* Gets the latest button presses and detects any change since the last time
* the buttons were checked. If there is a change it is passed to the
* individual handler for the screen currently being displayed (the buttons
* are all 'soft' keys so their meaning changes from screen to screen).
//偵測最新一次的按鈕後的改變,假使改變了便會在屏幕上顯示最近一次的操作。
*
* PARAMETERS: Name RW Usage
* pu8Keys RW Persistent value of buttons pressed
* //壓下按鈕後的固定值
****************************************************************************/
PRIVATE void vProcessKeys(uint8 *pu8Keys)
{
uint8 u8KeysDown; //設置按鍵按下
uint8 u8NewKeysDown;//新按鍵按下

u8KeysDown = *pu8Keys; //按鍵按下會等於壓下按鈕的固定值

/* Process key press */ // 按下按鍵的程序
u8NewKeysDown = u8ButtonReadFfd(); //讀取按鈕在板子上的狀態

if (u8NewKeysDown != u8KeysDown)//假使新的鍵相等於設置的鍵
{
u8KeysDown = u8NewKeysDown; //則相等

/* Key presses depend on mode */ //按鍵決定模式
switch (sDemoData.sSystem.eState) //狀態設置
{
case E_STATE_SPLASH: //回應按鍵的值設置資料或者轉至介紹屏幕;JN-3033.p23
vProcessSplashKeyPress(u8KeysDown);
break;

case E_STATE_NETWORK: //回應按鍵的值設置資料或者轉至加入網路屏幕;JN-3033.p23
vProcessNetworkKeyPress(u8KeysDown);
break;

case E_STATE_NODE: // 回應按鍵的值設置資料或者轉至最新接收值的屏幕;JN-3033.p23
vProcessNodeKeyPress(u8KeysDown);
break;

default:
break;
}
}

/* Store value for use next time */ //儲存下次使用的值
*pu8Keys = u8KeysDown;
}


/****************************************************************************
*
* NAME: u8UpdateTimeBlock
*
* DESCRIPTION:
* Moves the state machine time block on by one time period. //利用一個時間週期移動一個狀態的時間區塊
*
* PARAMETERS: Name RW Usage
* u8TimeBlock R Previous time block //上一個時間區塊
*
* RETURNS:
* uint8 Next time block //回傳下一個時間區塊
*
****************************************************************************/
PRIVATE uint8 u8UpdateTimeBlock(uint8 u8TimeBlock) //設定一個時間參數
{
u8TimeBlock++; //時間遞增時
if (u8TimeBlock >= MAX_BLOCKS) //假如大於等於最大值時
{
u8TimeBlock = 0; //此時的時間區為0
}

return u8TimeBlock; //回傳原本的值
}

/****************************************************************************
*
* NAME: vSendData
*
* DESCRIPTION:
* Generates and sends a frame consisting of 1 KVP transaction, for the
* setting of the LED at the receiving device. The address is provided in the
* call but the endpoint is fixed. //產生並且傳送一個1個KVP(關鍵值對),以控制一個LED的傳感節點
*
* PARAMETERS: Name RW Usage
* u16Addr R Address to send data to //資料傳輸的位置
* u8Switch R Switch value (0 or 1) //轉換0或1的值
*
****************************************************************************/
PRIVATE void vSendData(uint16 u16Addr, uint8 u8Switch) //設定參數
{
uint8 u8SrcEP = 0x30; //源設備的端口號,Source endpoint number
APS_Addrmode_e eAddrMode; //接收函數中判斷參數
AF_Transaction_s Transaction; //設定一個轉換的結構變量
uint16 u16DestAddr;
uint8 u8DestEndpoint;
uint8 transCount = 1;

eAddrMode = APS_ADDRMODE_SHORT;
u16DestAddr = u16Addr;
u8DestEndpoint = 0x40;

Transaction.u8SequenceNum = u8AfGetTransactionSequence(TRUE);
Transaction.uFrame.sKvp.eCommandTypeID = KVP_SET;
Transaction.uFrame.sKvp.eAttributeDataType = KVP_UNSIGNED_8BIT_INTEGER;
Transaction.uFrame.sKvp.eErrorCode = KVP_SUCCESS;
Transaction.uFrame.sKvp.u16AttributeID = 0x0000;
Transaction.uFrame.sKvp.uAttributeData.UnsignedInt8 = u8Switch;

afdeDataRequest(eAddrMode,
u16DestAddr,
u8DestEndpoint,
u8SrcEP,
DAP_PROFILE_ID,
DAP_CID_SWITCH,
AF_KVP,
transCount,
&Transaction,
APS_TXOPTION_NONE,
ENABLE_ROUTE_DISCOVERY,
0);
}

/****************************************************************************
*
* NAME: vProcessUpdateBlock
*
* DESCRIPTION:
* Called once per second to update the scrolling graphs and, if showing a
* screen with graphs on, updating the LCD. /此功能更新所有圖型的節點,數據的縮放然後更新顯示在屏幕上
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vProcessUpdateBlock(void)
{
tsNodeData *psNodeData;
tsNodeElementData *psNodeElementData; //節點的基本數據
uint8 *pu8GraphData;// 繪製資料的圖
uint8 u8PrevPoint; //上一個點
uint8 u8Node; //節點
uint8 u8Sensor;//感測器
uint8 u8Value; //參數的值

/* Update graphs */ //更新圖型
for (u8Node = 0; u8Node < DEMO_ENDPOINTS; u8Node++)
{
psNodeData = &sDemoData.sNode.asNodeData[u8Node];
if (psNodeData->u8FramesMissed)
{
/* Missed data, so copy previous value forward */ //資料遺失時複製前一個值
u8PrevPoint = (sDemoData.sGui.u8GraphPos - 1) & (DEMO_HISTORY_LEN - 1);
for (u8Sensor = 0; u8Sensor < DEMO_SENSOR_LIST_LEN; u8Sensor++)
{
pu8GraphData = psNodeData->asNodeElementData[u8Sensor].au8GraphData;
pu8GraphData[sDemoData.sGui.u8GraphPos] = pu8GraphData[u8PrevPoint];
}
} // 所繪出的圖為上一個點的數據
else
{
/* Data must be scaled for graph (0-13)// 數據的所繪出的圖規模為0-13
Temp range is 0-52 //測出溫度的範圍為0-52
Humidity range is 0-104 //濕度的感測範圍為0-104
Light range is 0-6 //光的感測範圍為0-6
*/
for (u8Sensor = 0; u8Sensor < DEMO_SENSOR_LIST_LEN; u8Sensor++)
{
psNodeElementData = &psNodeData->asNodeElementData[u8Sensor];
u8Value = psNodeElementData->u8NowValue; //感測的範圍從0開始到最大值,範圍內取得現在的所測到的值
switch (u8Sensor) //感測器所測到的,溫度,濕度,光度的值
{
case E_SENSOR_TEMP:
u8Value = u8Value >> 2;
break;

case E_SENSOR_HTS:
u8Value = u8Value >> 3;
break;

case E_SENSOR_ALS:
u8Value = u8Value * 2;
break;
}
if (u8Value > 13)
{
u8Value = 13; //假使得到的值大於13則等於13
}
psNodeElementData->au8GraphData[sDemoData.sGui.u8GraphPos] = u8Value; //所繪出的圖型為所得到的值
}
}

/* For next time, assume failed until proven otherwise */
if (psNodeData->u8FramesMissed < FRAMES_MISSED_INDICATION)
{
psNodeData->u8FramesMissed++;
}
}

/* Increment graph position */
sDemoData.sGui.u8GraphPos = (sDemoData.sGui.u8GraphPos + 1) & (DEMO_HISTORY_LEN - 1);

/* Update display */ //更新顯示為節點或網路模式
switch (sDemoData.sSystem.eState)
{
case E_STATE_NETWORK://網路模式
vUpdateNetworkScreen(sDemoData.sGui.eCurrentSensor);
break;

case E_STATE_NODE: //節點模式
vUpdateNodeScreen(sDemoData.sGui.u8CurrentNode);
break;

default:
break;
}
}

/****************************************************************************
*
* NAME: vProcessSplashKeyPress
*
* DESCRIPTION:
* Handles button presses on the splash screen. The buttons show the stack
* version. //按住按鈕後可跳至介紹畫面,可以知道為第幾版本
*
* PARAMETERS: Name RW Usage
* u8KeyMap R Current buttons pressed bitmap
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vProcessSplashKeyPress(uint8 u8KeyMap)
{
char acString[9];

switch (u8KeyMap)
{
case E_KEY_0: //按鍵0時會在LCD板上顯示的字樣
vUTIL_NumToString(sDemoData.sSystem.u32ZigbeeStackVersion, acString);
vLcdWriteText("Stack release", 6, 0);
vLcdWriteText(acString, 6, 80);
vLcdRefreshAll();
break;

case E_KEY_1: //按鍵1時會在螢幕出現通道的增加
/* Plus button: increment value */
sDemoData.sSystem.u8Channel++;
if (sDemoData.sSystem.u8Channel > CHANNEL_MAX)
{
sDemoData.sSystem.u8Channel = CHANNEL_MIN;
}
vUpdateSplashScreen();
break;

case E_KEY_2: //按鍵2時會在屏幕出現通道的遞減
/* Minus button: decrement value */
sDemoData.sSystem.u8Channel--;
if (sDemoData.sSystem.u8Channel < CHANNEL_MIN)
{
sDemoData.sSystem.u8Channel = CHANNEL_MAX;
}
vUpdateSplashScreen();
break;

case E_KEY_3: // 選定通道後按按鍵3會跳至加入網路的畫面
/* Done button: start network and go to network screen */
sDemoData.sSystem.eState = E_STATE_NETWORK;
JZS_sConfig.u32Channel = sDemoData.sSystem.u8Channel;
JZS_vStartStack();
vBuildNetworkScreen();
break;

default:
break;
}
}

/****************************************************************************
*
* NAME: vProcessNetworkKeyPress
*
* DESCRIPTION:
* Handles button presses on the Network screen. The buttons can move onto
* the first Node screen (if there are any nodes) or select a particular
* sensor. //選擇按鈕可以跳至加入網入的螢幕,如果有其他的節點或特定感測也可以選擇
*
* PARAMETERS: Name RW Usage
* u8KeyMap R Current buttons pressed bitmap
*
* RETURNS:
* void
*
****************************************************************************/
uint8 u8PermitJoining = 0xff;

PRIVATE void vProcessNetworkKeyPress(uint8 u8KeyMap)
{
switch (u8KeyMap)
{
case E_KEY_0:
/* Node button: go to node screen (if there are any nodes) */ //如果節點數大於0按鍵0可以跳至節點的屏幕
if (sDemoData.sNode.u8AssociatedNodes > 0)
{
sDemoData.sSystem.eState = E_STATE_NODE; //為節點狀態
sDemoData.sGui.u8CurrentNode = 0; //第一個節點
vBuildNodeScreen(sDemoData.sGui.u8CurrentNode); //顯示第一個節點感測的數據
}
break;

case E_KEY_1: //
/* Temp button: change if not already there */ //在節點的銀幕上換至感測溫度的畫面
sDemoData.sGui.eCurrentSensor = E_SENSOR_TEMP; //選擇溫度
u8PermitJoining = 0xff - u8PermitJoining;
nlmePermitJoiningRequest(u8PermitJoining);
vBuildNetworkScreen(); //產生畫面
break;

case E_KEY_2:
/* Humidity button: change if not already there */ // 在螢幕上換至感測濕度的畫面
sDemoData.sGui.eCurrentSensor = E_SENSOR_HTS; //濕度
vBuildNetworkScreen();
break;

case E_KEY_3:
/* Temp button: change if not already there */ //同上是亮度
sDemoData.sGui.eCurrentSensor = E_SENSOR_ALS;
vBuildNetworkScreen();
break;
}
}

/****************************************************************************
*
* NAME: vProcessNodeKeyPress
*
* DESCRIPTION:
* Handles button presses on the Node screens. The first button can move to
* the next Node screen (if there are any more nodes) or back to the Network
* screen. Another button selects the Node Control screen and the other two
* toggle the state of the remote switch. //按鈕的設定控制螢幕為跳至下一個節點,或控制其他板子
*
* PARAMETERS: Name RW Usage
* u8KeyMap R Current buttons pressed bitmap
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vProcessNodeKeyPress(uint8 u8KeyMap)
{
switch (u8KeyMap)
{
case E_KEY_0:
/* Node button: go to next node or network screen */ //多個節點加入可按按鍵0換下個節點的畫面
sDemoData.sGui.u8CurrentNode++;
if (sDemoData.sGui.u8CurrentNode == sDemoData.sNode.u8AssociatedNodes) //假使切換至最後一個節點後再按按鍵0
{
sDemoData.sSystem.eState = E_STATE_NETWORK; //會跳至節點加入網路的模式
sDemoData.sGui.eCurrentSensor = E_SENSOR_ALS; //測的數據為光
vBuildNetworkScreen();
}
else
{
vBuildNodeScreen(sDemoData.sGui.u8CurrentNode);
}
break;

case E_KEY_2:
/* Off button */ //可傳送資料控制其他板子為關掉的按鈕
case E_KEY_3:
/* On button */ //為開啟的按鈕
vSendData(sDemoData.sNode.asNodeData[sDemoData.sGui.u8CurrentNode].u16ShortAdr, (u8KeyMap == E_KEY_2) ? 0 : 1);
break;
}
}

/****************************************************************************
*
* NAME: vUpdateSplashScreen
*
* DESCRIPTION:
* Updates the Splash screen, when it first appears or when the user
* changes the channel number. //更新啟動畫面,使用者可以切換使用的通道
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vUpdateSplashScreen(void)
{
char acString[5];

vValToDec(acString, sDemoData.sSystem.u8Channel, " ");
vLcdWriteText(acString, 7, 16); //LCD顯示jennicLogo.c的字樣 7,16為LCD上的位置

vLcdRefreshAll();
}

/****************************************************************************
*
* NAME: vBuildNetworkScreen
*
* DESCRIPTION:
* Creates the Network screen. Depending on how the GUI has been configured
* it may want to display up to 3 or up to 4 nodes simultaneuously. Also, it
* only shows nodes that have successfully associated. To achieve this, it
* makes use of an array of the four display positions on the screen, and
* loops through this to position each node in the correct position.
* //創造加入網路的螢幕,最多可加入3-4個節點,當被接受的節點可顯示在螢幕上,根據先後順序分別有四個位置
* This function only draws the text required, then uses the related update
* function to display the actual data and to refresh the LCD.
* //根據相關的函數來顯示實際數據更新在LCD上
* PARAMETERS: Name RW Usage
* eSensor R Sensor to display
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vBuildNetworkScreen(void)
{
static const char *apcSensorLabel[DEMO_SENSOR_LIST_LEN] = {
"Temp", "Humidity", "Light"}; //感測的項目分別有溫度,濕度,亮度
static const uint8 au8LabelPos[DEMO_SENSOR_LIST_LEN] = {29, 58, 102};
uint8 u8Node;
int iIndex;
teSensor eSensor = sDemoData.sGui.eCurrentSensor;

vLcdClear();

if (u8PermitJoining == 0)
{
vLcdWriteText("Joining off", 6, 0);
}
else
{
vLcdWriteText("Joining on", 6, 0);
}

/* Show labels */ //沒有節點的連結時會出現No sensors detected
if (sDemoData.sNode.u8AssociatedNodes == 0)
{
vLcdWriteText("No sensors detected", 3, 0);
}
else
{
u8Node = 0;
while ((u8Node < sDemoData.sNode.u8AssociatedNodes) && (u8Node < 4))//當有節點連接時LCD的行列顯示節點的名稱
{
vLcdWriteText((char *)apcNodeNameList[u8Node], au8NodeLcdRow[u8Node], au8NodeLcdCol[u8Node]);
u8Node++;
}
}

/* Hot buttons at bottom of screen */ //螢幕上的熱鍵
vLcdWriteText("Node", 7, 0);

for (iIndex = 0; iIndex < DEMO_SENSOR_LIST_LEN; iIndex++)
{
vLcdWriteText((char *)apcSensorLabel[iIndex], 7, au8LabelPos[iIndex]);
}
vLcdWriteInvertedText((char *)apcSensorLabel[eSensor], 7, au8LabelPos[eSensor]);

vUpdateNetworkScreen(eSensor);
}

/****************************************************************************
*
* NAME: vUpdateNetworkScreen
*
* DESCRIPTION:
* Draws the graphs and values for the Network screen. See the description
* for vBuildNetworkScreen for an explanation of the positioning of elements
* on the display.
* //將所得到的值畫出在顯示器上,更新現有的或之前保留的數據在屏幕上
* PARAMETERS: Name RW Usage
* eSensor R Sensor to display
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vUpdateNetworkScreen(teSensor eSensor)
{
uint8 u8Node;
uint8 u8Row; // 在LCD上分行
uint8 u8Col; // 在LCD上分列


u8Node = 0;

while ((u8Node < sDemoData.sNode.u8AssociatedNodes) && (u8Node < 4)) // node的最大值為4
{
u8Row = au8NodeLcdRow[u8Node] + 1; //增加行數
u8Col = au8NodeLcdCol[u8Node];

vLcdUpdateElement(&sDemoData.sNode.asNodeData[u8Node], //LCD上節點的基本參數
eSensor, u8Row, u8Col, TRUE);

u8Node++;
}

vLcdRefreshAll();
}

/****************************************************************************
*
* NAME: vLcdUpdateElement
*
* DESCRIPTION:
* Draws the graph and text for a single sensor for a single node. The text
* includes alarm indications if the sensor value exceeds user specified
* limits.
* //顯示出單一感測器的文字及圖形,當子文字也包含感測的值超出用戶設定的限制提出警告
* PARAMETERS: Name RW Usage
* psNodeElementData R Pointer to data for node
* u8Row R Character row to display on
* u8Col R Pixel column to display on
* boShowInfo R TRUE to show missed frames indication
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vLcdUpdateElement(tsNodeData *psNodeData, teSensor eSensor,
uint8 u8Row, uint8 u8Col, bool_t boShowInfo)
{
char acString[10];
uint8 u8NowValue;
tsNodeElementData *psNodeElementData = &psNodeData->asNodeElementData[eSensor];

u8NowValue = psNodeElementData->u8NowValue;

switch (eSensor)
{
case E_SENSOR_TEMP: //測到的數字加上度C
vValToDec(acString, u8NowValue, "[C ");
break;

case E_SENSOR_HTS: //測到的數字加上%
vValToDec(acString, u8NowValue, "% ");
break;

case E_SENSOR_ALS:
/* This is a light sensor so display symbol */ //測到的值以一圖案表示
acString[0] = '&' + u8NowValue;
acString[1] = '\0';
break;

default:
break;
}

vLcdWriteText(acString, u8Row, u8Col);

/* Print alarm */
vLcdWriteText(" ", (uint8)(u8Row + 1), u8Col);

if (boShowInfo)
{
vUTIL_NumToString(psNodeData->u16ShortAdr, acString);
vLcdWriteText(&acString[4], (uint8)(u8Row + 1), u8Col);
vValToDec(acString, psNodeData->u8FramesMissed - 1, "");
vLcdWriteText(acString, (uint8)(u8Row), u8Col + 20);
}

/* Draw graph */ //畫圖
vDrawGraph(psNodeElementData->au8GraphData, (uint8)(u8Col + 27), u8Row);
}

/****************************************************************************
*
* NAME: vBuildNodeScreen
*
* DESCRIPTION:
* Builds the text to appear on a Node screen, then uses the update function
* to populate it with data. //建立了顯示屏幕的節點上的文字,然後使用更新功能來填充它的數據
*
* PARAMETERS: Name RW Usage
* u8Node R Node to display
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vBuildNodeScreen(uint8 u8Node)
{
vLcdClear();
vLcdWriteText((char *)apcNodeNameList[u8Node], 0, 0); //設置名稱
vLcdWriteText("Humidity", 0, 64); //後面的數字為在LCD上的位置
vLcdWriteText("Temp", 3, 0);
vLcdWriteText("Light", 3, 64);
vLcdWriteText("Node", 7, 0);
vLcdWriteText("Off", 7, 75);
vLcdWriteText("On", 7, 115);

vUpdateNodeScreen(u8Node);
}

/****************************************************************************
*
* NAME: vUpdateNodeScreen
*
* DESCRIPTION:
* Draws the three sensor graphs for a node.
* //畫出一個節點上的三個感測值
* PARAMETERS: Name RW Usage
* u8Node R Node to display
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vUpdateNodeScreen(uint8 u8Node)
{
tsNodeData *psNodeData;
char acString[8];

psNodeData = &sDemoData.sNode.asNodeData[u8Node];

/* Status */ //顯示是哪個節點及名稱
vValToDec(acString, psNodeData->u8FramesMissed - 1, " ");
vLcdWriteText(acString, 1, 20);

/* Update graphs, alarms and values */ //按照位置畫出此節點的溫度,濕度,亮度的圖,
vLcdUpdateElement(psNodeData, E_SENSOR_TEMP, 4, 0, FALSE);
vLcdUpdateElement(psNodeData, E_SENSOR_HTS, 1, 64, FALSE);
vLcdUpdateElement(psNodeData, E_SENSOR_ALS, 4, 64, FALSE);

vLcdRefreshAll();
}

/****************************************************************************
*
* NAME: vDrawGraph
*
* DESCRIPTION:
* Creates a bitmap from an array of values. Each value is represented by a
* column on the graph, and a lookup table is used to translate each value
* (assumed to be in the range 0 to 13) to the data required for the bitmap.
* Finally, the bitmap is displayed via a board API.
* //產生一個範圍為1-13的點陣圖,值為圖上的所增加的列數
* PARAMETERS: Name RW Usage
* pu8GraphData R Array of 32 elements of graph data
* u8StartCol R First column of bitmap
* u8StartRow R Top character row of bitmap
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vDrawGraph(uint8 *pu8GraphData, uint8 u8StartCol,
uint8 u8StartRow)
{
static const uint16 au16LineData[14] = {0x4000, 0x6000, 0x7000, 0x7800,
0x7c00, 0x7e00, 0x7f00, 0x7f80,
0x7fc0, 0x7fe0, 0x7ff0, 0x7ff8,
0x7ffc, 0x7ffe}; //範圍為0-13 所以存在14個值
uint8 au8GraphBitmap[66];
const tsBitmap sGraphBitmap = {au8GraphBitmap, 33, 2};
int i;
uint16 u16LineData;
uint8 u8DataPos = sDemoData.sGui.u8GraphPos;

/* Draw y axis */ //編輯y軸
au8GraphBitmap[0] = 0xfe;
au8GraphBitmap[33] = 0x7f;

/* Fill in data */ //填入資料
for (i = 0; i < DEMO_HISTORY_LEN; i += 1) //
{
u16LineData = au16LineData[pu8GraphData[u8DataPos]];

au8GraphBitmap[i * 2 + 1] = (uint8)(u16LineData & 0xff);
au8GraphBitmap[i * 2 + 2] = (uint8)(u16LineData & 0xff);
au8GraphBitmap[i * 2 + 34] = (uint8)(u16LineData >> 8);
au8GraphBitmap[i * 2 + 35] = (uint8)(u16LineData >> 8);
// 繪製圖形隨著變數i的增加顯示在圖形上增加數
/* Increment data point */ //增量數據點
u8DataPos = (u8DataPos + 1) & (DEMO_HISTORY_LEN - 1);
}

/* Write bitmap to shadow memory */ //內存點陣
vLcdWriteBitmap((tsBitmap *)&sGraphBitmap, u8StartCol, u8StartRow);
}

/****************************************************************************
*
* NAME: vStringCopy
*
* DESCRIPTION:
* Simple string copy as standard libraries not available.
*
* PARAMETERS: Name RW Usage
* pcFrom R Pointer to string to copy
* pcTo W Pointer to store for new string
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vStringCopy(char *pcFrom, char *pcTo)
{
while (*pcFrom != '\0')
{
*pcTo = *pcFrom;
pcTo++;
pcFrom++;
}
*pcTo = '\0';
}

/****************************************************************************
*
* NAME: vValToDec
*
* DESCRIPTION:
* Converts an 8-bit value to a string of the textual decimal representation.
* Adds a text string after the text.
*
* PARAMETERS: Name RW Usage
* pcOutString R Location for new string
* u8Value R Value to convert
* pcLabel R Label to append to string
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vValToDec(char *pcOutString, uint8 u8Value, char *pcLabel)
{
static const uint8 au8Digits[3] = {100, 10, 1};
uint8 u8Digit;
uint8 u8DigitIndex;
uint8 u8Count;
bool_t boPreviousDigitPrinted = FALSE;

for (u8DigitIndex = 0; u8DigitIndex < 3; u8DigitIndex++)
{
u8Count = 0;
u8Digit = au8Digits[u8DigitIndex];
while (u8Value >= u8Digit)
{
u8Value -= u8Digit;
u8Count++;
}

if ((u8Count != 0) (boPreviousDigitPrinted == TRUE)
(u8DigitIndex == 2))
{
*pcOutString = '0' + u8Count;
boPreviousDigitPrinted = TRUE;
pcOutString++;
}
}

vStringCopy(pcLabel, pcOutString);
}

#ifdef TEST_BOS_TIMER
PRIVATE void vTimerFired0(void *pvMessage, uint8 u8Len)
{
uint8 u8Dummy;

u8LedFlash0 = 1 - u8LedFlash0;
vLedControl(0, u8LedFlash0);

bBosCreateTimer(vTimerFired0, NULL, 0, 10, &u8Dummy);
}
#endif

/****************************************************************************
*
* NAME: vAddDesc
*
* DESCRIPTION:
* Draws the three sensor graphs for a node.
*
* PARAMETERS: Name RW Usage
* u8Node R Node to display
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vAddDesc(void)
{ //控制板為一組輸入一組輸出
uint8 u8DeviceVer = 0x00;
uint8 u8Flags = 0x00;
uint8 u8EndPoint = 0x40;
uint16 u16DeviceId = 0x0000;
// 使用相同的組編號為輸入和輸出集群。這意味著從一個節點的輸出組會符合其他節點的輸入組
uint8 u8InputClusterCnt = 1;
uint8 au8InputClusterList[] = {DAP_CID_SENSOR_READINGS};
uint8 u8OutputClusterCnt = 0;
uint8 au8OutputClusterList[] = {};

(void)afmeSimpleDescAdd(u8EndPoint, DAP_PROFILE_ID, u16DeviceId,
u8DeviceVer, u8Flags, u8InputClusterCnt,
au8InputClusterList, u8OutputClusterCnt,
au8OutputClusterList);
}

/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/

有些大段的程式碼真的是看不懂還有待研究!!

906~938 1009~1033 1238~1282 1520~1588

這些是看不懂查不到的行數 我會再找看看的!!

連續看了幾天的程式碼發現其實用的語法沒有很多

只是一些設的參數名稱的縮寫要查

大致上的功能看程式碼能看得懂

而這也是Zigbee的API層 也是我們要努力的層

所以要加油

2009年6月5日 星期五

"身心障礙者行為問題處理" 一書讀後感想

第二章 行為問題的意義與內涵
行為問題或者是問題行為: 主要的是強調行為本身會因為條件的不同而有所差異,因為發生的行為在因為環境的不同會影響別人對此行為的接納度。
產生行為問題的其因素又可分為四項
1. 行為本身是否合乎年齡、性別與發展程度
2. 行為發生的地點是否適當
3. 行為對於周遭人的看法
4. 產生的行為對個體是來說是否適當

身心障礙者的行為問題
身心障礙者指的是因為身理及心理有顯著的障礙,造成他們可能產生的行為問題的原因又可分為三類
1. 行為的型態:型式和動作
2. 行為的功能:大致上的要產生行為主要為的是引起其他人的注意
3. 行為的病原:是為疾病所引起的如焦慮症,恐懼症等等

我們從型態的角度看又可分為六項

(1). 固著行為:
只一再重複某種特定的行為,而此行為不具特別的意義,且會持續相當的一段時間;當中又可以照口語、動作、強迫性的收集行為,不當的戀物行為、固定形式而抗拒改變的行為。
而固著行為會依照年齡或能力的增加在內容和形式上會有所改變,但極少數的行為會不。

(2). 自傷行為:
這類的行為被視為最嚴重且最急需被處理的問題,此行為又可分為兩類
狹義:指個體蓄意會無意識重複各種方式傷害自己
廣義:指任何傷害自我身體形象或健康行為
自傷行為又可細分三種
1. 重度自傷行為
2. 固定是自傷行為
3. 淺性或中度自傷行為

(3). 攻擊行為:
此行為被認為是個體的發脾氣的一部份,可分為三種
1. 身體的攻擊
2. 口語和對物品的攻擊
3. 消極的抵制或是不聽話的反抗

(4). 不適當的社會行為
此行為稱之為反社會的行為,指個體在公開在公開場合中表現出不合常理的行為,而違反社會的規範,甚至侵犯他人的基本權益,以至於減少他人對於個體的接納度。此行為又可分為兩項
外顯:不適當的社會行為是指個體公然從事與受害者正面衝突
內隱:外人往往無法看到行為發生的不適當的社會行為
其行為可分成四大類
1. 技巧的缺陷
2. 表現的缺陷
 此兩種是指在某些情況下行為能夠表現出來,而某種情況下卻不行
3. 自我控制技巧的缺陷
4. 自我控制表現的缺陷
 此兩種是指由於受到干擾次機的影響而無法表現行為

(5). 特殊情緒困擾
身心障礙者本身較一般人容自產生行緒和心理上的不適應,而此特殊情緒本身就是一個問題,也是造成行為的主要因素;如憂鬱症,焦慮症,恐慌症,恐懼症等

(6). 身體調節異常的意義:
指個體所表現出的行為問題,主要是日常生活所需攝取和代謝運作失調而造成的現象如飲食,排泄及睡眠等等

閱讀完此章節後,了解的這些會造成身心障礙者所可能產生行為的一些原因,因為書上都介紹的非常的詳細,而其中也提到要認定為是否是行為問題時也要考慮當時的環境和個體來判別,當然我們也要重視其個體的想法,使其行為具有社會的效度,因為他們有太多的因素會造成他們產生些大眾接納度較低的行為,所以我們要體諒他們更要尊重他們,進而幫助他們才是。

2009年6月1日 星期一

極重度多重障礙孩童如廁訓練成效之研究-心得

如廁是生活的基本技能,在成長的環節中也是重要的開端,如廁的好壞或許會影響一個人的特質,不好的話,可能會因為引來周遭同學的嘲笑,造成人際關係不好,對自己也會充滿自卑,一般的小孩如此更何況是有障礙的小孩,不僅僅如此,當小便失禁在褲子裡,也往往會造成一些疾病,所以如廁對每一個人確確實實的是很重要的。
  在文章裡有提到國外的部分,他們對於身障小孩如廁的訓練已經有相當的研究和設備,反觀國內,真的能找到的資料很有限,也間接的證明了有從事相關的研究占不多數,所以是我們國家應該加強的部分。另外,此篇也探討如何的如廁訓練才是符合我們所要的合理訓練,因為在文中提到的三種方式,有前向移動訓練法、快速如廁訓練法與便盆提示法,是被廣泛採用的方法,雖然是有成效的做法,但是其中的步驟有些有違反人道,會對小孩子造成另一種傷害,當然是不符合我們的期望的。而李老師的研究方法,是屬於較符合我們國家的觀念,以人為主要中心,利用回饋系統,增強物等等,並且加設感測的設備,能夠即時的在小孩子失禁時測出並加以教導,對於障礙者小孩的如廁的訓練必需要耐心,治標不如治本讓小朋友們順利的學習如廁的習慣,可以讓小孩增加信心,也可以減少不少的花費。在訓練的過程中,家長和老師都是扮演很重要的角色,是小孩教導和仿效的對象,科技的加入是輔助增強效果,也是我們研究的方向,我們由衷的希望能夠為這些障礙孩童完成如廁的訓練。
  文章中也提到國內在發展如廁訓練的領與的確不多,當然希望能夠得到重視是最重要的,畢盡如廁是生活的基本技能,幫助這些障礙孩童能夠擁有如廁的能力是我們所樂見的,在不同障礙者要有不同方面的方法,這些事都還是我們我要學習的,所以目前對於如廁訓練的觀點我們還事知道的不夠豐富,在這方面還是必須的多多探討。

2009年5月19日 星期二

如廁訓練的比較

如廁訓練的比較
此篇分成三類

第一類是同年齡層的幼兒做的如廁訓練
第二類是目前智能障礙者所做的如廁訓練
第三類是加入我們輔助科技所做的如廁訓練

一.幼兒的如廁訓練
有三種模式會影響如廁訓練
(1) 生理成熟
(2) 對指令的理解和反應
(3) 動機、模仿的慾望

訓練的方法 
1. 定時作息法
此方法主要是特定的時間帶兒童到廁所,固定的時間間隔,如每一小時去廁所一次,另外找出兒童在正常攝取飲料的型況,大概尿濕的時間,然後預估能接近會尿尿的時候帶去廁所。
2. 分配練習法
(1) 要兒童在清醒情況下,記錄是否有大小便,並且要定時的收集資料,還要針對飲食,上廁所的地方,上廁所的量做記載。
(2) 分析資料,找出大小便的模式。主要目的是找出明顯的上廁所的兩個時
段,並針對這兩個時間點做最初的訓練。
(3) 選擇適當的增強物以便訓練如廁使用,而這個增強物最好只是用在如上訓練,如此一來就可以增加效果。
(4) 接下來就是收集資料了,如果兒童在記錄上表現的良好的時候,就可以一邊訓練,一邊進行其他時間點的加強。
(5) 如果所有的時間都有尿尿行為,且不會整天都尿濕褲子,就可以交導兒童表達需要上廁所的行為了。
3. 快速訓練法
(1) 主要是短時間訓練自發獨力的如廁行為。
(2) 給兒童多喝水,增加兒童小變的需求和訓練機會。
(3) 讓兒童待在廁所10 分鐘,如果有小便的值後立即給予讚賞。
(4) 當不在廁所的時候,假如沒有尿濕也給予讚賞。
(5) 若有尿濕,依情況給予口頭的斥責,並帶兒童到廁所練習上廁所的步驟,並要求他們洗褲子或其它弄髒的地方。
(6) 要持續讚賞兒童不尿濕的行為。


二.智能障礙學生的教學方案可包括以下幾項重點
(1) 最少的提示,含糊的口頭,操作提示。
(2) 特定的口頭,操作提示。
(3) 示範:老師示範,學生模仿。
(4) 肢體語言:非口語的溝通,只向。
(5) 初始的協助,老師身體協助,學生開始自做時老師撤退協助,絕不代勞。

如廁自理訓練
一、 如廁能力之評估
(1) 生理系統是否正常。
(2) 認知能力:由於認知能力較遲緩會影響便意的感受變慢,對人如廁的模仿能力差,要表達便意時有困難。
二、 如廁訓練原則,養成上廁所習慣
(1) 改把包尿布的生活改變成固定地點的如廁生涯,首先要培養規律性,固定時間內帶孩子上廁所,開始的時間間隔要短,增加他順例如廁的次數。
(2) 掌握徵兆,觀察當有出現想上廁所的表情會動作時便帶去廁所,減少如廁失敗次數。
(3) 對於依賴性大的孩子,偶爾固意讓孩子嘗嘗拉在褲子的感覺,一旦產生厭惡感下次就會用新發覺了。
(4) 對於感覺較遲鈍的兒童,或動作控制不佳者,為提高皮膚局部感覺,可改穿透氣的褲子並做神經控制訓練。
(5) 當有尿意的時候,要訓練兒童忍耐。
三、 自我控自排泄的訓練方法
1. 乾爽褲子檢查法,以簡單的語句詢問褲子現在是否乾爽,如果是的話給予讚賞,並利用傳統的如廁訓練的方法,每隔幾小時就帶去廁所,保持褲子的處於輸服的狀態,從連續性增強竹見到間歇性增強。
2. 如廁相關行為教學,示範整套的如廁行為,但須針對動作及感官障礙所要做調整且相關技能要達到標準。
3. 失禁的處理,可以採用幾種方式
(1) 忽視:以平靜的方式換褲清洗,不要提供太快的增強活動。
(2) 限制:要求學生感受並注視其褲子,要以口氣及表情表達限制。
四、 個別化如廁訓練
(1) 上廁所前幾分鐘,以簡單語句指示上廁所。
(2) 若待在馬桶十分鐘後無結果則不申斥,若成功如廁及給予鼓勵。
(3) 任何大小便行為皆要記錄。
(4) 只要是在廁所皆交有關的如廁既能,適度的給予提示,逐漸撤退的給予協助。
(5) 所有如廁行為皆須直接增強,固老師要密切監控學生的表現。
(6) 反覆練習以養成習慣。


三.加入輔助科技後的如廁訓練的優點
可以利用以上的如廁訓練的技巧,加入輔助科技,加強如廁的效果。
1. 目的是讓學生自行產生前往廁所的動機,不需要忍耐,並且老師可以做適當的監控。
2. 系統化記錄學生如廁的時間次數或規律性。減少老師要密切監控的記載的負擔。
3. 完成如廁時可以得到立即的回饋,並非只是口頭的獎勵,而是能夠得到感官方面的刺激,加深如廁後的印象,並引起下次如廁動機。