Added ability to store strings in flash

This commit is contained in:
Kristian Lauszus 2012-07-31 22:53:32 +02:00
parent 2fb8dcf8ae
commit ea575c3999
3 changed files with 41 additions and 1 deletions

View file

@ -1522,6 +1522,23 @@ void RFCOMM::print(uint8_t* array, uint8_t length) {
RFCOMM_Command(rfcommbuf,length+4);
}
void RFCOMM::print(const __FlashStringHelper *ifsh) {
const uint8_t PROGMEM *p = (const uint8_t PROGMEM *)ifsh;
size_t size = 0;
while (1) { // Calculate the size of the string
uint8_t c = pgm_read_byte(p++);
if (c == 0) break;
size++;
}
uint8_t buf[size];
pgm_read_byte(p--); // Go one back
pgm_read_byte(p--); // Don't include the null character
for(uint8_t i = 1; i < size+1; i++)
buf[size-i] = pgm_read_byte(p--); // Write to buffer reversed
print(buf,size);
}
void RFCOMM::println(const char* data) {
char output[strlen(data)+2];
@ -1540,6 +1557,25 @@ void RFCOMM::println(uint8_t* array, uint8_t length) {
buf[length+1] = '\n';
print(buf,length+2);
}
void RFCOMM::println(const __FlashStringHelper *ifsh) {
const uint8_t PROGMEM *p = (const uint8_t PROGMEM *)ifsh;
size_t size = 0;
while (1) { // Calculate the size of the string
uint8_t c = pgm_read_byte(p++);
if (c == 0) break;
size++;
}
uint8_t buf[size+2];
pgm_read_byte(p--); // Go one back
pgm_read_byte(p--); // Don't include the null character
for(uint8_t i = 1; i < size+1; i++)
buf[size-i] = pgm_read_byte(p--); // Write to buffer reversed
buf[size] = '\r';
buf[size+1] = '\n';
print(buf,size+2);
}
uint8_t RFCOMM::read() {
uint8_t output = rfcommDataBuffer[0];

View file

@ -203,9 +203,13 @@ public:
void print(const char* data); // Used to send strings
void print(uint8_t data); // Used to send single bytes
void print(uint8_t* array, uint8_t length); // Used to send arrays
void print(const __FlashStringHelper *); // Used to print strings stored in flash
void println(const char* data); // Include newline and carriage return
void println(uint8_t data); // Include newline and carriage return
void println(uint8_t* array, uint8_t length); // Include newline and carriage return
void println(const __FlashStringHelper *); // Include newline and carriage return
uint8_t available() { return rfcommAvailable; }; // Get the bytes waiting to be read
uint8_t read(); // Used to read the buffer

View file

@ -25,7 +25,7 @@ void loop() {
if(SerialBT.connected) {
if(firstMessage) {
firstMessage = false;
SerialBT.println("Hello from Arduino"); // Send welcome message
SerialBT.println(F("Hello from Arduino")); // Send welcome message
}
if(Serial.available())
SerialBT.print(Serial.read());