Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: GoogleChart_TestProgram
Revision 0:ded8a44ff71f, committed 2010-08-17
- Comitter:
- shintamainjp
- Date:
- Tue Aug 17 09:21:55 2010 +0000
- Commit message:
Changed in this revision
--- /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