static PyObject *py_set_run(PyObject *self, PyObject *args, PyObject *kwargs){
    char key[8];
    char *channel;
    int run = 0;
    static char *kwlist[] = {"channel", "run", NULL};

    if(!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", kwlist, &channel, &run))
        return NULL;

    if (run != 0 && run != 1)
    {
        PyErr_SetString(PyExc_ValueError, "run must be either 0 or 1");
        return NULL;
    } 

    if (!get_pwm_key(channel, key)) {
        PyErr_SetString(PyExc_ValueError, "Invalid PWM key or name.");
        return NULL;    
    }

    if (pwm_set_run(key, run) == -1) {
        PyErr_SetString(PyExc_RuntimeError, "You must start() the PWM channel first");
        return NULL;
    }

    Py_RETURN_NONE;

}
Exemplo n.º 2
0
Arquivo: pwm.c Projeto: wda2945/Fido
int pwm_disable(PwmChannel_t *pwm)
{
	pwm_set_run(pwm, 0);
	//close the fds
	close(pwm->period_fd);
	close(pwm->duty_fd);
	close(pwm->polarity_fd);
	close(pwm->run_fd);
    return 0;    
}
Exemplo n.º 3
0
Arquivo: pwm.c Projeto: wda2945/Fido
int pwm_start(const char *pinName, int exportNumber, char *pwmDir, float duty, float freq, int polarity, PwmChannel_t *pwm)
{
    char pwm_control_path[PATHLEN];


    char pwm_path[PATHLEN];				//pwm channel control folder
    char export[2];
    int fd;

    strncpy(pwm->key, pinName, KEYLEN);

    if (set_pinmux(pinName, "pwm") < 0)
    {
    	return -1;
    }
    //export pwm channel
    if ((fd = open("/sys/class/pwm/export", O_WRONLY)) < 0)
    {
    	LogError("pwm open(/sys/class/pwm/export) fail (%s)\n", strerror(errno));
        return -1;
    }
    snprintf(export, 2, "%i", exportNumber);
    write(fd,export,1);
    close(fd);

    snprintf(pwm_path, sizeof(pwm_path), "/sys/class/pwm/%s", pwmDir);

    //create the path for period control
    snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/period_ns", pwm_path);
    if ((pwm->period_fd = open(pwm_control_path, O_WRONLY)) < 0)
    {
    	LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno));
        return -1;
    }

    snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/duty_ns", pwm_path);
    if ((pwm->duty_fd = open(pwm_control_path, O_WRONLY)) < 0) {
        //error, close already opened period_fd.
    	LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno));
        close(pwm->period_fd);
        return -1;
    }

    snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/polarity", pwm_path);
    if ((pwm->polarity_fd = open(pwm_control_path, O_WRONLY)) < 0) {
    	LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno));
        //error, close already opened period_fd and duty_fd.
        close(pwm->period_fd);
        close(pwm->duty_fd);
        return -1;
    }    

    snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/run", pwm_path);
    if ((pwm->run_fd = open(pwm_control_path, O_WRONLY)) < 0) {
    	LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno));
        //error, close already opened period_fd and duty_fd.
    	close(pwm->polarity_fd);
        close(pwm->period_fd);
        close(pwm->duty_fd);
        return -1;
    }

    pwm_set_frequency(pwm, freq);
    pwm_set_polarity(pwm, polarity);
    pwm_set_duty_cycle(pwm, duty);
    pwm_set_run(pwm, 1);

    return 0;
}