DevI2C wrappers for Javascript.

Dependents:   ST_SENSOR_JS MQTT_JS

Committer:
akhtar.syedzeeshan@gmail.com
Date:
Wed Oct 25 13:45:51 2017 +0200
Revision:
0:948fd0e96aaa
Child:
1:9004b187e772
Implemented DevI2C for Javascript

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 1 /* Copyright JS Foundation and other contributors, http://js.foundation
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 2 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 3 * Licensed under the Apache License, Version 2.0 (the "License");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 4 * you may not use this file except in compliance with the License.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 5 * You may obtain a copy of the License at
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 6 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 7 * http://www.apache.org/licenses/LICENSE-2.0
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 8 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 9 * Unless required by applicable law or agreed to in writing, software
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 10 * distributed under the License is distributed on an "AS IS" BASIS
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 12 * See the License for the specific language governing permissions and
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 13 * limitations under the License.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 14 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 15 #include "jerryscript-mbed-util/logging.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 16 #include "jerryscript-mbed-library-registry/wrap_tools.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 17
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 18 #include "DevI2C.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 19
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 20 #include "mbed.h"
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 21
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 22 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 23 * DevI2C#destructor
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 24 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 25 * Called if/when the DevI2C object is GC'ed.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 26 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 27 void NAME_FOR_CLASS_NATIVE_DESTRUCTOR(DevI2C) (void *void_ptr) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 28 delete static_cast<DevI2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 29 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 30
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 31 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 32 * Type infomation of the native DevI2C pointer
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 33 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 34 * Set DevI2C#destructor as the free callback.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 35 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 36 static const jerry_object_native_info_t native_obj_type_info = {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 37 .free_cb = NAME_FOR_CLASS_NATIVE_DESTRUCTOR(DevI2C)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 38 };
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 39
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 40 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 41 * DevI2C#frequency (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 42 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 43 * Set the frequency of the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 44 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 45 * @param frequency New DevI2C Frequency
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 46 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 47 DECLARE_CLASS_FUNCTION(DevI2C, frequency) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 48 CHECK_ARGUMENT_COUNT(DevI2C, frequency, (args_count == 1));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 49 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, frequency, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 50
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 51 // Unwrap native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 52 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 53 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 54 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 55
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 56 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 57 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 58 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 59 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 60
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 61 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 62
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 63 int hz = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 64 native_ptr->frequency(hz);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 65
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 66 return jerry_create_undefined();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 67 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 68
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 69 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 70 * DevI2C#read (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 71 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 72 * Read data from the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 73 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 74 * @overload DevI2C#read(int)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 75 * Read a single byte from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 76 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 77 * @param ack indicates if the byte is to be acknowledged (1 => acknowledge)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 78 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 79 * @returns array: Data read from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 80 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 81 * @overload DevI2C#read(int, array, int)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 82 * Read a series of bytes from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 83 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 84 * @param address DevI2C address to read from
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 85 * @param data Array to read into
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 86 * @param length Length of data to read
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 87 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 88 * @returns array: Data read from the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 89 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 90 DECLARE_CLASS_FUNCTION(DevI2C, read) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 91 CHECK_ARGUMENT_COUNT(DevI2C, read, (args_count == 1 || args_count == 3 || args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 92
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 93 if (args_count == 1) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 94 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 95 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 96 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 97 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 98
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 99 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 100 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 101 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 102 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 103
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 104 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 105
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 106 int data = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 107 int result = native_ptr->read(data);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 108
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 109 return jerry_create_number(result);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 110 } else {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 111 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 112 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 1, array);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 113 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, read, 2, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 114
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 115 CHECK_ARGUMENT_TYPE_ON_CONDITION(DevI2C, read, 3, boolean, (args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 116
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 117 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 118 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 119 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 120
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 121 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 122 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 123 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 124 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 125
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 126 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 127
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 128 const uint32_t data_len = jerry_get_array_length(args[1]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 129
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 130 int address = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 131 int length = jerry_get_number_value(args[2]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 132
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 133 char *data = new char[data_len];
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 134
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 135 bool repeated = false;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 136 if (args_count == 4) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 137 repeated = jerry_get_boolean_value(args[3]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 138 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 139
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 140 int result = native_ptr->read(address, data, length, repeated);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 141
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 142 jerry_value_t out_array = jerry_create_array(data_len);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 143
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 144 for (uint32_t i = 0; i < data_len; i++) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 145 jerry_value_t val = jerry_create_number(double(data[i]));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 146 jerry_set_property_by_index(out_array, i, val);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 147 jerry_release_value(val);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 148 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 149
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 150 delete[] data;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 151
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 152 if (result == 0) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 153 // ACK
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 154 return out_array;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 155 } else {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 156 // NACK
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 157 const char *error_msg = "NACK received from DevI2C bus";
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 158
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 159 jerry_release_value(out_array);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 160 return jerry_create_error(JERRY_ERROR_COMMON, reinterpret_cast<const jerry_char_t *>(error_msg));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 161 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 162 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 163 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 164
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 165 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 166 * DevI2C#write (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 167 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 168 * @overload DevI2C#write(int)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 169 * Write a single byte to the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 170 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 171 * @param data Data byte to write to the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 172 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 173 * @returns 1 on success, 0 on failure
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 174 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 175 * @overload DevI2C#write(int, array, int, bool)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 176 * Write an array of data to a certain address on the DevI2C bus
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 177 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 178 * @param address 8-bit DevI2C slave address
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 179 * @param data Array of bytes to send
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 180 * @param length Length of data to write
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 181 * @param repeated (optional) If true, do not send stop at end.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 182 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 183 * @returns 0 on success, non-0 on failure
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 184 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 185 DECLARE_CLASS_FUNCTION(DevI2C, write) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 186 CHECK_ARGUMENT_COUNT(DevI2C, write, (args_count == 1 || args_count == 3 || args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 187
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 188 if (args_count == 1) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 189 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 190
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 191 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 192 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 193 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 194 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 195
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 196 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 197 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 198 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 199 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 200
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 201 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 202
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 203 // Unwrap arguments
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 204 int data = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 205
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 206 int result = native_ptr->write(data);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 207 return jerry_create_number(result);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 208 } else {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 209 // 3 or 4
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 210 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 211 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 1, array);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 212 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, write, 2, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 213 CHECK_ARGUMENT_TYPE_ON_CONDITION(DevI2C, write, 3, boolean, (args_count == 4));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 214
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 215 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 216 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 217 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 218 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 219
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 220 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 221 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 222 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 223 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 224
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 225 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 226
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 227 // Unwrap arguments
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 228 int address = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 229 const uint32_t data_len = jerry_get_array_length(args[1]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 230 int length = jerry_get_number_value(args[2]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 231 bool repeated = args_count == 4 && jerry_get_boolean_value(args[3]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 232
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 233 // Construct data byte array
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 234 char *data = new char[data_len];
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 235 for (uint32_t i = 0; i < data_len; i++) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 236 data[i] = jerry_get_number_value(jerry_get_property_by_index(args[1], i));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 237 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 238
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 239 int result = native_ptr->write(address, data, length, repeated);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 240
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 241 // free dynamically allocated resources
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 242 delete[] data;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 243
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 244 return jerry_create_number(result);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 245 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 246 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 247
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 248 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 249 * DevI2C#start (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 250 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 251 * Creates a start condition on the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 252 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 253 DECLARE_CLASS_FUNCTION(DevI2C, start) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 254 CHECK_ARGUMENT_COUNT(DevI2C, start, (args_count == 0));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 255
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 256 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 257 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 258 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 259 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 260
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 261 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 262 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 263 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 264 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 265
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 266 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 267
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 268 native_ptr->start();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 269 return jerry_create_undefined();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 270 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 271
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 272 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 273 * DevI2C#stop (native JavaScript method)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 274 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 275 * Creates a stop condition on the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 276 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 277 DECLARE_CLASS_FUNCTION(DevI2C, stop) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 278 CHECK_ARGUMENT_COUNT(DevI2C, stop, (args_count == 0));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 279
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 280 // Extract native DevI2C object
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 281 void *void_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 282 const jerry_object_native_info_t *type_ptr;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 283 bool has_ptr = jerry_get_object_native_pointer(this_obj, &void_ptr, &type_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 284
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 285 if (!has_ptr || type_ptr != &native_obj_type_info) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 286 return jerry_create_error(JERRY_ERROR_TYPE,
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 287 (const jerry_char_t *) "Failed to get native DevI2C pointer");
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 288 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 289
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 290 I2C *native_ptr = static_cast<I2C*>(void_ptr);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 291
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 292 native_ptr->stop();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 293 return jerry_create_undefined();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 294 }
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 295
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 296 /**
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 297 * DevI2C (native JavaScript constructor)
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 298 *
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 299 * @param sda mbed pin for DevI2C data
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 300 * @param scl mbed pin for DevI2C clock
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 301 * @returns a JavaScript object representing the DevI2C bus.
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 302 */
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 303 DECLARE_CLASS_CONSTRUCTOR(DevI2C) {
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 304 CHECK_ARGUMENT_COUNT(DevI2C, __constructor, (args_count == 2));
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 305 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, __constructor, 0, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 306 CHECK_ARGUMENT_TYPE_ALWAYS(DevI2C, __constructor, 1, number);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 307
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 308 int sda = jerry_get_number_value(args[0]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 309 int scl = jerry_get_number_value(args[1]);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 310
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 311 DevI2C *native_ptr = new DevI2C((PinName)sda, (PinName)scl);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 312
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 313 jerry_value_t js_object = jerry_create_object();
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 314 jerry_set_object_native_pointer(js_object, native_ptr, &native_obj_type_info);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 315
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 316 ATTACH_CLASS_FUNCTION(js_object, DevI2C, frequency);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 317 ATTACH_CLASS_FUNCTION(js_object, DevI2C, read);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 318 ATTACH_CLASS_FUNCTION(js_object, DevI2C, write);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 319 ATTACH_CLASS_FUNCTION(js_object, DevI2C, start);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 320 ATTACH_CLASS_FUNCTION(js_object, DevI2C, stop);
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 321
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 322 return js_object;
akhtar.syedzeeshan@gmail.com 0:948fd0e96aaa 323 }