From 43cbee25345ca2a8c6e4a950ad8d5e91375d0527 Mon Sep 17 00:00:00 2001 From: schodet Date: Wed, 19 May 2004 13:15:12 +0000 Subject: Plein de trucs. --- 2004/i/nono/src/io/gpio_servo_pp.cc | 83 ++++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 11 deletions(-) (limited to '2004/i/nono/src/io/gpio_servo_pp.cc') 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_; +} + -- cgit v1.2.3