test code 123

Dependencies:   mbed

Fork of LinkNode-Test by Qi Yao

Committer:
youkee
Date:
Fri Oct 28 13:04:10 2016 +0000
Revision:
1:b0d4fbbdb244
Parent:
0:1ad0e04b1bc5
ghhbfdd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
youkee 0:1ad0e04b1bc5 1 /*
youkee 0:1ad0e04b1bc5 2 * Copyright 2016 Google Inc. All Rights Reserved.
youkee 0:1ad0e04b1bc5 3 *
youkee 0:1ad0e04b1bc5 4 * Licensed under the Apache License, Version 2.0 (the "License");
youkee 0:1ad0e04b1bc5 5 * you may not use this file except in compliance with the License.
youkee 0:1ad0e04b1bc5 6 * You may obtain a copy of the License at
youkee 0:1ad0e04b1bc5 7 *
youkee 0:1ad0e04b1bc5 8 * http://www.apache.org/licenses/LICENSE-2.0
youkee 0:1ad0e04b1bc5 9 *
youkee 0:1ad0e04b1bc5 10 * Unless required by applicable law or agreed to in writing, software
youkee 0:1ad0e04b1bc5 11 * distributed under the License is distributed on an "AS IS" BASIS,
youkee 0:1ad0e04b1bc5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
youkee 0:1ad0e04b1bc5 13 * See the License for the specific language governing permissions and
youkee 0:1ad0e04b1bc5 14 * limitations under the License.
youkee 0:1ad0e04b1bc5 15 */
youkee 0:1ad0e04b1bc5 16
youkee 0:1ad0e04b1bc5 17 #include "ble/BLE.h"
youkee 0:1ad0e04b1bc5 18 #include "goosci_utility.h"
youkee 0:1ad0e04b1bc5 19 #include "sensor.pb.h"
youkee 0:1ad0e04b1bc5 20 #include "pb.h"
youkee 0:1ad0e04b1bc5 21 #include "pb_decode.h"
youkee 0:1ad0e04b1bc5 22 #include "pb_common.h"
youkee 0:1ad0e04b1bc5 23 #include "mbed.h"
youkee 0:1ad0e04b1bc5 24 #include "pb_encode.h"
youkee 0:1ad0e04b1bc5 25
youkee 0:1ad0e04b1bc5 26
youkee 0:1ad0e04b1bc5 27
youkee 0:1ad0e04b1bc5 28 goosci_SensorData sd = goosci_SensorData_init_zero;
youkee 0:1ad0e04b1bc5 29 const int BUFFER_LEN = 256;
youkee 0:1ad0e04b1bc5 30 uint8_t *buffer = NULL;
youkee 0:1ad0e04b1bc5 31 pb_ostream_t stream;
youkee 0:1ad0e04b1bc5 32 extern BLE ble;
youkee 0:1ad0e04b1bc5 33
youkee 0:1ad0e04b1bc5 34
youkee 0:1ad0e04b1bc5 35
youkee 0:1ad0e04b1bc5 36 int packets = 0;
youkee 0:1ad0e04b1bc5 37
youkee 0:1ad0e04b1bc5 38 void send_int_data(GattCharacteristic & characteristic, unsigned long timestamp_key, int value)
youkee 0:1ad0e04b1bc5 39 {
youkee 0:1ad0e04b1bc5 40 if ( buffer == NULL )
youkee 0:1ad0e04b1bc5 41 {
youkee 0:1ad0e04b1bc5 42 buffer = (uint8_t *) malloc(BUFFER_LEN);
youkee 0:1ad0e04b1bc5 43 }
youkee 0:1ad0e04b1bc5 44 stream = pb_ostream_from_buffer(buffer, BUFFER_LEN);
youkee 0:1ad0e04b1bc5 45
youkee 0:1ad0e04b1bc5 46 goosci_SensorData sd = goosci_SensorData_init_zero;
youkee 0:1ad0e04b1bc5 47 ;
youkee 0:1ad0e04b1bc5 48 sd.timestamp_key = timestamp_key; // timestamp
youkee 0:1ad0e04b1bc5 49 sd.which_result = (pb_size_t) goosci_SensorData_data_tag;
youkee 0:1ad0e04b1bc5 50 sd.result.data.pin = goosci_Pin();
youkee 0:1ad0e04b1bc5 51 sd.result.data.pin.which_pin = goosci_Pin_analog_pin_tag;
youkee 0:1ad0e04b1bc5 52 sd.result.data.pin.pin.analog_pin.pin = 0;
youkee 0:1ad0e04b1bc5 53 sd.result.data.which_value = goosci_Data_analog_value_tag;
youkee 0:1ad0e04b1bc5 54 sd.result.data.value.analog_value.value = value;
youkee 0:1ad0e04b1bc5 55
youkee 0:1ad0e04b1bc5 56 if (!pb_encode(&stream, goosci_SensorData_fields, &sd))
youkee 0:1ad0e04b1bc5 57 {
youkee 0:1ad0e04b1bc5 58 //DEBUG_PRINT("Encoding failed: %s\n", PB_GET_ERROR(&stream));
youkee 0:1ad0e04b1bc5 59 }
youkee 0:1ad0e04b1bc5 60 else
youkee 0:1ad0e04b1bc5 61 {
youkee 0:1ad0e04b1bc5 62 /*
youkee 0:1ad0e04b1bc5 63 DEBUG_PRINT(F("send_data timestamp: "));
youkee 0:1ad0e04b1bc5 64 DEBUG_PRINTLN(sd.timestamp_key);
youkee 0:1ad0e04b1bc5 65 DEBUG_PRINT(F("send_data value: "));
youkee 0:1ad0e04b1bc5 66 DEBUG_PRINTLN(value);
youkee 0:1ad0e04b1bc5 67 DEBUG_PRINT(F("size: "));
youkee 0:1ad0e04b1bc5 68 DEBUG_PRINT(stream.bytes_written);
youkee 0:1ad0e04b1bc5 69 DEBUG_PRINTLN(F(" bytes."));
youkee 0:1ad0e04b1bc5 70 String s;
youkee 0:1ad0e04b1bc5 71 for (unsigned int i = 0; i < stream.bytes_written; ++i) {
youkee 0:1ad0e04b1bc5 72 s += String(buffer[i], HEX);
youkee 0:1ad0e04b1bc5 73 if ((i-1) % 2 == 0) s += " ";
youkee 0:1ad0e04b1bc5 74 }
youkee 0:1ad0e04b1bc5 75 DEBUG_PRINTLN(s.c_str());
youkee 0:1ad0e04b1bc5 76 */
youkee 0:1ad0e04b1bc5 77 uint8_t size = stream.bytes_written;
youkee 0:1ad0e04b1bc5 78 const uint8_t max_packet_size = BTLE_BUFFER_SIZE - 2;
youkee 0:1ad0e04b1bc5 79 /* Force size/max_packet_size to round up */
youkee 0:1ad0e04b1bc5 80 uint8_t num_packets = (size + max_packet_size - 1) / max_packet_size;
youkee 0:1ad0e04b1bc5 81
youkee 0:1ad0e04b1bc5 82 for (uint8_t ii = 0; ii < num_packets; ii++)
youkee 0:1ad0e04b1bc5 83 {
youkee 0:1ad0e04b1bc5 84 bool is_last_packet = ((num_packets - 1) == ii);
youkee 0:1ad0e04b1bc5 85 /* There are 3 possibilities for current_packet_size
youkee 0:1ad0e04b1bc5 86 1) It is the last packet and the remaining data is smaller than our allocated buffer (size % max_packet_size)
youkee 0:1ad0e04b1bc5 87 2) It is the last packet and the remaining data is equal to our allocated buffer (max_packet_size)
youkee 0:1ad0e04b1bc5 88 3) It is not the last packet (max_packet_size)
youkee 0:1ad0e04b1bc5 89 */
youkee 0:1ad0e04b1bc5 90 uint8_t current_packet_size =
youkee 0:1ad0e04b1bc5 91 (is_last_packet ?
youkee 0:1ad0e04b1bc5 92 ((size % max_packet_size == 0) ?
youkee 0:1ad0e04b1bc5 93 max_packet_size : (size % max_packet_size)) :
youkee 0:1ad0e04b1bc5 94 max_packet_size);
youkee 0:1ad0e04b1bc5 95
youkee 0:1ad0e04b1bc5 96 uint8_t packet[BTLE_BUFFER_SIZE];
youkee 0:1ad0e04b1bc5 97 packet[0] = current_packet_size;
youkee 0:1ad0e04b1bc5 98 packet[1] = is_last_packet;
youkee 0:1ad0e04b1bc5 99 memcpy((void*) (packet + 2), buffer + ii * max_packet_size,current_packet_size);
youkee 0:1ad0e04b1bc5 100
youkee 0:1ad0e04b1bc5 101
youkee 0:1ad0e04b1bc5 102 if(!ble.updateCharacteristicValue(characteristic.getValueAttribute().getHandle(), packet,current_packet_size + 2))
youkee 0:1ad0e04b1bc5 103 {
youkee 0:1ad0e04b1bc5 104 //DEBUG_PRINTLN("Send of packet failed.");
youkee 0:1ad0e04b1bc5 105 break;
youkee 0:1ad0e04b1bc5 106 }
youkee 0:1ad0e04b1bc5 107 }
youkee 0:1ad0e04b1bc5 108 }
youkee 0:1ad0e04b1bc5 109 }
youkee 0:1ad0e04b1bc5 110
youkee 0:1ad0e04b1bc5 111 //cann't send float data .
youkee 0:1ad0e04b1bc5 112 void send_float_data(GattCharacteristic & characteristic, unsigned long timestamp_key, float fvalue)
youkee 0:1ad0e04b1bc5 113 {
youkee 0:1ad0e04b1bc5 114 if ( buffer == NULL )
youkee 0:1ad0e04b1bc5 115 {
youkee 0:1ad0e04b1bc5 116 buffer = (uint8_t *) malloc(BUFFER_LEN);
youkee 0:1ad0e04b1bc5 117 }
youkee 0:1ad0e04b1bc5 118 stream = pb_ostream_from_buffer(buffer, BUFFER_LEN);
youkee 0:1ad0e04b1bc5 119
youkee 0:1ad0e04b1bc5 120 goosci_SensorData sd = goosci_SensorData_init_zero;
youkee 0:1ad0e04b1bc5 121 ;
youkee 0:1ad0e04b1bc5 122 sd.timestamp_key = timestamp_key; // timestamp
youkee 0:1ad0e04b1bc5 123 sd.which_result = (pb_size_t) goosci_SensorData_data_tag;
youkee 0:1ad0e04b1bc5 124 sd.result.data.pin = goosci_Pin();
youkee 0:1ad0e04b1bc5 125 sd.result.data.pin.which_pin = goosci_Pin_analog_pin_tag;
youkee 0:1ad0e04b1bc5 126 sd.result.data.pin.pin.analog_pin.pin = 0;
youkee 0:1ad0e04b1bc5 127 sd.result.data.which_value = goosci_Data_float_value_tag;
youkee 0:1ad0e04b1bc5 128 sd.result.data.value.float_value.value = fvalue;
youkee 0:1ad0e04b1bc5 129
youkee 0:1ad0e04b1bc5 130 if (!pb_encode(&stream, goosci_SensorData_fields, &sd))
youkee 0:1ad0e04b1bc5 131 {
youkee 0:1ad0e04b1bc5 132 //DEBUG_PRINT("Encoding failed: %s\n", PB_GET_ERROR(&stream));
youkee 0:1ad0e04b1bc5 133 }
youkee 0:1ad0e04b1bc5 134 else
youkee 0:1ad0e04b1bc5 135 {
youkee 0:1ad0e04b1bc5 136 /*
youkee 0:1ad0e04b1bc5 137 DEBUG_PRINT(F("send_data timestamp: "));
youkee 0:1ad0e04b1bc5 138 DEBUG_PRINTLN(sd.timestamp_key);
youkee 0:1ad0e04b1bc5 139 DEBUG_PRINT(F("send_data value: "));
youkee 0:1ad0e04b1bc5 140 DEBUG_PRINTLN(value);
youkee 0:1ad0e04b1bc5 141 DEBUG_PRINT(F("size: "));
youkee 0:1ad0e04b1bc5 142 DEBUG_PRINT(stream.bytes_written);
youkee 0:1ad0e04b1bc5 143 DEBUG_PRINTLN(F(" bytes."));
youkee 0:1ad0e04b1bc5 144 String s;
youkee 0:1ad0e04b1bc5 145 for (unsigned int i = 0; i < stream.bytes_written; ++i) {
youkee 0:1ad0e04b1bc5 146 s += String(buffer[i], HEX);
youkee 0:1ad0e04b1bc5 147 if ((i-1) % 2 == 0) s += " ";
youkee 0:1ad0e04b1bc5 148 }
youkee 0:1ad0e04b1bc5 149 DEBUG_PRINTLN(s.c_str());
youkee 0:1ad0e04b1bc5 150 */
youkee 0:1ad0e04b1bc5 151 uint8_t size = stream.bytes_written;
youkee 0:1ad0e04b1bc5 152 const uint8_t max_packet_size = BTLE_BUFFER_SIZE - 2;
youkee 0:1ad0e04b1bc5 153 /* Force size/max_packet_size to round up */
youkee 0:1ad0e04b1bc5 154 uint8_t num_packets = (size + max_packet_size - 1) / max_packet_size;
youkee 0:1ad0e04b1bc5 155
youkee 0:1ad0e04b1bc5 156 for (uint8_t ii = 0; ii < num_packets; ii++)
youkee 0:1ad0e04b1bc5 157 {
youkee 0:1ad0e04b1bc5 158 bool is_last_packet = ((num_packets - 1) == ii);
youkee 0:1ad0e04b1bc5 159 /* There are 3 possibilities for current_packet_size
youkee 0:1ad0e04b1bc5 160 1) It is the last packet and the remaining data is smaller than our allocated buffer (size % max_packet_size)
youkee 0:1ad0e04b1bc5 161 2) It is the last packet and the remaining data is equal to our allocated buffer (max_packet_size)
youkee 0:1ad0e04b1bc5 162 3) It is not the last packet (max_packet_size)
youkee 0:1ad0e04b1bc5 163 */
youkee 0:1ad0e04b1bc5 164 uint8_t current_packet_size =
youkee 0:1ad0e04b1bc5 165 (is_last_packet ?
youkee 0:1ad0e04b1bc5 166 ((size % max_packet_size == 0) ?
youkee 0:1ad0e04b1bc5 167 max_packet_size : (size % max_packet_size)) :
youkee 0:1ad0e04b1bc5 168 max_packet_size);
youkee 0:1ad0e04b1bc5 169
youkee 0:1ad0e04b1bc5 170 uint8_t packet[BTLE_BUFFER_SIZE];
youkee 0:1ad0e04b1bc5 171 packet[0] = current_packet_size;
youkee 0:1ad0e04b1bc5 172 packet[1] = is_last_packet;
youkee 0:1ad0e04b1bc5 173 memcpy((void*) (packet + 2), buffer + ii * max_packet_size,current_packet_size);
youkee 0:1ad0e04b1bc5 174
youkee 0:1ad0e04b1bc5 175
youkee 0:1ad0e04b1bc5 176 if(!ble.updateCharacteristicValue(characteristic.getValueAttribute().getHandle(), packet,current_packet_size + 2))
youkee 0:1ad0e04b1bc5 177 {
youkee 0:1ad0e04b1bc5 178 //DEBUG_PRINTLN("Send of packet failed.");
youkee 0:1ad0e04b1bc5 179 break;
youkee 0:1ad0e04b1bc5 180 }
youkee 0:1ad0e04b1bc5 181 }
youkee 0:1ad0e04b1bc5 182 }
youkee 0:1ad0e04b1bc5 183 }
youkee 0:1ad0e04b1bc5 184
youkee 0:1ad0e04b1bc5 185
youkee 0:1ad0e04b1bc5 186
youkee 0:1ad0e04b1bc5 187 bool encode_pin(pb_ostream_t *stream, const pb_field_t *field,void * const *arg)
youkee 0:1ad0e04b1bc5 188 {
youkee 0:1ad0e04b1bc5 189 goosci_Pin sp = goosci_Pin_init_zero;
youkee 0:1ad0e04b1bc5 190 sp.pin.analog_pin.pin = 0;
youkee 0:1ad0e04b1bc5 191 if (!pb_encode_tag_for_field(stream, field))
youkee 0:1ad0e04b1bc5 192 return false;
youkee 0:1ad0e04b1bc5 193 if (!pb_encode_submessage(stream, goosci_Pin_fields, &sp))
youkee 0:1ad0e04b1bc5 194 return false;
youkee 0:1ad0e04b1bc5 195 return true;
youkee 0:1ad0e04b1bc5 196 }