spi.hpp: Add C++ wrapper around Spi
authorBrendan Le Foll <brendan.le.foll@intel.com>
Fri, 16 May 2014 13:10:29 +0000 (14:10 +0100)
committerBrendan Le Foll <brendan.le.foll@intel.com>
Fri, 16 May 2014 13:31:46 +0000 (14:31 +0100)
* maa_spi_context becomes an opaque pointer
* C++ wrapper class Spi created
* swig now uses C++ wrapper Gpio to generate API

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
api/spi.h
api/spi.hpp [new file with mode: 0644]
examples/spi_mcp4261.c
src/CMakeLists.txt
src/maa.i
src/spi/spi.c

index 09780ab..12d7426 100644 (file)
--- a/api/spi.h
+++ b/api/spi.h
@@ -40,20 +40,13 @@ extern "C" {
 
 #include "maa.h"
 
-/**
- * A strucutre representing the SPI device
- */
-typedef struct {
-    /*@{*/
-    int spifd; /**< File descriptor to SPI Device */
-    /*@}*/
-} maa_spi_context;
+typedef struct _spi* maa_spi_context;
 
 /** Initialise SPI_context, uses board mapping. Sets the muxes
  *
  * @return maa_spi_context The returned initialised SPI context
  */
-maa_spi_context* maa_spi_init();
+maa_spi_context maa_spi_init();
 
 /** Set the SPI device mode. see spidev
  *
@@ -62,7 +55,7 @@ maa_spi_context* maa_spi_init();
  *
  * @return maa_spi_context The returned initialised SPI context
  */
-maa_result_t maa_spi_mode(maa_spi_context* spi,unsigned short mode);
+maa_result_t maa_spi_mode(maa_spi_context dev,unsigned short mode);
 
 /** Set the SPI device operating clock frequency.
  *
@@ -71,7 +64,7 @@ maa_result_t maa_spi_mode(maa_spi_context* spi,unsigned short mode);
  *
  * @return maa_spi_context The returned initialised SPI context
  */
-maa_result_t maa_spi_frequency(maa_spi_context* spi, int hz);
+maa_result_t maa_spi_frequency(maa_spi_context dev, int hz);
 
 /** Write Single Byte to the SPI device.
  *
@@ -80,7 +73,7 @@ maa_result_t maa_spi_frequency(maa_spi_context* spi, int hz);
  *
  * @return data received on the miso line.
  */
-uint8_t maa_spi_write(maa_spi_context* spi, uint8_t data);
+uint8_t maa_spi_write(maa_spi_context dev, uint8_t data);
 
 /** Write Buffer of bytes to the SPI device.
  *
@@ -90,7 +83,7 @@ uint8_t maa_spi_write(maa_spi_context* spi, uint8_t data);
  *
  * @return data received on the miso line. Same length as passed in.
  */
-uint8_t* maa_spi_write_buf(maa_spi_context* spi, uint8_t data[], int length);
+uint8_t* maa_spi_write_buf(maa_spi_context dev, uint8_t* data, int length);
 
 
 /** De-inits an maa_spi_context device
@@ -99,7 +92,7 @@ uint8_t* maa_spi_write_buf(maa_spi_context* spi, uint8_t data[], int length);
  *
  *  @return maa_result_t the maa result.
  */
-maa_result_t maa_spi_stop(maa_spi_context* spi);
+maa_result_t maa_spi_stop(maa_spi_context dev);
 
 #ifdef __cplusplus
 }
diff --git a/api/spi.hpp b/api/spi.hpp
new file mode 100644 (file)
index 0000000..68e5824
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Author: Brendan Le Foll <brendan.le.foll@intel.com>
+ * Copyright (c) 2014 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.
+ */
+
+#pragma once
+
+/** @file
+ *
+ * This file defines the spi C++ interface for libmaa
+ */
+
+#include "spi.h"
+
+namespace maa {
+
+class Spi {
+    public:
+        Spi() {
+            m_spi = maa_spi_init();
+        }
+        ~Spi() {
+            maa_spi_stop(m_spi);
+        }
+        maa_result_t mode(unsigned short mode) {
+            return maa_spi_mode(m_spi, mode);
+        }
+        maa_result_t frequency(int hz) {
+            return maa_spi_frequency(m_spi, hz);
+        }
+        uint8_t write(uint8_t data) {
+            return maa_spi_write(m_spi, data);
+        }
+        uint8_t* write_buf(uint8_t* data, int length) {
+            return maa_spi_write_buf(m_spi, data, length);
+        }
+    private:
+        maa_spi_context m_spi;
+};
+
+}
index 649a82e..52c0de5 100644 (file)
@@ -30,10 +30,10 @@ int
 main(int argc, char **argv)
 {
     maa_init();
-    maa_spi_context *spi;
+    maa_spi_context spi;
     spi = maa_spi_init(0);
     unsigned int response = 0;
-    printf("Hello, SPI initialised: fd=%i\n",spi->spifd);
+    printf("Hello, SPI initialised\n");
     uint8_t data[] = {0x00, 100};
     uint8_t *recv;
     while(1) {
index 741e67b..c623c1f 100644 (file)
@@ -12,6 +12,7 @@ set (maa_LIB_HEADERS
   ${PROJECT_SOURCE_DIR}/api/pwm.h
   ${PROJECT_SOURCE_DIR}/api/pwm.hpp
   ${PROJECT_SOURCE_DIR}/api/spi.h
+  ${PROJECT_SOURCE_DIR}/api/spi.hpp
   ${PROJECT_SOURCE_DIR}/api/aio.h
   ${PROJECT_SOURCE_DIR}/api/aio.hpp
   ${PROJECT_SOURCE_DIR}/include/smbus.h
index ac24a4c..e053282 100644 (file)
--- a/src/maa.i
+++ b/src/maa.i
@@ -3,7 +3,7 @@
     #include "gpio.hpp"
     #include "pwm.hpp"
     #include "i2c.hpp"
-    #include "spi.h"
+    #include "spi.hpp"
     #include "aio.hpp"
 %}
 
@@ -29,37 +29,7 @@ const char * maa_get_version();
 
 #### SPI ####
 
-%rename(Spi) maa_spi_context;
-
-%ignore spifd;
-typedef struct {
-    /*@{*/
-    int spifd; /**< File descriptor to SPI Device */
-    /*@}*/
-} maa_spi_context;
-
-%nodefault maa_spi_context;
-%extend maa_spi_context {
-  maa_spi_context()
-  {
-    return maa_spi_init();
-  }
-  ~maa_spi_context()
-  {
-  }
-  int mode(unsigned short mode)
-  {
-    return maa_spi_mode($self, mode);
-  }
-  int frequency(int hz)
-  {
-    return maa_spi_frequency($self, hz);
-  }
-  unsigned int write(unsigned int data)
-  {
-    return maa_spi_write($self, data);
-  }
-}
+%include "spi.hpp"
 
 #### AIO ####
 
index 847c4d0..85595a4 100644 (file)
 #define MAX_SIZE 64
 #define SPI_MAX_LENGTH 4096
 
-maa_spi_context*
+/**
+ * A strucutre representing the SPI device
+ */
+struct _spi {
+    /*@{*/
+    int devfd; /**< File descriptor to SPI Device */
+    /*@}*/
+};
+
+maa_spi_context
 maa_spi_init()
 {
     double bus = maa_check_spi();
@@ -42,14 +51,14 @@ maa_spi_init()
         fprintf(stderr, "Failed. SPI platform Error\n");
         return NULL;
     }
-    maa_spi_context* dev = (maa_spi_context*) malloc(sizeof(maa_spi_context));
+    maa_spi_context dev = (maa_spi_context) malloc(sizeof(struct _spi));
     memset(dev, 0, sizeof(maa_spi_context));
 
     char path[MAX_SIZE];
     sprintf(path, "/dev/spidev%.1f", bus);
 
-    dev->spifd = open(path, O_RDWR);
-    if (dev->spifd < 0) {
+    dev->devfd = open(path, O_RDWR);
+    if (dev->devfd < 0) {
         fprintf(stderr, "Failed opening SPI Device. bus:%s\n", path);
         free(dev);
         return NULL;
@@ -59,19 +68,19 @@ maa_spi_init()
 }
 
 maa_result_t
-maa_spi_mode(maa_spi_context* spi, unsigned short mode)
+maa_spi_mode(maa_spi_context dev, unsigned short mode)
 {
     return MAA_ERROR_FEATURE_NOT_IMPLEMENTED;
 }
 
 maa_result_t
-maa_spi_frequency(maa_spi_context* spi, int hz)
+maa_spi_frequency(maa_spi_context dev, int hz)
 {
     return MAA_ERROR_FEATURE_NOT_IMPLEMENTED;
 }
 
 uint8_t
-maa_spi_write(maa_spi_context* spi, uint8_t data)
+maa_spi_write(maa_spi_context dev, uint8_t data)
 {
     struct spi_ioc_transfer msg;
     memset(&msg, 0, sizeof(msg));
@@ -85,15 +94,15 @@ maa_spi_write(maa_spi_context* spi, uint8_t data)
     msg.bits_per_word = 8;
     msg.delay_usecs = 0;
     msg.len = length;
-    if(ioctl(spi->spifd, SPI_IOC_MESSAGE(1), &msg) < 0) {
-        fprintf(stderr, "Failed to perform spi transfer\n");
+    if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) {
+        fprintf(stderr, "Failed to perform dev transfer\n");
         return -1;
     }
     return recv;
 }
 
 uint8_t*
-maa_spi_write_buf(maa_spi_context* spi, uint8_t* data, int length)
+maa_spi_write_buf(maa_spi_context dev, uint8_t* data, int length)
 {
     struct spi_ioc_transfer msg;
     memset(&msg, 0, sizeof(msg));
@@ -106,15 +115,15 @@ maa_spi_write_buf(maa_spi_context* spi, uint8_t* data, int length)
     msg.bits_per_word = 8;
     msg.delay_usecs = 0;
     msg.len = length;
-    if(ioctl(spi->spifd, SPI_IOC_MESSAGE(1), &msg) < 0) {
-        fprintf(stderr, "Failed to perform spi transfer\n");
+    if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) {
+        fprintf(stderr, "Failed to perform dev transfer\n");
         return NULL;
     }
     return recv;
 }
 
 maa_result_t
-maa_spi_stop(maa_spi_context* spi)
+maa_spi_stop(maa_spi_context dev)
 {
     return MAA_ERROR_FEATURE_NOT_IMPLEMENTED;
 }