From 179dbb7e626b70488180fce562f6d15423b9a8bf Mon Sep 17 00:00:00 2001
From: Gerd Sattler <gerd@disroot.org>
Date: Thu, 4 Jul 2019 16:21:48 +0200
Subject: [PATCH] Add vibra module

---
 epicardium/epicardium.h      |  4 ++++
 epicardium/meson.build       |  1 +
 epicardium/modules/vibra.c   | 13 +++++++++++++
 pycardium/meson.build        |  1 +
 pycardium/modules/qstrdefs.h |  3 +++
 pycardium/modules/vibra.c    | 37 ++++++++++++++++++++++++++++++++++++
 pycardium/mpconfigport.h     |  1 +
 7 files changed, 60 insertions(+)
 create mode 100644 epicardium/modules/vibra.c
 create mode 100644 pycardium/modules/vibra.c

diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index d5af7aefe..c46b09fac 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -15,4 +15,8 @@ API(API_UART_READ, char epic_uart_read_chr(void));
 #define API_LEDS_SET   0x3
 API(API_LEDS_SET, void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b));
 
+// turn vibration motor on or off
+#define API_VIBRA_SET  0x4
+API(API_VIBRA_SET, void epic_vibra_set(int status));
+
 #endif /* _EPICARDIUM_H */
diff --git a/epicardium/meson.build b/epicardium/meson.build
index 88726887b..4ab377cb9 100644
--- a/epicardium/meson.build
+++ b/epicardium/meson.build
@@ -67,6 +67,7 @@ elf = executable(
   'main.c',
   'serial.c',
   'support.c',
+  'modules/vibra.c',
   dependencies: [libcard10, max32665_startup_core0, maxusb],
   link_with: [api_dispatcher_lib, freertos],
   link_whole: [max32665_startup_core0_lib, board_card10_lib],
diff --git a/epicardium/modules/vibra.c b/epicardium/modules/vibra.c
new file mode 100644
index 000000000..e02721a59
--- /dev/null
+++ b/epicardium/modules/vibra.c
@@ -0,0 +1,13 @@
+#include "gpio.h"
+
+static const gpio_cfg_t motor_pin = {
+	PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE
+};
+
+void epic_vibra_set(int status) {
+    if(status) {
+        GPIO_OutSet(&motor_pin);
+	} else {
+		GPIO_OutClr(&motor_pin);
+    }
+}
diff --git a/pycardium/meson.build b/pycardium/meson.build
index 0c839aaaa..0e02f357e 100644
--- a/pycardium/meson.build
+++ b/pycardium/meson.build
@@ -3,6 +3,7 @@ name = 'pycardium'
 modsrc = files(
   'modules/utime.c',
   'modules/leds.c',
+  'modules/vibra.c',
 )
 
 #################################
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index a6fbb5dfe..632b6c673 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -13,3 +13,6 @@ Q(ticks_us)
 Q(ticks_cpu)
 Q(ticks_add)
 Q(ticks_diff)
+
+/* vibra */
+Q(vibra)
\ No newline at end of file
diff --git a/pycardium/modules/vibra.c b/pycardium/modules/vibra.c
new file mode 100644
index 000000000..1fac77cc3
--- /dev/null
+++ b/pycardium/modules/vibra.c
@@ -0,0 +1,37 @@
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
+#include "epicardium.h"
+
+STATIC mp_obj_t mp_vibra_set(mp_obj_t state_obj)
+{
+	if (state_obj == mp_const_true) {
+		epic_vibra_set(1);
+	} else if (state_obj == mp_const_false){
+		epic_vibra_set(0);
+	} else {
+		mp_raise_TypeError("expected bool");
+	}
+	return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(vibra_set_obj, mp_vibra_set);
+
+// Define all properties of the example module.
+// Table entries are key/value pairs of the attribute name (a string)
+// and the MicroPython object reference.
+// All identifiers and strings are written as MP_QSTR_xxx and will be
+// optimized to word-sized integers by the build system (interned strings).
+STATIC const mp_rom_map_elem_t vibra_module_globals_table[] = {
+	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_vibra) },
+	{ MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&vibra_set_obj) },
+};
+STATIC MP_DEFINE_CONST_DICT(vibra_module_globals, vibra_module_globals_table);
+
+// Define module object.
+const mp_obj_module_t vibra_module = {
+	.base = { &mp_type_module },
+	.globals = (mp_obj_dict_t*)&vibra_module_globals,
+};
+
+// Register the module to make it available in Python
+MP_REGISTER_MODULE(MP_QSTR_vibra, vibra_module, MODULE_VIBRA_ENABLED);
diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h
index c4e6a6cb0..5156b1b14 100644
--- a/pycardium/mpconfigport.h
+++ b/pycardium/mpconfigport.h
@@ -26,6 +26,7 @@
 /* Modules */
 #define MODULE_UTIME_ENABLED                (1)
 #define MODULE_LEDS_ENABLED                 (1)
+#define MODULE_VIBRA_ENABLED                (1)
 
 /*
  * This port is intended to be 32-bit, but unfortunately, int32_t for
-- 
GitLab