spi: Make Spi write() work from SWIG with typemaps
This change also changes the C++ API write(char) call to writeByte(uint8_t) and the write() call now takes a uint8_t* instead of a char*. This should not alter any code significantly and does not affect the C API. Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
@@ -91,20 +91,20 @@ class Spi {
|
|||||||
* @param data the byte to send
|
* @param data the byte to send
|
||||||
* @return data received on the miso line
|
* @return data received on the miso line
|
||||||
*/
|
*/
|
||||||
char write(char data) {
|
uint8_t writeByte(uint8_t data) {
|
||||||
return (char) mraa_spi_write(m_spi, (uint8_t) data);
|
return mraa_spi_write(m_spi, (uint8_t) data);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Write buffer of bytes to SPI device The pointer return has to be
|
* Write buffer of bytes to SPI device The pointer return has to be
|
||||||
* free'd by the caller. It will return a NULL pointer in cases of
|
* free'd by the caller. It will return a NULL pointer in cases of
|
||||||
* error
|
* error
|
||||||
*
|
*
|
||||||
* @param data buffer to send
|
* @param txBuf buffer to send
|
||||||
* @param length size of buffer to send
|
* @param length size of buffer to send
|
||||||
* @return char* data received on the miso line. Same length as passed in
|
* @return uint8_t* data received on the miso line. Same length as passed in
|
||||||
*/
|
*/
|
||||||
char* write(char* data, size_t length) {
|
uint8_t* write(uint8_t* txBuf, int length) {
|
||||||
return (char*) mraa_spi_write_buf(m_spi, (uint8_t *) data, (int) length);
|
return mraa_spi_write_buf(m_spi, txBuf, length);
|
||||||
}
|
}
|
||||||
#ifndef SWIG
|
#ifndef SWIG
|
||||||
/**
|
/**
|
||||||
@@ -116,8 +116,8 @@ class Spi {
|
|||||||
* @param length size of buffer to send
|
* @param length size of buffer to send
|
||||||
* @return Result of operation
|
* @return Result of operation
|
||||||
*/
|
*/
|
||||||
mraa_result_t transfer(char* data, char* rxBuf, size_t length) {
|
mraa_result_t transfer(uint8_t* txBuf, uint8_t* rxBuf, int length) {
|
||||||
return mraa_spi_transfer_buf(m_spi, (uint8_t *) data, (uint8_t *)rxBuf, (int) length);
|
return mraa_spi_transfer_buf(m_spi, txBuf, rxBuf, length);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ int main ()
|
|||||||
|
|
||||||
spi = new mraa::Spi(0);
|
spi = new mraa::Spi(0);
|
||||||
|
|
||||||
char data[] = {0x00, 100};
|
uint8_t data[] = {0x00, 100};
|
||||||
char rxBuf[2];
|
uint8_t rxBuf[2];
|
||||||
char *recv;
|
uint8_t *recv;
|
||||||
while (running == 0) {
|
while (running == 0) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 90; i < 130; i++) {
|
for (i = 90; i < 130; i++) {
|
||||||
|
|||||||
41
examples/javascript/spi.js
Normal file
41
examples/javascript/spi.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2015 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var m = require('mraa'); //require mraa
|
||||||
|
|
||||||
|
// helper function to go from hex val to dec
|
||||||
|
function char(x) { return parseInt(x, 16); }
|
||||||
|
|
||||||
|
x = new m.Spi(0)
|
||||||
|
buf = new Buffer(4)
|
||||||
|
buf[0] = char('0xf4')
|
||||||
|
buf[1] = char('0x2e')
|
||||||
|
buf[2] = char('0x3e')
|
||||||
|
buf[3] = char('0x4e')
|
||||||
|
buf2 = x.write(buf)
|
||||||
|
console.log("Sent: " + buf.toString('hex') + ". Received: " + buf2.toString('hex'))
|
||||||
|
|
||||||
|
|
||||||
43
examples/python/spi.py
Normal file
43
examples/python/spi.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
# Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
# Copyright (c) 2015 Intel Corporation.
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
# a copy of this software and associated documentation files (the
|
||||||
|
# "Software"), to deal in the Software without restriction, including
|
||||||
|
# without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
# permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
# the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be
|
||||||
|
# included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
|
||||||
|
|
||||||
|
import mraa as m
|
||||||
|
import random as rand
|
||||||
|
|
||||||
|
# Excuse the super boring example, I was out of fun devices to play with, this
|
||||||
|
# will write and read the same data back to itself, a few 100 times, just short
|
||||||
|
# MISO & MOSI on your board
|
||||||
|
|
||||||
|
dev = m.Spi(0)
|
||||||
|
|
||||||
|
for x in range(0,100):
|
||||||
|
txbuf = bytearray(4)
|
||||||
|
for y in range(0,4):
|
||||||
|
txbuf[y] = rand.randrange(0, 256)
|
||||||
|
rxbuf = dev.write(txbuf)
|
||||||
|
if rxbuf != txbuf:
|
||||||
|
print("We have an error captain!")
|
||||||
|
break
|
||||||
|
exit(1)
|
||||||
|
|
||||||
@@ -14,7 +14,23 @@
|
|||||||
$2 = node::Buffer::Length($input);
|
$2 = node::Buffer::Length($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Spi write()
|
||||||
|
%typemap(in) (uint8_t *txBuf, int length) {
|
||||||
|
$1 = (uint8_t*) node::Buffer::Data($input);
|
||||||
|
$2 = node::Buffer::Length($input);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace mraa {
|
||||||
|
class Spi;
|
||||||
|
%typemap(out) uint8_t*
|
||||||
|
{
|
||||||
|
// need to loop over length
|
||||||
|
$result = node::Buffer::New((char*) $1, arg3)->handle_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
%newobject I2c::read(uint8_t *data, int length);
|
%newobject I2c::read(uint8_t *data, int length);
|
||||||
|
%newobject Spi::write(uint8_t *data, int length);
|
||||||
|
|
||||||
%typemap(in) (uint8_t *data, int length) {
|
%typemap(in) (uint8_t *data, int length) {
|
||||||
int x;
|
int x;
|
||||||
|
|||||||
@@ -16,13 +16,36 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Spi write()
|
||||||
|
%typemap(in) (uint8_t *txBuf, int length) {
|
||||||
|
if (PyByteArray_Check($input)) {
|
||||||
|
// whilst this may seem 'hopeful' it turns out this is safe
|
||||||
|
$1 = (uint8_t*) PyByteArray_AsString($input);
|
||||||
|
$2 = PyByteArray_Size($input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace mraa {
|
||||||
|
class I2c;
|
||||||
%typemap(out) uint8_t*
|
%typemap(out) uint8_t*
|
||||||
{
|
{
|
||||||
// need to loop over length
|
// need to loop over length
|
||||||
$result = PyByteArray_FromStringAndSize((char*) $1, arg2);
|
$result = PyByteArray_FromStringAndSize((char*) $1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Spi;
|
||||||
|
%typemap(out) uint8_t*
|
||||||
|
{
|
||||||
|
// need to loop over length
|
||||||
|
$result = PyByteArray_FromStringAndSize((char*) $1, arg3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
%newobject I2c::read(uint8_t *data, int length);
|
%newobject I2c::read(uint8_t *data, int length);
|
||||||
|
%newobject Spi::write(uint8_t *data, int length);
|
||||||
|
%newobject Spi::transfer(uint8_t *txBuf, uint8_t *rxBuf, int length);
|
||||||
|
|
||||||
|
// I2c::read()
|
||||||
|
|
||||||
%typemap(in) (uint8_t *data, int length) {
|
%typemap(in) (uint8_t *data, int length) {
|
||||||
if (!PyInt_Check($input)) {
|
if (!PyInt_Check($input)) {
|
||||||
@@ -49,5 +72,31 @@
|
|||||||
free($1);
|
free($1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Spi::transfer()
|
||||||
|
|
||||||
|
%typemap(in) (uint8_t* txBuf, uint8_t* rxBuf, int length) {
|
||||||
|
if (!PyInt_Check($input)) {
|
||||||
|
PyErr_SetString(PyExc_ValueError, "Expecting an integer");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$3 = PyInt_AsLong($input);
|
||||||
|
if ($3 < 0) {
|
||||||
|
PyErr_SetString(PyExc_ValueError, "Positive integer expected");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$2 = (uint8_t*) malloc($3 * sizeof(uint8_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
%typemap(argout) (uint8_t* txBuf, uint8_t* rxBuf, int length) {
|
||||||
|
Py_XDECREF($result); /* Blow away any previous result */
|
||||||
|
if (result != MRAA_SUCCESS) { /* Check for I/O error */
|
||||||
|
free($2);
|
||||||
|
PyErr_SetFromErrno(PyExc_IOError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$result = PyByteArray_FromStringAndSize((char*) $2, $3);
|
||||||
|
free($2);
|
||||||
|
}
|
||||||
|
|
||||||
%include ../mraa.i
|
%include ../mraa.i
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user