From 9a30e53b5f0d9288e63feeebb431cae4fdbd2328 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 8 Jun 2016 02:14:56 +0100 Subject: [PATCH] wiringpi: much implementation --- wiringpi/chiark_tcl_wiringpi.h | 5 ++ wiringpi/wiringpi.c | 122 +++++++++++++++++++++++++++++++-- wiringpi/wiringpi.tct | 31 ++------- 3 files changed, 127 insertions(+), 31 deletions(-) diff --git a/wiringpi/chiark_tcl_wiringpi.h b/wiringpi/chiark_tcl_wiringpi.h index 89d849d..d5ada8a 100644 --- a/wiringpi/chiark_tcl_wiringpi.h +++ b/wiringpi/chiark_tcl_wiringpi.h @@ -21,6 +21,11 @@ #include "chiark-tcl.h" +typedef struct { + const char *name; + void (*func)(int pin); +} WiringPiTclModeInfo; + #include "wiringpi+tcmdif.h" #endif /*WIRINGPITCL_H*/ diff --git a/wiringpi/wiringpi.c b/wiringpi/wiringpi.c index e71cb53..f3b7cb8 100644 --- a/wiringpi/wiringpi.c +++ b/wiringpi/wiringpi.c @@ -18,10 +18,9 @@ * write PIN VAL * pwm PIN VAL * clock PIN FREQ - * drive GROUP VALUE - * pwm-bal|pwm-ms PIN - * pwmr PIN RANGE - * pwmc PIN CLOCK + * pwm-bal|pwm-ms + * pwmr RANGE + * pwmc DIVIDER * pwmTone PIN FREQ */ /* ---8<--- end of documentation comment --8<-- */ @@ -50,8 +49,123 @@ #include "chiark_tcl_wiringpi.h" +#include "wiringPi.h" + /*---------- important types and forward declarations ----------*/ +static int ensure_setup(void) { + return TCL_OK; +} + +/*---------- operations ----------*/ + +#define CHECK_SETUP \ + int rc; \ + rc = ensure_setup(); \ + if (rc) return rc; else + +#define CHECK_RANGE(val, min, max, what, VAL) do{ \ + if (val < (min)) \ + return cht_staticerr(ip, what " too small" \ + " (must be at least" #min ")", \ + "WIRINGPI RANGE " VAL " MIN " #min); \ + if (val > (max)) \ + return cht_staticerr(ip, what " too large" \ + " (must be at most" #max ")", \ + "WIRINGPI RANGE " VAL " MAX " #max); \ + }while(0) + +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_boardId(ClientData cd, Tcl_Interp *ip, + Tcl_Obj **result) { +#define N 5 + CHECK_SETUP; + int ints[N]; + Tcl_Obj *objl[N]; + piBoardId(&ints[0], + &ints[1], + &ints[2], + &ints[3], + &ints[4]); + int i; + for (i=0; ifunc(pin); + return TCL_OK; +} + + /*---------- main hooks for tcl ----------*/ CHT_INIT(wiringpi, {}, CHTI_COMMANDS(cht_wiringpitoplevel_entries)) diff --git a/wiringpi/wiringpi.tct b/wiringpi/wiringpi.tct index 7aadecb..c25d0ae 100644 --- a/wiringpi/wiringpi.tct +++ b/wiringpi/wiringpi.tct @@ -28,7 +28,7 @@ Table wiringpitcl WiringPiTcl_SubCommand => obj mode pin int - mode enum(WiringPiTcl_Mode/, "wiringpi pin mode") + mode enum(WiringPiTclModeInfo/, "wiringpi pin mode") read pin int => int @@ -47,36 +47,13 @@ Table wiringpitcl WiringPiTcl_SubCommand clock pin int freq int - drive - group int - value int - pwm-bal - pin int - pwm-ms - pin int pwmTone pin int val int pwmr pin int val int + pwm-bal + pwm-ms pwmc - pin int - clk int - -Table wiringpitcl_mode WiringPiTcl_Mode - in - out - pwm - pwmTone - clock - up - down - tri - off - alt0 - alt1 - alt2 - alt3 - alt4 - alt5 + divider int -- 2.30.2