Fork of the official mbed C/C++ SDK provides the software platform and libraries to build your applications. The fork has the documentation converted to Doxygen format
Dependents: NervousPuppySprintOne NervousPuppySprint2602 Robot WarehouseBot1 ... more
Fork of mbed by
Revision 4:5d1359a283bc, committed 2008-11-27
- Comitter:
- simon.ford@mbed.co.uk
- Date:
- Thu Nov 27 16:23:24 2008 +0000
- Parent:
- 3:aefd12a1f1c5
- Child:
- 5:62573be585e9
- Commit message:
- New version of framework: vectors, environment, platform, base and file system
Changed in this revision
--- a/AnalogIn.h Fri Nov 14 15:25:20 2008 +0000
+++ b/AnalogIn.h Thu Nov 27 16:23:24 2008 +0000
@@ -24,7 +24,7 @@
* Variables:
* pin - AnalogIn pin to connect to (15-20)
*/
- AnalogIn(int pin);
+ AnalogIn(int pin, const char *name = NULL);
/* Group: Access Methods */
@@ -64,6 +64,8 @@
* A shorthand for <read>
*/
operator float();
+
+ virtual const struct rpc_method *rpc_methods();
protected:
--- a/AnalogOut.h Fri Nov 14 15:25:20 2008 +0000 +++ b/AnalogOut.h Thu Nov 27 16:23:24 2008 +0000 @@ -24,7 +24,7 @@ * Variables: * pin - AnalogOut pin to connect to (18) */ - AnalogOut(int pin); + AnalogOut(int pin, const char *name = NULL); /* Group: Access Methods */ @@ -86,6 +86,8 @@ * A shorthand for <read> */ operator float(); + + virtual const struct rpc_method *rpc_methods(); };
--- a/Base.h Fri Nov 14 15:25:20 2008 +0000
+++ b/Base.h Thu Nov 27 16:23:24 2008 +0000
@@ -1,42 +1,117 @@
/* mbed Microcontroller Library - Base
- * Copyright (c) 2007-2008, sford
+ * Copyright (c) 2006-2008 ARM Limited. All rights reserved.
+ * sford, jbrawn
*/
-
+
#ifndef MBED_BASE_H
#define MBED_BASE_H
-#define MBED_BASE_NUM_OBJECTS 128 // max # base objects
-#define MBED_BASE_SIZE_NAME 16 // max size of object name, including the null-termination
-
-#include "rt_sys.h"
+#include <cstdlib>
namespace mbed {
+/* Class Base
+ * The base class for most things
+ */
class Base {
public:
+
+ Base(const char *name = NULL);
- Base();
- virtual ~Base();
+ virtual ~Base();
+
+ /* Function register_object
+ * Registers this object with the given name, so that it can be
+ * looked up with lookup. If this object has already been
+ * registered, then this just changes the name.
+ *
+ * Variables
+ * name - The name to give the object. If NULL we do nothing.
+ */
+ void register_object(const char *name);
+
+ /* Function name
+ * Returns the name of the object, or NULL if it has no name.
+ */
+ const char *name();
+
+ /* Function rpc
+ * Call the given method with the given arguments, and write the
+ * result into the string pointed to by result. The default
+ * implementation calls rpc_methods to determine the supported
+ * methods.
+ *
+ * Variables
+ * method - The name of the method to call.
+ * arguments - A list of arguments separated by spaces.
+ * result - A pointer to a string to write the result into. May
+ * be NULL, in which case nothing is written.
+ * returns - true if method corresponds to a valid rpc method, or
+ * false otherwise.
+ */
+ virtual bool rpc(const char *method, const char *arguments, char *result);
- void name(const char* name);
- const char* name();
- const char* type();
-
- static Base* lookup(const char* name);
-
- virtual FILEHANDLE sys_open(const char* name, int openmode);
+ /* Function rpc_method
+ * Returns a pointer to an array describing the rpc methods
+ * supported by this object, terminated by RPC_METHOD_END.
+ *
+ * Example
+ *
+ * > class Example : public Base {
+ * > int foo(int a, int b) { return a + b; }
+ * > virtual const struct rpc_method *rpc_methods() {
+ * > static const rpc_method rpc_methods[] = {
+ * > { "foo", generic_caller<int, Example, int, int, &Example::foo> },
+ * > RPC_METHOD_END
+ * > };
+ * > return rpc_methods;
+ * > }
+ * > };
+ */
+ virtual const struct rpc_method *rpc_methods();
+
+ /* Function rpc
+ * Use the lookup function to lookup an object and, if
+ * successful, call its rpc method
+ *
+ * Variables
+ * returns - false if name does not correspond to an object,
+ * otherwise the return value of the call to the object's rpc
+ * method.
+ */
+ static bool rpc(const char *name, const char *method, const char *arguments, char *result);
+
+ /* Function lookup
+ * Lookup and return the object that has the given name.
+ *
+ * Variables
+ * name - the name to lookup.
+ * len - the length of name.
+ */
+ static Base *lookup(const char *name, unsigned int len);
protected:
- const char* _type; // The class type
- char _name[MBED_BASE_SIZE_NAME]; // The class instance name
-
- static int _uid; // The counter used to generate the uid's
- static Base* _objects[MBED_BASE_NUM_OBJECTS]; // Pointers to all the objects to enable things like rpc
-
+ static Base *_head;
+ Base *_next;
+ const char *_name;
+
};
+/* Macro MBED_OBJECT_NAME_MAX
+ * The maximum size of object name (including terminating null byte)
+ * that will be recognised when using fopen to open a FileLike
+ * object, or when using the rpc function.
+ */
+#define MBED_OBJECT_NAME_MAX 32
+
+/* Macro MBED_METHOD_NAME_MAX
+ * The maximum size of rpc method name (including terminating null
+ * byte) that will be recognised by the rpc function (in rpc.h).
+ */
+#define MBED_METHOD_NAME_MAX 32
+
} // namespace mbed
#endif
--- a/BusIn.h Fri Nov 14 15:25:20 2008 +0000
+++ b/BusIn.h Thu Nov 27 16:23:24 2008 +0000
@@ -29,10 +29,11 @@
* It is only required to specify as many pin variables as is required
* for the bus; the rest will default to NOT_CONNECTED
*/
- BusIn(int p0, int p1 = NOT_CONNECTED, int p2 = NOT_CONNECTED, int p3 = NOT_CONNECTED,
- int p4 = NOT_CONNECTED, int p5 = NOT_CONNECTED, int p6 = NOT_CONNECTED, int p7 = NOT_CONNECTED,
- int p8 = NOT_CONNECTED, int p9 = NOT_CONNECTED, int p10 = NOT_CONNECTED, int p11 = NOT_CONNECTED,
- int p12 = NOT_CONNECTED, int p13 = NOT_CONNECTED, int p14 = NOT_CONNECTED, int p15 = NOT_CONNECTED);
+ BusIn(int p0, int p1 = NOT_CONNECTED, int p2 = NOT_CONNECTED, int p3 = NOT_CONNECTED,
+ int p4 = NOT_CONNECTED, int p5 = NOT_CONNECTED, int p6 = NOT_CONNECTED, int p7 = NOT_CONNECTED,
+ int p8 = NOT_CONNECTED, int p9 = NOT_CONNECTED, int p10 = NOT_CONNECTED, int p11 = NOT_CONNECTED,
+ int p12 = NOT_CONNECTED, int p13 = NOT_CONNECTED, int p14 = NOT_CONNECTED, int p15 = NOT_CONNECTED,
+ const char *name = NULL);
virtual ~BusIn();
@@ -52,6 +53,8 @@
* A shorthand for <read>
*/
operator int();
+
+ virtual const struct rpc_method *rpc_methods();
protected:
--- a/BusOut.h Fri Nov 14 15:25:20 2008 +0000
+++ b/BusOut.h Thu Nov 27 16:23:24 2008 +0000
@@ -29,10 +29,11 @@
* It is only required to specify as many pin variables as is required
* for the bus; the rest will default to NOT_CONNECTED
*/
- BusOut(int p0, int p1 = NOT_CONNECTED, int p2 = NOT_CONNECTED, int p3 = NOT_CONNECTED,
- int p4 = NOT_CONNECTED, int p5 = NOT_CONNECTED, int p6 = NOT_CONNECTED, int p7 = NOT_CONNECTED,
- int p8 = NOT_CONNECTED, int p9 = NOT_CONNECTED, int p10 = NOT_CONNECTED, int p11 = NOT_CONNECTED,
- int p12 = NOT_CONNECTED, int p13 = NOT_CONNECTED, int p14 = NOT_CONNECTED, int p15 = NOT_CONNECTED);
+ BusOut(int p0, int p1 = NOT_CONNECTED, int p2 = NOT_CONNECTED, int p3 = NOT_CONNECTED,
+ int p4 = NOT_CONNECTED, int p5 = NOT_CONNECTED, int p6 = NOT_CONNECTED, int p7 = NOT_CONNECTED,
+ int p8 = NOT_CONNECTED, int p9 = NOT_CONNECTED, int p10 = NOT_CONNECTED, int p11 = NOT_CONNECTED,
+ int p12 = NOT_CONNECTED, int p13 = NOT_CONNECTED, int p14 = NOT_CONNECTED, int p15 = NOT_CONNECTED,
+ const char *name = NULL);
virtual ~BusOut();
@@ -68,6 +69,8 @@
*/
operator int();
+ virtual const struct rpc_method *rpc_methods();
+
protected:
DigitalOut* _pin[16];
--- a/Debug.h Fri Nov 14 15:25:20 2008 +0000
+++ b/Debug.h Thu Nov 27 16:23:24 2008 +0000
@@ -5,8 +5,6 @@
#ifndef MBED_DEBUG_H
#define MBED_DEBUG_H
-#include "DebugTracer.h"
-
namespace mbed {
/* Section: debug
@@ -25,11 +23,11 @@
void ERROR(const char* format, ...);
#endif
-#define ERROR(...) mbed_error(__FILE__, __LINE__, __VA_ARGS__)
-void mbed_error(const char* file, int line, const char* fmt, ...);
+#define ERROR(FMT, ...) mbed_error(__FILE__, __LINE__, FMT, ##__VA_ARGS__)
+void mbed_error(const char* file, int line, const char* fmt=0, ...) __attribute__((noreturn));
// Internal use for "official" errors
-void mbed_error(const char* file, int line, int code, const char* fmt, ...);
+void mbed_error(const char* file, int line, int code, const char* fmt=0, ...) __attribute__((noreturn));
// As seen by user, for documentation purposes only
#if 0
@@ -46,11 +44,7 @@
void ASSERT(int condition, const char* fmt = 0, ...);
#endif
-#define ASSERT(...) mbed_assert(__FILE__, __LINE__, __VA_ARGS__)
-void mbed_assert(const char* file, int line, int condition, const char* fmt = 0, ...);
-
-// Internal use for "official" errors
-void mbed_assert(const char* file, int line, int condition, int code, const char* fmt = 0, ...);
+#define ASSERT(COND, ...) (COND ? (void)0 : mbed_error(__FILE__, __LINE__, ##__VA_ARGS__))
// As seen by user, for documentation purposes only
#if 0
--- a/DebugTracer.h Fri Nov 14 15:25:20 2008 +0000
+++ b/DebugTracer.h Thu Nov 27 16:23:24 2008 +0000
@@ -6,7 +6,7 @@
#define MBED_DEBUGTRACER_H
#include "Base.h"
-#include "stdio.h"
+#include <cstdio>
#define MAX_TRACER_DEPTH 32
@@ -17,7 +17,7 @@
#define METHOD(name) DebugTracer _tracer_instance(name, this)
#define FUNCTION(name) DebugTracer _tracer_instance(name)
-/* Class: DebugTracer
+/* Class DebugTracer
* A code instrumentation utility
*
* This object adds a function name or methodname/object instance
@@ -31,7 +31,7 @@
* - trace the runtime call graph (for the whole program run, or programatically on/off)
*
*
- * Example:
+ * Example
*
* Function example
* > void foo(int x) { FUNCTION("foo");
@@ -45,7 +45,7 @@
public:
- /* Constructor: DebugTracer
+ /* Constructor DebugTracer
* Record the method and object instance it is called on
* to the call stack
*/
@@ -55,7 +55,7 @@
_depth++;
}
- /* Destructor: ~DebugTracer
+ /* Destructor ~DebugTracer
* Pop from the call stack
*/
~DebugTracer() {
@@ -63,16 +63,16 @@
}
static void stack() {
- fprintf(stderr, "Trace (depth = %d):\n", _depth);
+ std::fprintf(stderr, "Trace (depth = %d):\n", _depth);
for(int i=0; i<_depth; i++) {
// indent
for(int j=0; j<i; j++) {
- fprintf(stderr, " ");
+ std::fprintf(stderr, " ");
}
if(_objects[i]) {
- fprintf(stderr, "%s::", _objects[i]->type());
+// std::fprintf(stderr, "%s::", _objects[i]->type());
}
- fprintf(stderr, "%s\n", _functions[i]);
+ std::fprintf(stderr, "%s\n", _functions[i]);
}
}
--- a/DigitalIn.h Fri Nov 14 15:25:20 2008 +0000 +++ b/DigitalIn.h Thu Nov 27 16:23:24 2008 +0000 @@ -28,7 +28,7 @@ * Variables: * pin - DigitalIn pin to connect to (5-30) */ - DigitalIn(int pin); + DigitalIn(int pin, const char *name = NULL); /* Function: rise * Attach a function to call when a rising edge occurs on the input @@ -66,6 +66,8 @@ operator int(); static void _irq(); // Called on a GPIO interrupt + + virtual const struct rpc_method *rpc_methods(); protected:
--- a/DigitalOut.h Fri Nov 14 15:25:20 2008 +0000
+++ b/DigitalOut.h Thu Nov 27 16:23:24 2008 +0000
@@ -25,7 +25,7 @@
* Variables:
* pin - DigitalOut pin to connect to (5-30)
*/
- DigitalOut(int pin);
+ DigitalOut(int pin, const char* name = NULL);
/* Group: Access Methods */
@@ -46,7 +46,9 @@
* 0 for logical 0 (0v) and 1 for logical 1 (3.3v)
*/
int read();
-
+
+ virtual const struct rpc_method *rpc_methods();
+
/* Group: Access Method Shorthand */
/* Function: operator=
--- a/FileHandle.h Fri Nov 14 15:25:20 2008 +0000
+++ b/FileHandle.h Thu Nov 27 16:23:24 2008 +0000
@@ -5,9 +5,19 @@
#ifndef MBED_FILEHANDLE_H
#define MBED_FILEHANDLE_H
+typedef int FILEHANDLE;
+
+#include <stdio.h>
+#ifdef __ARMCC_VERSION
+typedef int ssize_t;
+typedef long off_t;
+#else
+#include <sys/types.h>
+#endif
+
namespace mbed {
-/* Class: FileHandle
+/* Class FileHandle
* An OO equivalent of the internal FILEHANDLE variable
* and associated _sys_* functions
*
@@ -21,73 +31,81 @@
public:
- //virtual ~FileHandle() { }
-
- /* Function: sys_write
- * Write the contents of a buffer to the file
+ /* Function write
+ * Write the contents of a buffer to the file
*
- * Parameters:
+ * Parameters
* buffer - the buffer to write from
* length - the number of characters to write
- * mode - the mode of the file, 0 (normal) or 1 (binary); this may be unused?
*
- * Returns:
- * 0 on success, -1 on error, or the number of characters not written on partial success
+ * Returns
+ * The number of characters written (possibly 0) on success, -1 on error.
*/
- virtual int sys_write(const unsigned char* buffer, unsigned int length, int mode) = 0;
+ virtual ssize_t write(const void* buffer, size_t length) = 0;
- virtual int sys_close() = 0;
-
- /* Function: sys_read
- * Reads the contents of the file into a buffer
- *
- * Parameters:
+ /* Function close
+ * Close the file
+ *
+ * Returns
+ * Zero on success, -1 on error.
+ */
+ virtual int close() = 0;
+
+ /* Function read
+ * Reads the contents of the file into a buffer
+ *
+ * Parameters
* buffer - the buffer to read in to
* length - the number of characters to read
- * mode - the mode of the file, 0 (normal) or 1 (binary); this may be unused?
*
- * Returns:
- * 0 on success, -1 on error, or the number of characters not read on partial success. EOF is
- * signaled by setting the top bit (0x80000000) of the return value.
- */
- virtual int sys_read(unsigned char* buffer, unsigned int length, int mode) = 0;
-
- /* Function: sys_istty
- * Check if the handle is for a interactive terminal device
- *
- * If so, unbuffered behaviour is used by default
- *
- * Returns:
- * 0 - no
- * 1 - yes
- */
- virtual int sys_istty() = 0 ;
+ * Returns
+ * The number of characters read (zero at end of file) on success, -1 on error.
+ */
+ virtual ssize_t read(void* buffer, size_t length) = 0;
+
+ /* Function isatty
+ * Check if the handle is for a interactive terminal device
+ *
+ * If so, line buffered behaviour is used by default
+ *
+ * Returns
+ * 1 if it is a terminal, 0 otherwise
+ */
+ virtual int isatty() = 0 ;
- /* Function: sys_seek
- * Move the file position to a given offset from the file start
- *
- * Returns:
- * 0 on success, -1 on failure or unsupported
- */
- virtual int sys_seek(int position) = 0;
-
- /* Function: sys_ensure
- * Flush any OS buffers associated with the FileHandle, ensuring it
- * is up to date on disk
- *
- * Returns:
- * 0 on success or un-needed, -1 on error
- */
- virtual int sys_ensure() = 0;
-
- /* Function: sys_flen
- * Find the current length of the file
- *
- * Returns:
- * The current length of the file, or -1 on error
- */
- virtual int sys_flen() = 0;
-
+ /* Function lseek
+ * Move the file position to a given offset from a given location.
+ *
+ * Parameters
+ * offset - The offset from whence to move to
+ * whence - SEEK_SET for the start of the file, SEEK_CUR for the
+ * current file position, or SEEK_END for the end of the file.
+ *
+ * Returns
+ * New file position on success, -1 on failure or unsupported
+ */
+ virtual off_t lseek(off_t offset, int whence) = 0;
+
+ /* Function fsync
+ * Flush any buffers associated with the FileHandle, ensuring it
+ * is up to date on disk
+ *
+ * Returns
+ * 0 on success or un-needed, -1 on error
+ */
+ virtual int fsync() = 0;
+
+ virtual off_t flen() {
+ /* remember our current position */
+ off_t pos = lseek(0, SEEK_CUR);
+ if(pos == -1) return -1;
+ /* seek to the end to get the file length */
+ off_t res = lseek(0, SEEK_END);
+ /* return to our old position */
+ lseek(pos, SEEK_SET);
+ return res;
+ }
+
};
} // namespace mbed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FileLike.h Thu Nov 27 16:23:24 2008 +0000
@@ -0,0 +1,30 @@
+/* Copyright 2008 ARM Limited. All rights reserved. */
+
+#ifndef MBED_FILELIKE_H
+#define MBED_FILELIKE_H
+
+#include "Base.h"
+#include "FileHandle.h"
+
+namespace mbed {
+
+/* Class FileLike
+ * A file-like object is one that can be opened with fopen by
+ * fopen("/name", mode). It is intersection of the classes Base and
+ * FileHandle.
+ */
+class FileLike : public Base, public FileHandle {
+
+ public:
+ /* Constructor FileLike
+ *
+ * Variables
+ * name - The name to use to open the file.
+ */
+ FileLike(const char *name) : Base(name) { }
+
+};
+
+} // namespace mbed
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FileSystemLike.h Thu Nov 27 16:23:24 2008 +0000
@@ -0,0 +1,74 @@
+/* Copyright 2008 ARM Limited. All rights reserved. */
+
+#ifndef MBED_FILESYSTEMLIKE_H
+#define MBED_FILESYSTEMLIKE_H
+
+#include "Base.h"
+#include "FileHandle.h"
+#ifdef __ARMCC_VERSION
+# define O_RDONLY 0
+# define O_WRONLY 1
+# define O_RDWR 2
+# define O_CREAT 0x0200
+# define O_APPEND 0x0008
+#else
+# include <sys/fcntl.h>
+#endif
+
+namespace mbed {
+
+/* Class FileSystemLike
+ * A filesystem-like object is one that can be used to open files
+ * though it by fopen("/name/filename", mode)
+ *
+ * Implementations must define at least open (the default definitions
+ * of the rest of the functions just return error values).
+ */
+class FileSystemLike : public Base {
+
+ public:
+
+ /* Constructor FileSystemLike
+ *
+ * Variables
+ * name - The name to use for the filesystem.
+ */
+ FileSystemLike(const char *name) : Base(name) {}
+
+ /* Function open
+ *
+ * Variables
+ * filename - The name of the file to open.
+ * flags - One of O_RDONLY, O_WRONLY, or O_RDWR, possibly OR'd
+ * with O_CREAT or O_APPEND.
+ * returns - A pointer to a FileHandle object representing the
+ * file on success, or NULL on failure.
+ */
+ virtual FileHandle *open(const char *filename, int flags) = 0;
+
+ /* Function remove
+ * Remove a file from the filesystem.
+ *
+ * Variables
+ * filename - the name of the file to remove.
+ * returns - 0 on success, -1 on failure.
+ */
+ virtual int remove(const char *filename) { return -1; };
+
+ /* Function rename
+ * Rename a file in the filesystem.
+ *
+ * Variables
+ * oldname - the name of the file to rename.
+ * newname - the name to rename it to.
+ * returns - 0 on success, -1 on failure.
+ */
+ virtual int rename(const char *oldname, const char *newname) { return -1; };
+
+ // TODO other filesystem functions (mkdir, rm, rn, ls etc)
+
+};
+
+} // namespace mbed
+
+#endif
--- a/FunctionPointer.h Fri Nov 14 15:25:20 2008 +0000
+++ b/FunctionPointer.h Thu Nov 27 16:23:24 2008 +0000
@@ -1,86 +1,86 @@
-/* mbed Microcontroller Library - FunctionPointer
- * Copyright (c) 2007-2008, sford
- */
-
-#ifndef MBED_FUNCTIONPOINTER_H
-#define MBED_FUNCTIONPOINTER_H
-
-#include "string.h"
-
-namespace mbed {
-
-/* Class FunctionPointer
- * A class for storing and calling a pointer to a static or member void function
- */
-class FunctionPointer {
-
-public:
-
- /* Constructor FunctionPointer
- * Create a FunctionPointer, attaching a static function
- *
- * Variables
- * function - The void static function to attach (default is none)
- */
- FunctionPointer(void (*function)(void) = 0);
-
- /* Constructor FunctionPointer
- * Create a FunctionPointer, attaching a member function
- *
- * Variables
- * object - The object pointer to invoke the member function on (i.e. the this pointer)
- * function - The address of the void member function to attach
- */
- template<typename T>
- FunctionPointer(T *object, void (T::*member)(void)) {
- attach(object, member);
- }
-
- /* Function attach
- * Attach a static function
- *
- * Variables
- * function - The void static function to attach (default is none)
- */
- void attach(void (*function)(void) = 0);
-
- /* Function attach
- * Attach a member function
- *
- * Variables
- * object - The object pointer to invoke the member function on (i.e. the this pointer)
- * function - The address of the void member function to attach
- */
- template<typename T>
- void attach(T *object, void (T::*member)(void)) {
- _object = static_cast<void*>(object);
- memcpy(_member, (char*)&member, sizeof(member));
- _membercaller = &FunctionPointer::membercaller<T>;
- _function = 0;
- }
-
- /* Function call
- * Call the attached static or member function
- */
- void call();
-
-private:
-
- template<typename T>
- static void membercaller(void *object, char *member) {
- T* o = static_cast<T*>(object);
- void (T::*m)(void);
- memcpy((char*)&m, member, sizeof(m));
- (o->*m)();
- }
-
- void (*_function)(void); // static function pointer - 0 if none attached
- void *_object; // object this pointer - 0 if none attached
- char _member[16]; // raw member function pointer storage - converted back by registered _membercaller
- void (*_membercaller)(void*, char*); // registered membercaller function to convert back and call _member on _object
-
-};
-
-}
-
-#endif
+/* mbed Microcontroller Library - FunctionPointer
+ * Copyright (c) 2007-2008, sford
+ */
+
+#ifndef MBED_FUNCTIONPOINTER_H
+#define MBED_FUNCTIONPOINTER_H
+
+#include "string.h"
+
+namespace mbed {
+
+/* Class FunctionPointer
+ * A class for storing and calling a pointer to a static or member void function
+ */
+class FunctionPointer {
+
+public:
+
+ /* Constructor FunctionPointer
+ * Create a FunctionPointer, attaching a static function
+ *
+ * Variables
+ * function - The void static function to attach (default is none)
+ */
+ FunctionPointer(void (*function)(void) = 0);
+
+ /* Constructor FunctionPointer
+ * Create a FunctionPointer, attaching a member function
+ *
+ * Variables
+ * object - The object pointer to invoke the member function on (i.e. the this pointer)
+ * function - The address of the void member function to attach
+ */
+ template<typename T>
+ FunctionPointer(T *object, void (T::*member)(void)) {
+ attach(object, member);
+ }
+
+ /* Function attach
+ * Attach a static function
+ *
+ * Variables
+ * function - The void static function to attach (default is none)
+ */
+ void attach(void (*function)(void) = 0);
+
+ /* Function attach
+ * Attach a member function
+ *
+ * Variables
+ * object - The object pointer to invoke the member function on (i.e. the this pointer)
+ * function - The address of the void member function to attach
+ */
+ template<typename T>
+ void attach(T *object, void (T::*member)(void)) {
+ _object = static_cast<void*>(object);
+ memcpy(_member, (char*)&member, sizeof(member));
+ _membercaller = &FunctionPointer::membercaller<T>;
+ _function = 0;
+ }
+
+ /* Function call
+ * Call the attached static or member function
+ */
+ void call();
+
+private:
+
+ template<typename T>
+ static void membercaller(void *object, char *member) {
+ T* o = static_cast<T*>(object);
+ void (T::*m)(void);
+ memcpy((char*)&m, member, sizeof(m));
+ (o->*m)();
+ }
+
+ void (*_function)(void); // static function pointer - 0 if none attached
+ void *_object; // object this pointer - 0 if none attached
+ char _member[16]; // raw member function pointer storage - converted back by registered _membercaller
+ void (*_membercaller)(void*, char*); // registered membercaller function to convert back and call _member on _object
+
+};
+
+}
+
+#endif
--- a/I2C.h Fri Nov 14 15:25:20 2008 +0000 +++ b/I2C.h Thu Nov 27 16:23:24 2008 +0000 @@ -28,7 +28,7 @@ * Pin Options: * (9, 10) or (28, 27) */ - I2C(int sda, int scl); + I2C(int sda, int scl, const char *name = NULL); /* Function: frequency * Set the frequency of the I2C interface
--- a/LPC2300_HAL.h Fri Nov 14 15:25:20 2008 +0000
+++ b/LPC2300_HAL.h Thu Nov 27 16:23:24 2008 +0000
@@ -11,11 +11,9 @@
#ifndef MBED_LPC2300_HAL_H
#define MBED_LPC2300_HAL_H
-#include "LPC23xx.h"
-
namespace LPC2300 {
-/* Section: LPC2300 */
+/* Section LPC2300 */
//===================================================================
// General
@@ -29,22 +27,22 @@
// Pin Connect Block
//===================================================================
-/* Function: pin_function
+/* Function pin_function
* Set the port function (0-3)
*/
void pin_function(int port, int function);
-/* Function: pin_pullup
+/* Function pin_pullup
* Set the port resistor to pullup
*/
void pin_pullup(int port);
-/* Function: pin_pulldown
+/* Function pin_pulldown
* Set the port resistor to pulldown
*/
void pin_pulldown(int port);
-/* Function: pin_pullnone
+/* Function pin_pullnone
* Set the port resistor to none
*/
void pin_pullnone(int port);
@@ -64,22 +62,22 @@
volatile unsigned int clr; // 0x1C
};
-/* Function: gpio_input
+/* Function gpio_input
* Set the port GPIO as an input
*/
void gpio_input(int port);
-/* Function: gpio_output
+/* Function gpio_output
* Set the port GPIO as an output
*/
void gpio_output(int port);
-/* Function: gpio_write
+/* Function gpio_write
* Write a value to the GPIO port (v & 1)
*/
void gpio_write(int port, int v);
-/* Function: gpio_read
+/* Function gpio_read
* Read a value from the GPIO port (0 or 1)
*/
int gpio_read(int port);
@@ -96,27 +94,27 @@
reg32 EnF; // 0x10
};
-/* Function: gpio_irq_enable_rising
+/* Function gpio_irq_enable_rising
* Enable the rising edge interrupt
*/
void gpio_irq_enable_rising(int port);
-/* Function: gpio_irq_enable_falling
+/* Function gpio_irq_enable_falling
* Enable the falling edge interrupt
*/
void gpio_irq_enable_falling(int port);
-/* Function: gpio_irq_disable_rising
+/* Function gpio_irq_disable_rising
* Disable the rising edge interrupt
*/
void gpio_irq_disable_rising(int port);
-/* Function: gpio_irq_disable_falling
+/* Function gpio_irq_disable_falling
* Disable the falling edge interrupt
*/
void gpio_irq_disable_falling(int port);
-/* Function: gpio_irq_clear
+/* Function gpio_irq_clear
* Clear rising and falling interrupt for the port
*/
void gpio_irq_clear(int port);
@@ -129,22 +127,22 @@
// Analog-to-Digital Converter
//===================================================================
-/* Function: adc_poweron
+/* Function adc_poweron
* Turn on the ADC
*/
void adc_poweron();
-/* Function: adc_poweroff
+/* Function adc_poweroff
* Turn off the ADC
*/
void adc_poweroff();
-/* Function: adc_init
+/* Function adc_init
* Setup the ADC ready for reading
*/
void adc_init();
-/* Function: adc_read
+/* Function adc_read
* Read the value of the ADC (10-bit, id 0-5)
*/
int adc_read(int id);
@@ -153,27 +151,27 @@
// Digital-to-Analog Converter
//===================================================================
-/* Function: dac_poweron
+/* Function dac_poweron
* Turn on the DAC
*/
void dac_poweron();
-/* Function: dac_poweroff
+/* Function dac_poweroff
* Turn off the DAC
*/
void dac_poweroff();
-/* Function: dac_init
+/* Function dac_init
* Setup the DAC ready for writinbg
*/
void dac_init();
-/* Function: dac_write
+/* Function dac_write
* Write a value to the DAC (10-bit)
*/
void dac_write(int value);
-/* Function: dac_read
+/* Function dac_read
* Read the value currently set as the DAC output (10-bit)
*/
int dac_read();
@@ -208,7 +206,7 @@
reg32 CTCR; // 0x70 - Count Control Register
};
-#define LPC2368_PWM ((LPC2368_PWM_RF*)0xE0018000)
+#define LPC2368_PWM ((LPC2368_PWM_RF*)PWM1_BASE_ADDR)
#define TCR_CNT_EN (1 << 0)
#define TCR_RESET (1 << 1)
@@ -289,12 +287,12 @@
Forced0
};
-/* Function: uart_poweron
+/* Function uart_poweron
* Turn on the Uart power
*/
void uart_poweron(int id);
-/* Function: uart_poweroff
+/* Function uart_poweroff
* Turn off the Uart power
*/
void uart_poweroff(int id);
@@ -362,12 +360,12 @@
reg32 ctcr; // 0x70
};
-/* Function: timer_poweron
+/* Function timer_poweron
* Turn on the Timer power
*/
void timer_poweron(int id);
-/* Function: timer_poweroff
+/* Function timer_poweroff
* Turn off the Timer power
*/
void timer_poweroff(int id);
--- a/LPC2300_MAP.h Fri Nov 14 15:25:20 2008 +0000
+++ b/LPC2300_MAP.h Thu Nov 27 16:23:24 2008 +0000
@@ -28,6 +28,11 @@
USBRX = 70
};
+#define LED1_PORT (4*32 + 28)
+#define LED2_PORT (3*32 + 25)
+#define LED3_PORT (4*32 + 29)
+#define LED4_PORT (3*32 + 26)
+
#elif TARGET_PHAT40
enum {
@@ -39,6 +44,11 @@
USBRX = 37
};
+#define LED1_PORT (1*32 + 18)
+#define LED2_PORT (1*32 + 20)
+#define LED3_PORT (1*32 + 21)
+#define LED4_PORT (1*32 + 23)
+
#else
#error "UNRECOGNISED TARGET"
#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LocalFileSystem.h Thu Nov 27 16:23:24 2008 +0000
@@ -0,0 +1,52 @@
+/* mbed Microcontroller Library - SemihostFileSystem
+ * Copyright (c) 2007-2008, sford
+ */
+
+#ifndef MBED_LOCALFILESYSTEM_H
+#define MBED_LOCALFILESYSTEM_H
+
+#include "FileSystemLike.h"
+
+namespace mbed {
+
+/* Class: LocalFileSystem
+ * A filesystem for accessing the local mbed Microcontroller USB disk drive.
+ *
+ * This allows programs to read and write files on the same disk drive that is used to program the
+ * mbed Microcontroller. Once created, the standard C file access functions are used to open,
+ * read and write files.
+ *
+ * Example:
+ * > #include "mbed.h"
+ * >
+ * > LocalFileSystem local("local"); // Create the local filesystem under the name "local"
+ * >
+ * > int main() {
+ * > FILE *fp = fopen("/local/out.txt", "w"); // Open "out.txt" on the local file system for writing
+ * > fprintf(fp, "Hello World!");
+ * > fclose(fp);
+ * > }
+ *
+ * Implementation Notes:
+ * If the microcontroller program makes an access to the local drive, it will be marked as "removed"
+ * on the Host computer. This means it is no longer accessible from the Host Computer.
+ *
+ * The drive will only re-appear when the microcontroller program exists. Note that if the program does
+ * not exit, you will need to hold down reset on the mbed Microcontroller to be able to see the drive again!
+ */
+class LocalFileSystem : public FileSystemLike {
+
+public:
+
+ LocalFileSystem(const char* n) : FileSystemLike(n) {
+
+ }
+
+ virtual FileHandle *open(const char* name, int flags);
+ virtual int remove(const char *filename);
+
+};
+
+} // namespace mbed
+
+#endif
--- a/PwmOut.h Fri Nov 14 15:25:20 2008 +0000 +++ b/PwmOut.h Thu Nov 27 16:23:24 2008 +0000 @@ -24,7 +24,7 @@ * Variables: * pin - PwmOut pin to connect to (21-26) */ - PwmOut(int pin); + PwmOut(int pin, const char *name = NULL); /* Group: Access Methods (Analog-like) */ @@ -127,6 +127,8 @@ * A shorthand for <read> */ operator float(); + + virtual const struct rpc_method *rpc_methods(); protected:
--- a/Retarget.h Fri Nov 14 15:25:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* mbed Microcontroller Library - Retarget - * Copyright (c) 2007-2008, sford - */ - -#ifndef MBED_RETARGET_H -#define MBED_RETARGET_H - -#include "stdio.h" -#include "rt_sys.h" - -//=================================================================== -// System -//=================================================================== - -extern "C" void mbed_startup(); -extern "C" int $Sub$$main(); -extern "C" void $Sub$$_sys_exit(int return_code); - -//=================================================================== -// Pre-stdio -//=================================================================== - -extern "C" int $Sub$$fputc(int c, FILE* f); -extern "C" int $Sub$$fgetc(FILE* f); -extern "C" int $Sub$$__backspace(FILE* f); -extern "C" void $Sub$$_ttywrch(int c); - -//=================================================================== -// Post-stdio -//=================================================================== - -extern "C" FILEHANDLE $Sub$$_sys_open(const char* name, int openmode); -extern "C" int $Sub$$_sys_close(FILEHANDLE fh); -extern "C" int $Sub$$_sys_write(FILEHANDLE fh, const unsigned char* buffer, unsigned int length, int mode); -extern "C" int $Sub$$_sys_read(FILEHANDLE fh, unsigned char* buffer, unsigned int length, int mode); -extern "C" int $Sub$$_sys_istty(FILEHANDLE fh); -extern "C" int $Sub$$_sys_seek(FILEHANDLE fh, int position); -extern "C" int $Sub$$_sys_ensure(FILEHANDLE fh); -extern "C" int $Sub$$_sys_flen(FILEHANDLE fh); - - -#endif -
--- a/SPI.h Fri Nov 14 15:25:20 2008 +0000 +++ b/SPI.h Thu Nov 27 16:23:24 2008 +0000 @@ -30,7 +30,7 @@ * Pin Options: * (5, 6, 7) or (11, 12, 13) */ - SPI(int mosi, int miso, int sclk); + SPI(int mosi, int miso, int sclk, const char *name = NULL); /* Function: format * Set the transmission format
--- a/SemihostFileHandle.h Fri Nov 14 15:25:20 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/* mbed Microcontroller Library - SemihostFileHandle
- * Copyright (c) 2007-2008, sford
- */
-
-#ifndef MBED_SEMIHOSTFILEHANDLE_H
-#define MBED_SEMIHOSTFILEHANDLE_H
-
-#include "rt_sys.h"
-#include "FileHandle.h"
-
-extern "C" int $Super$$_sys_close(FILEHANDLE fh);
-extern "C" int $Super$$_sys_write(FILEHANDLE fh, const unsigned char* buffer, unsigned int length, int mode);
-extern "C" int $Super$$_sys_read(FILEHANDLE fh, unsigned char* buffer, unsigned int length, int mode);
-extern "C" int $Super$$_sys_istty(FILEHANDLE fh);
-extern "C" int $Super$$_sys_seek(FILEHANDLE fh, int position);
-extern "C" int $Super$$_sys_ensure(FILEHANDLE fh);
-extern "C" long $Super$$_sys_flen(FILEHANDLE fh);
-
-namespace mbed {
-
-/* Class SemihostFileHandle
- * Implements a FileHandle for talking to the standard Semihosting implementation
- */
-class SemihostFileHandle : public FileHandle {
-
-public:
-
- /* Constructor SemihostFileHandle
- * Create a SemihostFileHandle using a standard FILEHANDLE
- */
- SemihostFileHandle(FILEHANDLE fh) {
- _fh = fh;
- }
-
- virtual int sys_close() {
- return $Super$$_sys_close(_fh);
- }
- // virtual ~SemihostFileHandle() {
- // $Super$$_sys_close(_fh);
- //}
-
- virtual int sys_write(const unsigned char* buffer, unsigned int length, int mode) {
- return $Super$$_sys_write(_fh, buffer, length, mode);
- }
-
- virtual int sys_read(unsigned char* buffer, unsigned int length, int mode) {
- return $Super$$_sys_read(_fh, buffer, length, mode);
- }
-
- virtual int sys_istty() {
- return $Super$$_sys_istty(_fh);
- }
-
- virtual int sys_seek(int position) {
- return $Super$$_sys_seek(_fh, position);
- }
-
- virtual int sys_ensure() {
- return $Super$$_sys_ensure(_fh);
- }
-
- virtual int sys_flen() {
- return $Super$$_sys_flen(_fh);
- }
-
-protected:
-
- FILEHANDLE _fh;
-
-};
-
-} // namespace mbed
-
-#endif
-
--- a/SemihostFileSystem.h Fri Nov 14 15:25:20 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/* mbed Microcontroller Library - SemihostFileSystem
- * Copyright (c) 2007-2008, sford
- */
-
-#ifndef MBED_SEMIHOSTFILESYSTEM_H
-#define MBED_SEMIHOSTFILESYSTEM_H
-
-#include "rt_sys.h"
-
-#include "SemihostFileHandle.h"
-
-extern "C" FILEHANDLE $Super$$_sys_open(const char *name, int openmode);
-
-namespace mbed {
-
-/* Class SemihostFileSystem
- * A file system invoking the standard semihosting implementation
- */
-class SemihostFileSystem : public Base {
-
-public:
-
- SemihostFileSystem(char* n) {
- name(n);
- _type = "SemihostFileSystem";
- }
-
- virtual FILEHANDLE sys_open(const char* name, int openmode) {
- FILEHANDLE fh = $Super$$_sys_open(name, openmode);
- FileHandle* fhc = new SemihostFileHandle(fh);
- return (FILEHANDLE)fhc;
- }
-
-};
-
-} // namespace mbed
-
-#endif
-
--- a/Serial.h Fri Nov 14 15:25:20 2008 +0000
+++ b/Serial.h Thu Nov 27 16:23:24 2008 +0000
@@ -28,7 +28,7 @@
* Pin Options:
* (9, 10) or (13, 14) or (28, 27)
*/
- Serial(int tx, int rx);
+ Serial(int tx, int rx, const char *name = NULL);
/* Function: baud
--- a/Stream.h Fri Nov 14 15:25:20 2008 +0000
+++ b/Stream.h Thu Nov 27 16:23:24 2008 +0000
@@ -5,31 +5,53 @@
#ifndef MBED_STREAM_H
#define MBED_STREAM_H
-#include "Base.h"
+#include "FileLike.h"
+#include <cstdio>
namespace mbed {
-class Stream : public Base {
+class Stream : protected FileLike {
public:
-
- Stream();
+
+ Stream(const char *name = NULL);
+ virtual ~Stream();
- int putc(int c);
- int getc();
+ int putc(int c) {
+ fflush(_file);
+ return std::fputc(c, _file);
+ }
+ int puts(const char *s) {
+ fflush(_file);
+ return std::fputs(s, _file);
+ }
+ int getc() {
+ fflush(_file);
+ return std::fgetc(_file);
+ }
+ char *gets(char *s, int size) {
+ fflush(_file);
+ return std::fgets(s,size,_file);;
+ }
int printf(const char* format, ...);
int scanf(const char* format, ...);
-
- int _backspace();
-
+
+ operator std::FILE*() { return _file; }
+
protected:
- virtual int _putc(int c) = 0;
- virtual int _getc() = 0;
+ virtual int close();
+ virtual ssize_t write(const void* buffer, size_t length);
+ virtual ssize_t read(void* buffer, size_t length);
+ virtual off_t lseek(off_t offset, int whence);
+ virtual int isatty();
+ virtual int fsync();
- int _back;
- int _last;
-
+ virtual int _putc(int c) = 0;
+ virtual int _getc() = 0;
+
+ std::FILE *_file;
+
};
} // namespace mbed
--- a/Ticker.h Fri Nov 14 15:25:20 2008 +0000
+++ b/Ticker.h Thu Nov 27 16:23:24 2008 +0000
@@ -1,89 +1,89 @@
-/* mbed Microcontroller Library - Ticker
- * Copyright (c) 2007-2008, sford
- */
-
-#ifndef MBED_TICKER_H
-#define MBED_TICKER_H
-
-#include "TimerEvent.h"
-#include "FunctionPointer.h"
-
-namespace mbed {
-
-/* Class: Ticker
- * A Ticker is used to call a function at a recurring interval
- *
- * You can use as many seperate Ticker objects as you require.
- */
-class Ticker : public TimerEvent {
-
-public:
-
- /* Function: attach
- * Attach a function to be called by the Ticker, specifiying the interval in seconds
- *
- * Variables:
- * fptr - pointer to the function to be called
- * t - the time between calls in seconds
- */
- void attach(void (*fptr)(void), float t) {
- attach_us(fptr, t * 1000000.0f);
- }
-
- /* Function: attach
- * Attach a member function to be called by the Ticker, specifiying the interval in seconds
- *
- * Variables:
- * tptr - pointer to the object to call the member function on
- * mptr - pointer to the member function to be called
- * t - the time between calls in seconds
- */
- template<typename T>
- void attach(T* tptr, void (T::*mptr)(void), float t) {
- attach_us(tptr, mptr, t * 1000000.0f);
- }
-
- /* Function: attach_us
- * Attach a function to be called by the Ticker, specifiying the interval in micro-seconds
- *
- * Variables:
- * fptr - pointer to the function to be called
- * t - the time between calls in micro-seconds
- */
- void attach_us(void (*fptr)(void), unsigned int t) {
- _function.attach(fptr);
- setup(t);
- }
-
- /* Function: attach_us
- * Attach a member function to be called by the Ticker, specifiying the interval in micro-seconds
- *
- * Variables:
- * tptr - pointer to the object to call the member function on
- * mptr - pointer to the member function to be called
- * t - the time between calls in micro-seconds
- */
- template<typename T>
- void attach_us(T* tptr, void (T::*mptr)(void), unsigned int t) {
- _function.attach(tptr, mptr);
- setup(t);
- }
-
- /* Function: detach
- * Detach the function
- */
- void detach();
-
-protected:
-
- void setup(unsigned int t);
- virtual void handler();
-
- unsigned int _delay;
- FunctionPointer _function;
-
-};
-
-}
-
-#endif
+/* mbed Microcontroller Library - Ticker
+ * Copyright (c) 2007-2008, sford
+ */
+
+#ifndef MBED_TICKER_H
+#define MBED_TICKER_H
+
+#include "TimerEvent.h"
+#include "FunctionPointer.h"
+
+namespace mbed {
+
+/* Class: Ticker
+ * A Ticker is used to call a function at a recurring interval
+ *
+ * You can use as many seperate Ticker objects as you require.
+ */
+class Ticker : public TimerEvent {
+
+public:
+
+ /* Function: attach
+ * Attach a function to be called by the Ticker, specifiying the interval in seconds
+ *
+ * Variables:
+ * fptr - pointer to the function to be called
+ * t - the time between calls in seconds
+ */
+ void attach(void (*fptr)(void), float t) {
+ attach_us(fptr, t * 1000000.0f);
+ }
+
+ /* Function: attach
+ * Attach a member function to be called by the Ticker, specifiying the interval in seconds
+ *
+ * Variables:
+ * tptr - pointer to the object to call the member function on
+ * mptr - pointer to the member function to be called
+ * t - the time between calls in seconds
+ */
+ template<typename T>
+ void attach(T* tptr, void (T::*mptr)(void), float t) {
+ attach_us(tptr, mptr, t * 1000000.0f);
+ }
+
+ /* Function: attach_us
+ * Attach a function to be called by the Ticker, specifiying the interval in micro-seconds
+ *
+ * Variables:
+ * fptr - pointer to the function to be called
+ * t - the time between calls in micro-seconds
+ */
+ void attach_us(void (*fptr)(void), unsigned int t) {
+ _function.attach(fptr);
+ setup(t);
+ }
+
+ /* Function: attach_us
+ * Attach a member function to be called by the Ticker, specifiying the interval in micro-seconds
+ *
+ * Variables:
+ * tptr - pointer to the object to call the member function on
+ * mptr - pointer to the member function to be called
+ * t - the time between calls in micro-seconds
+ */
+ template<typename T>
+ void attach_us(T* tptr, void (T::*mptr)(void), unsigned int t) {
+ _function.attach(tptr, mptr);
+ setup(t);
+ }
+
+ /* Function: detach
+ * Detach the function
+ */
+ void detach();
+
+protected:
+
+ void setup(unsigned int t);
+ virtual void handler();
+
+ unsigned int _delay;
+ FunctionPointer _function;
+
+};
+
+}
+
+#endif
--- a/Timeout.h Fri Nov 14 15:25:20 2008 +0000
+++ b/Timeout.h Thu Nov 27 16:23:24 2008 +0000
@@ -1,86 +1,86 @@
-/* mbed Microcontroller Library - Timeout
- * Copyright (c) 2007-2008, sford
- */
-
-#ifndef MBED_TIMEOUT_H
-#define MBED_TIMEOUT_H
-
-#include "Ticker.h"
-
-namespace mbed {
-
-/* Class: Timeout
- * A Timeout is used to call a function at a point in the future
- *
- * You can use as many seperate Timeout objects as you require.
- */
-class Timeout : public Ticker {
-
-#if 0 // For documentation
-
- /* Function: attach
- * Attach a function to be called by the Timeout, specifiying the delay in seconds
- *
- * Variables:
- * fptr - pointer to the function to be called
- * t - the time before the call in seconds
- */
- void attach(void (*fptr)(void), float t) {
- attach_us(fptr, t * 1000000.0f);
- }
-
- /* Function: attach
- * Attach a member function to be called by the Timeout, specifiying the delay in seconds
- *
- * Variables:
- * tptr - pointer to the object to call the member function on
- * mptr - pointer to the member function to be called
- * t - the time before the calls in seconds
- */
- template<typename T>
- void attach(T* tptr, void (T::*mptr)(void), float t) {
- attach_us(tptr, mptr, t * 1000000.0f);
- }
-
- /* Function: attach_us
- * Attach a function to be called by the Timeout, specifiying the delay in micro-seconds
- *
- * Variables:
- * fptr - pointer to the function to be called
- * t - the time before the call in micro-seconds
- */
- void attach_us(void (*fptr)(void), unsigned int t) {
- _function.attach(fptr);
- setup(t);
- }
-
- /* Function: attach_us
- * Attach a member function to be called by the Timeout, specifiying the delay in micro-seconds
- *
- * Variables:
- * tptr - pointer to the object to call the member function on
- * mptr - pointer to the member function to be called
- * t - the time before the call in micro-seconds
- */
- template<typename T>
- void attach_us(T* tptr, void (T::*mptr)(void), unsigned int t) {
- _function.attach(tptr, mptr);
- setup(t);
- }
-
- /* Function: detach
- * Detach the function
- */
- void detach();
-
-#endif
-
-protected:
-
- virtual void handler();
-
-};
-
-}
-
-#endif
+/* mbed Microcontroller Library - Timeout
+ * Copyright (c) 2007-2008, sford
+ */
+
+#ifndef MBED_TIMEOUT_H
+#define MBED_TIMEOUT_H
+
+#include "Ticker.h"
+
+namespace mbed {
+
+/* Class: Timeout
+ * A Timeout is used to call a function at a point in the future
+ *
+ * You can use as many seperate Timeout objects as you require.
+ */
+class Timeout : public Ticker {
+
+#if 0 // For documentation
+
+ /* Function: attach
+ * Attach a function to be called by the Timeout, specifiying the delay in seconds
+ *
+ * Variables:
+ * fptr - pointer to the function to be called
+ * t - the time before the call in seconds
+ */
+ void attach(void (*fptr)(void), float t) {
+ attach_us(fptr, t * 1000000.0f);
+ }
+
+ /* Function: attach
+ * Attach a member function to be called by the Timeout, specifiying the delay in seconds
+ *
+ * Variables:
+ * tptr - pointer to the object to call the member function on
+ * mptr - pointer to the member function to be called
+ * t - the time before the calls in seconds
+ */
+ template<typename T>
+ void attach(T* tptr, void (T::*mptr)(void), float t) {
+ attach_us(tptr, mptr, t * 1000000.0f);
+ }
+
+ /* Function: attach_us
+ * Attach a function to be called by the Timeout, specifiying the delay in micro-seconds
+ *
+ * Variables:
+ * fptr - pointer to the function to be called
+ * t - the time before the call in micro-seconds
+ */
+ void attach_us(void (*fptr)(void), unsigned int t) {
+ _function.attach(fptr);
+ setup(t);
+ }
+
+ /* Function: attach_us
+ * Attach a member function to be called by the Timeout, specifiying the delay in micro-seconds
+ *
+ * Variables:
+ * tptr - pointer to the object to call the member function on
+ * mptr - pointer to the member function to be called
+ * t - the time before the call in micro-seconds
+ */
+ template<typename T>
+ void attach_us(T* tptr, void (T::*mptr)(void), unsigned int t) {
+ _function.attach(tptr, mptr);
+ setup(t);
+ }
+
+ /* Function: detach
+ * Detach the function
+ */
+ void detach();
+
+#endif
+
+protected:
+
+ virtual void handler();
+
+};
+
+}
+
+#endif
--- a/Timer.h Fri Nov 14 15:25:20 2008 +0000 +++ b/Timer.h Thu Nov 27 16:23:24 2008 +0000 @@ -16,7 +16,7 @@ public: - Timer(); + Timer(const char *name = NULL); /* Group: Access Methods */
--- a/TimerEvent.h Fri Nov 14 15:25:20 2008 +0000
+++ b/TimerEvent.h Thu Nov 27 16:23:24 2008 +0000
@@ -1,43 +1,43 @@
-/* mbed Microcontroller Library - TimerEvent
- * Copyright (c) 2007-2008, sford
- */
-
-#ifndef MBED_TIMEREVENT_H
-#define MBED_TIMEREVENT_H
-
-namespace mbed {
-
-// Base abstraction for timer interrupts
-class TimerEvent {
-
-public:
-
- // The handler registered with the underlying timer interrupt
- static void irq();
-
- // Destruction removes it...
- virtual ~TimerEvent();
-
-protected:
-
- // The handler called to service the timer event of the derived class
- virtual void handler() = 0;
-
- // insert in to linked list
- void insert(unsigned int timestamp);
-
- // remove from linked list, if in it
- void remove();
-
- // Get the current usec timestamp
- static unsigned int timestamp();
-
- static TimerEvent *_head; // The head of the list of the events, NULL if none
- TimerEvent *_next; // Pointer to the next in the list, NULL if last
- unsigned int _timestamp; // The timestamp at which the even should be triggered
-
-};
-
-}
-
-#endif
+/* mbed Microcontroller Library - TimerEvent
+ * Copyright (c) 2007-2008, sford
+ */
+
+#ifndef MBED_TIMEREVENT_H
+#define MBED_TIMEREVENT_H
+
+namespace mbed {
+
+// Base abstraction for timer interrupts
+class TimerEvent {
+
+public:
+
+ // The handler registered with the underlying timer interrupt
+ static void irq();
+
+ // Destruction removes it...
+ virtual ~TimerEvent();
+
+protected:
+
+ // The handler called to service the timer event of the derived class
+ virtual void handler() = 0;
+
+ // insert in to linked list
+ void insert(unsigned int timestamp);
+
+ // remove from linked list, if in it
+ void remove();
+
+ // Get the current usec timestamp
+ static unsigned int timestamp();
+
+ static TimerEvent *_head; // The head of the list of the events, NULL if none
+ TimerEvent *_next; // Pointer to the next in the list, NULL if last
+ unsigned int _timestamp; // The timestamp at which the even should be triggered
+
+};
+
+}
+
+#endif
Binary file mbed.ar has changed
--- a/mbed.h Fri Nov 14 15:25:20 2008 +0000 +++ b/mbed.h Thu Nov 27 16:23:24 2008 +0000 @@ -6,10 +6,10 @@ #define MBED_H // Useful C libraries -#include "stdio.h" -#include "stdlib.h" -#include "string.h" -#include "math.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> #include "helper.h" @@ -34,6 +34,7 @@ #include "wait.h" #include "Ticker.h" #include "Timeout.h" +#include "LocalFileSystem.h" using namespace mbed;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.sct Thu Nov 27 16:23:24 2008 +0000
@@ -0,0 +1,26 @@
+; Copyright 2008 ARM Limited. All rights reserved.
+
+FLASH_LOAD 0x0 0x00080000
+{
+
+ ER_RESET +0
+ {
+ * (VECTOR_TABLE)
+ }
+
+ ER_RO +0
+ {
+ * (+RO)
+ }
+
+ ER_RW 0x40000120
+ {
+ * (+RW)
+ }
+
+ ER_ZI +0
+ {
+ * (+ZI)
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rpc.h Thu Nov 27 16:23:24 2008 +0000
@@ -0,0 +1,277 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2008 ARM Limited. All rights reserved.
+ */
+
+#ifndef MBED_RPC_H
+#define MBED_RPC_H
+
+/* Section rpc
+ * Helpers for rpc handling.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Base.h"
+
+namespace mbed {
+
+/* Function parse_arg
+ * Parses and returns a value from a string.
+ *
+ * Variable
+ * arg - The string to pase
+ * next - If not NULL a pointer to after the last
+ * character parsed is written here
+ */
+template<typename T> T parse_arg(const char *arg, const char **next);
+
+/* signed integer types */
+
+template<> inline char parse_arg<char>(const char *arg, const char **next) {
+ if(next != NULL) *next = arg+1;
+ return *arg;
+}
+
+template<> inline short int parse_arg<short int>(const char *arg, const char **next) {
+ return strtol(arg, const_cast<char**>(next), 10);
+}
+
+template<> inline long int parse_arg<long int>(const char *arg, const char **next) {
+ return strtol(arg, const_cast<char**>(next), 10);
+}
+
+template<> inline int parse_arg<int>(const char *arg, const char **next) {
+ return strtol(arg, const_cast<char**>(next), 10);
+}
+
+template<> inline long long parse_arg<long long>(const char *arg, const char **next) {
+ return strtoll(arg, const_cast<char**>(next), 10);
+}
+
+/* unsigned integer types */
+
+template<> inline unsigned char parse_arg<unsigned char>(const char *arg, const char **next) {
+ if(next != NULL) *next = arg+1;
+ return *arg;
+}
+
+template<> inline unsigned short int parse_arg<unsigned short int>(const char *arg, const char **next) {
+ return strtoul(arg, const_cast<char**>(next), 10);
+}
+
+template<> inline unsigned long int parse_arg<unsigned long int>(const char *arg, const char **next) {
+ return strtoul(arg, const_cast<char**>(next), 10);
+}
+
+template<> inline unsigned int parse_arg<unsigned int>(const char *arg, const char **next) {
+ return strtoul(arg, const_cast<char**>(next), 10);
+}
+
+template<> inline unsigned long long parse_arg<unsigned long long>(const char *arg, const char **next) {
+ return strtoull(arg, const_cast<char**>(next), 10);
+}
+
+/* floating types */
+
+template<> inline float parse_arg<float>(const char *arg, const char **next) {
+#if !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 310000
+ return strtof(arg,const_cast<char**>(next));
+#else
+ return strtod(arg,const_cast<char**>(next));
+#endif
+}
+
+template<> inline double parse_arg<double>(const char *arg, const char **next) {
+ return strtod(arg,const_cast<char**>(next));
+}
+
+template<> inline long double parse_arg<long double>(const char *arg, const char **next) {
+ return strtod(arg,const_cast<char**>(next));
+}
+
+
+/* Function write_result
+ * Writes a value in to a result string in an appropriate manner
+ *
+ * Variable
+ * val - The value to write
+ * result - A pointer to the array to write the value into
+ */
+template<typename T> void write_result(T val, char *result);
+
+/* signed integer types */
+
+template<> inline void write_result<char>(char val, char *result) {
+ result[0] = val;
+ result[1] = '\0';
+}
+
+template<> inline void write_result<short int>(short int val, char *result) {
+ sprintf(result, "%hi", val);
+}
+
+template<> inline void write_result<int>(int val, char *result) {
+ sprintf(result, "%i", val);
+}
+
+template<> inline void write_result<long int>(long int val, char *result) {
+ sprintf(result, "%li", val);
+}
+
+template<> inline void write_result<long long int>(long long int val, char *result) {
+ sprintf(result, "%lli", val);
+}
+
+/* unsigned integer types */
+
+template<> inline void write_result<unsigned char>(unsigned char val, char *result) {
+ result[0] = val;
+ result[1] = '\0';
+}
+
+template<> inline void write_result<unsigned short int>(unsigned short int val, char *result) {
+ sprintf(result, "%hu", val);
+}
+
+template<> inline void write_result<unsigned int>(unsigned int val, char *result) {
+ sprintf(result, "%u", val);
+}
+
+template<> inline void write_result<unsigned long int>(unsigned long int val, char *result) {
+ sprintf(result, "%lu", val);
+}
+
+template<> inline void write_result<unsigned long long int>(unsigned long long int val, char *result) {
+ sprintf(result, "%llu", val);
+}
+
+/* floating types */
+
+template<> inline void write_result<float>(float val, char *result) {
+ sprintf(result, "%g", val);
+}
+
+template<> inline void write_result<double>(double val, char *result) {
+ sprintf(result, "%g", val);
+}
+
+template<> inline void write_result<long double>(long double val, char *result) {
+ sprintf(result, "%Lg", val);
+}
+
+
+/* Function generic_caller
+ */
+template<class T, void (T::*member)()>
+void generic_caller(Base *this_ptr, const char *arguments, char *result) {
+ (static_cast<T*>(this_ptr)->*member)();
+ if(result != NULL) {
+ result[0] = '\0';
+ }
+}
+
+
+/* Function generic_caller
+ */
+template<class T, typename A1, void (T::*member)(A1)>
+void generic_caller(Base *this_ptr, const char *arguments, char *result) {
+ const char *next = arguments;
+
+ if(*next == ',' || *next == ' ') next++;
+ A1 arg1 = parse_arg<A1>(next,NULL);
+
+ (static_cast<T*>(this_ptr)->*member)(arg1);
+ if(result != NULL) {
+ result[0] = '\0';
+ }
+}
+
+
+/* Function generic_caller
+ */
+template<class T, typename A1, typename A2, void (T::*member)(A1,A2)>
+void generic_caller(Base *this_ptr, const char *arguments, char *result) {
+ const char *next = arguments;
+
+ if(*next == ',' || *next == ' ') next++;
+ A1 arg1 = parse_arg<A1>(next,&next);
+
+ if(*next == ',' || *next == ' ') next++;
+ A2 arg2 = parse_arg<A2>(next,NULL);
+
+ (static_cast<T*>(this_ptr)->*member)(arg1,arg2);
+ if(result != NULL) {
+ result[0] = '\0';
+ }
+}
+
+
+/* Function generic_caller
+ */
+template<typename R, class T, R (T::*member)()>
+void generic_caller(Base *this_ptr, const char *arguments, char *result) {
+ R res = (static_cast<T*>(this_ptr)->*member)();
+ if(result != NULL) {
+ write_result<R>(res, result);
+ }
+}
+
+
+/* Function generic_caller
+ */
+template<typename R, class T, typename A1, R (T::*member)(A1)>
+void generic_caller(Base *this_ptr, const char *arguments, char *result) {
+ const char *next = arguments;
+
+ if(*next == ',' || *next == ' ') next++;
+ A1 arg1 = parse_arg<A1>(next,NULL);
+
+ R res = (static_cast<T*>(this_ptr)->*member)(arg1);
+ if(result != NULL) {
+ write_result<R>(res, result);
+ }
+}
+
+
+/* Function generic_caller
+ */
+template<typename R, class T, typename A1, typename A2, R (T::*member)(A1,A2)>
+void generic_caller(Base *this_ptr, const char *arguments, char *result) {
+ const char *next = arguments;
+
+ if(*next == ',' || *next == ' ') next++;
+ A1 arg1 = parse_arg<A1>(next,&next);
+
+ if(*next == ',' || *next == ' ') next++;
+ A2 arg2 = parse_arg<A2>(next,NULL);
+
+ R res = (static_cast<T*>(this_ptr)->*member)(arg1,arg2);
+ if(result != NULL) {
+ write_result<R>(res, result);
+ }
+}
+
+struct rpc_method {
+ const char *name;
+ void (*caller)(Base*, const char*, char*);
+};
+
+#define RPC_METHOD_END { NULL, NULL }
+
+
+/* Function rpc
+ * Parse a string describing a call and then do it
+ *
+ * Variables
+ * call - A pointer to a string describing the call, which has
+ * the form /object/method arg ... argn. Arguments are
+ * delimited by space characters, and the string is terminated
+ * by a null character.
+ * result - A pointer to an array to write the result into.
+ */
+bool rpc(const char *buf, char *result = 0);
+
+} /* namespace mbed */
+
+#endif
--- a/stackheap.h Fri Nov 14 15:25:20 2008 +0000
+++ b/stackheap.h Thu Nov 27 16:23:24 2008 +0000
@@ -73,7 +73,11 @@
inline int stack_limit() {
+#ifdef __GNUC__
+ return (unsigned)__builtin_frame_address(0);
+#else
return __current_sp();
+#endif
}
inline int stack_size() {
Mihail Stoyanov
