wildbill,
I have tested that scenario and you are correct, using the vars breaks the pointer indexing as you predicted.
Actually that is good to know, because I understand it now.
So I am using arrays like I started with .... Only better now I have some idea what I am doing ...
This is working, thanks everyone.
// Test data
float BatVolts = 13.5;
float ACVolts = 236;
float WindSpeed = 3;
float PVCurrent = 20;
typedef struct{ // new type (xVar - Exposed variables)
char Name[10];
float * Ptr;
}xVar;
float * ValPtr;
xVar ExposedVars[20]; // make an array of xVars
void MapFloatName(float * NewVarPtr, char NewName[]){ // function to build array data, fetching the pointer in the process
static int VarCount = 0;
ExposedVars[VarCount].Ptr = NewVarPtr;
strcpy (ExposedVars[VarCount].Name,NewName);
VarCount++;
}
float * GetVarRef(char VarName[]){ // function to lookup names and return a pointer to the apropriate variable
int iLoopCount = 0;
while(strlen(ExposedVars[iLoopCount].Name) > 0){
Serial.print(VarName);
Serial.print(" <-> ");
Serial.println(ExposedVars[iLoopCount].Name);
if(strcmp(ExposedVars[iLoopCount].Name,VarName)==0)
{
Serial.print(VarName);
Serial.print(" found @ ");
Serial.print(iLoopCount);
return ExposedVars[iLoopCount].Ptr;
}
iLoopCount++;
}
Serial.print(VarName);
Serial.println(" not found");
return NULL;
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void setup()
{
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
Serial.begin(9600);
Serial.println(freeRam ());
MapFloatName(& BatVolts,"BatVolts");
MapFloatName(& ACVolts,"ACVolts");
MapFloatName(& BatVolts,"WindSpeed");
MapFloatName(& ACVolts,"PVCurrent");
Serial.println(freeRam ());
Serial.println("");
ValPtr = GetVarRef("BatVolts");
if(ValPtr){
Serial.print(" Value is ");
Serial.println(* ValPtr);
}
Serial.println("");
ValPtr = GetVarRef("BadName1");
if(ValPtr){
Serial.print(" Value is ");
Serial.println(* ValPtr);
}
Serial.println("");
ValPtr = GetVarRef("ACVolts");
if(ValPtr){
Serial.print(" Value is ");
Serial.println(* ValPtr);
}
Serial.println("");
ValPtr = GetVarRef("PVCurrent");
if(ValPtr){
Serial.print(" Value is ");
Serial.println(* ValPtr);
}
Serial.println("");
ValPtr = GetVarRef("WindSpeed");
if(ValPtr){
Serial.print(" Value is ");
Serial.println(* ValPtr);
}
Serial.println("");
ValPtr = GetVarRef("BadName2");
if(ValPtr){
Serial.print(" Value is ");
Serial.println(* ValPtr);
}
Serial.println("");
}
void loop()
{
digitalWrite(13,!digitalRead(13));
delay(250);
}