This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
rc2007-soccer/source/qFix/qfixSlaveBoard.h

158 lines
2.9 KiB
C
Raw Normal View History

//------------------------------------------------------------------
// qfixSlaveBoard.h
//
// This file contains the class SlaveBoard which represents a kind
// of remote control of a BobbyBoard via the I2C bus. The SlaveBoard
// can be used like a local BobbyBoard with all its inputs and outputs.
//
// Copyright 2005 by KTB mechatronics GmbH
// Author: Stefan Enderle
//------------------------------------------------------------------
#ifndef qfixSlaveBoard_h
#define qfixSlaveBoard_h
#include "qfixI2CMaster.h"
#include "qfixI2CDefs.h"
const uint8_t CMD_LEDON = 0;
const uint8_t CMD_LEDOFF = 1;
const uint8_t CMD_LEDSOFF = 2;
const uint8_t CMD_POWERON = 3;
const uint8_t CMD_POWEROFF = 4;
const uint8_t CMD_MOTOR = 5;
const uint8_t CMD_BUTTON = 6;
const uint8_t CMD_ANALOG = 7;
const uint8_t CMD_DIGITAL = 8;
//----------------------------------------
class SlaveBoard : I2CMaster
{
public:
SlaveBoard();
SlaveBoard(uint8_t logicalID);
/** Puts on LED i
*/
void ledOn(uint8_t i);
/** Puts off LED i
*/
void ledOff(uint8_t i);
/** Puts off all LEDs
*/
void ledsOff();
/** Puts the power output i on
*/
void powerOn(uint8_t i);
/** Puts the power output i off
*/
void powerOff(uint8_t i);
/** Sets motor i to the given speed. -255 <= speed <= 255
*/
void motor(uint8_t i, int speed);
/** Checks the state of button i. If it is pressed, true is returned,
* else false.
*/
bool button(uint8_t i);
/** returns the value of the analog port i. 0 <= value <= 255
*/
int analog(uint8_t i);
/** returns true if the digital port is logical high, else false.
*/
bool digital(uint8_t i);
};
SlaveBoard::SlaveBoard() : I2CMaster(I2C_ADDR_BOBBYBOARD)
{
}
SlaveBoard::SlaveBoard(uint8_t logicalID)
: I2CMaster(I2C_ADDR_BOBBYBOARD, logicalID)
{
}
void SlaveBoard::ledOn(uint8_t i)
{
if (i>3) return;
command(CMD_LEDON, i);
}
void SlaveBoard::ledOff(uint8_t i)
{
if (i>3) return;
command(CMD_LEDOFF, i);
}
void SlaveBoard::ledsOff()
{
command(CMD_LEDSOFF);
}
void SlaveBoard::powerOn(uint8_t i)
{
if (i>7) return;
command(CMD_POWERON, i);
}
void SlaveBoard::powerOff(uint8_t i)
{
if (i>7) return;
command(CMD_POWEROFF, i);
}
void SlaveBoard::motor(uint8_t i, int speed)
{
if (i>1) return;
uint8_t neg=(speed<0)?1:0;
uint8_t s;
if (speed>=0) s=uint8_t(speed); else s=-uint8_t(speed);
command(CMD_MOTOR, i, neg, s);
}
bool SlaveBoard::button(uint8_t i)
{
if (i>3) return false; // better error handling!
return (request(CMD_BUTTON, i) == 1);
}
int SlaveBoard::analog(uint8_t i)
{
if (i>3) return -1; // better error handling!
return (request(CMD_ANALOG, i));
}
bool SlaveBoard::digital(uint8_t i)
{
if (i>3) return false; // better error handling!
return (request(CMD_DIGITAL, i) == 1);
}
#endif