Hallo,
ich beschäftige mich nun seit ca 3 Monaten mit der Arduino-Plattform. Mein aktuelles Projekt ist ein Panorama - Roboter. Die Steuerung des Roboters übernimmt ein Arduino Mini Pro 328 gekoppelt mit einem 16x2 LCD und einem Rotary Encoder. Die Hardware funktioniert soweit, nur die Software will nicht so wie ich will. Die Steuerung habe ich “polymorph” aufgebaut. Als Eingabe der Parameter des Roboters dient die “Param” Basisklasse. Von dieser sind verschiedene Parameter (z.B. Range, Dictionary, Void, Boolean) abgeleitet. Mittlererweile hat das Sketch über 1500 Zeilen Code.
Folgende BUGS tauchen auf.
- beschädigte “Strings”, anstatt “1-5” escheint z.B. “1m5”
- zufälliges unvorhersehbares “Benehmen” des Arduino
Ich denke, es ist ein Memory-Problem
Sktech hat ca 15KB, memoryFree() ca 900 bytes.
Am meisten Probleme ergeben sich in diesem Abschnitt
char *Param::toText(int value)
{
static char buffer[7];
//itoa(value, buffer, 10);
sprintf(buffer, "%i", value);
return buffer;
}
Param.h
#ifndef Param_h
#define Param_h
#include <WProgram.h>
#include <inttypes.h>
class Param;
typedef void (*OnChange)(Param*);
typedef void (*OnRender)(Param*);
typedef void (*OnSelect)(Param*);
//**************************************************************
// Param BaseClass
//**************************************************************
class Param
{
public:
Param();
// Events
OnChange onChangeHandler;
OnSelect onSelectHandler;
OnRender onRenderHandler;
// Virtual
virtual void value(int){};
virtual int value(){ return 0;}
virtual const char *text();
virtual void inc(uint8_t){};
virtual void dec(uint8_t){};
// Static helper
static char *toText(int);
static int llimit(int, int, int);
static int ulimit(int, int, int);
void select();
void render();
const char *name;
};
//**************************************************************
// RangeParam
//**************************************************************
class RangeParam : public Param
{
public:
RangeParam(const char*, int, int, int, int);
RangeParam(const char*, int, int, int);
int value();
const char *text();
void inc(uint8_t);
void dec(uint8_t);
void value(int);
private:
int _step;
int _value;
int _from;
int _to;
};
//**************************************************************
// VoidParam
//**************************************************************
class VoidParam : public Param
{
public:
VoidParam();
int value();
const char *text();
};
//**************************************************************
// InfoParam
//**************************************************************
class InfoParam : public Param
{
public:
InfoParam(const char*, const char*, int);
int value();
const char *text();
private:
int _value;
const char *_msg;
};
//**************************************************************
// DicItem
//**************************************************************
class DicItem
{
public:
DicItem();
DicItem(const char*, int);
const char *name;
int value;
};
//**************************************************************
// DicParam
//**************************************************************
class DicParam : public Param
{
public:
DicParam();
DicParam(char*, DicItem*, uint8_t);
DicParam(char*, DicItem*, uint8_t, uint8_t);
int value();
const char *text();
void inc(uint8_t);
void dec(uint8_t);
void value(uint8_t);
uint8_t index();
protected:
uint8_t _index;
uint8_t _size;
DicItem *_items;
};
#endif
Param.cpp
#include "Param.h"
//**************************************************************
// Param BaseClass
//**************************************************************
Param::Param()
{
onChangeHandler = NULL;
onSelectHandler = NULL;
onRenderHandler = NULL;
}
char *Param::toText(int value)
{
static char buffer[7];
//itoa(value, buffer, 10);
sprintf(buffer, "%i", value);
return buffer;
}
int Param::llimit(int value, int limit, int step)
{
int tmp = value - step;
return (tmp >= limit) ? tmp : limit;
}
int Param::ulimit(int value, int limit, int step)
{
int tmp = value + step;
return (tmp <= limit) ?tmp : limit;
}
void Param::select()
{
if (onSelectHandler)
(onSelectHandler)(this);
}
void Param::render()
{
if (onRenderHandler)
(onRenderHandler)(this);
}
//**************************************************************
// RangeParam
//**************************************************************
RangeParam::RangeParam(const char *n, int from, int to, int step): _from(from), _to(to), _step(step)
{
_value = _from;
name = n;
}
RangeParam::RangeParam(const char *n, int from, int to, int step, int value): _from(from), _to(to), _step(step), _value(value)
{
name = n;
}
int RangeParam::value()
{
return _value;
}
const char *RangeParam::text()
{
return toText(_value);
}
void RangeParam::inc(uint8_t c)
{
int tmp = _value;
_value = ulimit(_value, _to, _step * c);
if (onChangeHandler && _value != tmp)
(onChangeHandler)(this); //OnChange ChangeHandler = onChangeHandler;
}
void RangeParam::dec(uint8_t c)
{
int tmp = _value;
_value = llimit(_value, _from, _step * c);
if (onChangeHandler && _value != tmp)
(onChangeHandler)(this); //OnChange ChangeHandler = onChangeHandler;
}
void RangeParam::value(int v)
{
_value = v;
}
//**************************************************************
// VoidParam
//**************************************************************
VoidParam::VoidParam(){}
int VoidParam::value(){ return 0;}
const char *VoidParam::text(){ return "";}
//**************************************************************
// InfoParam
//**************************************************************
InfoParam::InfoParam(const char *n, const char *msg, int value)
{
name = n;
_value = value;
_msg = msg;
}
int InfoParam::value()
{
return _value;
}
const char *InfoParam::text()
{
return _msg;
}
//**************************************************************
// DicItem
//**************************************************************
DicItem::DicItem(){}
DicItem::DicItem(const char *n, int v)
{
name = n;
value = v;
}
//**************************************************************
// DicParam
//**************************************************************
DicParam::DicParam(){}
DicParam::DicParam(char *n, DicItem *items, uint8_t size) : _items(items), _size(size)
{
_index = 0;
name = n;
}
DicParam::DicParam(char *n, DicItem *items, uint8_t size, uint8_t index)
{
name = n;
_size = size;
_index = index;
_items = items;
}
void DicParam::value(uint8_t index)
{
_index = index;
}
int DicParam::value()
{
return _items[_index].value;
}
const char *DicParam::text()
{
return _items[_index].name;
}
void DicParam::inc(uint8_t count)
{
int tmp = _index;
_index = ulimit(_index, _size -1, 1);
if (onChangeHandler && _index != tmp)
(onChangeHandler)(this);
}
void DicParam::dec(uint8_t count)
{
int oldindex = _index;
_index = llimit(_index, 0, 1);
if (onChangeHandler && _index != oldindex)
(onChangeHandler)(this);
}
uint8_t DicParam::index()
{
return _index;
}
Nach soviel Text und Code bin ich dankbar für gefundene Fehler oder Vorschläge
p.s ist mein erstes C / C++ Projekt
Markus