DevI2C wrappers for Javascript.

Dependents:   ST_SENSOR_JS MQTT_JS

Committer:
akhtar.syedzeeshan@gmail.com
Date:
Wed Jan 17 10:51:57 2018 +0100
Revision:
2:c899857665c6
Parent:
1:9004b187e772
Code fixes

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