-

Dependencies:   CommandHandler HygroClip2 InterruptBasedEncoder SPI_TFT_ILI9341 mbed-src-no-hal

Committer:
wolfsberger
Date:
Tue Feb 16 11:35:36 2016 +0000
Revision:
0:9ed7238d49e2
Child:
2:81fc8f80fdb4
OK

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfsberger 0:9ed7238d49e2 1 #ifndef LINEGRAPH_H_
wolfsberger 0:9ed7238d49e2 2 #define LINEGRAPH_H_
wolfsberger 0:9ed7238d49e2 3
wolfsberger 0:9ed7238d49e2 4 #include "SPI_TFT_ILI9341.h"
wolfsberger 0:9ed7238d49e2 5
wolfsberger 0:9ed7238d49e2 6 template <size_t itemCount>
wolfsberger 0:9ed7238d49e2 7 class LineGraph
wolfsberger 0:9ed7238d49e2 8 {
wolfsberger 0:9ed7238d49e2 9 public:
wolfsberger 0:9ed7238d49e2 10 LineGraph(SPI_TFT_ILI9341 * tft, int x, int y, int width, int height, int min, int max)
wolfsberger 0:9ed7238d49e2 11 : tft_(tft), x_(x), y_(y), width_(width), height_(height), min_(min), max_(max)
wolfsberger 0:9ed7238d49e2 12 {
wolfsberger 0:9ed7238d49e2 13 /*memset(dataOld_,-1.0f,itemCount*sizeof(float));
wolfsberger 0:9ed7238d49e2 14 memset(dataNew_,-1.0f,itemCount*sizeof(float));*/
wolfsberger 0:9ed7238d49e2 15 for(size_t i = 0; i<itemCount; i++)
wolfsberger 0:9ed7238d49e2 16 {
wolfsberger 0:9ed7238d49e2 17 dataOld_[i] = static_cast<float>(min) - 1.0f;
wolfsberger 0:9ed7238d49e2 18 dataNew_[i] = static_cast<float>(min) - 1.0f;
wolfsberger 0:9ed7238d49e2 19 }
wolfsberger 0:9ed7238d49e2 20 }
wolfsberger 0:9ed7238d49e2 21
wolfsberger 0:9ed7238d49e2 22 void addItem(float value)
wolfsberger 0:9ed7238d49e2 23 {
wolfsberger 0:9ed7238d49e2 24 if (!isInRange(value))
wolfsberger 0:9ed7238d49e2 25 {
wolfsberger 0:9ed7238d49e2 26 value = min_-1;
wolfsberger 0:9ed7238d49e2 27 }
wolfsberger 0:9ed7238d49e2 28
wolfsberger 0:9ed7238d49e2 29 memcpy(dataOld_,dataNew_,(itemCount)*sizeof(float));
wolfsberger 0:9ed7238d49e2 30 memmove(dataNew_,dataNew_+1,(itemCount-1)*sizeof(float));
wolfsberger 0:9ed7238d49e2 31 dataNew_[itemCount-1] = value;
wolfsberger 0:9ed7238d49e2 32 }
wolfsberger 0:9ed7238d49e2 33
wolfsberger 0:9ed7238d49e2 34 void draw(int color)
wolfsberger 0:9ed7238d49e2 35 {
wolfsberger 0:9ed7238d49e2 36 float pointStepSize = static_cast<float>(width_) / static_cast<float>(itemCount-1);
wolfsberger 0:9ed7238d49e2 37
wolfsberger 0:9ed7238d49e2 38 for (size_t index = 1; index < itemCount; index++)
wolfsberger 0:9ed7238d49e2 39 {
wolfsberger 0:9ed7238d49e2 40 size_t indexItem1 = index - 1;
wolfsberger 0:9ed7238d49e2 41 size_t indexItem2 = index;
wolfsberger 0:9ed7238d49e2 42
wolfsberger 0:9ed7238d49e2 43 float x1 = 1 + pointStepSize * static_cast<float>(indexItem1);
wolfsberger 0:9ed7238d49e2 44 float x2 = 1 + pointStepSize * static_cast<float>(indexItem2);
wolfsberger 0:9ed7238d49e2 45
wolfsberger 0:9ed7238d49e2 46 float y1Old = scaleY(dataOld_[indexItem1]);
wolfsberger 0:9ed7238d49e2 47 float y2Old = scaleY(dataOld_[indexItem2]);
wolfsberger 0:9ed7238d49e2 48
wolfsberger 0:9ed7238d49e2 49 tft_->line(x1, y1Old, x2, y2Old, Black);
wolfsberger 0:9ed7238d49e2 50
wolfsberger 0:9ed7238d49e2 51 if ((dataNew_[indexItem1] == (min_-1)) ||
wolfsberger 0:9ed7238d49e2 52 (dataNew_[indexItem2] == (min_-1)))
wolfsberger 0:9ed7238d49e2 53 {
wolfsberger 0:9ed7238d49e2 54 continue;
wolfsberger 0:9ed7238d49e2 55 }
wolfsberger 0:9ed7238d49e2 56
wolfsberger 0:9ed7238d49e2 57 float y1New = scaleY(dataNew_[indexItem1]);
wolfsberger 0:9ed7238d49e2 58 float y2New = scaleY(dataNew_[indexItem2]);
wolfsberger 0:9ed7238d49e2 59
wolfsberger 0:9ed7238d49e2 60 tft_->line(x1, y1New, x2, y2New, color);
wolfsberger 0:9ed7238d49e2 61 }
wolfsberger 0:9ed7238d49e2 62 }
wolfsberger 0:9ed7238d49e2 63 private:
wolfsberger 0:9ed7238d49e2 64 float scaleY(float ypos)
wolfsberger 0:9ed7238d49e2 65 {
wolfsberger 0:9ed7238d49e2 66 static float valueRange = static_cast<float>(max_-min_);
wolfsberger 0:9ed7238d49e2 67 static float buttomOfGraph = static_cast<float>(y_+height_);
wolfsberger 0:9ed7238d49e2 68
wolfsberger 0:9ed7238d49e2 69 if (ypos < min_)
wolfsberger 0:9ed7238d49e2 70 ypos = min_;
wolfsberger 0:9ed7238d49e2 71 if (ypos > max_)
wolfsberger 0:9ed7238d49e2 72 ypos = max_;
wolfsberger 0:9ed7238d49e2 73
wolfsberger 0:9ed7238d49e2 74 float scaled = buttomOfGraph - (height_ * (ypos / valueRange));
wolfsberger 0:9ed7238d49e2 75
wolfsberger 0:9ed7238d49e2 76 return scaled;
wolfsberger 0:9ed7238d49e2 77 }
wolfsberger 0:9ed7238d49e2 78 bool isInRange(float value)
wolfsberger 0:9ed7238d49e2 79 {
wolfsberger 0:9ed7238d49e2 80 return value > min_ &&
wolfsberger 0:9ed7238d49e2 81 value < max_;
wolfsberger 0:9ed7238d49e2 82 }
wolfsberger 0:9ed7238d49e2 83
wolfsberger 0:9ed7238d49e2 84 float dataOld_[itemCount];
wolfsberger 0:9ed7238d49e2 85 float dataNew_[itemCount];
wolfsberger 0:9ed7238d49e2 86 SPI_TFT_ILI9341 * tft_;
wolfsberger 0:9ed7238d49e2 87 int x_;
wolfsberger 0:9ed7238d49e2 88 int y_;
wolfsberger 0:9ed7238d49e2 89 int width_;
wolfsberger 0:9ed7238d49e2 90 int height_;
wolfsberger 0:9ed7238d49e2 91 int min_;
wolfsberger 0:9ed7238d49e2 92 int max_;
wolfsberger 0:9ed7238d49e2 93 };
wolfsberger 0:9ed7238d49e2 94
wolfsberger 0:9ed7238d49e2 95 #endif