Forked repository for pushing changes

Committer:
pmallick
Date:
Mon Sep 27 04:22:15 2021 +0000
Revision:
19:ed7c2dac92bd
Added support for analog read and write functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmallick 19:ed7c2dac92bd 1 /***************************************************************************//**
pmallick 19:ed7c2dac92bd 2 * @file ain.cpp
pmallick 19:ed7c2dac92bd 3 * @brief Implementation of mbed specific analog input functionality
pmallick 19:ed7c2dac92bd 4 ********************************************************************************
pmallick 19:ed7c2dac92bd 5 * Copyright (c) 2021 Analog Devices, Inc.
pmallick 19:ed7c2dac92bd 6 * All rights reserved.
pmallick 19:ed7c2dac92bd 7 *
pmallick 19:ed7c2dac92bd 8 * This software is proprietary to Analog Devices, Inc. and its licensors.
pmallick 19:ed7c2dac92bd 9 * By using this software you agree to the terms of the associated
pmallick 19:ed7c2dac92bd 10 * Analog Devices Software License Agreement.
pmallick 19:ed7c2dac92bd 11 *******************************************************************************/
pmallick 19:ed7c2dac92bd 12
pmallick 19:ed7c2dac92bd 13 /******************************************************************************/
pmallick 19:ed7c2dac92bd 14 /***************************** Include Files **********************************/
pmallick 19:ed7c2dac92bd 15 /******************************************************************************/
pmallick 19:ed7c2dac92bd 16 #include <mbed.h>
pmallick 19:ed7c2dac92bd 17
pmallick 19:ed7c2dac92bd 18 // Platform drivers needs to be C-compatible to work with other drivers
pmallick 19:ed7c2dac92bd 19 #ifdef __cplusplus
pmallick 19:ed7c2dac92bd 20 extern "C"
pmallick 19:ed7c2dac92bd 21 {
pmallick 19:ed7c2dac92bd 22 #endif // _cplusplus
pmallick 19:ed7c2dac92bd 23 #include "ain.h"
pmallick 19:ed7c2dac92bd 24 #include "mbed_ain_aout_extra.h"
pmallick 19:ed7c2dac92bd 25 #include "error.h"
pmallick 19:ed7c2dac92bd 26
pmallick 19:ed7c2dac92bd 27 /******************************************************************************/
pmallick 19:ed7c2dac92bd 28 /********************** Variables and User defined data types *****************/
pmallick 19:ed7c2dac92bd 29 /******************************************************************************/
pmallick 19:ed7c2dac92bd 30
pmallick 19:ed7c2dac92bd 31 /******************************************************************************/
pmallick 19:ed7c2dac92bd 32 /************************ Functions Declarations ******************************/
pmallick 19:ed7c2dac92bd 33 /******************************************************************************/
pmallick 19:ed7c2dac92bd 34
pmallick 19:ed7c2dac92bd 35 /******************************************************************************/
pmallick 19:ed7c2dac92bd 36 /************************ Functions Definitions *******************************/
pmallick 19:ed7c2dac92bd 37 /******************************************************************************/
pmallick 19:ed7c2dac92bd 38 /**
pmallick 19:ed7c2dac92bd 39 * @brief Read voltage from analog input pin
pmallick 19:ed7c2dac92bd 40 * @param desc[in] - Analog input descriptor
pmallick 19:ed7c2dac92bd 41 * @param value[out] - Buffer to pass analog reading.
pmallick 19:ed7c2dac92bd 42 * @return SUCCESS in case of success, FAILURE otherwise
pmallick 19:ed7c2dac92bd 43 */
pmallick 19:ed7c2dac92bd 44 int32_t ain_get_voltage(struct ain_desc *desc, float *value)
pmallick 19:ed7c2dac92bd 45 {
pmallick 19:ed7c2dac92bd 46 /* Pointer to analog input object */
pmallick 19:ed7c2dac92bd 47 mbed::AnalogIn *analog_input;
pmallick 19:ed7c2dac92bd 48
pmallick 19:ed7c2dac92bd 49 if (desc && desc->extra) {
pmallick 19:ed7c2dac92bd 50 analog_input = (AnalogIn *)((mbed_analog_in_desc *)
pmallick 19:ed7c2dac92bd 51 desc->extra)->analog_in_obj;
pmallick 19:ed7c2dac92bd 52 *value = analog_input->read_voltage();
pmallick 19:ed7c2dac92bd 53
pmallick 19:ed7c2dac92bd 54 return SUCCESS;
pmallick 19:ed7c2dac92bd 55 }
pmallick 19:ed7c2dac92bd 56 return FAILURE;
pmallick 19:ed7c2dac92bd 57 }
pmallick 19:ed7c2dac92bd 58
pmallick 19:ed7c2dac92bd 59 /**
pmallick 19:ed7c2dac92bd 60 * @brief Initialize the Analog Input Pin
pmallick 19:ed7c2dac92bd 61 * @param desc[in, out] - Analog input descriptor structure
pmallick 19:ed7c2dac92bd 62 * @param param[in] - Structure that contains analog input
pmallick 19:ed7c2dac92bd 63 * initialization parameters
pmallick 19:ed7c2dac92bd 64 * @return SUCCESS in case of success, FAILURE otherwise
pmallick 19:ed7c2dac92bd 65 */
pmallick 19:ed7c2dac92bd 66 int32_t ain_init(struct ain_desc **desc,
pmallick 19:ed7c2dac92bd 67 const struct ain_init_param *param)
pmallick 19:ed7c2dac92bd 68 {
pmallick 19:ed7c2dac92bd 69 mbed::AnalogIn *analog_input;
pmallick 19:ed7c2dac92bd 70 struct ain_desc *new_analog_in_desc;
pmallick 19:ed7c2dac92bd 71 struct mbed_analog_in_desc *new_mbed_analog_in_desc;
pmallick 19:ed7c2dac92bd 72
pmallick 19:ed7c2dac92bd 73 if (!desc || !param ) {
pmallick 19:ed7c2dac92bd 74 return FAILURE;
pmallick 19:ed7c2dac92bd 75 }
pmallick 19:ed7c2dac92bd 76
pmallick 19:ed7c2dac92bd 77 /* Allocate memory for general analog input descriptor */
pmallick 19:ed7c2dac92bd 78 new_analog_in_desc = (ain_desc *)malloc(sizeof(ain_desc));
pmallick 19:ed7c2dac92bd 79 if (!new_analog_in_desc) {
pmallick 19:ed7c2dac92bd 80 goto err_new_in_desc;
pmallick 19:ed7c2dac92bd 81 }
pmallick 19:ed7c2dac92bd 82
pmallick 19:ed7c2dac92bd 83 /* Configure pin number and reference voltage*/
pmallick 19:ed7c2dac92bd 84 new_analog_in_desc->number = param->number;
pmallick 19:ed7c2dac92bd 85 new_analog_in_desc->vref = param->vref;
pmallick 19:ed7c2dac92bd 86
pmallick 19:ed7c2dac92bd 87 /* Allocate memory for mbed specific analog input descriptor
pmallick 19:ed7c2dac92bd 88 * for future use */
pmallick 19:ed7c2dac92bd 89 new_mbed_analog_in_desc = (mbed_analog_in_desc *)malloc(sizeof(
pmallick 19:ed7c2dac92bd 90 mbed_analog_in_desc));
pmallick 19:ed7c2dac92bd 91 if (!new_mbed_analog_in_desc) {
pmallick 19:ed7c2dac92bd 92 goto err_mbed_analog_in_desc;
pmallick 19:ed7c2dac92bd 93 }
pmallick 19:ed7c2dac92bd 94
pmallick 19:ed7c2dac92bd 95 /* Create and initialize mbed analog input object */
pmallick 19:ed7c2dac92bd 96 analog_input = new AnalogIn((PinName)param->number, param->vref);
pmallick 19:ed7c2dac92bd 97 if (analog_input) {
pmallick 19:ed7c2dac92bd 98 new_mbed_analog_in_desc->analog_in_obj = analog_input;
pmallick 19:ed7c2dac92bd 99 }
pmallick 19:ed7c2dac92bd 100
pmallick 19:ed7c2dac92bd 101 else {
pmallick 19:ed7c2dac92bd 102 goto err_analog_in_instance;
pmallick 19:ed7c2dac92bd 103 }
pmallick 19:ed7c2dac92bd 104
pmallick 19:ed7c2dac92bd 105 new_analog_in_desc->extra = (mbed_analog_in_desc *)new_mbed_analog_in_desc;
pmallick 19:ed7c2dac92bd 106
pmallick 19:ed7c2dac92bd 107 *desc = new_analog_in_desc;
pmallick 19:ed7c2dac92bd 108 return SUCCESS;
pmallick 19:ed7c2dac92bd 109
pmallick 19:ed7c2dac92bd 110 err_analog_in_instance:
pmallick 19:ed7c2dac92bd 111 free(new_mbed_analog_in_desc);
pmallick 19:ed7c2dac92bd 112 err_mbed_analog_in_desc:
pmallick 19:ed7c2dac92bd 113 free(new_analog_in_desc);
pmallick 19:ed7c2dac92bd 114 err_new_in_desc:
pmallick 19:ed7c2dac92bd 115 // Nothing to free
pmallick 19:ed7c2dac92bd 116
pmallick 19:ed7c2dac92bd 117 return FAILURE;
pmallick 19:ed7c2dac92bd 118 }
pmallick 19:ed7c2dac92bd 119
pmallick 19:ed7c2dac92bd 120 /**
pmallick 19:ed7c2dac92bd 121 * @brief Deallocate resources allocated by ain_init()
pmallick 19:ed7c2dac92bd 122 * @param desc[in, out] - Analog input descriptor
pmallick 19:ed7c2dac92bd 123 * @return SUCCESS in case of success, FAILURE otherwise.
pmallick 19:ed7c2dac92bd 124 */
pmallick 19:ed7c2dac92bd 125 int32_t ain_remove(struct ain_desc *desc)
pmallick 19:ed7c2dac92bd 126 {
pmallick 19:ed7c2dac92bd 127 if (desc) {
pmallick 19:ed7c2dac92bd 128
pmallick 19:ed7c2dac92bd 129 if (((mbed_analog_in_desc *)desc->extra)->analog_in_obj) {
pmallick 19:ed7c2dac92bd 130 delete((mbed::AnalogIn *)((mbed_analog_in_desc *)desc->
pmallick 19:ed7c2dac92bd 131 extra)->analog_in_obj);
pmallick 19:ed7c2dac92bd 132 }
pmallick 19:ed7c2dac92bd 133
pmallick 19:ed7c2dac92bd 134 if ((mbed_analog_in_desc *)desc->extra) {
pmallick 19:ed7c2dac92bd 135 free((mbed_analog_in_desc *)desc->extra);
pmallick 19:ed7c2dac92bd 136 }
pmallick 19:ed7c2dac92bd 137
pmallick 19:ed7c2dac92bd 138 if (((mbed_analog_in_desc *)desc->extra)->analog_in_obj) {
pmallick 19:ed7c2dac92bd 139 delete((mbed::AnalogOut *)((mbed_analog_in_desc *)
pmallick 19:ed7c2dac92bd 140 desc->extra)->analog_in_obj);
pmallick 19:ed7c2dac92bd 141 }
pmallick 19:ed7c2dac92bd 142
pmallick 19:ed7c2dac92bd 143 if ((mbed_analog_in_desc *)desc->extra) {
pmallick 19:ed7c2dac92bd 144 free((mbed_analog_in_desc *)desc->extra);
pmallick 19:ed7c2dac92bd 145 }
pmallick 19:ed7c2dac92bd 146
pmallick 19:ed7c2dac92bd 147 free(desc);
pmallick 19:ed7c2dac92bd 148
pmallick 19:ed7c2dac92bd 149 return SUCCESS;
pmallick 19:ed7c2dac92bd 150 }
pmallick 19:ed7c2dac92bd 151
pmallick 19:ed7c2dac92bd 152 return FAILURE;
pmallick 19:ed7c2dac92bd 153 }
pmallick 19:ed7c2dac92bd 154
pmallick 19:ed7c2dac92bd 155 /**
pmallick 19:ed7c2dac92bd 156 * @brief Mbed specific analog input platform ops structure
pmallick 19:ed7c2dac92bd 157 */
pmallick 19:ed7c2dac92bd 158 const struct ain_platform_ops mbed_ain_ops = {
pmallick 19:ed7c2dac92bd 159 .init = &ain_init,
pmallick 19:ed7c2dac92bd 160 .read = &ain_get_voltage,
pmallick 19:ed7c2dac92bd 161 .remove = &ain_remove
pmallick 19:ed7c2dac92bd 162 };
pmallick 19:ed7c2dac92bd 163
pmallick 19:ed7c2dac92bd 164 // Platform drivers needs to be C-compatible to work with other drivers
pmallick 19:ed7c2dac92bd 165 #ifdef __cplusplus
pmallick 19:ed7c2dac92bd 166 }
pmallick 19:ed7c2dac92bd 167 #endif // _cplusplus