X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=wiringpi%2Fwiringpi.c;h=3b6348d2690890f71b7a6be486d1c894f5178bc3;hp=e71cb53ce4831bb04a96fd5662587029e27ff5bc;hb=69ecaa002ac974316ca2a9f37f1674476cd63a5c;hpb=815388c65f811518a388d7dc1c65ee05fdafb36d diff --git a/wiringpi/wiringpi.c b/wiringpi/wiringpi.c index e71cb53..3b6348d 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,184 @@ #include "chiark_tcl_wiringpi.h" +#include "wiringPi.h" + /*---------- important types and forward declarations ----------*/ +#define CHECK_SETUP \ + int rc; \ + rc = ensure_setup(ip); \ + 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) + +static int setup_done; + +/*---------- operations ----------*/ + +static int setup_failure(Tcl_Interp *ip, int r) { +#define N 4 + Tcl_Obj *codelist[N]; + codelist[0]= cht_ret_string(ip,"WIRINGPI"); + codelist[1]= cht_ret_string(ip,"ERROR"); + codelist[2]= cht_ret_string(ip,"SETUP"); + codelist[3]= cht_ret_int(ip,r); + Tcl_SetObjResult(ip, Tcl_NewListObj(N, codelist)); +#undef N + Tcl_SetResult(ip, (char*)"wiringpi initialisation error", TCL_STATIC); + return TCL_ERROR; +} + +static int ensure_setup(Tcl_Interp *ip) { + if (!setup_done) { + int r = wiringPiSetup(); + if (r) return setup_failure(ip, r); + setup_done = 1; + } + return TCL_OK; +} + +int cht_do_wiringpitcl_setup(ClientData cd, Tcl_Interp *ip, + int objc, Tcl_Obj *const *objv) { + int r; + int rc; + + if (setup_done) + return cht_staticerr(ip,"wiringpi setup called again", + "WIRINGPI FORBIDDEN-REINIT SETUP"); + + if (*objv) { + const char *modeopt; + rc = cht_pat_string(ip,*objv++,&modeopt); + if (rc) return rc; + if (modeopt[0] != '-' || !modeopt[1] || modeopt[2]) + return cht_staticerr(ip,"wiringpi setup option wrong syntax", 0); + if (*objv) + return cht_staticerr(ip,"wiringpi setup too many arguments", 0); + switch (modeopt[1]) { + case 'g': r = wiringPiSetupGpio(); break; + case '1': r = wiringPiSetupPhys(); break; + default: + return cht_staticerr(ip,"wiringpi setup option unknown value", 0); + } + } else { + r = wiringPiSetup(); + } + if (r) return setup_failure(ip, r); + 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))