Losing variable value when adding function to code


hi there have problem code.

quick overview,
i prototyping arduino uno hooked nrf8001 ble , nokia 5110 screen. have wirtten app on phone sends command ble arduino , displays on screen.
below code works , explained:

code: [select]
#include <spi.h>
#include "adafruit_ble_uart.h"
#include <adafruit_gfx.h>
#include <adafruit_pcd8544.h>

#define adafruitble_req 10
#define adafruitble_rdy 2
#define adafruitble_rst 9
adafruit_ble_uart uart = adafruit_ble_uart(adafruitble_req, adafruitble_rdy, adafruitble_rst);adafruit_ble_uart btleserial = adafruit_ble_uart(adafruitble_req, adafruitble_rdy, adafruitble_rst);

adafruit_pcd8544 display = adafruit_pcd8544(7, 6, 5, 4, 3);

#define numflakes 10
#define xpos 0
#define ypos 1
#define deltay 2

#define logo16_glcd_height 16
#define logo16_glcd_width  16

// logo adafruit
static const unsigned char progmem logo16_glcd_bmp[] =
{ b00000000, b11000000,
  b00000001, b11000000,
  b00000001, b11000000,
  b00000011, b11100000,
  b11110011, b11100000,
  b11111110, b11111000,
  b01111110, b11111111,
  b00110011, b10011111,
  b00011111, b11111100,
  b00001101, b01110000,
  b00011011, b10100000,
  b00111111, b11100000,
  b00111111, b11110000,
  b01111100, b11110000,
  b01110000, b01110000,
  b00000000, b00110000 };


void setup(void)
{
  serial.begin(9600);
  serial.println(f("ble has begun"));
  uart.setrxcallback(rxcallback);
  uart.setacicallback(acicallback);
  uart.begin();
  display.begin();
  serial.println(f("display has begun"));
  display.setcontrast(50);
  display.display();
  delay(3000);
  display.cleardisplay();
  display.display();
}
aci_evt_opcode_t laststatus = aci_evt_disconnected;
void loop()
{
  uart.pollaci(); 
}
void acicallback(aci_evt_opcode_t event)
{
  switch(event)
  {
    case aci_evt_device_started:
      serial.println(f("advertising started"));
      break;
    case aci_evt_connected:
      serial.println(f("connected!"));
      break;
    case aci_evt_disconnected:
      serial.println(f("disconnected or advertising timed out"));
      break;
    default:
      break;
  }
}
void rxcallback(uint8_t *buffer, uint8_t len)
{
  int i;
  string m;
  serial.print(m);
  serial.print(f("received "));
  serial.print(len);
  serial.print(f(" bytes: "));
  for(i=0; i<len; i++){
   char n = buffer[i];
   m += string(n);
  }
  serial.print("m's value: \n");
  serial.print(m);
  checkfunctions(m);
}
int checkfunctions(string m){
  serial.print("\nno more chars, checking functions\n");
  serial.print(m);
  if(m == "clear"){
    display.cleardisplay();
    display.display();
  }
  else if(m == "readytime"){
    serial.print("\nsetting time\n");
  }
  else if(m == "clock"){
    serial.println(f("\nwe going draw clock"));
    display.display();
    delay(2000);
    display.cleardisplay();
  }
}


when add either "else if" statement or new function lose "m" vairable's value in rxcallback function. "m" variable holds text receives phone. bug?? or wrong ide? or missing something? below again same code added function and  else if statment , when run code "m" value empty, prints nothing.

code: [select]
#include <spi.h>
#include "adafruit_ble_uart.h"
#include <adafruit_gfx.h>
#include <adafruit_pcd8544.h>

#define adafruitble_req 10
#define adafruitble_rdy 2
#define adafruitble_rst 9
adafruit_ble_uart uart = adafruit_ble_uart(adafruitble_req, adafruitble_rdy, adafruitble_rst);adafruit_ble_uart btleserial = adafruit_ble_uart(adafruitble_req, adafruitble_rdy, adafruitble_rst);

adafruit_pcd8544 display = adafruit_pcd8544(7, 6, 5, 4, 3);

#define numflakes 10
#define xpos 0
#define ypos 1
#define deltay 2

#define logo16_glcd_height 16
#define logo16_glcd_width  16

// logo adafruit
static const unsigned char progmem logo16_glcd_bmp[] =
{ b00000000, b11000000,
  b00000001, b11000000,
  b00000001, b11000000,
  b00000011, b11100000,
  b11110011, b11100000,
  b11111110, b11111000,
  b01111110, b11111111,
  b00110011, b10011111,
  b00011111, b11111100,
  b00001101, b01110000,
  b00011011, b10100000,
  b00111111, b11100000,
  b00111111, b11110000,
  b01111100, b11110000,
  b01110000, b01110000,
  b00000000, b00110000 };


void setup(void)
{
  serial.begin(9600);
  serial.println(f("ble has begun"));
  uart.setrxcallback(rxcallback);
  uart.setacicallback(acicallback);
  uart.begin();
  display.begin();
  serial.println(f("display has begun"));
  display.setcontrast(50);
  display.display();
  delay(3000);
  display.cleardisplay();
  display.display();
}
aci_evt_opcode_t laststatus = aci_evt_disconnected;
void loop()
{
  uart.pollaci(); 
}
void acicallback(aci_evt_opcode_t event)
{
  switch(event)
  {
    case aci_evt_device_started:
      serial.println(f("advertising started"));
      break;
    case aci_evt_connected:
      serial.println(f("connected!"));
      break;
    case aci_evt_disconnected:
      serial.println(f("disconnected or advertising timed out"));
      break;
    default:
      break;
  }
}
void rxcallback(uint8_t *buffer, uint8_t len)
{
  int i;
  string m;
  serial.print(m);
  serial.print(f("received "));
  serial.print(len);
  serial.print(f(" bytes: "));
  for(i=0; i<len; i++){
   char n = buffer[i];
   m += string(n);
  }
  serial.print("m's value: \n");
  serial.print(m);
  checkfunctions(m);
}
int checkfunctions(string m){
  serial.print("\nno more chars, checking functions\n");
  serial.print(m);
  if(m == "clear"){
    display.cleardisplay();
    display.display();
  }
  else if(m == "readytime"){
    serial.print("\nsetting time\n");
  }
  else if(m == "clock"){
    serial.println(f("\nwe going draw clock"));
    display.display();
    delay(2000);
    display.cleardisplay();
  }
  else if (m == "clock"){
      drawclock();
  }
}

void drawclock(){
display.setcursor(37,0);
display.println("12");
display.setcursor(40,41);
display.println("6");
display.setcursor(79,21);
display.println("3");
display.setcursor(0,21);
display.println("9");
display.fillcircle(display.width()/2, display.height()/2, 2, black);
}

m has local scope in rxcallback

to access in other functions, must declare globally instead.

code: [select]
void rxcallback(uint8_t *buffer, uint8_t len)
{
  int i;
  string m;
  serial.print(m);


http://arduino.cc/en/reference/scope


Arduino Forum > Using Arduino > Programming Questions > Losing variable value when adding function to code


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support