Simple functions to ease cross compiling between mbed and Visual Studio
Diff: Utilities.cpp
- Revision:
- 0:7c744796fa67
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities.cpp Thu Nov 08 12:53:47 2012 +0000 @@ -0,0 +1,264 @@ +/// A collection of utilities that ease the migration to/from Visual Studio and mbed +/// cloud compiler. + +#include "Utilities.h" // mbed <-> Visual Studio + + +#include "string.h" + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +// Helper functions follow. These functions may exist in some environments and +// not in other combinations of libraries and compilers, so private versions +// are here to ensure consistent behavior. + +/// mytolower exists because not all compiler libraries have this function +/// +/// This takes a character and if it is upper-case, it converts it to +/// lower-case and returns it. +/// +/// @param a is the character to convert +/// @returns the lower case equivalent to a +/// +char mytolower(char a) { + if (a >= 'A' && a <= 'Z') + return (a - 'A' + 'a'); + else + return a; +} + +/// mystrnicmp exists because not all compiler libraries have this function. +/// +/// Some have strnicmp, others _strnicmp, and others have C++ methods, which +/// is outside the scope of this C-portable set of functions. +/// +/// @param l is a pointer to the string on the left +/// @param r is a pointer to the string on the right +/// @param n is the number of characters to compare +/// @returns -1 if l < r +/// @returns 0 if l == r +/// @returns +1 if l > r +/// +int mystrnicmp(const char *l, const char *r, size_t n) { + int result = 0; + + if (n != 0) { + do { + result = mytolower(*l++) - mytolower(*r++); + } while ((result == 0) && (*l != '\0') && (--n > 0)); + } + if (result < -1) + result = -1; + else if (result > 1) + result = 1; + return result; +} + +/// mystrcat exists because not all compiler libraries have this function +/// +/// This function concatinates one string onto another. It is generally +/// considered unsafe, because of the potential for buffer overflow. +/// Some libraries offer a strcat_s as the safe version, and others may have +/// _strcat. Because this is needed only internal to the CommandProcessor, +/// this version was created. +/// +/// @param dst is a pointer to the destination string +/// @param src is a pointer to the source string +/// @returns nothing +/// +void mystrcat(char *dst, char *src) { + while (*dst) + dst++; + do + *dst++ = *src; + while (*src++); +} + +/// myisprint exists because not all compiler libraries have this function +/// +/// This function tests a character to see if it is printable (a member +/// of the standard ASCII set). +/// +/// @param c is the character to test +/// @returns TRUE if the character is printable +/// @returns FALSE if the character is not printable +/// +int myisprint(int c) { + if (c >= ' ' && c <= '~') + return TRUE; + else + return FALSE; +} + + +/// hextoi converts a hex string to an unsigned integer +/// +/// This functions converts text to an unsigned integer, as long as +/// the stream contains hex-ASCII characters +/// +/// @param p is a pointer to the string +/// @returns unsigned long integer value +/// +unsigned long hextoul(char *p) { + unsigned long x = 0; + while (*p) { + x <<= 4; + if (*p >= '0' && *p <= '9') + x += *p - '0'; + else if (*p >= 'a' && *p <= 'f') + x += *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') + x += *p - 'A' + 10; + p++; + } + return x; +} + + + +#ifdef WIN32 +//####################################################################### +//####################################################################### +//####################################################################### +// +// Everything from here forward is intended to "satisfy" the Visual +// Studio 2010 compiler. It isn't intended to necessarily run, since +// we're faking out hardware for the most part. +// + +LPC_WDT_BASE * LPC_WDT; + +LPC_CAN_BASE * LPC_CAN1; +LPC_CAN_BASE * LPC_CAN2; + + +void wait(float t) { + (void)t; +} + + +CANMessage::CANMessage() { +} + +CANMessage::CANMessage(uint32_t _id, char *_pdata, int _len, int _type, int _format) { + id = _id; + dir = 0; + len = _len; + format = _format; + type = _type; + for (int i=0; i<len; i++) + data[i] = _pdata[i]; +} + +CANMessage::~CANMessage() { +} + + +CAN::CAN(PinName r, PinName t) { + (void)r; + (void)t; +} +CAN::~CAN() { +} +int CAN::write(CANMessage msg) { + (void)msg; + return 1; +} +int CAN::read(CANMessage &msg) { + (void)msg; + return 1; +} +void CAN::attach(void(*fp)(void)) { + (void)fp; +} +void CAN::monitor(bool t) { + (void)t; +} +bool CAN::frequency(uint32_t f) { + (void)f; + return true; +} +uint32_t CAN::tderror() { + return 0; +} +uint32_t CAN::rderror() { + return 0; +} +void CAN::reset() { +} + +PwmOut::PwmOut(PinName p) { + (void)p; +} +PwmOut::~PwmOut() { +} +double &PwmOut::operator=(double _p) { + return p = _p; +} + +Timeout::Timeout() { +} +Timeout::~Timeout() { +} + +DigitalInOut::DigitalInOut(PinName p) { + (void)p; +} +DigitalInOut::~DigitalInOut() { +} +void DigitalInOut::output() { +} +void DigitalInOut::input() { +} +void DigitalInOut::write(bool v) { + (void)v; +} +void DigitalInOut::mode(int m) { + (void)m; +} + +Serial::Serial(PinName t, PinName r) { + (void)t; + (void)r; +} +Serial::~Serial() { +} +void Serial::baud(uint32_t freq) { + (void)freq; +} +int Serial::getc() { + return _getch(); +} +int Serial::putc(int c) { + return _putch(c); +} +int Serial::readable() { + return _kbhit(); +} +int Serial::printf(char * fmt, ...) { + return ::printf(fmt); +} + +Timer::Timer() { +} +Timer::~Timer() { +} +void Timer::start() { +} +uint32_t Timer::read_ms() { + return 0; +} +uint32_t Timer::read_us() { + return 0; +} + + +extern "C" { + void mbed_reset() { + } +} + +#endif // WIN32 \ No newline at end of file