Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
aout.cpp
00001 /***************************************************************************//** 00002 * @file aout.cpp 00003 * @brief Implementation of mbed specific analog output functionality 00004 ******************************************************************************** 00005 * Copyright (c) 2021 Analog Devices, Inc. 00006 * All rights reserved. 00007 * 00008 * This software is proprietary to Analog Devices, Inc. and its licensors. 00009 * By using this software you agree to the terms of the associated 00010 * Analog Devices Software License Agreement. 00011 *******************************************************************************/ 00012 00013 /******************************************************************************/ 00014 /***************************** Include Files **********************************/ 00015 /******************************************************************************/ 00016 #include <mbed.h> 00017 00018 // Platform drivers needs to be C-compatible to work with other drivers 00019 #ifdef __cplusplus 00020 extern "C" 00021 { 00022 #endif // _cplusplus 00023 #include "aout.h " 00024 #include "mbed_ain_aout_extra.h" 00025 #include "error.h" 00026 00027 /******************************************************************************/ 00028 /********************** Variables and User defined data types *****************/ 00029 /******************************************************************************/ 00030 00031 /******************************************************************************/ 00032 /************************ Functions Declarations ******************************/ 00033 /******************************************************************************/ 00034 00035 /******************************************************************************/ 00036 /************************ Functions Definitions *******************************/ 00037 /******************************************************************************/ 00038 /** 00039 * @brief Write voltage to analog output pin 00040 * @param desc[in] - Analog output descriptor 00041 * @param value[in] - Analog output value in volts 00042 * @return SUCCESS in case of success, FAILURE otherwise. 00043 */ 00044 int32_t aout_set_voltage(struct aout_desc *desc, float value) 00045 { 00046 /* Pointer to analog output object */ 00047 mbed::AnalogOut *analog_output; 00048 float volt_mapped; 00049 00050 /* Mbed AnalogOut APIs accept voltage in range from 0.0f 00051 * (representing DAC min output range / 0%) to 1.0f (representing 00052 * DAC max output range / 100%). Hence we need to map the voltage levels 00053 * before passing it to mbed APIs */ 00054 if (value >= desc->aout_min_v && value <= desc->aout_max_v) { 00055 volt_mapped = ((value - desc->aout_min_v) / 00056 (desc->aout_max_v - desc->aout_min_v)); 00057 } else { 00058 return -EINVAL; 00059 } 00060 00061 if (desc && desc->extra) { 00062 analog_output = (AnalogOut *)((mbed_analog_out_desc *) 00063 desc->extra)->analog_out_obj ; 00064 analog_output->write(volt_mapped); 00065 00066 return SUCCESS; 00067 } 00068 return FAILURE; 00069 } 00070 00071 /** 00072 * @brief Initialize the analog output pin 00073 * @param desc[in, out] - Analog output descriptor structure 00074 * @param param[in] - Structure that contains analog output 00075 * initialization parameters 00076 * @return SUCCESS in case of success, FAILURE otherwise 00077 */ 00078 int32_t aout_init(struct aout_desc **desc, 00079 const struct aout_init_param *param) 00080 { 00081 mbed::AnalogOut *analog_output; 00082 struct aout_desc *new_analog_out_desc; 00083 struct mbed_analog_out_desc *new_mbed_analog_out_desc; 00084 00085 if (!desc || !param ) { 00086 return FAILURE; 00087 } 00088 00089 /* Allocate memory for general analog output descriptor */ 00090 new_analog_out_desc = (aout_desc *)malloc(sizeof(aout_desc)); 00091 if (!new_analog_out_desc) { 00092 goto err_new_out_desc; 00093 } 00094 00095 /* Configure pin number,DAC max and min range */ 00096 new_analog_out_desc->number = param->number; 00097 new_analog_out_desc->aout_min_v = param->aout_min_v; 00098 new_analog_out_desc->aout_max_v = param->aout_max_v; 00099 00100 /* Allocate memory for mbed specific analog output descriptor 00101 * for future use */ 00102 new_mbed_analog_out_desc = (mbed_analog_out_desc *)malloc 00103 (sizeof(new_mbed_analog_out_desc)); 00104 if (!new_mbed_analog_out_desc) { 00105 goto err_mbed_analog_out_desc; 00106 } 00107 00108 /* Create and initialize mbed analog output object */ 00109 analog_output = new AnalogOut((PinName)param->number); 00110 if (analog_output) { 00111 new_mbed_analog_out_desc->analog_out_obj = analog_output; 00112 } else { 00113 goto err_analog_out_instance; 00114 } 00115 00116 new_analog_out_desc->extra = (mbed_analog_out_desc *) 00117 new_mbed_analog_out_desc; 00118 00119 *desc = new_analog_out_desc; 00120 return SUCCESS; 00121 00122 err_analog_out_instance: 00123 free(new_mbed_analog_out_desc); 00124 err_mbed_analog_out_desc: 00125 free(new_analog_out_desc); 00126 err_new_out_desc: 00127 // Nothing to free 00128 00129 return FAILURE; 00130 } 00131 00132 /** 00133 * @brief Deallocate resources allocated by aout_init() 00134 * @param desc[in, out] - Analog output descriptor 00135 * @return SUCCESS in case of success, FAILURE otherwise. 00136 */ 00137 int32_t aout_remove(struct aout_desc *desc) 00138 { 00139 if (desc) { 00140 00141 if (((mbed_analog_out_desc *)desc->extra)->analog_out_obj) { 00142 delete((mbed::AnalogIn *)((mbed_analog_out_desc *)desc-> 00143 extra)->analog_out_obj); 00144 } 00145 00146 if ((mbed_analog_out_desc *)desc->extra) { 00147 free((mbed_analog_out_desc *)desc->extra); 00148 } 00149 00150 if (((mbed_analog_out_desc *)desc->extra)->analog_out_obj) { 00151 delete((mbed::AnalogOut *)((mbed_analog_out_desc *) 00152 desc->extra)->analog_out_obj); 00153 } 00154 00155 if ((mbed_analog_out_desc *)desc->extra) { 00156 free((mbed_analog_out_desc *)desc->extra); 00157 } 00158 00159 free(desc); 00160 00161 return SUCCESS; 00162 } 00163 00164 return FAILURE; 00165 } 00166 00167 /** 00168 * @brief Mbed specific analog output platform ops structure 00169 */ 00170 const struct aout_platform_ops mbed_aout_ops = { 00171 .init = &aout_init, 00172 .write = &aout_set_voltage, 00173 .remove = &aout_remove 00174 }; 00175 00176 00177 // Platform drivers needs to be C-compatible to work with other drivers 00178 #ifdef __cplusplus 00179 } 00180 #endif // _cplusplus
Generated on Fri Jul 15 2022 08:04:32 by
1.7.2