Show Posts
Pages: [1] 2 3 ... 6
1  Using Arduino / Programming Questions / Re: generate / throw compiler errors [solved] on: June 07, 2014, 11:56:38 am
thanks for the tip.

found additional infos at:
https://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html#Diagnostics

sunny greetings
stefan
2  Using Arduino / Programming Questions / generate / throw compiler errors [solved] on: June 07, 2014, 03:44:37 am
Hello Community,

how is it possible to throw a custom compiler error / warning
(as example to notify the user to use a pin that can have a interrupt - with a link to the http://arduino.cc/en/Reference/AttachInterrupt page)

can you give me some search terms?
sunny greetings

stefan
3  Using Arduino / Programming Questions / Re: Forcing a 16 digit display for a 16 bit binary on: June 07, 2014, 02:11:53 am
just to add an example for the 'for if' thing:

Code:
void printBinary16(unsigned int iIn)  {
//                       0b1234567812345678
for (unsigned int mask = 0b1000000000000000; mask; mask >>= 1) {
if (mask & iIn) {
Serial.print('1');
}
else {
Serial.print('0');
}
}
}
4  Using Arduino / Programming Questions / Re: function pointer & memory selection on: April 11, 2014, 04:44:35 am
Thanks for your explanation of the void* pointer thing :-)

i have used this and managed to get the most things working.

know i have a conceptual problem -

i have a mapping to parse the value from an incoming string  (char array)
for this function i also want to use a function pointer -
its the same way as for the other function pointer...
but at the moment this functions are returning different data types -
so the compiler complains about he can not assign the pointer - ok
thats clear -
but how to handle this?
i 'think' i need a return type that is different for each function...
i tested - i cant return a pointer to an internal variable of the called function - thats also clear -
if the function exits  the pointer losses his destination.
i could use a in the calling function declared variable and give the parsing function a pointer to this-
so it could write the parsed value to this outside location..
but for this i have to declare a variable  - and it needs a type -
so at the moment i can use the biggest used type (for me currently uint16_t)

here is the interessting part of the code...
(the complete test_functionpointer.ino is in the attachment (otherwise the forum message would be to big..)
Code:
//.....

// parse
typedef uint16_t (xLocalTestClass::*tCbfunc_parseValue) (char *caValue);
bool _parseValue_Bool(char *caValue) {
return (bool) atoi(caValue);
};

//....

uint16_t _parseValue_UIntBinary(char *caValue) {
uint16_t wResult = 0;
if (strlen(caValue) == 16) {
byte bCharIndex = 0;
for (unsigned int mask = 0b1000000000000000; mask; mask >>= 1) {
// check if this bit is set
if (caValue[bCharIndex] == '1') {
// set Bit
wResult |= mask;
} // else its 0 so do nothing.
bCharIndex = bCharIndex + 1;
}
}
return wResult;
};

//.....

// test
byte test(byte bOperation, char cSwitchMemory, byte bBitIndex, void *pValue, char *caValue) {

// default to left
byte bLRIndex = 0;
if ( 1 != 1) {
// set to right
bLRIndex = 1;
}

// pointer to Memory Value
void *pMemory = NULL;


// function pointers
tCbfunc_CheckChanged fc_CheckChanged = NULL;
tCbfunc_parseValue fc_parseValue = NULL;
// tCbfunc_printValue fc_printValue = NULL;
tCbfunc_setValue fc_setValue = NULL;

switch (cSwitchMemory) {
case 'a': {
pMemory = &memory_LeftRight[bLRIndex].wRotaryEncoder_position;
fc_CheckChanged = &xLocalTestClass::_checkChanged_UInt;
fc_setValue = &xLocalTestClass::_setValue_UInt;
fc_parseValue = &xLocalTestClass::_parseValue_UInt;
} break;
case 'b': {
pMemory = &memory_LeftRight[bLRIndex].wLEDsRaw;
fc_CheckChanged = &xLocalTestClass::_checkChanged_2Bit;
fc_setValue = &xLocalTestClass::_setValue_2Bit;
fc_parseValue = &xLocalTestClass::_parseValue_UIntBinary;
} break;
case 'c': {
pMemory = &memory_System.bSlidingSwitch_Left;
fc_CheckChanged = &xLocalTestClass::_checkChanged_UInt;
fc_setValue = &xLocalTestClass::_setValue_Bool;
fc_parseValue = &xLocalTestClass::_parseValue_Bool;
} break;
} // end switch level2


// do things with function pointers
// remember Original Operation
byte bOperationOld = bOperation;
// do as long as Operation changes:
do {
bOperationOld = bOperation;
switch (bOperation) {
case hdOperation_GET: {
Serial.println(F("hdOperation_GET"));
*(uint16_t *) pValue = *(uint16_t *) pMemory;
}
case hdOperation_RECEIVE: {
Serial.println(F("hdOperation_RECEIVE"));
*pValue = (*this.*fc_parseValue)(caValue);
bOperation = hdOperation_SETINT;
} break;
case hdOperation_SETINT:
case hdOperation_SET: {
Serial.println(F("hdOperation_SET(INT)"));
// check if value changes:
if ((*this.*fc_CheckChanged)(pMemory, pValue, bBitIndex) ) {
// set value
(*this.*fc_setValue)(pMemory, pValue, bBitIndex);
// check if need to transmit new value
if (bOperation == hdOperation_SET) {
bOperation = hdOperation_TRANSMIT;
} else {
// callback 'ValueChanged'
}
}
} break;
case hdOperation_TRANSMIT:{
Serial.println(F("hdOperation_TRANSMIT"));
Serial.print(F(" MemoryValue:"));
Serial.println((*(uint16_t *)pMemory));
//printValue_Byte(streamCommunication, pMemory);
} break;
} // end switch bOperation
} while (bOperationOld != bOperation);

return 1;
};

i don't know if the described would be a 'nice' solution -
is there a other solution / way / concept for this problem out there?

i have appended my main sketch -
its a library so put it in your sketchbook/libraries/ folder. it contains a example.
this is the sketch for testing and developing all functionality..
short description what is does:
read the serial port.
if it receives a complete line (checks for line endings and prevents from internal buffer overflows...)
   parse this line.
   --> use the handleData function in 'hdOperation_RECEIVE' mode.
   
this handleData function is the main construct to interface the internal representation of the system data.
and my idea / goal ist to only have one interface for internal get / set and external transmit / receive operations
   

i hope someone has a tip / idea  about what ways to go with this... :-)

sunny greetings stefan
5  Using Arduino / Programming Questions / Re: function pointer & memory selection on: April 08, 2014, 07:33:11 am
Thanks for your quick responses.

@PaulS:
i don't know that - what would be the thing you prefere:
Code:
unsigned int
// or
uint16_t
i have read that the 'uint16_t' thing is the cleanest way - just harder to get for beginners?

@econjack:
thanks for the practical example ;-)
i tried around with some 'carst constructions' but they don't woked..
i used exactly this - big to small concept.
all functions and variables for handling data were the bigest typ. so i can use this to store smaller types in them...

if - in future i want to add some other datatypes to my system - (eventually bigger than the 2byte)
i think the best way is to use a void* pointer?!
i think i than have keep track on the used size the pointer is pointing to..
could this work? or do you have some other ideas to handle such a thing?
i some way i am unsure if the approach i try is the right thing for the task..

sunny greetings
stefan
6  Using Arduino / Programming Questions / function pointer & memory selection on: April 08, 2014, 06:24:26 am
Hi Community,

iam on my way to build a 'communication-interface' between some arduinos (using serial)
the concept is that every arduino knows all data of the hole system.
(changes are 'broadcastet' to every arduino)

at the moment iam writing the heart of the thing - the 'parse incoming / send data / set / get' handler.

on the main thing i use a big switch case to map the incoming id to the internal variable name.
as i have begin to write this big thing i came to the idea to use function pointers and variable pointers
so that in the switch case only the datatype handling is done -
and after this the real action (operation : receive / transmit / set / get) is done.

i have written a striped down sketch to test the concept.

my problem is that i don't know how to best handle the different datatypes that i have
(at the moment word, byte, boolean)

here the test sketch:
Code:
/*
Test sketch for function pointers and data handling

Public Domain
*/


class xLocalTestClass {
public:
// public consts :

static const byte state_NotValid = 11;
static const byte state_Standby = 12;

static const byte hdOperation_SET = 's';
static const byte hdOperation_SETINT = 'i';
static const byte hdOperation_GET = 'g';
static const byte hdOperation_RECEIVE = 'r';
static const byte hdOperation_TRANSMIT = 't';

private:
// per object data general

// ID
const byte cbID;
// flag to check if the begin function is already called and the class is ready to work.
boolean bReady;

// internal state
byte bState;

// Internal representation of complete 2ChControl System:

// left right
struct sSideIO {
byte bButtonStates;
byte bButtonEvent[5];
word wLEDsRaw;
int iFader_position_current;
int iFader_position_target;
byte bFader_touch;
word wRotaryEncoder_position;
};

// system
struct sSystem {
bool bSlidingSwitch_Left;
bool bSlidingSwitch_Right;
byte bSDCard_State;
byte bPowerMux_State;
word wPowerIN_Voltage;
word bInfoLEDsRaw;
};

// display
struct sDisplay {
byte bBGLight_State;
byte bBGLight_Value;
byte bContrast_State;
byte bContrast_Value;
};

sSideIO memory_LeftRight[2];
sSystem memory_System;
sDisplay memory_Display;

// private methods


bool checkChanged_Value(word *pMemory, word *pValue, byte bBitIndex) {
bool bResult = 0;
if (*pMemory != *pValue) {
bResult = 1;
}
return bResult;
}

bool checkChanged_2Bit(word *pMemory, word *pValue, byte bBitIndex) {
bool bResult = 0;
if (((*pMemory >> (bBitIndex*2)) & 0b0000000000000011) != *pValue) {
bResult = 1;
}
return bResult;
}

void setValue_Value(word *pMemory, word *pValue, byte bBitIndex) {
*pMemory = *pValue;
}

void setValue_2Bit(word *pMemory, word *pValue, byte bBitIndex) {
if (*pValue){
// set Bit
*pMemory |= (*pValue << (bBitIndex*2));
} else {
// clear Bit
*pMemory &= ~(*pValue << (bBitIndex*2));
}
}


public:
// Constructor
xLocalTestClass(
const byte cbID_New
) :
cbID(cbID_New)
{
//do some initialisation
bReady = false;
};

// Destructor
~xLocalTestClass() {
  // nothing to do here ?!
};


// public methods general

// get ID
const byte getID() {
return cbID;
};


// check if class is ready to operate.
boolean isReady() {
return bReady;
};


// start
void begin() {
if (bReady == false) {

bReady = true;
}
};

// update system
// returns state
byte update() {
byte bStateTemp = state_NotValid;
if (bReady) {
bStateTemp = bState;

} // end if bReady
return bStateTemp;
};

// public methods functional

// start Counting up to an given value; if Value is reached generates an state changed event.
byte test(byte bOperation, char cSwitchMemory, byte bBitIndex, word *pValue, word wValueReceive) {

// default to left
byte bLRIndex = 0;
if ( 1 != 1) {
// set to right
bLRIndex = 1;
}

// pointer to Memory Value
word *pMemory = NULL;


// tCbfuncCheckChanged fc_CheckChanged = NULL;
bool (xLocalTestClass::*fc_CheckChanged) (word *pMemory, word *pValue, byte bBitIndex) = NULL;
void (xLocalTestClass::*fc_SetValue) (word *pMemory, word *pValue, byte bBitIndex) = NULL;

switch (cSwitchMemory) {
case 'a': {
pMemory = &memory_LeftRight[bLRIndex].wRotaryEncoder_position;
fc_CheckChanged = &xLocalTestClass::checkChanged_Value;
fc_SetValue = &xLocalTestClass::setValue_Value;
} break;
case 'b': {
pMemory = &memory_LeftRight[bLRIndex].wLEDsRaw;
fc_CheckChanged = &xLocalTestClass::checkChanged_2Bit;
fc_SetValue = &xLocalTestClass::setValue_2Bit;
} break;
case 'c': {
pMemory = &memory_System.bSlidingSwitch_Left;
fc_CheckChanged = &xLocalTestClass::checkChanged_Value;
fc_SetValue = &xLocalTestClass::setValue_Value;
} break;
} // end switch level2


// do things with function pointers
// remember Original Operation
byte bOperationOld = bOperation;
// do as long as Operation changes:
do {
bOperationOld = bOperation;
switch (bOperation) {
case hdOperation_GET: {
Serial.println(F("hdOperation_GET"));
*pValue = *pMemory;
}
case hdOperation_RECEIVE: {
Serial.println(F("hdOperation_RECEIVE"));
//*pValue = getValue_Byte(caValue);
*pValue = wValueReceive;
bOperation = hdOperation_SETINT;
} break;
case hdOperation_SETINT:
case hdOperation_SET: {
Serial.println(F("hdOperation_SET(INT)"));
// check if value changes:
if ((*this.*fc_CheckChanged)(pMemory, pValue, bBitIndex) ) {
// set value
(*this.*fc_SetValue)(pMemory, pValue, bBitIndex);
// check if need to transmit new value
if (bOperation == hdOperation_SET) {
bOperation = hdOperation_TRANSMIT;
} else {
// callback 'ValueChanged'
}
}
} break;
case hdOperation_TRANSMIT:{
Serial.println(F("hdOperation_TRANSMIT"));
Serial.print(F(" MemoryValue:"));
Serial.println(*pMemory);
//printValue_Byte(streamCommunication, *pMemory);
} break;
} // end switch bOperation
} while (bOperationOld != bOperation);

return 1;
};


}; // end class slight_Test


xLocalTestClass myLocalTestObject(42);


void setup() {
Serial.println(F("test_functionpointer.ino"));

myLocalTestObject.begin();

word wValue = 0;
word *pValue = &wValue;

//byte test(byte bOperation, byte bSwitchMemory, byte bBitIndex, word *pValue, wValueReceive)
Serial.println(F("\t SET: pValue = &500;"));
*pValue = 500;
myLocalTestObject.test(xLocalTestClass::hdOperation_SET, 'a', 1, pValue, 0);

Serial.println(F("\t TRANSMIT:"));
myLocalTestObject.test(xLocalTestClass::hdOperation_TRANSMIT, 'a', 1, pValue, 0);

Serial.println(F("\t GET:"));
myLocalTestObject.test(xLocalTestClass::hdOperation_GET, 'a', 1, pValue, 0);
Serial.print(F("\t return value:"));
Serial.println(*pValue);

Serial.println(F("\t RECEIVE:"));
myLocalTestObject.test(xLocalTestClass::hdOperation_RECEIVE, 'a', 1, pValue, 0);
}

void loop() {
1;
}

Errors:
Code:
test_functionpointer.ino: In member function 'byte xLocalTestClass::test(byte, char, byte, word*, word)':
test_functionpointer:183: error: cannot convert 'bool*' to 'word*' in assignment
this is the problem with the different datatypes...

i think i could do something like this with an void* pointer??
or is there some from ground up other way to do something like this?

sunny greetings

stefan
7  International / Deutsch / Re: Text-Datei von SD Karte Zeile für Zeile auslesen... on: February 19, 2014, 03:20:02 am
Hi Matze,

ich hab mal ein 'Beispiel' gebastelt -
das geht ein bisschen weiter als das was du hier gefragt hast...

es 'analysiert' (parst) jede Zeile anhand des ersten Zeichens.
das Format sieht dann etwa so aus:
Code:
key:value
wobei bei key nur das erste Zeichend entscheidend ist - der value wird ab dem ':' ausgewertet-
bedeutet man kann nach dem ersten entscheidenden zeichen noch mehr zeichen benutzen um ein key zu beschreiben.
des weiteren wird jede Zeile die mit einer '#' startet als Kommentar ignoriert.

in dem Zip sind drei Test Dateien mit drin:
test1.txt Windows Zeilenenden
test2.txt Linux Zeilenenden
test3.txt Mac(alt) Zeilenenden

jede Zeile wird beim einlesen auf die länge geprüft -
wenn sie länger ist als der Interne Buffer wird der rest der Zeile ignoriert.
das erlaubt auch sehr lange kommentare.


das script hat auch ein Serielles Menu eingebaut -
die Baudrate vom Seriellen Monitor muss auf 115200 gestellt werden.

mit 'r' wird die Karte angesprochen und die drei Dateien nach einander eingelesen.

was man noch ergänzen könnte:
- Einlesen welche Dateien sich auf der Karte befinden
- Karten-Informationen auslesen

viel spaß damit - und wenn noch fragen - gerne fragen ;-)

sonnige grüße
stefan
8  Using Arduino / Programming Questions / Re: define type (struct) inside of class as public so that user can use it. on: February 12, 2014, 03:10:04 am
@pYro_65: thanks for the tip with 'static' - i have read throu some documentation now - you are right - i did not know what static really did.. ;-)

@andrewzuku: thanks for the tip to use pointers and declare the arrays outside of the struct!

now i think there are 'all' possible solutions in this thread:
  • Templates
  • Pointers
  • Dynamic allocation (maloc)
  • fixed array size

one idea for the pointer thing came to my mind: is it possible to declare on element of an struct as const
and initialize it in  initialiser list? like this?
Code:

struct testThing {
const byte sizeX;
word *mm_In;
word *mm_Out;
};

testThing ttNewTest = {4, wNewTest_In, wNewTest_Out}; // line 1
word wNewTest_In[ttNewTest.sizeX] = { 0, 100, 1000, 65535 }; // line 2
word wNewTest_Out[ttNewTest.sizeX] = { 0,   1,  200,   255 }; // line 3
// this gererates some errors:
// line 1: error: 'wNewTest_In' was not declared in this scope
// line 1: error: 'wNewTest_Out' was not declared in this scope
// line 2: error: array bound is not an integer constant
// line 3: error: array bound is not an integer constant

// that works.
const byte cbSize = 4;
word wNewTest2_In[cbSize] = { 0, 100, 1000, 65535 };
word wNewTest2_Out[cbSize] = { 0,   1,  200,   255 };
testThing ttNewTest2 = {cbSize, wNewTest2_In, wNewTest2_Out};
the first error is clear- the thing is not declared at this point.
i think there is a way to get around this but i dont remember..
i dont understand the second error - the member 'sizeX' is const - so why does the compiler dont like this?

just for my understanding:
when do i need the 'typedef' variant and when is it fine with just 'struct' ??

for me one important point is to write some easy to read and understand code.
(at least for me to easy understand it ;-) )
with an initializer list on an struct i have a clean block what belongs to one 'thing'
so you can 'catch' it while scrolling through the code...
with the pointers you have some 'ugly' extra variables... ;-)
it is just a personal taste.
in my current project i solved it with the 'fixed array size' way - i just set an 'maximal' allowed array size.
(its not the finest thing to have some unused empty memory blocked -
but hey its just one or two word values - if i run out of memory i know where to cut down usage..)
sunny greetings stefan
9  Using Arduino / Project Guidance / Re: Peltier heater Cooler changing current direction on: February 02, 2014, 04:16:19 pm
I think you can use a 'MotorDriver' IC for this - or build your H-Bridge with discrete components...
10  Using Arduino / Project Guidance / Re: need help with the coding on: February 02, 2014, 04:09:35 pm
pleas add some clear meaning to your theme title (edit first post).
so people know what your question is about.
if done a quick search - and found this Shield:
http://www.exp-tech.de/Displays/ITeadstudio-2-8-TFT-Touch-Shield-fuer-Arduino.html
pleas link to the thing you really use - so other can check what is all about.
and on the site i have linked is a demo code...
so it would be good to check out if you can get it to run...

sunny greetings
stefan
11  Using Arduino / Project Guidance / Re: Recommendation for sensor to use to detect human proximity - ultrasonic or IR ? on: February 02, 2014, 03:49:33 pm
check out the [ur=http://www.maxbotix.com/Ultrasonic_Sensors/Rangefinders.html]MaxBotix [/url]things. they are not cheap (about 25Euro) - but excellent in detecting and stable readings - i have used theme for an art installation. if you cam near the object the light goes on - lightlevel was mapped to the distance..

you can also try to use the sharp IR sensors. there are different types for different distances. i also used one of theme - but not for distance meassurement - i used it as 'beam-breaker' they are relative noisy and have an extreme small active area.

for 'only human' i think you can try to combine on of the above with an PIR Sensor
there are some presence sensor that use radar / microwaves.
but they are also expensive..

sunny greetings
stefan
12  Using Arduino / Project Guidance / Re: High-tech egg incubator controller on: February 02, 2014, 03:23:23 pm
for Motor Control there are shields like the
Arduino Motor Shield
or - as example look through the different models from pololu

i would consider to use an Rotary Encoder + one button as the input thing.
than you can make a menu with the lcd an don't need all the potentiometers..

sunny greetings
stefan
13  Using Arduino / Programming Questions / Re: define type (struct) inside of class as public so that user can use it. on: January 30, 2014, 03:58:23 am
Hi all,

thanks pYro_65 for the thing with the templates. the example is easy to understand as starting point - i will read some more about it..
for my current problem i have the feeling that the concept of templates are to 'heavy' / complicated.. eventually i want to use the struct also in the main code..

@PaulS i know that i cant make a run-time sizable array without malloc.
i only want to have a fixed sized array.
my idea was to have a struct so the things that belong together are written in one 'thing'
i also have no problem to move the struct definition out of my class. i only need this type for this class - so i tried to move it to local point as possible.

i try to explain / outline the idea i wish to achieve with some code examples:
struct
Code:
// that example does not work....
typedef struct {
static const byte size;
word mm_In[];
word mm_Out[];
} tmultimap;
and using it like this:
Code:
tmultimap tmultimapMyTestMap = {
4,
{     0,   100,  1000, 65535},
{     0,     1,   200,   255}
};

tmultimap tmultimapMyTestMap2 = {
3,
{     0,   100,   100},
{     0,     0,   200}
};
i hope i it is clear enough?!

as workaround i will use a fixed array size until i find a solution that fits in ;-)
so i have a 'maximal size'.

// some other thing:
is it possible to include libraries (*.h files) after some other code?
or should i include it at the first place in the main sketch?
at the moment i try to pack things logical - so i include my lib and than have the variables for this part. than comes the next include with the corresponding variables and so on..
(i had some unexpected behavior in my last test.. and moving the include to the top of the file fixed it..)

sunny greetings
stefan
14  Using Arduino / Programming Questions / define type (struct) inside of class as public so that user can use it. on: January 26, 2014, 03:33:41 pm
hi community,

my class uses the MultiMap function to calculate some values.
my idea was to define a 'new datatype' for the multimap.
that means a struct with 'size' filed and 'in' and 'out' arrays
i wanted to make this only available through the class.
so i defined this struct in the public area of the class definition:
Code:
// Class Definition:
class slight_Test {
public:
// public typedefs:

// variant 1
typedef struct {
byte size = 4;
word mm_In[4];
word mm_Out[4];
} tmultimap;

// variant 2
// struct sMultiMap {
// static const byte size;
// word mm_In[size];
// word mm_Out[size];
// };
// typedef struct sMultiMap tmultimap;
....
there are two variants.
both generates some errors if  try to compile them and have used this type this way in my sketch:
Code:
slight_Test::tmultimap tmultimapMyTestMap = {
4,
{     0,   100,  1000, 65535},
{     0,     1,   200,   255}
};
variant 1 errors:
Code:
slight_Test_LibDev.ino: At global scope:
slight_Test_LibDev.ino:111: warning: missing braces around initializer for 'word [4]'
slight_Test_LibDev:111: error: braces around scalar initializer for type 'word'

if i uncomment the other version (variant 2) i get this errors:
Code:
In file included from slight_Test_LibDev.ino:104:
C:\...\arduino_sketchbook\libraries\slight_Test/slight_Test.h: At global scope:
C:\...\arduino_sketchbook\libraries\slight_Test/slight_Test.h:61: error: array bound is not an integer constant
C:\...\arduino_sketchbook\libraries\slight_Test/slight_Test.h:62: error: array bound is not an integer constant
i do not understand this error - size is defined as static and const ?! what other way to go?

variant2 is the think i really want to do.
is this the right way?
i think i could do something like this with an class definition and malloc in the constructor as i found in Pass array size to class constructor
but is it possible to declare a class in an class??
so is there a 'easy' way to do this just with structs or is there a other way?

i added an zip file with the test library / test class.
i also added the files separated so you just can open it for a short look without unpacking the zip.
this class does nothing useful..
its just for testing concepts..

i hope there is someone that can help me to learn some more about c++ concepts and how to do such things  ;-)

sunny greetings
stefan
15  International / Deutsch / Re: Client und Server zugleich möglich? on: January 26, 2014, 08:14:04 am
Hi Haustechno,

also ich habe schon einen UDP-Empfänger, UDP-Sender und 'Telnet-Server' gleichzeitig laufen gehabt.
also bei mir gings -
allerdings müsstest du sonst mal genauer specifizieren / beschreiben wie du dir das vorstellst bzw. was die gegenstelle ist...

sonnige grüße
stefan
Pages: [1] 2 3 ... 6