DevI2C wrappers for Javascript.

Dependents:   ST_SENSOR_JS MQTT_JS

Committer:
akhtar.syedzeeshan@gmail.com
Date:
Wed Oct 25 14:04:24 2017 +0200
Revision:
1:9004b187e772
Parent:
0:948fd0e96aaa
Child:
2:c899857665c6
Added information and disclaimer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akhtar.syedzeeshan@gmail.com 1:9004b187e772 1 /**
akhtar.syedzeeshan@gmail.com 1:9004b187e772 2 ******************************************************************************
akhtar.syedzeeshan@gmail.com 1:9004b187e772 3 * @file LSM6DSL_JS-js.cpp
akhtar.syedzeeshan@gmail.com 1:9004b187e772 4 * @author ST
akhtar.syedzeeshan@gmail.com 1:9004b187e772 5 * @version V1.0.0
akhtar.syedzeeshan@gmail.com 1:9004b187e772 6 * @date 25 October 2017
akhtar.syedzeeshan@gmail.com 1:9004b187e772 7 * @brief Implementation of an LSM6DSL Accelerometer and gyroscope sensor for
akhtar.syedzeeshan@gmail.com 1:9004b187e772 8 * use with Javascript.
akhtar.syedzeeshan@gmail.com 1:9004b187e772 9 ******************************************************************************
akhtar.syedzeeshan@gmail.com 1:9004b187e772 10 * @attention
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 11 *
akhtar.syedzeeshan@gmail.com 1:9004b187e772 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 13 *
akhtar.syedzeeshan@gmail.com 1:9004b187e772 14 * Redistribution and use in source and binary forms, with or without modification,
akhtar.syedzeeshan@gmail.com 1:9004b187e772 15 * are permitted provided that the following conditions are met:
akhtar.syedzeeshan@gmail.com 1:9004b187e772 16 * 1. Redistributions of source code must retain the above copyright notice,
akhtar.syedzeeshan@gmail.com 1:9004b187e772 17 * this list of conditions and the following disclaimer.
akhtar.syedzeeshan@gmail.com 1:9004b187e772 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
akhtar.syedzeeshan@gmail.com 1:9004b187e772 19 * this list of conditions and the following disclaimer in the documentation
akhtar.syedzeeshan@gmail.com 1:9004b187e772 20 * and/or other materials provided with the distribution.
akhtar.syedzeeshan@gmail.com 1:9004b187e772 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
akhtar.syedzeeshan@gmail.com 1:9004b187e772 22 * may be used to endorse or promote products derived from this software
akhtar.syedzeeshan@gmail.com 1:9004b187e772 23 * without specific prior written permission.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 24 *
akhtar.syedzeeshan@gmail.com 1:9004b187e772 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
akhtar.syedzeeshan@gmail.com 1:9004b187e772 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
akhtar.syedzeeshan@gmail.com 1:9004b187e772 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
akhtar.syedzeeshan@gmail.com 1:9004b187e772 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
akhtar.syedzeeshan@gmail.com 1:9004b187e772 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
akhtar.syedzeeshan@gmail.com 1:9004b187e772 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
akhtar.syedzeeshan@gmail.com 1:9004b187e772 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
akhtar.syedzeeshan@gmail.com 1:9004b187e772 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
akhtar.syedzeeshan@gmail.com 1:9004b187e772 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
akhtar.syedzeeshan@gmail.com 1:9004b187e772 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
akhtar.syedzeeshan@gmail.com 1:9004b187e772 35 *
akhtar.syedzeeshan@gmail.com 1:9004b187e772 36 ******************************************************************************
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 37 */
akhtar.syedzeeshan@gmail.com 1:9004b187e772 38
akhtar.syedzeeshan@gmail.com 1:9004b187e772 39
akhtar.syedzeeshan@gmail.com 1:9004b187e772 40 /* Includes ------------------------------------------------------------------*/
akhtar.syedzeeshan@gmail.com 1:9004b187e772 41
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 42 #include "jerryscript-mbed-util/logging.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 43 #include "jerryscript-mbed-library-registry/wrap_tools.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 44
akhtar.syedzeeshan@gmail.com 1:9004b187e772 45 // Load the library that we'll wrap
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 46 #include "DevI2C.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 47
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 48 #include "mbed.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 49
akhtar.syedzeeshan@gmail.com 1:9004b187e772 50 /* Class Implementation ------------------------------------------------------*/
akhtar.syedzeeshan@gmail.com 1:9004b187e772 51
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 52 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 53 * DevI2C#destructor
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 54 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 55 * Called if/when the DevI2C object is GC'ed.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 56 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 57 void NAME_FOR_CLASS_NATIVE_DESTRUCTOR(DevI2C) (void *void_ptr) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 58 delete static_cast<DevI2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 59 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 60
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 61 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 62 * Type infomation of the native DevI2C pointer
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 63 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 64 * Set DevI2C#destructor as the free callback.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 65 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 66 static const jerry_object_native_info_t native_obj_type_info = {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 67 .free_cb = NAME_FOR_CLASS_NATIVE_DESTRUCTOR(DevI2C)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 68 };
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 69
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 70 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 71 * DevI2C#frequency (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 72 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 73 * Set the frequency of the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 74 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 75 * @param frequency New DevI2C Frequency
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 76 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 77 DECLARE_CLASS_FUNCTION(DevI2C, frequency) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 78 CHECK_ARGUMENT_COUNT(DevI2C, frequency, (args_count == 1));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 79 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, frequency, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 80
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 81 // Unwrap native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 82 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 83 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 84 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 85
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 86 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 87 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 88 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 89 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 90
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 91 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 92
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 93 int hz = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 94 native_ptr->frequency(hz);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 95
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 96 return jerry_create_undefined();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 97 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 98
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 99 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 100 * DevI2C#read (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 101 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 102 * Read data from the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 103 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 104 * @overload DevI2C#read(int)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 105 * Read a single byte from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 106 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 107 * @param ack indicates if the byte is to be acknowledged (1 => acknowledge)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 108 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 109 * @returns array: Data read from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 110 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 111 * @overload DevI2C#read(int, array, int)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 112 * Read a series of bytes from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 113 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 114 * @param address DevI2C address to read from
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 115 * @param data Array to read into
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 116 * @param length Length of data to read
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 117 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 118 * @returns array: Data read from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 119 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 120 DECLARE_CLASS_FUNCTION(DevI2C, read) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 121 CHECK_ARGUMENT_COUNT(DevI2C, read, (args_count == 1 || args_count == 3 || args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 122
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 123 if (args_count == 1) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 124 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 125 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 126 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 127 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 128
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 129 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 130 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 131 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 132 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 133
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 134 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 135
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 136 int data = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 137 int result = native_ptr->read(data);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 138
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 139 return jerry_create_number(result);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 140 } else {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 141 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 142 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 1, array);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 143 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 2, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 144
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 145 CHECK_ARGUMENT_TYPE_ON_CONDITION(DevI2C, read, 3, boolean, (args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 146
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 147 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 148 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 149 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 150
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 151 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 152 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 153 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 154 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 155
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 156 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 157
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 158 const uint32_t data_len = jerry_get_array_length(args[1]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 159
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 160 int address = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 161 int length = jerry_get_number_value(args[2]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 162
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 163 char *data = new char[data_len];
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 164
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 165 bool repeated = false;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 166 if (args_count == 4) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 167 repeated = jerry_get_boolean_value(args[3]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 168 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 169
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 170 int result = native_ptr->read(address, data, length, repeated);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 171
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 172 jerry_value_t out_array = jerry_create_array(data_len);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 173
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 174 for (uint32_t i = 0; i < data_len; i++) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 175 jerry_value_t val = jerry_create_number(double(data[i]));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 176 jerry_set_property_by_index(out_array, i, val);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 177 jerry_release_value(val);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 178 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 179
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 180 delete[] data;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 181
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 182 if (result == 0) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 183 // ACK
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 184 return out_array;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 185 } else {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 186 // NACK
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 187 const char *error_msg = "NACK received from DevI2C bus";
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 188
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 189 jerry_release_value(out_array);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 190 return jerry_create_error(JERRY_ERROR_COMMON, reinterpret_cast<const jerry_char_t *>(error_msg));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 191 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 192 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 193 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 194
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 195 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 196 * DevI2C#write (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 197 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 198 * @overload DevI2C#write(int)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 199 * Write a single byte to the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 200 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 201 * @param data Data byte to write to the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 202 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 203 * @returns 1 on success, 0 on failure
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 204 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 205 * @overload DevI2C#write(int, array, int, bool)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 206 * Write an array of data to a certain address on the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 207 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 208 * @param address 8-bit DevI2C slave address
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 209 * @param data Array of bytes to send
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 210 * @param length Length of data to write
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 211 * @param repeated (optional) If true, do not send stop at end.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 212 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 213 * @returns 0 on success, non-0 on failure
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 214 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 215 DECLARE_CLASS_FUNCTION(DevI2C, write) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 216 CHECK_ARGUMENT_COUNT(DevI2C, write, (args_count == 1 || args_count == 3 || args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 217
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 218 if (args_count == 1) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 219 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 220
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 221 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 222 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 223 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 224 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 225
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 226 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 227 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 228 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 229 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 230
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 231 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 232
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 233 // Unwrap arguments
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 234 int data = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 235
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 236 int result = native_ptr->write(data);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 237 return jerry_create_number(result);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 238 } else {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 239 // 3 or 4
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 240 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 241 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 1, array);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 242 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 2, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 243 CHECK_ARGUMENT_TYPE_ON_CONDITION(DevI2C, write, 3, boolean, (args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 244
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 245 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 246 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 247 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 248 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 249
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 250 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 251 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 252 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 253 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 254
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 255 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 256
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 257 // Unwrap arguments
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 258 int address = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 259 const uint32_t data_len = jerry_get_array_length(args[1]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 260 int length = jerry_get_number_value(args[2]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 261 bool repeated = args_count == 4 && jerry_get_boolean_value(args[3]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 262
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 263 // Construct data byte array
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 264 char *data = new char[data_len];
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 265 for (uint32_t i = 0; i < data_len; i++) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 266 data[i] = jerry_get_number_value(jerry_get_property_by_index(args[1], i));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 267 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 268
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 269 int result = native_ptr->write(address, data, length, repeated);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 270
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 271 // free dynamically allocated resources
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 272 delete[] data;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 273
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 274 return jerry_create_number(result);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 275 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 276 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 277
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 278 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 279 * DevI2C#start (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 280 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 281 * Creates a start condition on the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 282 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 283 DECLARE_CLASS_FUNCTION(DevI2C, start) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 284 CHECK_ARGUMENT_COUNT(DevI2C, start, (args_count == 0));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 285
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 286 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 287 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 288 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 289 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 290
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 291 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 292 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 293 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 294 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 295
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 296 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 297
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 298 native_ptr->start();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 299 return jerry_create_undefined();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 300 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 301
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 302 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 303 * DevI2C#stop (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 304 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 305 * Creates a stop condition on the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 306 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 307 DECLARE_CLASS_FUNCTION(DevI2C, stop) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 308 CHECK_ARGUMENT_COUNT(DevI2C, stop, (args_count == 0));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 309
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 310 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 311 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 312 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 313 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 314
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 315 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 316 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 317 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 318 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 319
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 320 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 321
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 322 native_ptr->stop();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 323 return jerry_create_undefined();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 324 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 325
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 326 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 327 * DevI2C (native JavaScript constructor)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 328 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 329 * @param sda mbed pin for DevI2C data
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 330 * @param scl mbed pin for DevI2C clock
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 331 * @returns a JavaScript object representing the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 332 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 333 DECLARE_CLASS_CONSTRUCTOR(DevI2C) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 334 CHECK_ARGUMENT_COUNT(DevI2C, __constructor, (args_count == 2));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 335 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, __constructor, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 336 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, __constructor, 1, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 337
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 338 int sda = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 339 int scl = jerry_get_number_value(args[1]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 340
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 341 DevI2C *native_ptr = new DevI2C((PinName)sda, (PinName)scl);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 342
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 343 jerry_value_t js_object = jerry_create_object();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 344 jerry_set_object_native_pointer(js_object, native_ptr, &native_obj_type_info);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 345
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 346 ATTACH_CLASS_FUNCTION(js_object, DevI2C, frequency);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 347 ATTACH_CLASS_FUNCTION(js_object, DevI2C, read);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 348 ATTACH_CLASS_FUNCTION(js_object, DevI2C, write);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 349 ATTACH_CLASS_FUNCTION(js_object, DevI2C, start);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 350 ATTACH_CLASS_FUNCTION(js_object, DevI2C, stop);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 351
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 352 return js_object;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 353 }