ms35.cpp
Go to the documentation of this file.
00001 /****************************************************************
00002  *
00003  * Copyright (c) 2010
00004  *
00005  * Fraunhofer Institute for Manufacturing Engineering   
00006  * and Automation (IPA)
00007  *
00008  * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00009  *
00010  * Project name: care-o-bot
00011  * ROS stack name: cob_driver
00012  * ROS package name: cob_light
00013  * Description: Switch robots led color by sending data to
00014  * the led-µC over serial connection.
00015  *                                                              
00016  * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00017  *                      
00018  * Author: Benjamin Maidel, email:benjamin.maidel@ipa.fraunhofer.de
00019  * Supervised by: Benjamin Maidel, email:benjamin.maidel@ipa.fraunhofer.de
00020  *
00021  * Date of creation: August 2012
00022  * ToDo:
00023  *
00024  * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00025  *
00026  * Redistribution and use in source and binary forms, with or without
00027  * modification, are permitted provided that the following conditions are met:
00028  *
00029  *     * Redistributions of source code must retain the above copyright
00030  *       notice, this list of conditions and the following disclaimer.
00031  *     * Redistributions in binary form must reproduce the above copyright
00032  *       notice, this list of conditions and the following disclaimer in the
00033  *       documentation and/or other materials provided with the distribution.
00034  *     * Neither the name of the Fraunhofer Institute for Manufacturing 
00035  *       Engineering and Automation (IPA) nor the names of its
00036  *       contributors may be used to endorse or promote products derived from
00037  *       this software without specific prior written permission.
00038  *
00039  * This program is free software: you can redistribute it and/or modify
00040  * it under the terms of the GNU Lesser General Public License LGPL as 
00041  * published by the Free Software Foundation, either version 3 of the 
00042  * License, or (at your option) any later version.
00043  * 
00044  * This program is distributed in the hope that it will be useful,
00045  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00046  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00047  * GNU Lesser General Public License LGPL for more details.
00048  * 
00049  * You should have received a copy of the GNU Lesser General Public 
00050  * License LGPL along with this program. 
00051  * If not, see <http://www.gnu.org/licenses/>.
00052  *
00053  ****************************************************************/
00054 
00055 #include <ms35.h>
00056 #include <ros/ros.h>
00057 #include <boost/crc.hpp>
00058 #include <boost/cstdint.hpp>
00059 #include <boost/integer.hpp>
00060 
00061 MS35::MS35(SerialIO* serialIO)
00062 {
00063         _serialIO = serialIO;
00064         const char init_data[] = { 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd };
00065         int init_len = sizeof(init_data) / sizeof(init_data[0]);
00066         const char startup_data[] = { 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
00067         int startup_len = sizeof(startup_data) / sizeof(startup_data[0]);
00068         char init_buf[18];
00069 
00070         //write data until controller is ready to receive valid package
00071         char tmp = 0xfd;
00072         std::string recv;
00073         int bytes_recv;
00074         do{
00075                 _serialIO->sendData(&tmp, 1);
00076                 bytes_recv = _serialIO->readData(recv, 1);
00077 
00078         }while(bytes_recv <= 0);
00079 
00080         unsigned short int crc = getChecksum(startup_data, startup_len);
00081 
00082         memcpy(&init_buf, init_data, init_len);
00083         memcpy(&init_buf[init_len], startup_data, startup_len);
00084         init_buf[init_len+startup_len] = ((char*)&crc)[1];
00085         init_buf[init_len+startup_len+1] = ((char*)&crc)[0];
00086         sendData(init_buf, 18);
00087 }
00088 
00089 MS35::~MS35()
00090 {
00091 }
00092 
00093 unsigned short int MS35::getChecksum(const char* data, size_t len)
00094 {
00095         unsigned int ret;
00096         boost::crc_16_type checksum_agent;
00097         checksum_agent.process_bytes(data, len);
00098         return checksum_agent.checksum();;
00099 }
00100 
00101 int MS35::sendData(const char* data, size_t len)
00102 {
00103         int ret = -1;
00104         int bytes_wrote = 0;
00105 
00106         bytes_wrote = _serialIO->sendData(data, len);
00107         if(bytes_wrote == -1)
00108         {
00109                 ROS_WARN("Can not write to serial port. Port closed!");
00110                 ret = -1;
00111         }
00112         else
00113         {
00114                 ROS_DEBUG("Wrote [%s] with %i bytes from %i bytes", data, bytes_wrote, len);
00115                 //std::string recv;
00116                 //ROS_INFO("Receiving");
00117                 //int byte_recv = _serialIO->readData(recv, 1);
00118                 //ROS_INFO_STREAM("Received "<<byte_recv<<" bytes after color set: "<<recv);
00119                 //ret = 1;
00120         }
00121         return ret;
00122 }
00123 
00124 
00125 void MS35::setColor(color::rgba color)
00126 {
00127         color::rgba color_tmp = color;
00128 
00129         //calculate rgb spektrum for spezific alpha value, because
00130         //led board is not supporting alpha values
00131         color.r *= color.a;
00132         color.g *= color.a;
00133         color.b *= color.a;
00134 
00135         color.r = fabs(color.r * 255);
00136         color.g = fabs(color.g * 255);
00137         color.b = fabs(color.b * 255);
00138 
00139         buffer[0] = 0x01; buffer[1] = 0x00; 
00140         buffer[2] = (int)color.r; buffer[3]=(int)color.g; buffer[4]=(int)color.b;
00141         buffer[5] = 0x00; buffer[6]=0x00;
00142 
00143         unsigned short int crc = getChecksum(buffer, 7);
00144         buffer[7] = ((char*)&crc)[1];
00145         buffer[8] = ((char*)&crc)[0];
00146         //memcpy(&buffer[7], &crc, sizeof(unsigned short int));
00147 
00148         if(sendData(buffer, PACKAGE_SIZE))
00149                 m_sigColorSet(color_tmp);
00150 }


cob_light
Author(s): Benjamin Maidel
autogenerated on Thu Aug 27 2015 12:46:10