Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 4:f537311ddc53
- Parent:
- 3:01b322df3731
- Child:
- 5:b73ea174e997
--- a/main.cpp Mon Oct 13 14:50:01 2014 +0000
+++ b/main.cpp Tue Oct 14 09:10:45 2014 +0000
@@ -1,42 +1,22 @@
#include "mbed.h"
+#include "memory.h"
DigitalOut aLED(LED1);
Serial pc(USBTX, USBRX); // tx, rx
I2CSlave slave(p28, p27);
const int SLAVE_ADDRESS = 0x84;
-const int MEMORY_SIZE = 16;
const int I2C_FREQUENCY = 100000;
-const int I2C_BUFFER_SIZE = 10;
+const int I2C_BUFFER_SIZE = 5;
enum COMMAND { PUSH, PULL, CLEAR, PRINT };
-int memory[MEMORY_SIZE];
-
-/*
- * Set all memory locations to 0x55
- */
-void initializeMemory(void)
-{
- for (int i = 0; i < MEMORY_SIZE; i++) {
- memory[i] = -1;
- }
-}
-
-/*
- * Print current memory content
- */
-void printMemory(void)
-{
- for (int i = 0; i < MEMORY_SIZE; i++) {
- pc.printf("%d@0x%x\r\n", memory[i], i);
- }
-}
+#define intToByte(pbytebuff,intval) (*((int*)(pbytebuff)) = intval)
+#define byteToInt(pbytebuff,pintval) (*(pintval) = *((int*)(pbytebuff)))
int main() {
pc.baud(115200);
pc.printf("Size of integer is %d bytes\r\n", sizeof(int));
- pc.printf("Size of memory buffer is %d elements\r\n", MEMORY_SIZE);
// Alive LED
int cAlive = 0;
@@ -47,49 +27,75 @@
slave.address(SLAVE_ADDRESS);
pc.printf("Slave is working @ SLAVE_ADDRESS = 0x%x\r\n", SLAVE_ADDRESS);
- // Make sure memory buffer is zeroed
- initializeMemory();
- printMemory();
+ // Setup memory
+ Memory memory;
+ pc.printf("Size of memory buffer is %d elements\r\n", Memory::MEMORY_SIZE);
+ memory.print();
+ pc.printf("Awaiting commands from master ...\r\n");
// I2C buffer
char buffer[I2C_BUFFER_SIZE];
+ // Internal address pointer
+ int pointer = 0;
+
while (1) {
int i = slave.receive();
switch (i) {
- /*case I2CSlave::ReadAddressed:
- pc.printf("Slave received command: %d [ReadAddressed]\r\n", i);
-
- if (slave.write(msg, strlen(msg) + 1) == 0) {
- printf("Sending %s to master\r\n", msg);
+ case I2CSlave::ReadAddressed:
+ {
+ int value = memory.get(pointer);
+ buffer[0] = pointer;
+ intToByte(buffer+1, value);
+ if (!slave.write(buffer, I2C_BUFFER_SIZE)) {
+ pc.printf("Retrieving and sending to master %d@%d\r\n", value, pointer);
+ } else {
+ pc.printf("Failed to send to master %d@%d\r\n", value, pointer);
}
- break;*/
-
+ break;
+ }
case I2CSlave::WriteAddressed:
-
+ {
if (!slave.read(buffer, I2C_BUFFER_SIZE)) {
// Check command byte
switch (buffer[0]) {
case PUSH:
- pc.printf("Storing %d@%d\r\n", *((int*)(&(buffer[2]))), buffer[1]);
- if (buffer[1] < MEMORY_SIZE) {
- memory[buffer[1]] = *((int*)(&(buffer[2])));
+ {
+ int address = buffer[1];
+ int value;
+ byteToInt(buffer+2, &value);
+ pc.printf("Storing %d@%d\r\n", value, address);
+ memory.set(address, value);
+ break;
+ }
+
+ case PRINT:
+ {
+ memory.print();
+ break;
+ }
+
+ case PULL:
+ {
+ pc.printf("Setting pointer to %d\r\n", buffer[1]);
+ if (buffer[1] < Memory::MEMORY_SIZE) {
+ pointer = buffer[1];
} else {
pc.printf("Address out of boundary\r\n");
}
break;
-
- case PRINT:
- printMemory();
- break;
+ }
default:
+ {
pc.printf("Unknown command byte\r\n");
+ }
}
} else {
pc.printf("Received WriteAddressed] without data\r\n");
}
break;
+ }
}
// Clear buffer