GoogleChart.

Dependents:   GoogleChart_TestProgram

Revision:
0:ded8a44ff71f
--- /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);
+}