-
Dependencies: CommandHandler HygroClip2 InterruptBasedEncoder SPI_TFT_ILI9341 mbed-src-no-hal
LineGraph.h@0:9ed7238d49e2, 2016-02-16 (annotated)
- Committer:
- wolfsberger
- Date:
- Tue Feb 16 11:35:36 2016 +0000
- Revision:
- 0:9ed7238d49e2
- Child:
- 2:81fc8f80fdb4
OK
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 | 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 |