GoogleChart.

Dependents:   GoogleChart_TestProgram

Files at this revision

API Documentation at this revision

Comitter:
shintamainjp
Date:
Tue Aug 17 09:21:55 2010 +0000
Commit message:

Changed in this revision

Axis.cpp Show annotated file Show diff for this revision Revisions of this file
Axis.h Show annotated file Show diff for this revision Revisions of this file
DataSet.cpp Show annotated file Show diff for this revision Revisions of this file
DataSet.h Show annotated file Show diff for this revision Revisions of this file
GoogleChart.cpp Show annotated file Show diff for this revision Revisions of this file
GoogleChart.h Show annotated file Show diff for this revision Revisions of this file
GoogleChartLineChart.cpp Show annotated file Show diff for this revision Revisions of this file
GoogleChartLineChart.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Axis.cpp	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,40 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#include "Axis.h"
+
+Axis::Axis(int number, Type type) : number(number), type(type), rangeStart(0), rangeEnd(100) {}
+
+Axis::~Axis() {}
+
+int Axis::getNumber() const {
+    return number;
+}
+
+void Axis::setType(Axis::Type type) {
+    Axis::type = type;
+}
+
+Axis::Type Axis::getType() const {
+    return type;
+}
+
+void Axis::setRangeStart(int rangeStart) {
+    Axis::rangeStart = rangeStart;
+}
+
+int Axis::getRangeStart() const {
+    return rangeStart;
+}
+
+void Axis::setRangeEnd(int rangeEnd) {
+    Axis::rangeEnd = rangeEnd;
+}
+
+int Axis::getRangeEnd() const {
+    return rangeEnd;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Axis.h	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,39 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#ifndef _AXIS_H_
+#define _AXIS_H_
+
+class Axis {
+public:
+    typedef enum {
+        Bottom,
+        Left,
+        Right,
+        Top
+    } Type;
+    
+    Axis(int number, Type type = Bottom);
+    ~Axis();
+    
+    int getNumber() const;
+    void setType(Type type);
+    Type getType() const;
+    void setRangeStart(int rangeStart);
+    int getRangeStart() const;
+    void setRangeEnd(int rangeEnd);
+    int getRangeEnd() const;
+    
+private:
+
+    const int number;
+    Type type;
+    int rangeStart;
+    int rangeEnd;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataSet.cpp	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,54 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#include "DataSet.h"
+
+DataSet::DataSet(std::string label, int number, int size, DataSet::EncodeType encodeType)
+        :
+        label(label), number(number), size(size), encodeType(encodeType), dataCount(0), min(0), max(100) {
+    datalist = new double[size];
+}
+
+DataSet::~DataSet() {
+    delete [] datalist;
+}
+
+std::string DataSet::getLabel() {
+    return label;
+}
+
+int DataSet::getNumber() {
+    return number;
+}
+
+int DataSet::getSize() {
+    return size;
+}
+
+void DataSet::setEncodeType(DataSet::EncodeType encodeType) {
+    DataSet::encodeType = encodeType;
+}
+
+DataSet::EncodeType DataSet::getEncodeType() {
+    return encodeType;
+}
+
+void DataSet::clearAllData() {
+    dataCount = 0;
+}
+
+void DataSet::addData(double data) {
+    datalist[dataCount++] = data;
+}
+
+int DataSet::getDataCount() {
+    return dataCount;
+}
+
+double DataSet::getData(int index) {
+    return datalist[index];
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataSet.h	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,54 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#ifndef _DATA_SET_H_
+#define _DATA_SET_H_
+
+#include <string>
+
+class DataSet {
+public:
+    typedef enum {
+        Simple,
+        Extended,
+        Text
+    } EncodeType;
+    
+    DataSet(std::string label, int number, int size, EncodeType encodeType = Text);
+    ~DataSet();
+    
+    std::string getLabel();
+    int getNumber();
+    int getSize();
+    void setEncodeType(EncodeType encodeType);
+    EncodeType getEncodeType();
+    
+    void clearAllData();
+    void addData(double data);
+    int getDataCount();
+    double getData(int index);
+    
+    void setScale(double min, double max) {
+        DataSet::min = min;
+        DataSet::max = max;
+    }
+    double getMin() { return min; }
+    double getMax() { return max; }
+    
+private:
+
+    const std::string label;
+    const int number;
+    const int size;
+    EncodeType encodeType;
+    double *datalist;
+    int dataCount;
+    double min;
+    double max;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GoogleChart.cpp	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,339 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#include "GoogleChart.h"
+
+const std::string GoogleChart::baseURL = "http://chart.apis.google.com/chart";
+
+GoogleChart::GoogleChart() : title(""), width(300), height(225) {
+    for (int i = 0; i < MAX_AXIS; i++) {
+        axislist[i] = 0;
+    }
+    for (int i = 0; i < MAX_DATA; i++) {
+        datalist[i] = 0;
+    }
+}
+
+GoogleChart::~GoogleChart() {}
+
+int GoogleChart::addNewAxis(Axis::Type type) {
+    /*
+     * Search maximum number of axis.
+     */
+    int max = 0;
+    for (int i = 0; i < MAX_AXIS; i++) {
+        if (0 != axislist[i]) {
+            if (axislist[i]->getNumber() > max) {
+                max = axislist[i]->getNumber();
+            }
+        }
+    }
+
+    /*
+     * Create a new axis.
+     */
+    for (int i = 0; i < MAX_AXIS; i++) {
+        if (0 == axislist[i]) {
+            axislist[i] = new Axis(max + 1, type);
+            return max + 1;
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::setAxisType(const int number, Axis::Type type) {
+    for (int i = 0; i < MAX_AXIS; i++) {
+        if (0 != axislist[i]) {
+            if (axislist[i]->getNumber() == number) {
+                axislist[i]->setType(type);
+                return number;
+            }
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::setAxisRange(const int number, int rangeStart, int rangeEnd) {
+    for (int i = 0; i < MAX_AXIS; i++) {
+        if (0 != axislist[i]) {
+            if (axislist[i]->getNumber() == number) {
+                axislist[i]->setRangeStart(rangeStart);
+                axislist[i]->setRangeEnd(rangeEnd);
+                return number;
+            }
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::removeAxis(const int number) {
+    for (int i = 0; i < MAX_AXIS; i++) {
+        if (0 != axislist[i]) {
+            if (axislist[i]->getNumber() == number) {
+                delete axislist[i];
+                axislist[i] = 0;
+                return number;
+            }
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::addNewDataSet(std::string label, const int size) {
+    /*
+     * Search maximum number of data set.
+     */
+    int max = 0;
+    for (int i = 0; i < MAX_DATA; i++) {
+        if (0 != datalist[i]) {
+            if (datalist[i]->getNumber() > max) {
+                max = datalist[i]->getNumber();
+            }
+        }
+    }
+
+    /*
+     * Create a new data set.
+     */
+    for (int i = 0; i < MAX_DATA; i++) {
+        if (0 == datalist[i]) {
+            datalist[i] = new DataSet(label, max + 1, size);
+            return max + 1;
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::removeDataSet(const int number) {
+    for (int i = 0; i < MAX_DATA; i++) {
+        if (0 != datalist[i]) {
+            if (datalist[i]->getNumber() == number) {
+                delete datalist[i];
+                datalist[i] = 0;
+                return number;
+            }
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::addData(const int number, double data) {
+    for (int i = 0; i < MAX_DATA; i++) {
+        if (0 != datalist[i]) {
+            if (datalist[i]->getNumber() == number) {
+                datalist[i]->addData(data);
+                return i;
+            }
+        }
+    }
+    return -1;
+}
+
+int GoogleChart::clearAllData(const int number) {
+    for (int i = 0; i < MAX_DATA; i++) {
+        if (0 != datalist[i]) {
+            if (datalist[i]->getNumber() == number) {
+                datalist[i]->clearAllData();
+                return i;
+            }
+        }
+    }
+    return -1;
+}
+
+    int GoogleChart::setDataScale(const int number, int min, int max) {
+    for (int i = 0; i < MAX_DATA; i++) {
+        if (0 != datalist[i]) {
+            if (datalist[i]->getNumber() == number) {
+                datalist[i]->setScale(min, max);
+                return i;
+            }
+        }
+    }
+    return -1;
+    }
+
+void GoogleChart::setTitle(std::string title) {
+    GoogleChart::title = title;
+}
+
+std::string GoogleChart::getTitle() const {
+    return title;
+}
+
+void GoogleChart::setWidth(int width) {
+    GoogleChart::width = width;
+}
+
+int GoogleChart::getWidth() const {
+    return width;
+}
+
+void GoogleChart::setHeight(int height) {
+    GoogleChart::height = height;
+}
+
+int GoogleChart::getHeight() const {
+    return height;
+}
+
+std::string GoogleChart::toURL(std::string text) {
+    static const char *unsafe_characters = " \"<>#%{}|\\^~[]`";
+    std::string s = "";
+    for (int i = 0; i < text.length(); i++) {
+        char c = text.at(i);
+        if (strchr(unsafe_characters, c) == NULL) {
+            s = s + c;
+        } else {
+            char buf[8];
+            snprintf(buf, sizeof(buf), "%%%02X", c & 0xff);
+            s = s + std::string(buf);
+        }
+    }
+    return s;
+}
+
+std::string GoogleChart::paramChartType(ChartType chartType) {
+    /*
+     * Chart Type.
+     */
+    std::string s = "cht=";
+    switch (chartType) {
+        case LineChart:
+            s = s + "lc";
+            break;
+        default:
+            s = s + "unknown";
+            break;
+    }
+    return s;
+}
+
+std::string GoogleChart::paramAxis(Axis **list, int size) {
+
+    char buf[64];
+    /*
+     * Axis type and range.
+     */
+    int cnt = 0;
+    std::string sType = "chxt=";
+    std::string sRange = "chxr=";
+    for (int i = 0; i < size; i++) {
+        Axis *p = list[i];
+        if (0 != p) {
+            /*
+             * Type.
+             */
+            if (0 < cnt) {
+                sType = sType + ",";
+            }
+            switch (p->getType()) {
+                case Axis::Bottom:
+                    sType = sType + "x";
+                    break;
+                case Axis::Left:
+                    sType = sType + "y";
+                    break;
+                case Axis::Right:
+                    sType = sType + "r";
+                    break;
+                case Axis::Top:
+                    sType = sType + "t";
+                    break;
+                default:
+                    sType = sType + "?";
+                    break;
+            }
+            /*
+             * Range.
+             */
+            if (0 < cnt) {
+                sRange = sRange + "|";
+            }
+            snprintf(buf, sizeof(buf), "%d,%d,%d", cnt, p->getRangeStart(), p->getRangeEnd());
+            sRange = sRange + std::string(buf);
+            /*
+             * Next.
+             */
+            cnt++;
+        }
+    }
+
+    return sRange + "&" + sType;
+}
+
+std::string GoogleChart::paramDataSet(DataSet **list, int size) {
+    char buf[64];
+    int cnt = 0;
+    std::string sData = "chd=t:";
+    std::string sScale = "chds=";
+    std::string sLabel = "chdl=";
+    for (int i = 0; i < size; i++) {
+        DataSet *p = list[i];
+        if (0 != p) {
+            /*
+             * Data.
+             */
+            if (0 < cnt) {
+                sData = sData + "|";
+            }
+            for (int i = 0; i < p->getDataCount(); i++) {
+                double d = p->getData(i);
+                snprintf(buf, sizeof(buf), "%.3f", d);
+                if (0 < i) {
+                    sData = sData + ",";
+                }
+                sData = sData + std::string(buf);
+            }
+            /*
+             * Range.
+             */
+            if (0 < cnt) {
+                sScale = sScale + ",";
+            }
+            snprintf(buf, sizeof(buf), "%.3f,%.3f", p->getMin(), p->getMax());
+            sScale = sScale + std::string(buf);
+            /*
+             * Label.
+             */
+            if (0 < cnt) {
+                sLabel = sLabel + "|";
+            }
+            sLabel = sLabel + p->getLabel();
+            /*
+             * Next.
+             */
+            cnt++;
+        }
+    }
+
+    return sScale + "&" + sData + "&" + sLabel;
+}
+
+std::string GoogleChart::paramTitle(std::string title, int color, double fontSize) {
+    char buf[64];
+    std::string s = "";
+    /*
+     * Chart Title Text.
+     */
+    s = s + "chtt=" + title;
+    /*
+     * Chart Title Specification.
+     */
+    snprintf(buf, sizeof(buf), "&chts=%06X,%.1f", color, fontSize);
+    s = s + std::string(buf);
+    return s;
+}
+
+std::string GoogleChart::paramSize(int width, int height) {
+    char buf[64];
+    /*
+     * Chart Size.
+     */
+    snprintf(buf, sizeof(buf), "chs=%dx%d", width, height);
+    return std::string(buf);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GoogleChart.h	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,71 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#ifndef _GOOGLE_CHART_H_
+#define _GOOGLE_CHART_H_
+
+#include <string.h>
+#include <string>
+#include <ctype.h>
+
+#include <mbed.h>
+
+#include "Axis.h"
+#include "DataSet.h"
+
+class GoogleChart {
+public:
+
+    GoogleChart();
+    virtual ~GoogleChart();
+
+    virtual std::string toString() = 0;
+
+    int addNewAxis(Axis::Type type = Axis::Bottom);
+    int setAxisType(const int number, Axis::Type type);
+    int setAxisRange(const int number, int rangeStart, int rangeEnd);
+    int removeAxis(const int number);
+    
+    int addNewDataSet(std::string label, const int size);
+    int removeDataSet(const int number);
+    int addData(const int number, double data);
+    int clearAllData(const int number);
+    int setDataScale(const int number, int min, int max);
+
+    void setTitle(std::string title);
+    std::string getTitle() const;
+    void setWidth(int width);
+    int getWidth() const;
+    void setHeight(int height);
+    int getHeight() const;
+
+protected:
+    static const std::string baseURL;
+    std::string title;
+    int width;
+    int height;
+    
+    static const int MAX_AXIS = 16;
+    Axis *axislist[MAX_AXIS];
+    
+    static const int MAX_DATA = 16;
+    DataSet *datalist[MAX_DATA];
+
+    typedef enum {
+        LineChart
+    } ChartType;
+
+    static std::string toURL(std::string text);
+
+    static std::string paramChartType(ChartType chartType);
+    static std::string paramAxis(Axis **list, int size);
+    static std::string paramDataSet(DataSet **list, int size);
+    static std::string paramTitle(std::string title, int color, double fontSize);
+    static std::string paramSize(int width, int height);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GoogleChartLineChart.cpp	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,34 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#include "GoogleChartLineChart.h"
+
+GoogleChartLineChart::GoogleChartLineChart() : GoogleChart() {}
+GoogleChartLineChart::~GoogleChartLineChart() {}
+
+std::string GoogleChartLineChart::toString() {
+
+    std::string s = "";
+    s = s + baseURL;
+    s = s + "?";
+    s = s + toURL(paramAxis(axislist, MAX_AXIS));
+    s = s + "&";
+    s = s + toURL(paramSize(400, 320));
+    s = s + "&";
+    s = s + toURL(paramChartType(GoogleChart::LineChart));
+    s = s + "&";
+    s = s + toURL("chco=3D7930,FF9900");
+    s = s + "&";
+    s = s + toURL(paramDataSet(datalist, MAX_DATA));
+    s = s + "&";
+    s = s + toURL(paramTitle(title, 0x0000FF, 12.0));
+    s = s + "&";
+    s = s + toURL("chg=5,5,1,1");
+    s = s + "&";
+    s = s + toURL("chm=B,3D793022,0,0,0,1|B,FF990022,1,0,0,1");
+    return s;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GoogleChartLineChart.h	Tue Aug 17 09:21:55 2010 +0000
@@ -0,0 +1,24 @@
+/**
+ * GoogleChart API interface driver. (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#ifndef _GOOGLE_CHART_LINE_CHART_H_
+#define _GOOGLE_CHART_LINE_CHART_H_
+
+#include <stdio.h>
+#include <string.h>
+
+#include "GoogleChart.h"
+
+class GoogleChartLineChart : public GoogleChart {
+public:
+    GoogleChartLineChart();
+    virtual ~GoogleChartLineChart();
+
+    virtual std::string toString();
+};
+
+#endif