Maxim Integrated / Mbed OS MAXREFDES101_SOURCE

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
gmehmet
Date:
Wed Apr 10 14:56:25 2019 +0300
Revision:
1:f60eafbf009a
upload from local

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 1:f60eafbf009a 1 /***************************************************************************
gmehmet 1:f60eafbf009a 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 1:f60eafbf009a 3 *
gmehmet 1:f60eafbf009a 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 1:f60eafbf009a 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 1:f60eafbf009a 6 * to deal in the Software without restriction, including without limitation
gmehmet 1:f60eafbf009a 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 1:f60eafbf009a 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 1:f60eafbf009a 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 1:f60eafbf009a 10 *
gmehmet 1:f60eafbf009a 11 * The above copyright notice and this permission notice shall be included
gmehmet 1:f60eafbf009a 12 * in all copies or substantial portions of the Software.
gmehmet 1:f60eafbf009a 13 *
gmehmet 1:f60eafbf009a 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 1:f60eafbf009a 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 1:f60eafbf009a 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 1:f60eafbf009a 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 1:f60eafbf009a 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 1:f60eafbf009a 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 1:f60eafbf009a 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 1:f60eafbf009a 21 *
gmehmet 1:f60eafbf009a 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 1:f60eafbf009a 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 1:f60eafbf009a 24 * Products, Inc. Branding Policy.
gmehmet 1:f60eafbf009a 25 *
gmehmet 1:f60eafbf009a 26 * The mere transfer of this software does not imply any licenses
gmehmet 1:f60eafbf009a 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 1:f60eafbf009a 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 1:f60eafbf009a 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 1:f60eafbf009a 30 * ownership rights.
gmehmet 1:f60eafbf009a 31 ****************************************************************************
gmehmet 1:f60eafbf009a 32 */
gmehmet 1:f60eafbf009a 33
gmehmet 1:f60eafbf009a 34 #include <ctype.h>
gmehmet 1:f60eafbf009a 35 #include "TempComm.h"
gmehmet 1:f60eafbf009a 36 #include "mxc_errors.h"
gmehmet 1:f60eafbf009a 37 #include "MAX30205.h"
gmehmet 1:f60eafbf009a 38 #include "CRC8.h"
gmehmet 1:f60eafbf009a 39 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 40 #include "utils.h"
gmehmet 1:f60eafbf009a 41 #include "BLE_ICARUS.h"
gmehmet 1:f60eafbf009a 42
gmehmet 1:f60eafbf009a 43 #define TP_REG_COUNT 64
gmehmet 1:f60eafbf009a 44
gmehmet 1:f60eafbf009a 45
gmehmet 1:f60eafbf009a 46
gmehmet 1:f60eafbf009a 47
gmehmet 1:f60eafbf009a 48
gmehmet 1:f60eafbf009a 49 #define MINIMUM_PERIOD_SECOND 0.5
gmehmet 1:f60eafbf009a 50
gmehmet 1:f60eafbf009a 51 const char *cmd_tbl_tp[] = {
gmehmet 1:f60eafbf009a 52 "get_format temp 0",
gmehmet 1:f60eafbf009a 53 "read temp 0", /* raw */
gmehmet 1:f60eafbf009a 54 "set_cfg temp sr", //set sample rate
gmehmet 1:f60eafbf009a 55 "get_reg temp",
gmehmet 1:f60eafbf009a 56 "set_reg temp",
gmehmet 1:f60eafbf009a 57 "dump_reg temp",
gmehmet 1:f60eafbf009a 58 };
gmehmet 1:f60eafbf009a 59
gmehmet 1:f60eafbf009a 60 TempComm::TempComm(USBSerial* USB):
gmehmet 1:f60eafbf009a 61 SensorComm("temp", true)
gmehmet 1:f60eafbf009a 62 {
gmehmet 1:f60eafbf009a 63 m_USB = USB;
gmehmet 1:f60eafbf009a 64 TempComm_Set_ReadTempStatus(false);
gmehmet 1:f60eafbf009a 65 ticker_period_second_ = MINIMUM_PERIOD_SECOND;
gmehmet 1:f60eafbf009a 66 sampling_period_ms_ = MINIMUM_PERIOD_SECOND * 1000;
gmehmet 1:f60eafbf009a 67
gmehmet 1:f60eafbf009a 68 }
gmehmet 1:f60eafbf009a 69
gmehmet 1:f60eafbf009a 70 void TempComm::stop()
gmehmet 1:f60eafbf009a 71 {
gmehmet 1:f60eafbf009a 72 int ret;
gmehmet 1:f60eafbf009a 73 comm_mutex.lock();
gmehmet 1:f60eafbf009a 74 data_report_mode = 0;
gmehmet 1:f60eafbf009a 75 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 76 ret = sensor->sensor_enable(0);
gmehmet 1:f60eafbf009a 77 m_tempcomm_ticker_.detach();
gmehmet 1:f60eafbf009a 78 TempComm_Set_ReadTempStatus(false);
gmehmet 1:f60eafbf009a 79 if (ret < 0) {
gmehmet 1:f60eafbf009a 80 pr_err("sensor_enable failed. ret: %d", ret);
gmehmet 1:f60eafbf009a 81 }
gmehmet 1:f60eafbf009a 82 }
gmehmet 1:f60eafbf009a 83
gmehmet 1:f60eafbf009a 84 bool TempComm::parse_command(const char* cmd)
gmehmet 1:f60eafbf009a 85 {
gmehmet 1:f60eafbf009a 86 int i;
gmehmet 1:f60eafbf009a 87 int ret = EXIT_SUCCESS;
gmehmet 1:f60eafbf009a 88 uint8_t reg_addr;
gmehmet 1:f60eafbf009a 89 uint16_t val;
gmehmet 1:f60eafbf009a 90 bool recognizedCmd = false;
gmehmet 1:f60eafbf009a 91 int data_len = 0;
gmehmet 1:f60eafbf009a 92 char charbuf[512];
gmehmet 1:f60eafbf009a 93 addr_val_pair reg_vals[TP_REG_COUNT];
gmehmet 1:f60eafbf009a 94 bool comma;
gmehmet 1:f60eafbf009a 95
gmehmet 1:f60eafbf009a 96 if (sensor == NULL) {
gmehmet 1:f60eafbf009a 97 pr_err("sensor object is invalid!");
gmehmet 1:f60eafbf009a 98 return false;
gmehmet 1:f60eafbf009a 99 }
gmehmet 1:f60eafbf009a 100
gmehmet 1:f60eafbf009a 101 for (i = 0; i < NUM_CMDS; i++) {
gmehmet 1:f60eafbf009a 102 if (starts_with(cmd, cmd_tbl_tp[i])) {
gmehmet 1:f60eafbf009a 103 cmd_state_t user_cmd = (cmd_state_t)i;
gmehmet 1:f60eafbf009a 104 recognizedCmd = true;
gmehmet 1:f60eafbf009a 105 switch (user_cmd) {
gmehmet 1:f60eafbf009a 106 case get_tp_format_mode0:
gmehmet 1:f60eafbf009a 107 if(AsciiEn)
gmehmet 1:f60eafbf009a 108 {
gmehmet 1:f60eafbf009a 109 m_USB->printf("\r\n%s format=smpleCnt,temp err=0\r\n",
gmehmet 1:f60eafbf009a 110 cmd);
gmehmet 1:f60eafbf009a 111 }
gmehmet 1:f60eafbf009a 112 else
gmehmet 1:f60eafbf009a 113 {
gmehmet 1:f60eafbf009a 114 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smpleCnt,8},{temp,16,2} err=0\r\n",
gmehmet 1:f60eafbf009a 115 cmd);
gmehmet 1:f60eafbf009a 116 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 117 }
gmehmet 1:f60eafbf009a 118 break;
gmehmet 1:f60eafbf009a 119 case read_tp_mode0:
gmehmet 1:f60eafbf009a 120 comm_mutex.lock();
gmehmet 1:f60eafbf009a 121 data_report_mode = read_tp_mode0;
gmehmet 1:f60eafbf009a 122 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 123 sample_count = 0;
gmehmet 1:f60eafbf009a 124 ret = sensor->sensor_enable(1);
gmehmet 1:f60eafbf009a 125 if (ret < 0) {
gmehmet 1:f60eafbf009a 126 pr_err("sensor_enable failed. ret: %d\r\n", ret);
gmehmet 1:f60eafbf009a 127 }
gmehmet 1:f60eafbf009a 128
gmehmet 1:f60eafbf009a 129 m_tempcomm_ticker_.detach();
gmehmet 1:f60eafbf009a 130 m_tempcomm_ticker_.attach(callback(this,&TempComm::TempComm_Set_ReadTempStatus_Ticker), ticker_period_second_);
gmehmet 1:f60eafbf009a 131 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 132 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 133 break;
gmehmet 1:f60eafbf009a 134 case set_cfg_sr:
gmehmet 1:f60eafbf009a 135 ret = (parse_cmd_data(cmd, cmd_tbl_tp[i], &sampling_period_ms_, 1, false) != 1);
gmehmet 1:f60eafbf009a 136 if (ret) {
gmehmet 1:f60eafbf009a 137 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, -1);
gmehmet 1:f60eafbf009a 138 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 139 break;
gmehmet 1:f60eafbf009a 140 }
gmehmet 1:f60eafbf009a 141 ticker_period_second_ = sampling_period_ms_/ 1000.0;
gmehmet 1:f60eafbf009a 142 if(ticker_period_second_ < MINIMUM_PERIOD_SECOND){
gmehmet 1:f60eafbf009a 143 pr_err("minimum value is less than 0.5\r\n");
gmehmet 1:f60eafbf009a 144 sampling_period_ms_ = MINIMUM_PERIOD_SECOND * 1000;
gmehmet 1:f60eafbf009a 145 ticker_period_second_ = MINIMUM_PERIOD_SECOND;
gmehmet 1:f60eafbf009a 146 ret = -1;
gmehmet 1:f60eafbf009a 147 }
gmehmet 1:f60eafbf009a 148 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 149 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 150 break;
gmehmet 1:f60eafbf009a 151 case get_reg:
gmehmet 1:f60eafbf009a 152 reg_addr = 0;
gmehmet 1:f60eafbf009a 153 val = 0;
gmehmet 1:f60eafbf009a 154 ret = parse_get_reg_cmd(cmd, sensor_type, &reg_addr);
gmehmet 1:f60eafbf009a 155 if (!ret) {
gmehmet 1:f60eafbf009a 156 ret = ((MAX30205*)sensor)->readRegister(static_cast<MAX30205::Registers_e> (reg_addr), val);
gmehmet 1:f60eafbf009a 157 }
gmehmet 1:f60eafbf009a 158
gmehmet 1:f60eafbf009a 159 reg_vals[0].addr = reg_addr;
gmehmet 1:f60eafbf009a 160 reg_vals[0].val = val;
gmehmet 1:f60eafbf009a 161 InsertRegValuesIntoBleQeueu(reg_vals, 1);
gmehmet 1:f60eafbf009a 162
gmehmet 1:f60eafbf009a 163 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=%02X err=%d\r\n", cmd, val, ret);
gmehmet 1:f60eafbf009a 164 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 165 break;
gmehmet 1:f60eafbf009a 166 case set_reg:
gmehmet 1:f60eafbf009a 167 ret = parse_set_reg_cmd(cmd, sensor_type, &reg_addr, &val);
gmehmet 1:f60eafbf009a 168 if (!ret) {
gmehmet 1:f60eafbf009a 169 ret = ((MAX30205*)sensor)->writeRegister(static_cast<MAX30205::Registers_e> (reg_addr), val);
gmehmet 1:f60eafbf009a 170 }
gmehmet 1:f60eafbf009a 171
gmehmet 1:f60eafbf009a 172 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 173 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 174 break;
gmehmet 1:f60eafbf009a 175 case dump_regs:
gmehmet 1:f60eafbf009a 176 for (int i = 0; i < TP_REG_COUNT; i++) {
gmehmet 1:f60eafbf009a 177 reg_vals[i].addr = 0xFF;
gmehmet 1:f60eafbf009a 178 }
gmehmet 1:f60eafbf009a 179
gmehmet 1:f60eafbf009a 180 ret = sensor->dump_registers(reg_vals);
gmehmet 1:f60eafbf009a 181
gmehmet 1:f60eafbf009a 182 if (ret) {
gmehmet 1:f60eafbf009a 183 m_USB->printf("\r\n%s err=%d\n", cmd, ret);
gmehmet 1:f60eafbf009a 184
gmehmet 1:f60eafbf009a 185 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\n", cmd, ret);
gmehmet 1:f60eafbf009a 186 }
gmehmet 1:f60eafbf009a 187 else {
gmehmet 1:f60eafbf009a 188 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=", cmd);
gmehmet 1:f60eafbf009a 189 comma = false;
gmehmet 1:f60eafbf009a 190 for (int i = 0; i < TP_REG_COUNT; i++) {
gmehmet 1:f60eafbf009a 191 if(reg_vals[i].addr == 0xFF)
gmehmet 1:f60eafbf009a 192 break;
gmehmet 1:f60eafbf009a 193 if (comma) {
gmehmet 1:f60eafbf009a 194 data_len += snprintf(charbuf + data_len,
gmehmet 1:f60eafbf009a 195 sizeof(charbuf) - data_len - 1, ",");
gmehmet 1:f60eafbf009a 196 }
gmehmet 1:f60eafbf009a 197 data_len += snprintf(charbuf + data_len,
gmehmet 1:f60eafbf009a 198 sizeof(charbuf) - data_len - 1,
gmehmet 1:f60eafbf009a 199 "{%X,%X}", (unsigned int)reg_vals[i].addr, (unsigned int)reg_vals[i].val);
gmehmet 1:f60eafbf009a 200 comma = true;
gmehmet 1:f60eafbf009a 201 }
gmehmet 1:f60eafbf009a 202 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, " err=0\r\n");
gmehmet 1:f60eafbf009a 203
gmehmet 1:f60eafbf009a 204 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 205
gmehmet 1:f60eafbf009a 206 }
gmehmet 1:f60eafbf009a 207
gmehmet 1:f60eafbf009a 208 break;
gmehmet 1:f60eafbf009a 209
gmehmet 1:f60eafbf009a 210 default:
gmehmet 1:f60eafbf009a 211 break;
gmehmet 1:f60eafbf009a 212 }
gmehmet 1:f60eafbf009a 213
gmehmet 1:f60eafbf009a 214
gmehmet 1:f60eafbf009a 215 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 216 BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
gmehmet 1:f60eafbf009a 217 }
gmehmet 1:f60eafbf009a 218
gmehmet 1:f60eafbf009a 219
gmehmet 1:f60eafbf009a 220 }
gmehmet 1:f60eafbf009a 221 }
gmehmet 1:f60eafbf009a 222
gmehmet 1:f60eafbf009a 223 return recognizedCmd;
gmehmet 1:f60eafbf009a 224 }
gmehmet 1:f60eafbf009a 225
gmehmet 1:f60eafbf009a 226 int TempComm::data_report_execute(char* buf, int size)
gmehmet 1:f60eafbf009a 227 {
gmehmet 1:f60eafbf009a 228 int16_t data_len = 0;
gmehmet 1:f60eafbf009a 229 uint8_t tmp_report_mode;
gmehmet 1:f60eafbf009a 230 uint16_t tp_val;
gmehmet 1:f60eafbf009a 231 uint32_t ret;
gmehmet 1:f60eafbf009a 232 uint32_t tp_val_ext;
gmehmet 1:f60eafbf009a 233 float Celsius;
gmehmet 1:f60eafbf009a 234
gmehmet 1:f60eafbf009a 235 tp0_comm_packet *data_packet;
gmehmet 1:f60eafbf009a 236
gmehmet 1:f60eafbf009a 237 if (sensor == NULL)
gmehmet 1:f60eafbf009a 238 return 0;
gmehmet 1:f60eafbf009a 239
gmehmet 1:f60eafbf009a 240 if(!is_enabled())
gmehmet 1:f60eafbf009a 241 return 0;
gmehmet 1:f60eafbf009a 242
gmehmet 1:f60eafbf009a 243 comm_mutex.lock();
gmehmet 1:f60eafbf009a 244 tmp_report_mode = data_report_mode;
gmehmet 1:f60eafbf009a 245 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 246
gmehmet 1:f60eafbf009a 247 switch(tmp_report_mode) {
gmehmet 1:f60eafbf009a 248 case read_tp_mode0:
gmehmet 1:f60eafbf009a 249 if ( (m_can_read_temp_) ) {
gmehmet 1:f60eafbf009a 250 TempComm_Set_ReadTempStatus(false);
gmehmet 1:f60eafbf009a 251 ret = ((MAX30205*)sensor)->readTemperature(tp_val);
gmehmet 1:f60eafbf009a 252
gmehmet 1:f60eafbf009a 253
gmehmet 1:f60eafbf009a 254 if (ret != 0)
gmehmet 1:f60eafbf009a 255 return 0;
gmehmet 1:f60eafbf009a 256 tp_val_ext = (uint32_t)tp_val;
gmehmet 1:f60eafbf009a 257 Celsius = ((MAX30205*)sensor)->toCelsius(tp_val_ext);
gmehmet 1:f60eafbf009a 258 tp_val = Celsius*100;
gmehmet 1:f60eafbf009a 259 TempComm_instant_temp_celsius = Celsius;
gmehmet 1:f60eafbf009a 260
gmehmet 1:f60eafbf009a 261 if(AsciiEn)
gmehmet 1:f60eafbf009a 262 {
gmehmet 1:f60eafbf009a 263 data_len = snprintf(buf, size - 1,
gmehmet 1:f60eafbf009a 264 "%lu,%2.3f\r\n",
gmehmet 1:f60eafbf009a 265 sample_count++,
gmehmet 1:f60eafbf009a 266 Celsius);
gmehmet 1:f60eafbf009a 267 }
gmehmet 1:f60eafbf009a 268 else{
gmehmet 1:f60eafbf009a 269 data_packet = (tp0_comm_packet *)buf;
gmehmet 1:f60eafbf009a 270 data_packet->start_byte = 0xAA;
gmehmet 1:f60eafbf009a 271 data_packet->smpleCnt = sample_count++;
gmehmet 1:f60eafbf009a 272 data_packet->tp = tp_val;
gmehmet 1:f60eafbf009a 273 data_packet->crc8 = crc8((uint8_t*)data_packet, sizeof(*data_packet) - sizeof(uint8_t));
gmehmet 1:f60eafbf009a 274 data_len = sizeof(*data_packet);
gmehmet 1:f60eafbf009a 275 }
gmehmet 1:f60eafbf009a 276 }
gmehmet 1:f60eafbf009a 277 break;
gmehmet 1:f60eafbf009a 278
gmehmet 1:f60eafbf009a 279 default:
gmehmet 1:f60eafbf009a 280 return 0;
gmehmet 1:f60eafbf009a 281 }
gmehmet 1:f60eafbf009a 282
gmehmet 1:f60eafbf009a 283 if (data_len < 0) {
gmehmet 1:f60eafbf009a 284 pr_err("snprintf buf failed");
gmehmet 1:f60eafbf009a 285 } else if (data_len > size) {
gmehmet 1:f60eafbf009a 286 pr_err("buffer is insufficient to hold data");
gmehmet 1:f60eafbf009a 287 }
gmehmet 1:f60eafbf009a 288
gmehmet 1:f60eafbf009a 289 return data_len;
gmehmet 1:f60eafbf009a 290 }
gmehmet 1:f60eafbf009a 291
gmehmet 1:f60eafbf009a 292 void TempComm::TempComm_Set_ReadTempStatus(bool en){
gmehmet 1:f60eafbf009a 293 m_can_read_temp_ = en;
gmehmet 1:f60eafbf009a 294 }
gmehmet 1:f60eafbf009a 295
gmehmet 1:f60eafbf009a 296 void TempComm::TempComm_Set_ReadTempStatus_Ticker(){
gmehmet 1:f60eafbf009a 297 m_can_read_temp_ = true;
gmehmet 1:f60eafbf009a 298 }