summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/io/gpio_servo_pp.cc
diff options
context:
space:
mode:
Diffstat (limited to '2004/i/nono/src/io/gpio_servo_pp.cc')
-rw-r--r--2004/i/nono/src/io/gpio_servo_pp.cc83
1 files changed, 72 insertions, 11 deletions
diff --git a/2004/i/nono/src/io/gpio_servo_pp.cc b/2004/i/nono/src/io/gpio_servo_pp.cc
index 5edab20..c249c7b 100644
--- a/2004/i/nono/src/io/gpio_servo_pp.cc
+++ b/2004/i/nono/src/io/gpio_servo_pp.cc
@@ -31,7 +31,7 @@
/// Constructeur.
GpioServoPp::GpioServoPp (void)
: outputs_ (0), inputs_ (0),
- serial_ (true), ttyspeed_ (0),
+ ttyspeed_ (0),
log_ ("io", "pp")
{
Config rc ("rc/gpio_servo_pp");
@@ -43,9 +43,25 @@ GpioServoPp::GpioServoPp (void)
))
rc.noId ();
}
+ // Ouvre le port série.
serial_.open (ttyname_, ttyspeed_);
for (int i = 0; i < nbServo_; ++i)
servoPos_[i] = 0;
+ // Construit la table des noms.
+ names_["o0"] = 0;
+ names_["o1"] = 1;
+ names_["o2"] = 2;
+ names_["o3"] = 3;
+ names_["o4"] = 4;
+ names_["o5"] = 5;
+ names_["i0"] = 6;
+ names_["i1"] = 7;
+ names_["i2"] = 8;
+ names_["i3"] = 9;
+ names_["i4"] = 10;
+ names_["i5"] = 11;
+ names_["i6"] = 12;
+ names_["i7"] = 13;
}
/// Destructeur.
@@ -63,7 +79,7 @@ GpioServoPp::set (int n, unsigned int bits, int nb)
bits <<= n;
outputs_ = (outputs_ & ~mask) | (bits & mask) | 0x80;
serial_.putchar (outputs_);
- log_ (Log::debug) << "send " << std::hex << outputs_ << std::dec <<
+ log_ (Log::debug) << "send 0x" << std::hex << outputs_ << std::dec <<
std::endl;
}
@@ -73,7 +89,7 @@ GpioServoPp::get (int n, int nb)
{
if (n < nbOutputs_ || n + nb > nbOutputs_ + nbInputs_)
throw std::out_of_range ("GpioServoPp::get: Out of range.");
- unsigned int mask = 1 << (nb) - 1;
+ unsigned int mask = (1 << nb) - 1;
unsigned int bits = (inputs_ >> (n - nbOutputs_)) & mask;
return bits;
}
@@ -84,9 +100,9 @@ GpioServoPp::move (int n, int diff)
{
n %= nbServo_;
servoPos_[n] += diff;
- int v = n << 7 | servoPos_[n];
+ int v = n << 6 | servoPos_[n];
serial_.putchar (v);
- log_ (Log::debug) << "send " << std::hex << v << std::dec << std::endl;
+ log_ (Log::debug) << "send 0x" << std::hex << v << std::dec << std::endl;
}
/// Bouge un servo en position POS.
@@ -95,9 +111,9 @@ GpioServoPp::moveTo (int n, int pos)
{
n %= nbServo_;
servoPos_[n] = pos;
- int v = n << 7 | servoPos_[n];
+ int v = n << 6 | servoPos_[n];
serial_.putchar (v);
- log_ (Log::debug) << "send " << std::hex << v << std::dec << std::endl;
+ log_ (Log::debug) << "send 0x" << std::hex << v << std::dec << std::endl;
}
/// Met à jour.
@@ -107,15 +123,35 @@ GpioServoPp::update (void)
int c;
while ((c = serial_.getchar ()) != -1)
{
- log_ (Log::debug) << "recv " << std::hex << c << std::dec <<
+ log_ (Log::verydebug) << "recv 0x" << std::hex << c << std::dec <<
std::endl;
- switch (inputs_ & 0x0f)
+ switch (c & 0x0f)
{
case 0x0:
- inputs_ |= c >> 4;
+ inputs_ = (inputs_ & 0x0f) | (c & 0xf0);
+ log_ (Log::debug) << "comp " << (c >> 4) << std::endl;
break;
case 0x7:
- inputs_ |= c & 0xf0;
+ inputs_ = (inputs_ & 0xf0) | (c >> 4);
+ log_ (Log::debug) << "digi " << (c >> 4) << std::endl;
+ break;
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ case 0x9:
+ case 0xa:
+ case 0xb:
+ case 0xc:
+ {
+ int n = (c & 0x07) - 1;
+ anaInput_[n] = c >> 3;
+ log_ (Log::debug) << "ana " << n << ' ' << (c >> 3) <<
+ std::endl;
+ break;
+ }
+ default:
+ log_ (Log::debug) << "other";
break;
}
}
@@ -128,3 +164,28 @@ GpioServoPp::getNbIo (void)
return nbOutputs_ + nbInputs_;
}
+/// Récupère une entrée/sortie par son nom.
+int
+GpioServoPp::getByName (const std::string &name) const
+{
+ Names::const_iterator i = names_.find (name);
+ if (i != names_.end ())
+ return i->second;
+ else
+ return -1;
+}
+
+/// Récupère la valeure d'une entrée analogique.
+unsigned int
+GpioServoPp::getAna (int n)
+{
+ return anaInput_[n];
+}
+
+/// Récupère le nombre d'entrées analogiques.
+int
+GpioServoPp::getNbAna (void) const
+{
+ return nbAnaInputs_;
+}
+