📄 homesensorcoord.c
字号:
bool_t bUpNotDown; switch (u8KeyMap) { case E_KEY_0: /* Select button: move to next item in list */ vAdjustAlarm(&sDemoData.sGui.u8ControlSelection, CONTROL_LIST_LEN - 1, 0, TRUE); vUpdateNodeControlScreen(sDemoData.sGui.u8CurrentNode, sDemoData.sGui.u8ControlSelection, TRUE); break; case E_KEY_1: /* Plus button: increment value */ case E_KEY_2: /* Minus button: decrement value */ bUpNotDown = (u8KeyMap == E_KEY_1); switch (sDemoData.sGui.u8ControlSelection) { case 0: /* Temp high alarm */ vAdjustAlarm(&psNodeData->asNodeElementData[E_SENSOR_TEMP].u8HighAlarm, TEMP_HIGH_MAX, 0, bUpNotDown); break; case 1: /* Temp low alarm */ vAdjustAlarm(&psNodeData->asNodeElementData[E_SENSOR_TEMP].u8LowAlarm, TEMP_HIGH_MAX, 255, bUpNotDown); break; case 2: /* Light high alarm */ vAdjustAlarm(&psNodeData->asNodeElementData[E_SENSOR_ALS].u8HighAlarm, LIGHT_HIGH_MAX, 0, bUpNotDown); break; case 3: /* Light low alarm */ vAdjustAlarm(&psNodeData->asNodeElementData[E_SENSOR_ALS].u8LowAlarm, LIGHT_HIGH_MAX, 255, bUpNotDown); break; } vUpdateNodeControlScreen(sDemoData.sGui.u8CurrentNode, sDemoData.sGui.u8ControlSelection, TRUE); break; case E_KEY_3: /* Done button: return to node screen */ sDemoData.sSystem.eState = E_STATE_NODE; vBuildNodeScreen(sDemoData.sGui.u8CurrentNode); break; }}/**************************************************************************** * * NAME: vProcessSetupKeyPress * * DESCRIPTION: * Handles button presses on the Setup screen. The first button * selects which item to alter, the next two adjust the value up or down, and * the last button puts the device into running mode, starting the beacons * and moving to the Network screen. * * PARAMETERS: Name RW Usage * u8KeyMap R Current buttons pressed bitmap * * RETURNS: * void * ****************************************************************************/PRIVATE void vProcessSetupKeyPress(uint8 u8KeyMap){ switch (u8KeyMap) { case E_KEY_0: /* Select button: move to next item in list */ vAdjustAlarm(&sDemoData.sGui.u8SetupSelection, SETUP_LIST_LEN - 1, 0, TRUE); vUpdateSetupScreen(sDemoData.sGui.u8SetupSelection, TRUE); break; case E_KEY_1: /* Plus button: increment value */ case E_KEY_2: /* Minus button: decrement value */ switch (sDemoData.sGui.u8SetupSelection) { case 0: /* Local node */ vToggleOnOff(&sDemoData.sNode.bLocalNode); break; case 1: /* Four node selection */ vToggleOnOff(&sDemoData.sGui.bShowFourNodes); break; } vUpdateSetupScreen(sDemoData.sGui.u8SetupSelection, TRUE); break; case E_KEY_3: /* Done button: start beaconing and go to network screen. If local node is not being used, number of associated nodes is 0, as none can have associated yet, otherwise it is 1 as set during initialisation */ if (sDemoData.sNode.bLocalNode == FALSE) { sDemoData.sNode.u8AssociatedNodes = 0; } vStartBeacon(); sDemoData.sSystem.eState = E_STATE_NETWORK; vBuildNetworkScreen(sDemoData.sGui.eCurrentSensor); break; }}/**************************************************************************** * * NAME: vBuildSetChannelScreen * * DESCRIPTION: * Creates the Set Channel screen, consisting of a bitmap of the Jennic logo * and labels for the soft buttons on the bottom row. Uses the related update * function to display the current channel and refresh the LCD. * * RETURNS: * void * ****************************************************************************/PRIVATE void vBuildSetChannelScreen(void){ vLcdClear(); vLcdWriteBitmap((tsBitmap *)&sJennicLogo, 0, 1); /* Soft keys */ vLcdWriteText("Ch", 7, 0); vLcdWriteText("\\", 7, 47); vLcdWriteText("]", 7, 74); vLcdWriteText("Done", 7, 103); /* Update to display the data */ vUpdateSetChannelScreen();}/**************************************************************************** * * NAME: vUpdateSetChannelScreen * * DESCRIPTION: * Updates the Set Channel screen, when it first appears or when the user * changes the channel number. * * RETURNS: * void * ****************************************************************************/PRIVATE void vUpdateSetChannelScreen(void){ char acString[5]; vValToDec(acString, sDemoData.sSystem.u8Channel, " "); vLcdWriteText(acString, 7, 16); 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. * * This function only draws the text required, then uses the related update * function to display the actual data and to refresh the LCD. * * PARAMETERS: Name RW Usage * eSensor R Sensor to display * * RETURNS: * void * ****************************************************************************/PRIVATE void vBuildNetworkScreen(teSensor eSensor){ 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 iPos; vLcdClear(); /* If showing four nodes, they appear on screen as follows: Node 0 Node 1 Node 2 Node 3 If showing only three nodes, they appear as follows: Info Node 0 Node 1 Node 2 */ if (sDemoData.sGui.bShowFourNodes) { iPos = 0; } else { iPos = 1; vLcdWriteText("Network", 0, 0); vLcdWriteText("overview", 1, 0); } /* Show labels */ if (sDemoData.sNode.u8AssociatedNodes == 0) { vLcdWriteText("No nodes associated", 3, 0); } else { u8Node = 0; while ((u8Node < sDemoData.sNode.u8AssociatedNodes) && (iPos < 4)) { vLcdWriteText((char *)apcNodeNameList[u8Node], au8NodeLcdRow[iPos], au8NodeLcdCol[iPos]); u8Node++; iPos++; } } /* Hot buttons at bottom of screen */ vLcdWriteText("Node", 7, 0); for (iPos = 0; iPos < DEMO_SENSOR_LIST_LEN; iPos++) { vLcdWriteText((char *)apcSensorLabel[iPos], 7, au8LabelPos[iPos]); } 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; uint8 u8Col; int iPos; bool_t bShowRssi; /* If showing four nodes, they appear on screen as follows: Node 0 Node 1 Node 2 Node 3 If showing only three nodes, they appear as follows: Info Node 0 Node 1 Node 2 */ if (sDemoData.sGui.bShowFourNodes) { iPos = 0; } else { iPos = 1; } u8Node = 0; bShowRssi = sDemoData.sNode.bLocalNode ? FALSE : TRUE; while ((u8Node < sDemoData.sNode.u8AssociatedNodes) && (iPos < 4)) { u8Row = au8NodeLcdRow[iPos] + 1; u8Col = au8NodeLcdCol[iPos]; vLcdUpdateElement(&sDemoData.sNode.asNodeData[u8Node], eSensor, u8Row, u8Col, bShowRssi); u8Node++; iPos++; bShowRssi = TRUE; } 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 * bShowRssi R True to show RSSI data * * RETURNS: * void * ****************************************************************************/PRIVATE void vLcdUpdateElement(tsNodeData *psNodeData, teSensor eSensor, uint8 u8Row, uint8 u8Col, bool_t bShowRssi){ char acString[10]; uint8 u8NowValue; tsNodeElementData *psNodeElementData = &psNodeData->asNodeElementData[eSensor]; u8NowValue = psNodeElementData->u8NowValue; switch (eSensor) { case E_SENSOR_TEMP: 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 ((u8NowValue >= psNodeElementData->u8HighAlarm) && (psNodeElementData->u8HighAlarm != 0)) { vLcdWriteInvertedText("High", (uint8)(u8Row + 1), u8Col); } else { if ((u8NowValue <= psNodeElementData->u8LowAlarm) && (psNodeElementData->u8LowAlarm != 255)) { vLcdWriteInvertedText("Low", (uint8)(u8Row + 1), u8Col); } else { if (bShowRssi) { vValToDec(acString, psNodeData->u8Rssi, ""); vLcdWriteText(acString, (uint8)(u8Row + 1), u8Col); vValToDec(acString, psNodeData->u8FramesMissed - 1, ""); vLcdWriteText(acString, (uint8)(u8Row + 1), 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); vLcdWriteText("Temp", 3, 0); vLcdWriteText("Light", 3, 64); vLcdWriteText("Node", 7, 0); vLcdWriteText("Control", 7, 29); vLcdWriteText("On", 7, 77); vLcdWriteText("Off", 7, 107);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -