|
class Graph{ //ContentType (1)
|
|
private:
|
|
|
|
String title;
|
|
char graphType; //'a' Vertical Bar, 'b' Horizontal Bar, 'c' Cartesian Graph
|
|
|
|
//Assign whatever value in "configure(..." if a parameter is not required for the specified graphType
|
|
|
|
double value; //For: Vertical Bar Horizontal Bar Cartesian
|
|
double xpos; //For: Vertical Bar Horizontal Bar Cartesian
|
|
double ypos; //For: Vertical Bar Horizontal Bar Cartesian
|
|
double height; //For: Vertical Bar Horizontal Bar Cartesian
|
|
double width; //For: Vertical Bar Horizontal Bar Cartesian
|
|
double yminimum; //For: Vertical Bar Cartesian
|
|
double ymaximum; //For: Vertical Bar Cartesian
|
|
double xminimum; //For: Horizontal Bar Cartesian
|
|
double xmaximum; //For: Horizontal Bar Cartesian
|
|
double yStepSize; //For: Vertical Bar Cartesian
|
|
double xStepSize; //For: Horizontal Bar Cartesian
|
|
int digit; //For: Vertical Bar Horizontal Bar Cartesian
|
|
int * maximum;
|
|
double x;
|
|
double yrange;
|
|
double xrange;
|
|
double ox;
|
|
double oy;
|
|
double count;
|
|
double graphScale;
|
|
bool redraw = true;
|
|
|
|
int previousScreen = 0;
|
|
int previousContentType = 0;
|
|
|
|
public:
|
|
|
|
//This method configures the graph created, defines its parameters according the type of graph selected.
|
|
void configure(String title, char graphType, double xpos, double ypos, double width, double height,
|
|
double yminimum, double ymaximum, double xminimum, double xmaximum, double yStepSize, double xStepSize, int digit, void *maximum){
|
|
this->title = title;
|
|
this->graphType = graphType;
|
|
this->yminimum = yminimum;
|
|
this->ymaximum = ymaximum;
|
|
this->xminimum = xminimum;
|
|
this->count = xminimum;
|
|
this->xmaximum = xmaximum;
|
|
this->height = height;
|
|
this->width = width;
|
|
this->yStepSize = yStepSize;
|
|
this->xStepSize = xStepSize;
|
|
this->digit = digit;
|
|
this->xpos = xpos;
|
|
this->ypos = ypos;
|
|
this->maximum = (int *) maximum;
|
|
switch(graphType){
|
|
case 'a':
|
|
this->yrange = ymaximum - yminimum;
|
|
this->graphScale = (yStepSize) * (height / this->yrange) - .001; //Adjusts the scale of the graph, according to the range and the size of the step
|
|
break;
|
|
|
|
case 'b':
|
|
this->xrange = xmaximum - xminimum;
|
|
this->graphScale = (xStepSize) * (width / this->xrange) - .001; //Adjusts the scale of the graph, according to the range and the size of the step
|
|
break;
|
|
|
|
case 'c':
|
|
this->yrange = ymaximum - yminimum;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void drawGraph(){
|
|
double level, data, i;
|
|
switch(graphType){
|
|
case 'a':
|
|
double my;
|
|
|
|
if (this->redraw) { //Prints the labels
|
|
display.clearDisplay();
|
|
this->redraw = false;
|
|
display.fillRect(0, 0, 127 , 14, SSD1306_WHITE);
|
|
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
|
|
display.setTextSize(1);
|
|
display.setCursor(2, 4);
|
|
display.println(this->title);
|
|
|
|
for (i = 0; i <= this->height; i += this->graphScale) {
|
|
my = this->ypos - this->height + i;
|
|
display.drawFastHLine(this->xpos + this->width + 1, my, 5, SSD1306_WHITE);
|
|
// draw lables
|
|
display.setTextSize(1);
|
|
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
|
|
display.setCursor(this->xpos + this->width + 12, my - 3 );
|
|
data = this->ymaximum - ( i * (this->yStepSize / this->graphScale));
|
|
display.print(data, this->digit);
|
|
}
|
|
}
|
|
// compute level of bar graph that is scaled to the height and the hi and low vals
|
|
// this is needed to accompdate for +/- range
|
|
level = (this->height * (((this->value - this->yminimum) / (this->yrange))));
|
|
// draw the bar graph
|
|
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
|
|
display.drawRect(this->xpos, this->ypos - this->height, this->width, this->height, SSD1306_WHITE);
|
|
display.fillRect(this->xpos, this->ypos - this->height, this->width, this->height - level, SSD1306_BLACK);
|
|
display.drawRect(this->xpos, this->ypos - this->height, this->width, this->height, SSD1306_WHITE);
|
|
display.fillRect(this->xpos, this->ypos - level, this->width, level, SSD1306_WHITE);
|
|
// up until now print sends data to a video buffer NOT the screen
|
|
// this call sends the data to the screen
|
|
display.display();
|
|
break;
|
|
|
|
case 'b':
|
|
|
|
if (this->redraw) {
|
|
display.clearDisplay();
|
|
this->redraw = false;
|
|
display.fillRect(0, 0, 127 , 16, SSD1306_WHITE);
|
|
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
|
|
display.setTextSize(1);
|
|
display.setCursor(2, 4);
|
|
display.println(this->title);
|
|
// draw the text
|
|
|
|
for (i = 0; i <= this->width; i += this->graphScale) {
|
|
display.drawFastVLine(i + this->xpos , this->ypos , 5, SSD1306_WHITE);
|
|
// draw lables
|
|
display.setTextSize(1);
|
|
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
|
|
display.setCursor(i + this->xpos , this->ypos + 10);
|
|
// addling a small value to eliminate round off errors
|
|
// this val may need to be adjusted
|
|
data = ( i * (this->xStepSize / this->graphScale)) + this->xminimum + 0.00001;
|
|
display.print(data, this->digit);
|
|
}
|
|
}
|
|
// compute level of bar graph that is scaled to the width and the hi and low vals
|
|
// this is needed to accompdate for +/- range capability
|
|
// draw the bar graph
|
|
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
|
|
level = (this->width * (((this->value - this->xminimum) / (this->xmaximum - this->xminimum))));
|
|
display.fillRect(this->xpos + level, this->ypos - this->height, this->width - level, this->height, SSD1306_BLACK);
|
|
display.drawRect(this->xpos, this->ypos - this->height, this->width, this->height, SSD1306_WHITE);
|
|
display.fillRect(this->xpos, this->ypos - this->height, level, this->height, SSD1306_WHITE);
|
|
// up until now print sends data to a video buffer NOT the screen
|
|
// this call sends the data to the screen
|
|
display.display();
|
|
break;
|
|
|
|
case 'c':
|
|
double temp;
|
|
|
|
if (this->redraw == true) {
|
|
this->redraw = false;
|
|
this->xrange = *this->maximum - xminimum;
|
|
display.clearDisplay();
|
|
display.fillRect(0, 0, 127 , 16, SSD1306_WHITE);
|
|
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
|
|
display.setTextSize(1);
|
|
display.setCursor(2, 4);
|
|
display.println(title);
|
|
this->ox = (this->count - this->xminimum) * (this->width) / (this->xrange) + this->xpos;
|
|
this->oy = (this->value - this->yminimum) * (- this->height) / (this->yrange) + this->ypos;
|
|
// draw y scale
|
|
display.setTextSize(1);
|
|
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
|
|
for ( i = this->yminimum; i <= this->ymaximum; i += this->yStepSize) {
|
|
// compute the transform
|
|
// note my transform funcition is the same as the map function, except the map uses long and we need doubles
|
|
temp = (i - this->yminimum) * (- this->height) / (this->ymaximum - this->yminimum) + this->ypos;
|
|
if (i == 0) {
|
|
display.drawFastHLine(this->xpos - 3, temp, this->width + 3, SSD1306_WHITE);
|
|
}
|
|
else {
|
|
display.drawFastHLine(this->xpos - 3, temp, 3, SSD1306_WHITE);
|
|
}
|
|
display.setCursor(this->xpos - 27, temp - 3);
|
|
display.println(i, this->digit);
|
|
}
|
|
// draw x scale
|
|
for (i = this->xminimum; i <= *this->maximum; i += this->xStepSize) {
|
|
// compute the transform
|
|
display.setTextSize(1);
|
|
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
|
|
temp = (i - this->xminimum) * (this->width) / (this->xrange) + this->xpos;
|
|
if (i == 0) {
|
|
display.drawFastVLine(temp, this->ypos - this->height, this->height + 3, SSD1306_WHITE);
|
|
}
|
|
else {
|
|
display.drawFastVLine(temp, this->ypos, 3, SSD1306_WHITE);
|
|
}
|
|
display.setCursor(temp, this->ypos + 6);
|
|
display.println(i, this->digit);
|
|
}
|
|
}
|
|
|
|
// graph drawn now plot the data
|
|
// the entire plotting code are these few lines...
|
|
|
|
this->x = (this->count - this->xminimum) * (this->width) / (this->xrange) + this->xpos;
|
|
this->value = (this->value - this->yminimum) * (- this->height) / (this->yrange) + this->ypos;
|
|
display.drawLine(this->ox, this->oy, this->x, this->value, SSD1306_WHITE);
|
|
display.drawLine(this->ox, this->oy - 1, this->x, this->value - 1, SSD1306_WHITE);
|
|
this->ox = this->x;
|
|
this->oy = this->value;
|
|
|
|
// up until now print sends data to a video buffer NOT the screen
|
|
// this call sends the data to the screen
|
|
display.display();
|
|
this->count += 1;
|
|
if(this->ox >= (this->xpos + this->width)){
|
|
this->redraw = true;
|
|
this->count = xminimum;
|
|
}
|
|
}
|
|
}
|
|
|
|
void redrawFlag(){ // Activates the redraw bool to get the graph printed correctly
|
|
this->redraw = true;
|
|
this->count = xminimum;
|
|
}
|
|
|
|
void setPreviousScreen(int prev){
|
|
this->previousScreen = prev;
|
|
}
|
|
|
|
void setPreviousContentType(int prev){
|
|
this->previousContentType = prev;
|
|
}
|
|
|
|
int getPreviousScreen(){
|
|
int prev = this->previousScreen;
|
|
return prev;
|
|
}
|
|
|
|
int getPreviousContentType(){
|
|
int prev = this->previousContentType;
|
|
return prev;
|
|
}
|
|
|
|
void assignValue(double value){
|
|
this->value = value;
|
|
}
|
|
|
|
void reset(){
|
|
this->x = 0;
|
|
}
|
|
|
|
};
|