chiark / gitweb /
changelog: sort out a bit
[chiark-tcl.git] / wiringpi / wiringpi.c
index 32b1470f79aeae5ad6864e9a75728600c696d692..eaf05eb5320cac49636595f03cb3e0f4ab07e380 100644 (file)
@@ -50,7 +50,6 @@
 #include "chiark_tcl_wiringpi.h"
 
 #include "wiringPi.h"
-#include <piFace.h>
 
 /*---------- important types and forward declarations ----------*/
 
@@ -116,7 +115,6 @@ int cht_do_wiringpitcl_setup(ClientData cd, Tcl_Interp *ip,
     switch (modeopt[1]) {
     case 'g':  r = wiringPiSetupGpio();                             break;
     case '1':  r = wiringPiSetupPhys();                             break;
-    case 'p':  r = piFaceSetup(2000 /* ?! copied from gpio.c* */);  break;
     default:
       return cht_staticerr(ip,"wiringpi setup option unknown value", 0);
     }
@@ -127,20 +125,6 @@ int cht_do_wiringpitcl_setup(ClientData cd, Tcl_Interp *ip,
   return TCL_OK;
 }
 
-int cht_do_wiringpitcl_pwmc(ClientData cd, Tcl_Interp *ip, int divider) {
-  CHECK_SETUP;
-  CHECK_RANGE(divider,1,4095,"divider for pwmc","DIVIDER");
-  pwmSetClock(divider);
-  return TCL_OK;
-}
-
-int cht_do_wiringpitcl_pwmr(ClientData cd, Tcl_Interp *ip, int range) {
-  CHECK_SETUP;
-  CHECK_RANGE(range,1,INT_MAX,"pwm range","RANGE");
-  pwmSetRange(range);
-  return TCL_OK;
-}
-
 int cht_do_wiringpitcl_boardId(ClientData cd, Tcl_Interp *ip,
                               Tcl_Obj **result) {
 #define N 5
@@ -153,7 +137,7 @@ int cht_do_wiringpitcl_boardId(ClientData cd, Tcl_Interp *ip,
            &ints[3],
            &ints[4]);
   int i;
-  for (i=0; i<N; i++) objl[i]= Tcl_NewIntObj(ints[i]);
+  for (i=0; i<N; i++) objl[i]= cht_ret_int(ip, ints[i]);
   *result= Tcl_NewListObj(N,objl);
   return TCL_OK;
 #undef N
@@ -165,14 +149,45 @@ int cht_do_wiringpitcl_boardRev(ClientData cd, Tcl_Interp *ip, int *result) {
   return TCL_OK;
 }
 
-/*---------- families operations ----------*/
+int cht_do_wiringpitcl_pwmc(ClientData cd, Tcl_Interp *ip, int divider) {
+  CHECK_SETUP;
+  CHECK_RANGE(divider,1,4095,"divider for pwmc","DIVIDER");
+  pwmSetClock(divider);
+  return TCL_OK;
+}
+
+int cht_do_wiringpitcl_pwmr(ClientData cd, Tcl_Interp *ip, int range) {
+  CHECK_SETUP;
+  CHECK_RANGE(range,1,INT_MAX,"pwm range","RANGE");
+  pwmSetRange(range);
+  return TCL_OK;
+}
+
+int cht_do_wiringpitcl_pwm_bal(ClientData cd, Tcl_Interp *ip) {
+  CHECK_SETUP;
+  pwmSetMode(PWM_MODE_BAL);
+  return TCL_OK;
+}
 
-int cht_do_wiringpitcl_aread(ClientData cd, Tcl_Interp *ip, int pin, int *result) {
+int cht_do_wiringpitcl_pwm_ms(ClientData cd, Tcl_Interp *ip) {
   CHECK_SETUP;
-  *result = analogRead(pin);
+  pwmSetMode(PWM_MODE_MS);
   return TCL_OK;
 }
 
+/*---------- families of operations ----------*/
+
+#define SIMPLE_READER_OP(op, wpicall)                          \
+  int cht_do_wiringpitcl_##op(ClientData cd, Tcl_Interp *ip,   \
+                               int pin, int *result) {         \
+    CHECK_SETUP;                                               \
+    *result = wpicall(pin);                                    \
+    return TCL_OK;                                             \
+  }
+
+SIMPLE_READER_OP(read,  digitalRead)
+SIMPLE_READER_OP(aread, analogRead)
+
 #define SIMPLE_WRITER_OP(op, min, max, wpicall)                        \
   int cht_do_wiringpitcl_##op(ClientData cd, Tcl_Interp *ip,   \
                              int pin, int val) {               \