Skip to content

Commit

Permalink
added interrupt supporting
Browse files Browse the repository at this point in the history
  • Loading branch information
hugozhu committed Apr 13, 2013
1 parent e28298a commit 9a32a34
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 8 deletions.
4 changes: 0 additions & 4 deletions .gitmodules
@@ -1,7 +1,3 @@
[submodule "WiringPi"]
path = WiringPi
url = https://github.com/WiringPi/WiringPi.git

[submodule "PCD8544"]
path = PCD8544
url = https://github.com/binerry/RaspberryPi/tree/master/libraries/c/PCD8544
74 changes: 71 additions & 3 deletions rpi.go
Expand Up @@ -6,6 +6,20 @@ package rpi
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#define nil ((void*)0)
#define GEN_INTERRUPTER(PIN) static void interrupt_handler_##PIN() { \
context ctxt; \
ctxt.pin = PIN; \
ctxt.ret = PIN; \
callback_func(goCallback, &ctxt); \
}
typedef struct context context;
struct context {
int pin;
int ret;
};
static void my_pinMode(int p, int m) {
pinMode(p,m);
Expand All @@ -18,15 +32,50 @@ static void my_digitalWrite(int p, int m) {
static int my_digitalRead(int p) {
return digitalRead(p);
}
static void(*callback_func)(void (*f)(void*), void*);
extern void goCallback(void *);
GEN_INTERRUPTER(0)
GEN_INTERRUPTER(1)
GEN_INTERRUPTER(2)
GEN_INTERRUPTER(3)
GEN_INTERRUPTER(4)
GEN_INTERRUPTER(5)
GEN_INTERRUPTER(6)
GEN_INTERRUPTER(7)
static int my_wiringPiISR(int pin, int mode) {
switch(pin) {
case 0: return wiringPiISR(pin, mode, &interrupt_handler_0);
case 1: return wiringPiISR(pin, mode, &interrupt_handler_1);
case 2: return wiringPiISR(pin, mode, &interrupt_handler_2);
case 3: return wiringPiISR(pin, mode, &interrupt_handler_3);
case 4: return wiringPiISR(pin, mode, &interrupt_handler_4);
case 5: return wiringPiISR(pin, mode, &interrupt_handler_5);
case 6: return wiringPiISR(pin, mode, &interrupt_handler_6);
case 7: return wiringPiISR(pin, mode, &interrupt_handler_7);
}
return -1;
}
static void init(void *p) {
callback_func = p;
}
*/
import "C"
import "unsafe"

import (
"code.google.com/p/rog-go/exp/callback"
"errors"
"fmt"
)

const (
VERSION = "0.1"
VERSION = "0.2"
AUTHOR = "@hugozhu"
)

Expand Down Expand Up @@ -167,10 +216,11 @@ func PinToGpio(pin int) int {
return int(C.wpiPinToGpio(C.int(pin)))
}

func WiringPiSetup() {
func WiringPiSetup() error {
if -1 == int(C.wiringPiSetup()) {
panic("Failed to setup Pi")
return errors.New("wiringPiSetup failed to call")
}
return nil
}

/*
Expand Down Expand Up @@ -214,3 +264,21 @@ func Delay(ms int) {
func DelayMicroseconds(microSec int) {
C.delayMicroseconds(C.uint(microSec))
}

func WiringPiISR(pin int, mode int) chan int {
interrupt_chans[pin] = make(chan int)
C.my_wiringPiISR(C.int(pin), C.int(mode))
return interrupt_chans[pin]
}

func init() {
C.init(callback.Func)
}

var interrupt_chans = [64]chan int{}

//export goCallback
func goCallback(arg unsafe.Pointer) {
ctxt := (*C.context)(arg)
interrupt_chans[int(ctxt.pin)] <- int(ctxt.ret)
}

0 comments on commit 9a32a34

Please sign in to comment.