Added str() method

This commit is contained in:
Ingo Ruhnke 2010-05-26 16:56:28 +02:00
parent 238b1c2a54
commit b84d669f45
4 changed files with 114 additions and 14 deletions

View file

@ -21,6 +21,7 @@
#include <boost/tokenizer.hpp>
#include <boost/lexical_cast.hpp>
#include <stdlib.h>
#include <iostream>
#include "axis_event.hpp"
#include "evdev_helper.hpp"
@ -54,8 +55,8 @@ AxisEvent::create_rel(int device_id, int code, int repeat, float value)
AxisEvent ev;
ev.type = EV_REL;
ev.rel.code = UIEvent::create(device_id, EV_REL, code);
ev.rel.repeat = repeat;
ev.rel.value = value;
ev.rel.repeat = repeat;
return ev;
}
@ -66,7 +67,7 @@ AxisEvent::create_key()
ev.type = EV_KEY;
std::fill_n(ev.key.up_codes, MAX_MODIFIER+1, UIEvent::invalid());
std::fill_n(ev.key.down_codes, MAX_MODIFIER+1, UIEvent::invalid());
ev.key.threshold = 8000;
ev.key.threshold = 8000;
return ev;
}
@ -76,8 +77,8 @@ AxisEvent::create_rel()
AxisEvent ev;
ev.type = EV_REL;
ev.rel.code = UIEvent::invalid();
ev.rel.repeat = 10;
ev.rel.value = 5;
ev.rel.repeat = 10;
return ev;
}
@ -97,23 +98,32 @@ AxisEvent::create_abs()
AxisEvent
AxisEvent::from_string(const std::string& str)
{
AxisEvent ev;
switch (get_event_type(str))
{
case EV_ABS:
return abs_from_string(str);
ev = abs_from_string(str);
break;
case EV_REL:
return rel_from_string(str);
ev = rel_from_string(str);
break;
case EV_KEY:
return key_from_string(str);
case -1:
return invalid();
ev = invalid();
break;
default:
assert(!"AxisEvent::from_string(): should never be reached");
}
std::cout << "AxisEvent::from_string():\n in: " << str << "\n out: " << ev.str() << std::endl;
return ev;
}
AxisEvent
@ -165,7 +175,7 @@ AxisEvent::rel_from_string(const std::string& str)
break;
case 1:
ev.rel.value = boost::lexical_cast<int>(*i);
ev.rel.value = boost::lexical_cast<int>(*i);
break;
case 2:
@ -279,10 +289,16 @@ AxisEvent::send(uInput& uinput, int old_value, int value) const
case EV_ABS:
uinput.get_uinput(abs.code.device_id)->send(type, abs.code.code, value);
break;
case EV_REL:
// FIXME: Need to know the min/max of value
uinput.send_rel_repetitive(rel.code, rel.value * value / 32767, rel.repeat);
{
// FIXME: Need to know the min/max of value
int v = rel.value * value / 32767;
if (v == 0)
uinput.send_rel_repetitive(rel.code, v, -1);
else
uinput.send_rel_repetitive(rel.code, v, rel.repeat);
}
break;
case EV_KEY:
@ -319,4 +335,45 @@ AxisEvent::send(uInput& uinput, int old_value, int value) const
}
}
std::string
AxisEvent::str() const
{
std::ostringstream out;
switch(type)
{
case EV_ABS:
out << abs.code.device_id << "-" << abs.code.code << ":" << abs.min << ":" << abs.max << ":" << abs.fuzz << ":" << abs.flat;
break;
case EV_REL:
out << rel.code.device_id << "-" << rel.code.code << ":" << rel.value << ":" << rel.repeat;
break;
case EV_KEY:
for(int i = 0; key.up_codes[i].is_valid();)
{
out << key.up_codes[i].device_id << "-" << key.up_codes[i].code;
++i;
if (key.up_codes[i].is_valid())
out << "+";
}
out << ":";
for(int i = 0; key.down_codes[i].is_valid();)
{
out << key.down_codes[i].device_id << "-" << key.down_codes[i].code;
++i;
if (key.down_codes[i].is_valid())
out << "+";
}
out << ":" << key.threshold;
break;
}
return out.str();
}
/* EOF */

View file

@ -53,6 +53,8 @@ public:
bool is_valid() const;
std::string str() const;
private:
/** EV_KEY, EV_ABS, EV_REL */
int type;
@ -60,8 +62,8 @@ private:
union {
struct {
UIEvent code;
int repeat;
float value; // FIXME: Why is this float?
int repeat;
} rel;
struct {

View file

@ -71,8 +71,8 @@ ButtonEvent::create_rel(int code)
ButtonEvent ev;
ev.type = EV_REL;
ev.rel.code = UIEvent::create(DEVICEID_AUTO, EV_REL, code);
ev.rel.repeat = 100;
ev.rel.value = 3;
ev.rel.repeat = 100;
return ev;
}
@ -140,11 +140,13 @@ ButtonEvent::from_string(const std::string& str)
}
}
std::cout << "ButtonEvent::from_string():\n in: " << str << "\n out: " << ev.str() << std::endl;
return ev;
}
ButtonEvent::ButtonEvent() :
type(0xdeadbeaf)
type(-1)
{
}
@ -219,4 +221,41 @@ ButtonEvent::is_valid() const
return type != -1;
}
std::string
ButtonEvent::str() const
{
std::ostringstream out;
switch(type)
{
case EV_KEY:
for(int i = 0; key.codes[i].is_valid();)
{
out << key.codes[i].device_id << "-" << key.codes[i].code;
++i;
if (key.codes[i].is_valid())
out << "+";
}
break;
case EV_REL:
out << rel.code.device_id << "-" << rel.code.code << ":" << rel.value << ":" << rel.repeat;
break;
case EV_ABS:
out << abs.code.device_id << "-" << abs.code.code << ":" << abs.value;
break;
case -1:
out << "void";
break;
default:
assert(!"Never reached");
}
return out.str();
}
/* EOF */

View file

@ -45,6 +45,8 @@ public:
bool is_valid() const;
std::string str() const;
private:
/** EV_KEY, EV_ABS, EV_REL */
int type;
@ -52,8 +54,8 @@ private:
union {
struct {
UIEvent code;
int repeat;
int value;
int repeat;
} rel;
struct {