-
Dependencies: CommandHandler HygroClip2 InterruptBasedEncoder SPI_TFT_ILI9341 mbed-src-no-hal
LineGraph.h@4:47fd4584df95, 2016-04-05 (annotated)
- Committer:
- wolfsberger
- Date:
- Tue Apr 05 14:00:51 2016 +0000
- Revision:
- 4:47fd4584df95
- Parent:
- 3:3ef8c2d7b1bf
-
Who changed what in which revision?
User | Revision | Line number | New 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 |