Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Userland app for servomotor #462

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
11 changes: 11 additions & 0 deletions examples/servo/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Makefile for user application

# Specify this directory relative to the current application.
TOCK_USERLAND_BASE_DIR = ../..

# Which files to compile.
C_SRCS := $(wildcard *.c)

# Include userland master makefile. Contains rules and flags for actually
# building the application.
include $(TOCK_USERLAND_BASE_DIR)/AppMakefile.mk
25 changes: 25 additions & 0 deletions examples/servo/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include "../../libtock/interface/syscalls/servo_syscalls.h"
#include <libtock-sync/services/alarm.h>
#include <libtock/tock.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
// Checks if the driver exists and, if not, returns -1.
if (!libtock_servo_exists()) {
printf("There is no available servo\n");
return -1;
}

uint16_t angle;
inesmaria08 marked this conversation as resolved.
Show resolved Hide resolved

// Changes the angle of the servomotor from 0 to 180 degrees (waiting 0.1 ms between every change).
for (int i = 0; i <= 180; i++) {
libtock_servo_angle(i);
inesmaria08 marked this conversation as resolved.
Show resolved Hide resolved
libtocksync_alarm_delay_ms(100);
// Verifies if the function successfully returned the current angle.
if (libtock_current_servo_angle(&angle) == RETURNCODE_SUCCESS) {
printf("the current angle is: %d", angle);
}
inesmaria08 marked this conversation as resolved.
Show resolved Hide resolved
}
}
21 changes: 21 additions & 0 deletions libtock/interface/syscalls/servo_syscalls.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include "servo_syscalls.h"
#include <stdio.h>

bool libtock_servo_exists(void) {
return driver_exists(DRIVER_NUM_SERVO);
}

returncode_t libtock_servo_angle(uint32_t angle) {
syscall_return_t cval = command(DRIVER_NUM_SERVO, 1, angle, 0);
return tock_command_return_novalue_to_returncode(cval);
}

returncode_t libtock_current_servo_angle(uint16_t* angle) {
uint32_t value = 0;
syscall_return_t r = command(DRIVER_NUM_SERVO, 2, 0, 0);
// Converts the value returned by the servo, stored in `r`,
// and assigns it to `ret`.
returncode_t ret = tock_command_return_u32_to_returncode(r, &value);
*angle = (uint16_t)value;
return ret;
}
21 changes: 21 additions & 0 deletions libtock/interface/syscalls/servo_syscalls.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#pragma once

#include "../../tock.h"

#ifdef __cplusplus
extern "C" {
#endif

#define DRIVER_NUM_SERVO 0x90009

// Check if the servo system call driver is available on this board.
bool libtock_servo_exists(void);

// Change the angle.
returncode_t libtock_servo_angle(uint32_t angle);
// Requests the current angle from the servo.
returncode_t libtock_current_servo_angle(uint16_t* angle);

#ifdef __cplusplus
}
#endif
Loading