void displayMessages() { spiPoll(); if (znpBuf[SRSP_LENGTH_FIELD] > 0) { if (IS_AF_INCOMING_MESSAGE()) { setLed(1); //LED will blink to indicate a message was received #ifdef VERBOSE_MESSAGE_DISPLAY printAfIncomingMsgHeader(znpBuf); printf("\r\n"); #endif if (IS_INFO_MESSAGE_CLUSTER()) { struct infoMessage im = deserializeInfoMessage(znpBuf+20); #ifdef VERBOSE_MESSAGE_DISPLAY printInfoMessage(&im); #else printf("From:"); for (int j = 0; j<8; j++) { printf("%02X", im.header->mac[j]); } printf(",LQI=%02X", znpBuf[SRSP_HEADER_SIZE+9]); #endif if (im.numParameters > 0) { printf(";PanID:%04X", im.parameters[0]); if (im.numParameters == 3) //panId, vcc3v, light sensor (lux/10) { printf(",Vcc3=%umV,Light Sensor(lux)=%u,Cause=", im.parameters[1], im.parameters[2] * 10); switch (im.cause) { case CAUSE_SCHEDULED: printf("Timer"); break; case CAUSE_MOTION: printf("Motion"); break; case CAUSE_STARTUP: printf("Startup"); break; } } printf("\r\n"); } } else { printf("Rx: "); printHexBytes(znpBuf+SRSP_HEADER_SIZE+17, znpBuf[SRSP_HEADER_SIZE+16]); //print out message payload } clearLeds(); } else { //unknown message, just print out the whole thing printf("??: "); printHexBytes(znpBuf, (znpBuf[SRSP_LENGTH_FIELD] + SRSP_HEADER_SIZE)); } znpBuf[SRSP_LENGTH_FIELD] = 0; } }
/** Parse any received messages. If it's one of our OIDs then display the value on the RGB LED too. */ void parseMessages() { getMessage(); if ((zmBuf[SRSP_LENGTH_FIELD] > 0) && (IS_AF_INCOMING_MESSAGE())) { setLed(0); //LED will blink to indicate a message was received #ifdef VERBOSE_MESSAGE_DISPLAY printAfIncomingMsgHeader(zmBuf); printf("\r\n"); #endif if (IS_INFO_MESSAGE_CLUSTER()) { struct infoMessage im; deserializeInfoMessage(zmBuf+20, &im); // Convert the bytes into a Message struct int j = 0; #ifdef VERBOSE_MESSAGE_DISPLAY printInfoMessage(&im); displayZmBuf(); #else printf("From:"); // Display the sender's MAC address for (j = 7; j>(-1); j--) { printf("%02X", im.header.mac[j]); } printf(", LQI=%02X, ", zmBuf[AF_INCOMING_MESSAGE_LQI_FIELD]); // Display the received signal quality (Link Quality Indicator) #endif printf("%u KVPs received:\r\n", im.numParameters); #define NO_VALUE_RECEIVED 0xFF uint8_t redIndex = NO_VALUE_RECEIVED; uint8_t blueIndex = NO_VALUE_RECEIVED; uint8_t greenIndex = NO_VALUE_RECEIVED; for (j=0; j<im.numParameters; j++) // Iterate through all the received KVPs { printf(" %s (0x%02X) = %d ", getOidName(im.kvps[j].oid), im.kvps[j].oid, im.kvps[j].value); // Display the Key & Value displayFormattedOidValue(im.kvps[j].oid, im.kvps[j].value); printf("\r\n"); // If the received OID was an IR temperature OID then we can just display it on the LED if ((rgbLedDisplayMode == RGB_LED_DISPLAY_MODE_TEMP_IR) && (im.kvps[j].oid == OID_TEMPERATURE_IR)) displayTemperatureOnRgbLed(im.kvps[j].value); // But for the color sensor we need to get all three values before displaying else if (im.kvps[j].oid == OID_COLOR_SENSOR_RED) redIndex = j; else if (im.kvps[j].oid == OID_COLOR_SENSOR_BLUE) blueIndex = j; else if (im.kvps[j].oid == OID_COLOR_SENSOR_GREEN) greenIndex = j; } // Now done iterating through all KVPs. If we received color then update RGB LED #define RED_VALUE (im.kvps[redIndex].value) #define BLUE_VALUE (im.kvps[blueIndex].value) #define GREEN_VALUE (im.kvps[greenIndex].value) if ((rgbLedDisplayMode == RGB_LED_DISPLAY_MODE_COLOR) && ((redIndex != NO_VALUE_RECEIVED) && (blueIndex != NO_VALUE_RECEIVED) && (greenIndex != NO_VALUE_RECEIVED))) { displayColorOnRgbLed(RED_VALUE, BLUE_VALUE, GREEN_VALUE); } printf("\r\n"); } else { printf("Rx: "); printHexBytes(zmBuf+SRSP_HEADER_SIZE+17, zmBuf[SRSP_HEADER_SIZE+16]); //print out message payload } clearLeds(0); } else if (IS_ZDO_END_DEVICE_ANNCE_IND()) { displayZdoEndDeviceAnnounce(zmBuf); } else { //unknown message, just print out the whole thing printf("MSG: "); printHexBytes(zmBuf, (zmBuf[SRSP_LENGTH_FIELD] + SRSP_HEADER_SIZE)); } zmBuf[SRSP_LENGTH_FIELD] = 0; }