-

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

Committer:
wolfsberger
Date:
Tue Mar 15 07:46:06 2016 +0000
Revision:
3:3ef8c2d7b1bf
Parent:
2:81fc8f80fdb4
Reimported from emblocks

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