2009年6月8日 星期一
自動尋徑室內導航系統-讀後感想
另外我想說關於手持裝備,是否也可以用在不一樣的平台,如手機等等的,還有關於QR code的部分還可以多做些介紹,對於第一次接觸的人可以讓他們清楚知道其功用,另外在藍芽的部分著墨不多,知道是個發射端,之後讀到後面藍芽給的印象都不見了。另外提示的部分是語音影像,不過文中都是談論影像,到是很少提到語音的實際效益。
後面加入三創時的比賽,更提高可看性,也增加了此研究的可行性,我覺得真的很厲害,是我們要看齊的。
用於輔助認知障礙者就業之行動定位社會網路-讀後看法
到是在開頭提到的行動定位社會網路(MLSN)似乎沒有解釋的很清楚,不懂的人可能看得會有點含糊。
在介紹行動網路的部分也很仔細的分析了研究可能會用到的網路,也都能提跟手持結合後的效果跟問題,到是我覺得可以用個比較各模式的優缺點,這樣也比較清楚的。
在文中提到的Skype API 能夠發送簡訊給就輔員,這點很在我們的研究計畫裡也會有這樣的功能,希望跟夠多多的跟你們學習。
在系統架構圖方面,我想這一看就能一目瞭然是我們值得學習的地方,不過文字解釋的部分不夠明確,我覺得圖片是增加文字的閱讀印象,應該還可以多做些說明。在學員、伺服器與就輔員的流程這張圖,單單看黃色的部分可以大概知道其功用,不過外加了那些箭頭有點擾亂了架構,而且沒有標示出箭頭的功用。
另外圖的編號跟內文的圖X沒有對到唷!!
以上是我的一些看法,還希望能夠向你們多多學習!!
2009年6月7日 星期日
新式認知障礙者室內導航系統-讀後心得
程式碼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日 星期一
極重度多重障礙孩童如廁訓練成效之研究-心得
在文章裡有提到國外的部分,他們對於身障小孩如廁的訓練已經有相當的研究和設備,反觀國內,真的能找到的資料很有限,也間接的證明了有從事相關的研究占不多數,所以是我們國家應該加強的部分。另外,此篇也探討如何的如廁訓練才是符合我們所要的合理訓練,因為在文中提到的三種方式,有前向移動訓練法、快速如廁訓練法與便盆提示法,是被廣泛採用的方法,雖然是有成效的做法,但是其中的步驟有些有違反人道,會對小孩子造成另一種傷害,當然是不符合我們的期望的。而李老師的研究方法,是屬於較符合我們國家的觀念,以人為主要中心,利用回饋系統,增強物等等,並且加設感測的設備,能夠即時的在小孩子失禁時測出並加以教導,對於障礙者小孩的如廁的訓練必需要耐心,治標不如治本讓小朋友們順利的學習如廁的習慣,可以讓小孩增加信心,也可以減少不少的花費。在訓練的過程中,家長和老師都是扮演很重要的角色,是小孩教導和仿效的對象,科技的加入是輔助增強效果,也是我們研究的方向,我們由衷的希望能夠為這些障礙孩童完成如廁的訓練。
文章中也提到國內在發展如廁訓練的領與的確不多,當然希望能夠得到重視是最重要的,畢盡如廁是生活的基本技能,幫助這些障礙孩童能夠擁有如廁的能力是我們所樂見的,在不同障礙者要有不同方面的方法,這些事都還是我們我要學習的,所以目前對於如廁訓練的觀點我們還事知道的不夠豐富,在這方面還是必須的多多探討。