Skip to content

mBed online compiler fix + struct example #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 16, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ EEPROM devices support much higher read/write cycles than flash based memory, at
More info on EEPROM can be found on wikipedia:
https://en.wikipedia.org/wiki/EEPROM

## Basic example

``` cpp
// Here's an example using a 24LC256 on a GR PEACH
#include "mbed.h"
Expand Down Expand Up @@ -42,3 +44,58 @@ int main() {
}
```

## Saving struct example
``` cpp
// Here's an example using a 24LC256 to store a C struct
#include "mbed.h"
#include "I2CEEBlockDevice.h"

#define BLOCK_SIZE 32

// Create EEPROM device on I2C bus with 32kbytes of memory
I2CEEBlockDevice i2cee(P0_0, P0_1, 0xA0, 32*1024, BLOCK_SIZE);

uint8_t setting_block_size;

struct t_setting {
uint8_t version;
char name[20];
} setting = {
1,
"Hello World!"
};

int main() {
printf("i2cee struct test\n");

// No. of bytes to be stored, but topped up to be multiplied by block size
unsigned int setting_block_size = ceil(sizeof(setting)/(double)BLOCK_SIZE)*BLOCK_SIZE;

// Temporary buffer
char *buffer = (char*)malloc(setting_block_size);

// Initialize the device
i2cee.init();

// Save struct to EEPROM
printf("\nSaving struct version: %u, name: %s\n", setting.version, setting.name);
memcpy(buffer, &setting, sizeof(setting));
i2cee.program(buffer, 0, setting_block_size);

// Get back what was stored
t_setting tmp; //Re-make the struct
memset(buffer, 0, sizeof(buffer)); // empty buffer, not nessesary but helps when debugging

if (i2cee.read(buffer, 0, setting_block_size ) == 0){ // get data into buffer
// Convert what we read into struct
memcpy(&tmp, buffer, sizeof(tmp)); // copy only size of struct not setting_block_size
printf("\nTemporary struct version: %u, name: %s\n", tmp.version, tmp.name);
} else {
printf("Error when reading\n");
}

// Deinitialize the device
i2cee.deinit();
}
```