summaryrefslogtreecommitdiff
path: root/libforecastio/forecasts.c
blob: d7cb9089934040b504caed43bd45c2face2e3930 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <vdr/plugin.h>
#include <string>
#include <sstream>
#include <jansson.h>
#include "../tools/jsonhelpers.h"
#include "forecasts.h"

using namespace std;

cForecasts::cForecasts(void) {
    type = ftUnknownForecast;
    summary = "";
    icon = "";
    numDataPoints = 0;
    dataPointPointer = 0;
    dataPoints = NULL;
}

cForecasts::~cForecasts() {
    if (dataPoints && numDataPoints > 0) {
        for (int i=0; i<numDataPoints; i++) {
            if (dataPoints[i])
                delete dataPoints[i];
        }
        delete[] dataPoints;
    }
}

void cForecasts::SetForecast(json_t *forecast) {
    
    summary = JsonGetString(forecast, "summary");
    icon = JsonGetString(forecast, "icon");

    json_t *data = json_object_get(forecast, "data");
    if ( !json_is_array(data) ) {
        return;
    }
    numDataPoints = json_array_size(data);

    dataPoints = new cForecast*[numDataPoints];

    for (int i = 0; i < numDataPoints; i++) {
        json_t *jDataPoint = json_array_get(data, i);
        cForecast *dataPoint = new cForecast();
        dataPoint->SetForecast(jDataPoint);
        dataPoint->SetForecastType(type);
        dataPoints[i] = dataPoint;
    }
}

cForecast *cForecasts::GetForecast(int dataPoint) {
    if (!dataPoints)
        return NULL;
    if (dataPoint < 0 || dataPoint >= numDataPoints)
        return NULL;
    return dataPoints[dataPoint];
}

cForecast *cForecasts::GetCurrent(void) {
    if (!dataPoints)
        return NULL;
    time_t now = time(0);
    for (int i=0; i<numDataPoints; i++) {
        if (dataPoints[i] && dataPoints[i]->TimeMatch(now))
            return dataPoints[i];
    }
    return NULL;
}

cForecast *cForecasts::GetFirstHourly(void) {
    if (!dataPoints)
        return NULL;
    time_t now = time(0);
    for (int i=0; i<numDataPoints; i++) {
        if (dataPoints[i] && dataPoints[i]->TimeMatch(now)) {
            dataPointPointer = i;
            return dataPoints[dataPointPointer];
        }
    }
    return NULL;
}

cForecast *cForecasts::GetFirstDaily(void) {
    if (!dataPoints)
        return NULL;
    time_t now = time(0);
    for (int i=0; i<numDataPoints; i++) {
        if (dataPoints[i] && dataPoints[i]->DayMatch(now)) {
            dataPointPointer = i;
            return dataPoints[dataPointPointer];
        }
    }
    return NULL;    
}


cForecast *cForecasts::GetNext(void) {
    if (!dataPoints)
        return NULL;
    dataPointPointer++;
    if (dataPointPointer < numDataPoints) {
        return dataPoints[dataPointPointer];        
    }
    dataPointPointer = 0;
    return NULL;
}

void cForecasts::Debug(void) {
    if (type == ftHourly) {
        dsyslog("weatherforecast: 48 hour forecast");
    } else if (type == ftDaily) {
        dsyslog("weatherforecast: 7 day forecast");
    } 
    dsyslog("weatherforecast: summary: \"%s\"", summary.c_str());
    dsyslog("weatherforecast: icon: \"%s\"", icon.c_str());
    for (int i = 0; i < numDataPoints; i++) {
        dsyslog("weatherforecast: ------------ %s %d -----------", (type == ftHourly)?"Hour":"Day", i);
        dataPoints[i]->Debug();
    }
}