summaryrefslogtreecommitdiff
path: root/2005/i/robert/src/proto/proto.cc
diff options
context:
space:
mode:
Diffstat (limited to '2005/i/robert/src/proto/proto.cc')
-rw-r--r--2005/i/robert/src/proto/proto.cc280
1 files changed, 161 insertions, 119 deletions
diff --git a/2005/i/robert/src/proto/proto.cc b/2005/i/robert/src/proto/proto.cc
index 23ccb93..c8f4e1e 100644
--- a/2005/i/robert/src/proto/proto.cc
+++ b/2005/i/robert/src/proto/proto.cc
@@ -34,20 +34,23 @@ Proto::Proto(Receiver &receiver)
}
/// Ouvre le port série.
-void Proto::open(const std::string &ttyname)
+void
+Proto::open(const std::string &ttyname)
{
serial_.open(ttyname);
}
/// Ferme le port série
-void Proto::close(void)
+void
+Proto::close(void)
{
serial_.close();
}
/// Teste si tout les packets ont été envoyés et aquités, sinon, essaye de
/// le faire.
-bool Proto::sync(void)
+bool
+Proto::sync(void)
{
bool reGet = true;
//Récupération de la frame
@@ -80,7 +83,8 @@ bool Proto::sync(void)
}
/// Envoie un packet
-void Proto::send (const Frame & Frame)
+void
+Proto::send (const Frame & Frame)
{
frameQueue_.push(Frame);
sync();
@@ -90,13 +94,30 @@ void Proto::send (const Frame & Frame)
/// Envois un packet. COMMAND est la commande à envoyer, FORMAT, donne le
/// format et le nombre de paramètres ('b' : 8 bits, 'w' : 16 bits, 'd' :
/// 32 bits, majuscule pour signé).
-void Proto::send (uint8_t command, const char *format, int a0, int a1,
+void
+Proto::send (uint8_t command, const char *format, int a0, int a1,
int a2, int a3)
{
// Constitution de la frame
Proto::Frame frame;
- int nbArg = strlen(format);
+ //int nbArg = strlen(format);
frame.command = command;
+
+ if (format[0] != '\0')
+ {
+ newArgFrame(frame, format[0],a0);
+ if (format[1] != '\0')
+ {
+ newArgFrame(frame, format[1],a1);
+ if (format[2] != '\0')
+ {
+ newArgFrame(frame, format[2],a2);
+ if (format[3] != '\0')
+ newArgFrame(frame, format[3],a3);
+ }
+ }
+ }
+ /*
// Conversion et saisie des aguments
if(nbArg == 1)
newArgFrame(frame, format[0], a0);
@@ -118,30 +139,46 @@ void Proto::send (uint8_t command, const char *format, int a0, int a1,
newArgFrame(frame, format[2], a2);
newArgFrame(frame, format[3], a3);
}
+ */
send(frame);
}
-bool Proto::decode (const Proto::Frame &frame)
+bool
+Proto::decode (const Proto::Frame &frame)
{
+ //bon, est-ce que c'est bien utile ça?
+ int dummy;
+ return decode(frame, "", dummy, dummy, dummy, dummy);
+ /*
//On teste si des arguments sont présents(ca serait pas bon)
if(!frame.args.empty())
return false;
else
return true;
+ */
}
-bool Proto::decode (const Frame &frame, const char *format, int &a0)
+bool
+Proto::decode (const Frame &frame, const char *format, int &a0)
{
+ int dummy;
+ return decode(frame, format, a0, dummy, dummy, dummy);
+ /*
// On teste le format de la frame
if(!verifyFrame(frame, format, 1))
return false;
//On décode et on envoie
a0 = decodeArg(frame, format, 0);
return true;
+ */
}
-bool Proto::decode (const Frame &frame, const char *format, int &a0, int &a1)
+bool
+Proto::decode (const Frame &frame, const char *format, int &a0, int &a1)
{
+ int dummy;
+ return decode(frame, format, a0, a1, dummy, dummy);
+ /*
// On vérifie le format de la frame
if(!verifyFrame(frame, format, 2))
return false;
@@ -149,11 +186,17 @@ bool Proto::decode (const Frame &frame, const char *format, int &a0, int &a1)
a0 = decodeArg(frame, format, 0);
a1 = decodeArg(frame, format, 1);
return true;
+ */
}
-bool Proto::decode (const Frame &frame, const char *format, int &a0,
+bool
+Proto::decode (const Frame &frame, const char *format, int &a0,
int &a1, int &a2)
{
+
+ int dummy;
+ return decode(frame, format, a0, a1, a2, dummy);
+ /*
// On vérifie le format de la frame
if(!verifyFrame(frame, format, 3))
return false;
@@ -162,24 +205,25 @@ bool Proto::decode (const Frame &frame, const char *format, int &a0,
a1 = decodeArg(frame, format, 1);
a2 = decodeArg(frame, format, 2);
return true;
+ */
}
-bool Proto::decode (const Frame &frame, const char *format, int &a0,
+bool
+Proto::decode (const Frame &frame, const char *format, int &a0,
int &a1, int &a2, int &a3)
-{
- // On vérifie le format de la frame
- if(!verifyFrame(frame, format, 3))
- return false;
+{
+ //Teste si il y a bien le bon nombre d'argument
+ if (int(frame.args.size()) != argsFrameSize(format))//un cast pour virer un warning
+ return false;
// On décode et on envoie
- a0 = decodeArg(frame, format, 0);
- a1 = decodeArg(frame, format, 1);
- a2 = decodeArg(frame, format, 2);
- a3 = decodeArg(frame, format, 3);
+ decodeArg(frame, format, a0, a1, a2, a3);
+
return true;
}
/// Récupère les infos de l'AVR pour construire une frame
-bool Proto::getFrame(void)
+bool
+Proto::getFrame(void)
{
int receivedChar;
//tant que le tampon n'est pas vide, on teste
@@ -203,22 +247,22 @@ bool Proto::getFrame(void)
}
//Pour les autres charactères
//Si on attend la commande
- else if(revState_ == 1)
- {
- currentFrame_.command = ((uint8_t)hex2digit( receivedChar ))
- << 4;
- revState_ = 2;
- }
- else if(revState_ == 2)
- {
- currentFrame_.command |= (uint8_t)hex2digit( receivedChar );
- revState_ = 3;
- }
- else if(revState_ == 3)
+ switch(revState_)
{
- currentFrame_.args.push_back(((uint8_t)
- hex2digit( receivedChar )) << 4);
- revState_ = 3;
+ case 1:
+ currentFrame_.command = (uint8_t(hex2digit( receivedChar )))
+ << 4;
+ revState_ = 2;
+ break;
+ case 2:
+ currentFrame_.command |= uint8_t(hex2digit( receivedChar ));
+ revState_ = 3;
+ break;
+ case 3:
+ currentFrame_.args.push_back(uint8_t(
+ hex2digit( receivedChar )) << 4);
+ revState_ = 3;
+ break;
}
//Si revState == 0 alors on jette
}
@@ -226,7 +270,8 @@ bool Proto::getFrame(void)
return false;
}
-void Proto::sendFrame(const Frame & frame)
+ void
+Proto::sendFrame(const Frame & frame)
{
//envoyer le bang
serial_.putchar('!');
@@ -236,7 +281,7 @@ void Proto::sendFrame(const Frame & frame)
serial_.putchar(digit2hex(frame.command & 0x0f));
//Envoyer les arguments
- for(int i = 0; i < (int)frame.args.size(); i++) //le cast est pour virer un warning
+ for(int i = 0; i < int(frame.args.size()); i++) //le cast est pour virer un warning
{
serial_.putchar(digit2hex(frame.args[i] >> 4));
serial_.putchar(digit2hex(frame.args[i] & 0x0f));
@@ -249,114 +294,111 @@ void Proto::sendFrame(const Frame & frame)
tLastSend_ = Timer::getProgramTime();
}
-void Proto::newArgFrame(Proto::Frame & frame, char format, int arg)
+ void
+Proto::newArgFrame(Proto::Frame & frame, char format, int arg)
{
switch(format)
{
case 'b':
case 'B':
- frame.args.push_back((uint8_t)arg);
+ frame.args.push_back(uint8_t(arg));
break;
case 'w':
case 'W':
- frame.args.push_back((uint8_t)(arg >> 8));
- frame.args.push_back((uint8_t)arg);
+ frame.args.push_back(uint8_t(arg >> 8));
+ frame.args.push_back(uint8_t(arg));
break;
case 'd':
case 'D':
- frame.args.push_back((uint8_t)(arg >> 24));
- frame.args.push_back((uint8_t)(arg >> 16));
- frame.args.push_back((uint8_t)(arg >> 8));
- frame.args.push_back((uint8_t)arg);
+ frame.args.push_back(uint8_t(arg >> 24));
+ frame.args.push_back(uint8_t(arg >> 16));
+ frame.args.push_back(uint8_t(arg >> 8));
+ frame.args.push_back(uint8_t(arg));
break;
}
}
-int Proto::argsFrameSize(const char *format, int nbArg)
+ int
+Proto::argsFrameSize(const char *format)
{
int size = 0;
- if(nbArg == 0)
- nbArg = strlen(format);
- for(int i = 0; i < nbArg; i++)
- size += argSize(format[i]);
+ for(; *format != '\0'; format++)
+ switch(*format)
+ {
+ case 'b':
+ case 'B':
+ size += 1;
+ case 'w':
+ case 'W':
+ size += 1;
+ case 'd':
+ case 'D':
+ size += 1;
+ default:
+ size += 1;
+ }
return size;
}
-int Proto::argSize(char format)
-{
- switch(format)
- {
- case 'b':
- case 'B':
- return 1;
- case 'w':
- case 'W':
- return 2;
- case 'd':
- case 'D':
- return 4;
- default:
- return 0;
- }
-}
-
-bool Proto::verifyFrame(const Frame &frame, const char *format, int nbArg)
+void
+Proto::decodeArg(const Frame & frame, const char *format, int &a0, int &a1, int &a2, int &a3)
{
- //Teste si il y a bien le bon nombre d'argument
- if ((int)strlen(format) != nbArg)//Un cast pour shooter un warning
- return false;
- if ((int)frame.args.size() != argsFrameSize(format))//un cast pour virer un warning
- return false;
- //Voir pour des test plus approffondi si possible et necessaire
- return true;
-}
-
-int Proto::decodeArg(const Frame & frame, const char *format, int numArg)
-{
- int argDecoded = 0;
- int beginArg = argsFrameSize(format, numArg);
+ int temp[4];
+ int pos = 0;
- switch(format[numArg])
- {
- case 'b':
- argDecoded = (int)frame.args[beginArg];
- break;
- case 'B':
- {
- int8_t temp = (int8_t)frame.args[beginArg];
- argDecoded = (int) temp;
- break;
- }
- case 'w':
- argDecoded = (int)frame.args[beginArg] << 8
- |(int)frame.args[beginArg + 1];
- break;
- case 'W':
- {
- int8_t temp1 = (int8_t)frame.args[beginArg];
- argDecoded = (int)temp1 << 8
- |(int)frame.args[beginArg + 1];
- break;
- }
- case 'd':
- argDecoded = (int)frame.args[beginArg] << 24
- |(int)frame.args[beginArg + 1] << 16
- |(int)frame.args[beginArg + 2] << 8
- |(int)frame.args[beginArg + 3];
- break;
+ for(int i = 0; *format != '\0'; format++,i++)
+ {
+ switch(*format)
+ {
+ case 'b':
+ temp[i] = int(frame.args[pos]);
+ pos++;
+ break;
+ case 'B':
+ {
+ int8_t t = int8_t(frame.args[pos]);
+ temp[i] = int(t);
+ pos++;
+ break;
+ }
+ case 'w':
+ temp[i] = int(frame.args[pos]) << 8
+ |int(frame.args[pos + 1]);
+ pos += 2;
+ break;
+ case 'W':
+ {
+ int8_t t = int8_t(frame.args[pos]);
+ temp[i] = int(t) << 8
+ |int(frame.args[pos + 1]);
+ pos += 2;
+ break;
+ }
+ case 'd':
+ temp[i] = int(frame.args[pos]) << 24
+ |int(frame.args[pos + 1]) << 16
+ |int(frame.args[pos + 2]) << 8
+ |int(frame.args[pos + 3]);
+ pos += 4;
+ break;
- case 'D':
- int8_t temp1 = (int8_t)frame.args[beginArg];
- argDecoded = (int)temp1 << 24
- |(int)frame.args[beginArg + 1] << 16
- |(int)frame.args[beginArg + 2] << 8
- |(int)frame.args[beginArg + 3];
- break;
+ case 'D':
+ int8_t t = int8_t(frame.args[pos]);
+ temp[i] = int(t) << 24
+ |int(frame.args[pos + 1]) << 16
+ |int(frame.args[pos + 2]) << 8
+ |int(frame.args[pos + 3]);
+ break;
+ }
}
- return argDecoded;
+ a0 = temp[0];
+ a1 = temp[1];
+ a2 = temp[2];
+ a3 = temp[3];
}
-bool Proto::Frame::operator==(const Frame& frame)
+ bool
+Proto::Frame::operator==(const Frame& frame)
{
return this->command == frame.command && this->args == frame.args;
}