int main() { // Create the Xively context xi_context_t* xi_context = xi_create_context(XI_HTTP, DEVICE_KEY, FEED_ID); if(xi_context==NULL){ perror("XIVELY: Problem in creating the context"); return 1; } // Create the feed and clear its contents xi_feed_t feed; memset(&feed, 0, sizeof(xi_feed_t)); // Set the properties of the feed (id, number of streams and datstream) feed.feed_id = FEED_ID; feed.datastream_count = 1; //only sending a single stream, datastream 0 // Get a reference to the datastream xi_datastream_t* data = &feed.datastreams[0]; // Only going to send a single data point in the stream data->datapoint_count = 1; // Set up the data stream identifier "tempSensor" int size = sizeof(data->datastream_id); xi_str_copy_untiln(data->datastream_id, size, "tempSensor", '\0' ); // Set up the data point and setting a floating point value xi_datapoint_t* point = &data->datapoints[0]; xi_set_value_f32(point, getTemperature(readAnalog(0))); // Update the feed xi_feed_update(xi_context, &feed); xi_delete_context(xi_context); return 0; }
// NOTE - based on code example on StackOverflow: http://stackoverflow.com/questions/17661058/include-libraries-with-g/17700233#17700233 int GMXively::SendData(uint32_t feedID, const char *dataStreamID, float value) { xi_context_t* xi_context; xi_feed_t feed; memset(&feed, NULL, sizeof(xi_feed_t)); feed.feed_id = feedID; feed.datastream_count = 1; feed.datastreams[0].datapoint_count = 1; xi_datastream_t* datastream = &feed.datastreams[0]; strcpy(datastream->datastream_id, dataStreamID); xi_datapoint_t* datapoint = &datastream->datapoints[0]; try { // create the xively library context xi_context = xi_create_context(XI_HTTP, _apiKey, feed.feed_id); } catch (...) { GMUtils::Log("Exception creating context for feed %d, datastream %s", feedID, dataStreamID); return -1; } // check if everything works if (xi_context == NULL) { return -1; } try { xi_set_value_f32(datapoint, value); } catch (...) { GMUtils::Log("Exception setting value for feed %d, datastream %s", feedID, dataStreamID); return -2; } try { const xi_response_t *result = xi_feed_update(xi_context, &feed); GMUtils::Debug("Sent %s = %.2f, result %s", dataStreamID, value, result->http.http_status_string); } catch (...) { GMUtils::Log("Exception sending to feed %d, datastream %s", feedID, dataStreamID); return -3; } return 0; }
void test_datapoint_value_setters_and_getters(void* data) { (void)(data); void * ret; xi_datapoint_t dp; ret = xi_set_value_i32( &dp, 320 ); tt_assert( ret != 0 ); tt_assert( xi_get_value_i32( &dp ) == 320 ); tt_assert( xi_get_value_type( &dp ) == XI_VALUE_TYPE_I32 ); tt_assert( xi_value_pointer_i32( &dp ) != 0 && xi_value_pointer_f32( &dp ) == 0 && xi_value_pointer_str( &dp ) == 0 ); ret = xi_set_value_f32( &dp, (320.0/10) ); tt_assert( ret != 0 ); tt_assert( xi_get_value_f32( &dp ) == (320.0/10) ); tt_assert( xi_get_value_type( &dp ) == XI_VALUE_TYPE_F32 ); tt_assert( xi_value_pointer_i32( &dp ) == 0 && xi_value_pointer_f32( &dp ) != 0 && xi_value_pointer_str( &dp ) == 0 ); ret = xi_set_value_str( &dp, "Let's test everything!" ); tt_assert( ret != 0 ); char s[XI_VALUE_STRING_MAX_SIZE+100]; for (size_t i = 0; i < sizeof(s); i++) { s[i] = 'a'; } ret = xi_set_value_str( &dp, s ); tt_assert( ret != 0 ) tt_assert( xi_get_value_type( &dp ) == XI_VALUE_TYPE_STR ); tt_assert( xi_value_pointer_i32( &dp ) == 0 && xi_value_pointer_f32( &dp ) == 0 && xi_value_pointer_str( &dp ) != 0 ); char * x = xi_value_pointer_str( &dp ); tt_assert( strlen(s) > strlen(x) ); tt_assert( strlen(x) == XI_VALUE_STRING_MAX_SIZE-1 ); s[XI_VALUE_STRING_MAX_SIZE-5] = '\0'; ret = xi_set_value_str( &dp, s ); tt_assert( ret != 0 ); tt_assert( strlen(s) == strlen(x) ); tt_assert( strlen(x) == XI_VALUE_STRING_MAX_SIZE-5 ); end: ; }