bool XBeeMACLayer::sendAtCommand() { for(int i=0; i<AT_REQUEST_MAX_ATTEMPTS; ++i){ // send the command xbee.send(atRequest); //TEMPORARILY, we send the request and wait for the attempt several times until we got it. This is because we can receive other packets that will be placed in the same buffer and they must be ignored until getting our AT response for(int i=0; i<AT_RESPONSE_MAX_ATTEMPTS; ++i){ // wait up to 3 seconds for the status response if (xbee.readPacket(1000)) { // got a response! // should be an AT command response if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) { xbee.getResponse().getAtCommandResponse(atResponse); if (atResponse.isOk()) { if (atRequest.getCommand() == shCmd || atRequest.getCommand() == slCmd){ return getResponseMAC(); }else{ if (atRequest.getCommand() == ecCmd){ return getResponseCCAFailure(); } } } } } } } return false; }
bool XBeeUtil::getRadioAddress(XBee* xbee, int32_t& msb, int32_t& lsb, Stream* debug_stream){ bool toRet = true; XBeeUtil::debug_stream = debug_stream; AtCommandRequest atRequest = AtCommandRequest(); AtCommandResponse atResponse = AtCommandResponse(); uint8_t SH_cmd[] = { 'S', 'H' }; uint8_t SL_cmd[] = { 'S', 'L' }; atRequest.setCommand(SH_cmd); if (XBeeUtil::atCommand(xbee, atRequest, atResponse) && atResponse.getValueLength() == 4 && XBeeUtil::readAtResponseInt(xbee, atResponse, msb)) { } else { toRet = false; } atRequest.setCommand(SL_cmd); if (XBeeUtil::atCommand(xbee, atRequest, atResponse) && atResponse.getValueLength() == 4 && XBeeUtil::readAtResponseInt(xbee, atResponse, lsb)) { } else { toRet = false; } return toRet; }
int XBeeMACLayer::getNumberOfTransmissions(){ atRequest.setCommand(ecCmd); atRequest.setCommandValue((uint8_t*) &ecCommandValue); if (!sendAtCommand()) return CCA_RETRIES_FAIL; return cca_retries; }
/** EXPERT FUNCTION: Sends an ATCommand and returns the response as a 32-bit integer. If you specify a value of waitForResponse, the program will wait for the amount of ms specified by waitForResponse and immediately process the AT response. If you don't specify a value or specify 0 the program will call the general readXbee() and process the response there and write it to the corresponding variables. This function will then return 0. **/ uint32_t LithneClass::sendATCommand( uint8_t * cmd, uint16_t waitForResponse ) { uint32_t atAnswer = 0; /* Create a new AtComand Request and Response */ AtCommandRequest atRequest = AtCommandRequest(); /* Set the specific command you want to send to the XBee in the atRequest */ atRequest.setCommand( cmd ); /* Send this request to the xbee */ xbee.send( atRequest ); /* The processing of the AT response is handled in the readXBee(). We thus call this function. If we manually tell this function to wait for a response, it will skip this and attempt to read the information at this point. */ if( waitForResponse == 0 ) { readXbee(); } else { if ( xbee.readPacket(waitForResponse) ) { AtCommandResponse atResponse = AtCommandResponse(); /* If the packet is indeed an AT_COMMAND_RESPONSE, we write it to the atResponse. */ if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) { xbee.getResponse().getAtCommandResponse(atResponse); /* If the atResponse is correct (does not return an error code), we can process it. */ if (atResponse.isOk()) { if (atResponse.getValueLength() > 0) { for (int i = 0; i < atResponse.getValueLength(); i++) { atAnswer = (atAnswer << 8) + atResponse.getValue()[i]; } } } } } else { // at command failed if (xbee.getResponse().isError()) { // Serial.print("Error reading packet. Error code: "); // Serial.println(xbee.getResponse().getErrorCode()); } else { // Serial.print("No response from radio"); } } } return atAnswer; }
bool XBeeUtil::associate(XBee* xbee) { uint8_t AI_cmd[] = { 'A', 'I' }; AtCommandRequest atRequest = AtCommandRequest(); AtCommandResponse atResponse = AtCommandResponse(); atRequest.setCommand(AI_cmd); if (XBeeUtil::atCommand(xbee, atRequest, atResponse) && atResponse.getValueLength() == 1) { return true; } else { return false;; } }
bool XBeeMACLayer::init(){ //xbee.begin(9600); delay(XBEE_INIT_WAITING_TIME); //wait for the XBEE to initialize mac_position = 0; if (!sendAtCommand()) return false; // get SH (Serial High) atRequest.setCommand(slCmd); // Set command to SL if (!sendAtCommand()) return false; // get SL (Serial Low) return true; }
void XBeeActive::test_arRequestMod() { arRequestMod.setCommand(command); arRequestMod.setCommandValue(commandValue); arRequestMod.setCommandValueLength(commandValueLength); sendAtCommand_ar(); delay(250); atRequest.setCommand(WRCmd); sendAtCommand(); delay(250); atRequest.setCommand(assocCmd); sendAtCommand(); arRequestMod.clearCommandValue(); }
void XBeeActive::XBee_status() { unsigned long XBee_data2; atRequest.setCommand(shCmd); sendAtCommand(); delay(100); XBee_data2 = (unsigned long&)info_XBee_data1; DEBAG.print("SH " ); DEBAG.println(String(XBee_data2, HEX)); atRequest.setCommand(slCmd); sendAtCommand(); delay(100); XBee_data2 = (unsigned long&)info_XBee_data1; DEBAG.print("SL " ); DEBAG.println(String(XBee_data2, HEX)); atRequest.setCommand(MYCmd); sendAtCommand(); delay(100); XBee_data2 = (unsigned long&)info_XBee_data1; DEBAG.print("MY "); DEBAG.println(String(XBee_data2, HEX)); // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta; // Форматирование текста, смещение //// strcpy_P(buffer, (char*)pgm_read_word(&(table_message[12]))); // "Network (MY) = " // myGLCD.print("OI", LEFT, yXBee); // atRequest.setCommand(OICmd); // sendAtCommand(); // delay(100); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // myGLCD.print(String(XBee_data2, HEX), RIGHT, yXBee); // // // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta; // Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[13]))); // "PAN ID (OP) = " // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(opCmd); // sendAtCommand(); // delay(100); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // myGLCD.print(String(XBee_data2, HEX), RIGHT, yXBee); // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta; // Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[14]))); // "ID (ID) = " // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(IDCmd); // sendAtCommand(); // delay(100); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // myGLCD.print(String(XBee_data2, HEX), RIGHT, yXBee); // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta;// Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[15]))); // "Chanel (CH) = " // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(CHCmd); // sendAtCommand(); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // myGLCD.print("0x",193, yXBee); // myGLCD.print(String(XBee_data2, HEX), RIGHT, yXBee); // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta;// Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[16]))); // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(assocCmd); // sendAtCommand(); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // myGLCD.print(String(XBee_data2, HEX), RIGHT, yXBee); // // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta;// Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[17]))); // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(BDCmd); // sendAtCommand(); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // switch (XBee_data2) // { // case 0: // XBee_data2 = 1200; // break; // case 1: // XBee_data2 = 2400; // break; // case 2: // XBee_data2 = 4800; // break; // case 3: // XBee_data2 = 9600; // break; // case 4: // XBee_data2 = 19200; // break; // case 5: // XBee_data2 = 38400; // break; // case 6: // XBee_data2 = 57600; // break; // case 7: // XBee_data2 = 115200; // break; // default: // XBee_data2 = 000000; // } // // myGLCD.print(String(XBee_data2), RIGHT, yXBee); // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta;// Форматирование текста, смещение // // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[18]))); // "Volt(V) "; // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(VoltCmd); // sendAtCommand(); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // float XBee_data3 = XBee_data2; // myGLCD.printNumF(XBee_data3/1000,2, RIGHT, yXBee,'.',2); // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta; // Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[27]))); // txt_temperature // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(TPCmd); // Температура модуля // sendAtCommand(); // delay(100); // XBee_data2 = (unsigned long&)info_XBee_data1; // myGLCD.setColor(VGA_YELLOW); // myGLCD.print(String(XBee_data2, DEC), RIGHT, yXBee); // // myGLCD.setColor(255, 255, 255); // yXBee = yXBee + yDelta; // Форматирование текста, смещение // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[75]))); // "TX Power mW" // myGLCD.print(buffer, LEFT, yXBee); // atRequest.setCommand(PLCmd); // "TX Power mW" // sendAtCommand(); // delay(100); // XBee_data2 = (unsigned long&)info_XBee_data1; // switch (XBee_data2) // { // case 0: // XBee_data2 = 1; // break; // case 1: // XBee_data2 = 25; // break; // case 2: // XBee_data2 = 100; // break; // case 3: // XBee_data2 = 200; // break; // case 4: // XBee_data2 = 300; // break; // default: // XBee_data2 = 0; // break; // } // // myGLCD.setColor(VGA_YELLOW); // myGLCD.print(String(XBee_data2, DEC), RIGHT, yXBee); // // myGLCD.setColor(0, 0, 255); // Нарисовать прямоугольник для текста // myGLCD.fillRoundRect (2, 296, 238, 318); // myGLCD.setColor(255, 255, 255); // myGLCD.drawRoundRect (2, 296, 238, 318); // myGLCD.setBackColor(0, 0, 255); // myGLCD.setColor(255, 255, 255); // strcpy_P(buffer, (char*)pgm_read_word(&(table_message[19]))); // myGLCD.print(buffer, CENTER, 299); // Завершить просмотр // delay(300); }
void XBeeActive::search_XBee() { d0Value[0] = 0xFE; commandValueLength = 0x1; atRequest.setCommand(NTCmd); sendAtCommand(); delay(250); arRequestMod.clearCommandValue(); delay(100); atRequest.setCommand(NDCmd); int search_list = 0; int i10; Serial.println("\nSending command search XBee"); xbee.send(atRequest); while (true) { if (xbee.readPacket(5000)) // подождите до 5 секунд для ответа состояния { if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) // Должна быть команда отклика AT { xbee.getResponse().getAtCommandResponse(atResponse); if (atResponse.isOk()) { Serial.print("Command ["); Serial.print(atResponse.getCommand()[0]); Serial.print(atResponse.getCommand()[1]); Serial.println("] was successful!"); if (atResponse.getValueLength() > 0) { Len_XBee = atResponse.getValueLength(); Serial.print("Command value length is - "); Serial.println(atResponse.getValueLength(), DEC); Serial.print("Command value: "); for (i10 = 0; i10 < atResponse.getValueLength(); i10++) { info_XBee_data[i10] = atResponse.getValue()[i10]; Serial.print(info_XBee_data[i10], HEX); Serial.print(" "); } Serial.println(""); search_list++; } } else { Serial.print("Command return error code: "); Serial.println(atResponse.getStatus(), HEX); } } else { Serial.print("Expected AT response but got "); Serial.println(xbee.getResponse().getApiId(), HEX); } } else { if (xbee.getResponse().isError()) // at command failed { Serial.print("Error reading packet. Error code: "); Serial.println(xbee.getResponse().getErrorCode()); } else { Serial.println("\nNo response from radio1"); return; } } } }