StarBoard Orange - Example application No.1 GoogleChartLogger with StarBoard Orange

Dependencies:   EthernetNetIf mbed

Committer:
shintamainjp
Date:
Wed Aug 11 10:24:25 2010 +0000
Revision:
1:123eff9ba7b2
Parent:
0:77d8b45a8f42

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:77d8b45a8f42 1 /**
shintamainjp 0:77d8b45a8f42 2 * GoogleChart API interface driver. (Version 0.0.1)
shintamainjp 0:77d8b45a8f42 3 *
shintamainjp 0:77d8b45a8f42 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:77d8b45a8f42 5 * http://shinta.main.jp/
shintamainjp 0:77d8b45a8f42 6 */
shintamainjp 0:77d8b45a8f42 7
shintamainjp 0:77d8b45a8f42 8 #include "GoogleChart.h"
shintamainjp 0:77d8b45a8f42 9
shintamainjp 0:77d8b45a8f42 10 const std::string GoogleChart::baseURL = "http://chart.apis.google.com/chart";
shintamainjp 0:77d8b45a8f42 11
shintamainjp 0:77d8b45a8f42 12 GoogleChart::GoogleChart() : title(""), width(300), height(225) {
shintamainjp 0:77d8b45a8f42 13 for (int i = 0; i < MAX_AXIS; i++) {
shintamainjp 0:77d8b45a8f42 14 axislist[i] = 0;
shintamainjp 0:77d8b45a8f42 15 }
shintamainjp 0:77d8b45a8f42 16 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 17 datalist[i] = 0;
shintamainjp 0:77d8b45a8f42 18 }
shintamainjp 0:77d8b45a8f42 19 }
shintamainjp 0:77d8b45a8f42 20
shintamainjp 0:77d8b45a8f42 21 GoogleChart::~GoogleChart() {}
shintamainjp 0:77d8b45a8f42 22
shintamainjp 0:77d8b45a8f42 23 int GoogleChart::addNewAxis(Axis::Type type) {
shintamainjp 0:77d8b45a8f42 24 /*
shintamainjp 0:77d8b45a8f42 25 * Search maximum number of axis.
shintamainjp 0:77d8b45a8f42 26 */
shintamainjp 0:77d8b45a8f42 27 int max = 0;
shintamainjp 0:77d8b45a8f42 28 for (int i = 0; i < MAX_AXIS; i++) {
shintamainjp 0:77d8b45a8f42 29 if (0 != axislist[i]) {
shintamainjp 0:77d8b45a8f42 30 if (axislist[i]->getNumber() > max) {
shintamainjp 0:77d8b45a8f42 31 max = axislist[i]->getNumber();
shintamainjp 0:77d8b45a8f42 32 }
shintamainjp 0:77d8b45a8f42 33 }
shintamainjp 0:77d8b45a8f42 34 }
shintamainjp 0:77d8b45a8f42 35
shintamainjp 0:77d8b45a8f42 36 /*
shintamainjp 0:77d8b45a8f42 37 * Create a new axis.
shintamainjp 0:77d8b45a8f42 38 */
shintamainjp 0:77d8b45a8f42 39 for (int i = 0; i < MAX_AXIS; i++) {
shintamainjp 0:77d8b45a8f42 40 if (0 == axislist[i]) {
shintamainjp 0:77d8b45a8f42 41 axislist[i] = new Axis(max + 1, type);
shintamainjp 0:77d8b45a8f42 42 return max + 1;
shintamainjp 0:77d8b45a8f42 43 }
shintamainjp 0:77d8b45a8f42 44 }
shintamainjp 0:77d8b45a8f42 45 return -1;
shintamainjp 0:77d8b45a8f42 46 }
shintamainjp 0:77d8b45a8f42 47
shintamainjp 0:77d8b45a8f42 48 int GoogleChart::setAxisType(const int number, Axis::Type type) {
shintamainjp 0:77d8b45a8f42 49 for (int i = 0; i < MAX_AXIS; i++) {
shintamainjp 0:77d8b45a8f42 50 if (0 != axislist[i]) {
shintamainjp 0:77d8b45a8f42 51 if (axislist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 52 axislist[i]->setType(type);
shintamainjp 0:77d8b45a8f42 53 return number;
shintamainjp 0:77d8b45a8f42 54 }
shintamainjp 0:77d8b45a8f42 55 }
shintamainjp 0:77d8b45a8f42 56 }
shintamainjp 0:77d8b45a8f42 57 return -1;
shintamainjp 0:77d8b45a8f42 58 }
shintamainjp 0:77d8b45a8f42 59
shintamainjp 0:77d8b45a8f42 60 int GoogleChart::setAxisRange(const int number, int rangeStart, int rangeEnd) {
shintamainjp 0:77d8b45a8f42 61 for (int i = 0; i < MAX_AXIS; i++) {
shintamainjp 0:77d8b45a8f42 62 if (0 != axislist[i]) {
shintamainjp 0:77d8b45a8f42 63 if (axislist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 64 axislist[i]->setRangeStart(rangeStart);
shintamainjp 0:77d8b45a8f42 65 axislist[i]->setRangeEnd(rangeEnd);
shintamainjp 0:77d8b45a8f42 66 return number;
shintamainjp 0:77d8b45a8f42 67 }
shintamainjp 0:77d8b45a8f42 68 }
shintamainjp 0:77d8b45a8f42 69 }
shintamainjp 0:77d8b45a8f42 70 return -1;
shintamainjp 0:77d8b45a8f42 71 }
shintamainjp 0:77d8b45a8f42 72
shintamainjp 0:77d8b45a8f42 73 int GoogleChart::removeAxis(const int number) {
shintamainjp 0:77d8b45a8f42 74 for (int i = 0; i < MAX_AXIS; i++) {
shintamainjp 0:77d8b45a8f42 75 if (0 != axislist[i]) {
shintamainjp 0:77d8b45a8f42 76 if (axislist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 77 delete axislist[i];
shintamainjp 0:77d8b45a8f42 78 axislist[i] = 0;
shintamainjp 0:77d8b45a8f42 79 return number;
shintamainjp 0:77d8b45a8f42 80 }
shintamainjp 0:77d8b45a8f42 81 }
shintamainjp 0:77d8b45a8f42 82 }
shintamainjp 0:77d8b45a8f42 83 return -1;
shintamainjp 0:77d8b45a8f42 84 }
shintamainjp 0:77d8b45a8f42 85
shintamainjp 0:77d8b45a8f42 86 int GoogleChart::addNewDataSet(std::string label, const int size) {
shintamainjp 0:77d8b45a8f42 87 /*
shintamainjp 0:77d8b45a8f42 88 * Search maximum number of data set.
shintamainjp 0:77d8b45a8f42 89 */
shintamainjp 0:77d8b45a8f42 90 int max = 0;
shintamainjp 0:77d8b45a8f42 91 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 92 if (0 != datalist[i]) {
shintamainjp 0:77d8b45a8f42 93 if (datalist[i]->getNumber() > max) {
shintamainjp 0:77d8b45a8f42 94 max = datalist[i]->getNumber();
shintamainjp 0:77d8b45a8f42 95 }
shintamainjp 0:77d8b45a8f42 96 }
shintamainjp 0:77d8b45a8f42 97 }
shintamainjp 0:77d8b45a8f42 98
shintamainjp 0:77d8b45a8f42 99 /*
shintamainjp 0:77d8b45a8f42 100 * Create a new data set.
shintamainjp 0:77d8b45a8f42 101 */
shintamainjp 0:77d8b45a8f42 102 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 103 if (0 == datalist[i]) {
shintamainjp 0:77d8b45a8f42 104 datalist[i] = new DataSet(label, max + 1, size);
shintamainjp 0:77d8b45a8f42 105 return max + 1;
shintamainjp 0:77d8b45a8f42 106 }
shintamainjp 0:77d8b45a8f42 107 }
shintamainjp 0:77d8b45a8f42 108 return -1;
shintamainjp 0:77d8b45a8f42 109 }
shintamainjp 0:77d8b45a8f42 110
shintamainjp 0:77d8b45a8f42 111 int GoogleChart::removeDataSet(const int number) {
shintamainjp 0:77d8b45a8f42 112 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 113 if (0 != datalist[i]) {
shintamainjp 0:77d8b45a8f42 114 if (datalist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 115 delete datalist[i];
shintamainjp 0:77d8b45a8f42 116 datalist[i] = 0;
shintamainjp 0:77d8b45a8f42 117 return number;
shintamainjp 0:77d8b45a8f42 118 }
shintamainjp 0:77d8b45a8f42 119 }
shintamainjp 0:77d8b45a8f42 120 }
shintamainjp 0:77d8b45a8f42 121 return -1;
shintamainjp 0:77d8b45a8f42 122 }
shintamainjp 0:77d8b45a8f42 123
shintamainjp 0:77d8b45a8f42 124 int GoogleChart::addData(const int number, double data) {
shintamainjp 0:77d8b45a8f42 125 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 126 if (0 != datalist[i]) {
shintamainjp 0:77d8b45a8f42 127 if (datalist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 128 datalist[i]->addData(data);
shintamainjp 0:77d8b45a8f42 129 return i;
shintamainjp 0:77d8b45a8f42 130 }
shintamainjp 0:77d8b45a8f42 131 }
shintamainjp 0:77d8b45a8f42 132 }
shintamainjp 0:77d8b45a8f42 133 return -1;
shintamainjp 0:77d8b45a8f42 134 }
shintamainjp 0:77d8b45a8f42 135
shintamainjp 0:77d8b45a8f42 136 int GoogleChart::clearAllData(const int number) {
shintamainjp 0:77d8b45a8f42 137 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 138 if (0 != datalist[i]) {
shintamainjp 0:77d8b45a8f42 139 if (datalist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 140 datalist[i]->clearAllData();
shintamainjp 0:77d8b45a8f42 141 return i;
shintamainjp 0:77d8b45a8f42 142 }
shintamainjp 0:77d8b45a8f42 143 }
shintamainjp 0:77d8b45a8f42 144 }
shintamainjp 0:77d8b45a8f42 145 return -1;
shintamainjp 0:77d8b45a8f42 146 }
shintamainjp 0:77d8b45a8f42 147
shintamainjp 0:77d8b45a8f42 148 int GoogleChart::setDataScale(const int number, int min, int max) {
shintamainjp 0:77d8b45a8f42 149 for (int i = 0; i < MAX_DATA; i++) {
shintamainjp 0:77d8b45a8f42 150 if (0 != datalist[i]) {
shintamainjp 0:77d8b45a8f42 151 if (datalist[i]->getNumber() == number) {
shintamainjp 0:77d8b45a8f42 152 datalist[i]->setScale(min, max);
shintamainjp 0:77d8b45a8f42 153 return i;
shintamainjp 0:77d8b45a8f42 154 }
shintamainjp 0:77d8b45a8f42 155 }
shintamainjp 0:77d8b45a8f42 156 }
shintamainjp 0:77d8b45a8f42 157 return -1;
shintamainjp 0:77d8b45a8f42 158 }
shintamainjp 0:77d8b45a8f42 159
shintamainjp 0:77d8b45a8f42 160 void GoogleChart::setTitle(std::string title) {
shintamainjp 0:77d8b45a8f42 161 GoogleChart::title = title;
shintamainjp 0:77d8b45a8f42 162 }
shintamainjp 0:77d8b45a8f42 163
shintamainjp 0:77d8b45a8f42 164 std::string GoogleChart::getTitle() const {
shintamainjp 0:77d8b45a8f42 165 return title;
shintamainjp 0:77d8b45a8f42 166 }
shintamainjp 0:77d8b45a8f42 167
shintamainjp 0:77d8b45a8f42 168 void GoogleChart::setWidth(int width) {
shintamainjp 0:77d8b45a8f42 169 GoogleChart::width = width;
shintamainjp 0:77d8b45a8f42 170 }
shintamainjp 0:77d8b45a8f42 171
shintamainjp 0:77d8b45a8f42 172 int GoogleChart::getWidth() const {
shintamainjp 0:77d8b45a8f42 173 return width;
shintamainjp 0:77d8b45a8f42 174 }
shintamainjp 0:77d8b45a8f42 175
shintamainjp 0:77d8b45a8f42 176 void GoogleChart::setHeight(int height) {
shintamainjp 0:77d8b45a8f42 177 GoogleChart::height = height;
shintamainjp 0:77d8b45a8f42 178 }
shintamainjp 0:77d8b45a8f42 179
shintamainjp 0:77d8b45a8f42 180 int GoogleChart::getHeight() const {
shintamainjp 0:77d8b45a8f42 181 return height;
shintamainjp 0:77d8b45a8f42 182 }
shintamainjp 0:77d8b45a8f42 183
shintamainjp 0:77d8b45a8f42 184 std::string GoogleChart::toURL(std::string text) {
shintamainjp 0:77d8b45a8f42 185 static const char *unsafe_characters = " \"<>#%{}|\\^~[]`";
shintamainjp 0:77d8b45a8f42 186 std::string s = "";
shintamainjp 0:77d8b45a8f42 187 for (int i = 0; i < text.length(); i++) {
shintamainjp 0:77d8b45a8f42 188 char c = text.at(i);
shintamainjp 0:77d8b45a8f42 189 if (strchr(unsafe_characters, c) == NULL) {
shintamainjp 0:77d8b45a8f42 190 s = s + c;
shintamainjp 0:77d8b45a8f42 191 } else {
shintamainjp 0:77d8b45a8f42 192 char buf[8];
shintamainjp 0:77d8b45a8f42 193 snprintf(buf, sizeof(buf), "%%%02X", c & 0xff);
shintamainjp 0:77d8b45a8f42 194 s = s + std::string(buf);
shintamainjp 0:77d8b45a8f42 195 }
shintamainjp 0:77d8b45a8f42 196 }
shintamainjp 0:77d8b45a8f42 197 return s;
shintamainjp 0:77d8b45a8f42 198 }
shintamainjp 0:77d8b45a8f42 199
shintamainjp 0:77d8b45a8f42 200 std::string GoogleChart::paramChartType(ChartType chartType) {
shintamainjp 0:77d8b45a8f42 201 /*
shintamainjp 0:77d8b45a8f42 202 * Chart Type.
shintamainjp 0:77d8b45a8f42 203 */
shintamainjp 0:77d8b45a8f42 204 std::string s = "cht=";
shintamainjp 0:77d8b45a8f42 205 switch (chartType) {
shintamainjp 0:77d8b45a8f42 206 case LineChart:
shintamainjp 0:77d8b45a8f42 207 s = s + "lc";
shintamainjp 0:77d8b45a8f42 208 break;
shintamainjp 0:77d8b45a8f42 209 default:
shintamainjp 0:77d8b45a8f42 210 s = s + "unknown";
shintamainjp 0:77d8b45a8f42 211 break;
shintamainjp 0:77d8b45a8f42 212 }
shintamainjp 0:77d8b45a8f42 213 return s;
shintamainjp 0:77d8b45a8f42 214 }
shintamainjp 0:77d8b45a8f42 215
shintamainjp 0:77d8b45a8f42 216 std::string GoogleChart::paramAxis(Axis **list, int size) {
shintamainjp 0:77d8b45a8f42 217
shintamainjp 0:77d8b45a8f42 218 char buf[64];
shintamainjp 0:77d8b45a8f42 219 /*
shintamainjp 0:77d8b45a8f42 220 * Axis type and range.
shintamainjp 0:77d8b45a8f42 221 */
shintamainjp 0:77d8b45a8f42 222 int cnt = 0;
shintamainjp 0:77d8b45a8f42 223 std::string sType = "chxt=";
shintamainjp 0:77d8b45a8f42 224 std::string sRange = "chxr=";
shintamainjp 0:77d8b45a8f42 225 for (int i = 0; i < size; i++) {
shintamainjp 0:77d8b45a8f42 226 Axis *p = list[i];
shintamainjp 0:77d8b45a8f42 227 if (0 != p) {
shintamainjp 0:77d8b45a8f42 228 /*
shintamainjp 0:77d8b45a8f42 229 * Type.
shintamainjp 0:77d8b45a8f42 230 */
shintamainjp 0:77d8b45a8f42 231 if (0 < cnt) {
shintamainjp 0:77d8b45a8f42 232 sType = sType + ",";
shintamainjp 0:77d8b45a8f42 233 }
shintamainjp 0:77d8b45a8f42 234 switch (p->getType()) {
shintamainjp 0:77d8b45a8f42 235 case Axis::Bottom:
shintamainjp 0:77d8b45a8f42 236 sType = sType + "x";
shintamainjp 0:77d8b45a8f42 237 break;
shintamainjp 0:77d8b45a8f42 238 case Axis::Left:
shintamainjp 0:77d8b45a8f42 239 sType = sType + "y";
shintamainjp 0:77d8b45a8f42 240 break;
shintamainjp 0:77d8b45a8f42 241 case Axis::Right:
shintamainjp 0:77d8b45a8f42 242 sType = sType + "r";
shintamainjp 0:77d8b45a8f42 243 break;
shintamainjp 0:77d8b45a8f42 244 case Axis::Top:
shintamainjp 0:77d8b45a8f42 245 sType = sType + "t";
shintamainjp 0:77d8b45a8f42 246 break;
shintamainjp 0:77d8b45a8f42 247 default:
shintamainjp 0:77d8b45a8f42 248 sType = sType + "?";
shintamainjp 0:77d8b45a8f42 249 break;
shintamainjp 0:77d8b45a8f42 250 }
shintamainjp 0:77d8b45a8f42 251 /*
shintamainjp 0:77d8b45a8f42 252 * Range.
shintamainjp 0:77d8b45a8f42 253 */
shintamainjp 0:77d8b45a8f42 254 if (0 < cnt) {
shintamainjp 0:77d8b45a8f42 255 sRange = sRange + "|";
shintamainjp 0:77d8b45a8f42 256 }
shintamainjp 0:77d8b45a8f42 257 snprintf(buf, sizeof(buf), "%d,%d,%d", cnt, p->getRangeStart(), p->getRangeEnd());
shintamainjp 0:77d8b45a8f42 258 sRange = sRange + std::string(buf);
shintamainjp 0:77d8b45a8f42 259 /*
shintamainjp 0:77d8b45a8f42 260 * Next.
shintamainjp 0:77d8b45a8f42 261 */
shintamainjp 0:77d8b45a8f42 262 cnt++;
shintamainjp 0:77d8b45a8f42 263 }
shintamainjp 0:77d8b45a8f42 264 }
shintamainjp 0:77d8b45a8f42 265
shintamainjp 0:77d8b45a8f42 266 return sRange + "&" + sType;
shintamainjp 0:77d8b45a8f42 267 }
shintamainjp 0:77d8b45a8f42 268
shintamainjp 0:77d8b45a8f42 269 std::string GoogleChart::paramDataSet(DataSet **list, int size) {
shintamainjp 0:77d8b45a8f42 270 char buf[64];
shintamainjp 0:77d8b45a8f42 271 int cnt = 0;
shintamainjp 0:77d8b45a8f42 272 std::string sData = "chd=t:";
shintamainjp 0:77d8b45a8f42 273 std::string sScale = "chds=";
shintamainjp 0:77d8b45a8f42 274 std::string sLabel = "chdl=";
shintamainjp 0:77d8b45a8f42 275 for (int i = 0; i < size; i++) {
shintamainjp 0:77d8b45a8f42 276 DataSet *p = list[i];
shintamainjp 0:77d8b45a8f42 277 if (0 != p) {
shintamainjp 0:77d8b45a8f42 278 /*
shintamainjp 0:77d8b45a8f42 279 * Data.
shintamainjp 0:77d8b45a8f42 280 */
shintamainjp 0:77d8b45a8f42 281 if (0 < cnt) {
shintamainjp 0:77d8b45a8f42 282 sData = sData + "|";
shintamainjp 0:77d8b45a8f42 283 }
shintamainjp 0:77d8b45a8f42 284 for (int i = 0; i < p->getDataCount(); i++) {
shintamainjp 0:77d8b45a8f42 285 double d = p->getData(i);
shintamainjp 0:77d8b45a8f42 286 snprintf(buf, sizeof(buf), "%.3f", d);
shintamainjp 0:77d8b45a8f42 287 if (0 < i) {
shintamainjp 0:77d8b45a8f42 288 sData = sData + ",";
shintamainjp 0:77d8b45a8f42 289 }
shintamainjp 0:77d8b45a8f42 290 sData = sData + std::string(buf);
shintamainjp 0:77d8b45a8f42 291 }
shintamainjp 0:77d8b45a8f42 292 /*
shintamainjp 0:77d8b45a8f42 293 * Range.
shintamainjp 0:77d8b45a8f42 294 */
shintamainjp 0:77d8b45a8f42 295 if (0 < cnt) {
shintamainjp 0:77d8b45a8f42 296 sScale = sScale + ",";
shintamainjp 0:77d8b45a8f42 297 }
shintamainjp 0:77d8b45a8f42 298 snprintf(buf, sizeof(buf), "%.3f,%.3f", p->getMin(), p->getMax());
shintamainjp 0:77d8b45a8f42 299 sScale = sScale + std::string(buf);
shintamainjp 0:77d8b45a8f42 300 /*
shintamainjp 0:77d8b45a8f42 301 * Label.
shintamainjp 0:77d8b45a8f42 302 */
shintamainjp 0:77d8b45a8f42 303 if (0 < cnt) {
shintamainjp 0:77d8b45a8f42 304 sLabel = sLabel + "|";
shintamainjp 0:77d8b45a8f42 305 }
shintamainjp 0:77d8b45a8f42 306 sLabel = sLabel + p->getLabel();
shintamainjp 0:77d8b45a8f42 307 /*
shintamainjp 0:77d8b45a8f42 308 * Next.
shintamainjp 0:77d8b45a8f42 309 */
shintamainjp 0:77d8b45a8f42 310 cnt++;
shintamainjp 0:77d8b45a8f42 311 }
shintamainjp 0:77d8b45a8f42 312 }
shintamainjp 0:77d8b45a8f42 313
shintamainjp 0:77d8b45a8f42 314 return sScale + "&" + sData + "&" + sLabel;
shintamainjp 0:77d8b45a8f42 315 }
shintamainjp 0:77d8b45a8f42 316
shintamainjp 0:77d8b45a8f42 317 std::string GoogleChart::paramTitle(std::string title, int color, double fontSize) {
shintamainjp 0:77d8b45a8f42 318 char buf[64];
shintamainjp 0:77d8b45a8f42 319 std::string s = "";
shintamainjp 0:77d8b45a8f42 320 /*
shintamainjp 0:77d8b45a8f42 321 * Chart Title Text.
shintamainjp 0:77d8b45a8f42 322 */
shintamainjp 0:77d8b45a8f42 323 s = s + "chtt=" + title;
shintamainjp 0:77d8b45a8f42 324 /*
shintamainjp 0:77d8b45a8f42 325 * Chart Title Specification.
shintamainjp 0:77d8b45a8f42 326 */
shintamainjp 0:77d8b45a8f42 327 snprintf(buf, sizeof(buf), "&chts=%06X,%.1f", color, fontSize);
shintamainjp 0:77d8b45a8f42 328 s = s + std::string(buf);
shintamainjp 0:77d8b45a8f42 329 return s;
shintamainjp 0:77d8b45a8f42 330 }
shintamainjp 0:77d8b45a8f42 331
shintamainjp 0:77d8b45a8f42 332 std::string GoogleChart::paramSize(int width, int height) {
shintamainjp 0:77d8b45a8f42 333 char buf[64];
shintamainjp 0:77d8b45a8f42 334 /*
shintamainjp 0:77d8b45a8f42 335 * Chart Size.
shintamainjp 0:77d8b45a8f42 336 */
shintamainjp 0:77d8b45a8f42 337 snprintf(buf, sizeof(buf), "chs=%dx%d", width, height);
shintamainjp 0:77d8b45a8f42 338 return std::string(buf);
shintamainjp 0:77d8b45a8f42 339 }