Skip to content
lcd_i2c.ino 2.98 KiB
Newer Older
/****************************************************************************
* Author : Victor Dubois
****************************************************************************/

Victor Dubois's avatar
Victor Dubois committed
#include <ros.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <std_msgs/UInt16.h>
#include <std_msgs/Duration.h>
//#include <geometry_msgs/Pose.h>
//#include <geometry_msgs/Quaternion.h>
#include <math.h>
Victor Dubois's avatar
Victor Dubois committed

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
Victor Dubois's avatar
Victor Dubois committed
ros::NodeHandle nh;
bool stopped = true;
uint16_t current_score;
uint16_t remaining_time;
//geometry_msgs::Pose current_pose;
int loopId = 0;
Victor Dubois's avatar
Victor Dubois committed

void timeCb( const std_msgs::Duration& a_remaining_time){
    remaining_time = a_remaining_time.data.toSec();
}
Victor Dubois's avatar
Victor Dubois committed

void scoreCb( const std_msgs::UInt16& score){
    current_score = score.data;
    //drawLCD();
Victor Dubois's avatar
Victor Dubois committed
}

/*void poseCb( const geometry_msgs::Pose& a_pose){
    current_pose = a_pose;
}*/
Victor Dubois's avatar
Victor Dubois committed

ros::Subscriber<std_msgs::UInt16> score_sub("score", &scoreCb);
ros::Subscriber<std_msgs::Duration> time_sub("remainingTime", &timeCb);
//ros::Subscriber<geometry_msgs::Pose> pose_sub("current_pose", poseCb);
Victor Dubois's avatar
Victor Dubois committed

/*int quaternionToEulerZ(geometry_msgs::Quaternion& q)
Victor Dubois's avatar
Victor Dubois committed
{
    // yaw (z-axis rotation)
    double siny_cosp = 2 * (q.w * q.z + q.x * q.y);
    double cosy_cosp = 1 - 2 * (q.y * q.y + q.z * q.z);
    return static_cast<int>(atan2(siny_cosp, cosy_cosp));
}*/

void drawLCD()
{
    char* toto = "tu";

    // Print a message to the LCD.
    lcd.setCursor(7,1);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("Score:");
    print_with_padding(current_score);
    //lcd.print(add_padding(current_score));
    //lcd.print(char_buffer);
    /*lcd.setCursor(0,0);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("X");
    lcd.print(current_pose.position.x);
    lcd.setCursor(6,0);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("Y");
    lcd.print(current_pose.position.y);
    lcd.setCursor(12,0);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("T");
    //lcd.print(quaternionToEulerZ(current_pose.orientation));*/
    lcd.setCursor(0,1);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("T");
    print_with_padding(remaining_time);
    lcd.print("s");
    /*add_padding(remaining_time, &char_buffer);
    lcd.print(char_buffer);*/
}
Victor Dubois's avatar
Victor Dubois committed

void print_with_padding(uint16_t number)
{
    uint16_t hundreds = (number%1000 - number%100)/100;
    uint16_t units = number%10;
    uint16_t tens = (number%1000 - hundreds*100 - units)/10;
    if(hundreds == 0)
    {
        lcd.print(" ");
    }
    else
    {
        lcd.print(hundreds);
    };
    if(tens == 0 && hundreds == 0)
    {
        lcd.print(" ");
    }
    else
    {
        lcd.print(tens);
    };
    lcd.print(units);
Victor Dubois's avatar
Victor Dubois committed
}

void setup()
{ 
    current_score = 0;
    loopId = 255;
    remaining_time = 100;
    //current_pose = geometry_msgs::Pose();
    
    nh.initNode();
    nh.subscribe(score_sub);
    nh.subscribe(time_sub);
    //nh.subscribe(pose_sub);

    lcd.init();                      // initialize the lcd 
    lcd.backlight();
    lcd.setCursor(0,1);
    lcd.print("T");
}
Victor Dubois's avatar
Victor Dubois committed

void loop()
{
    nh.spinOnce();
    if(loopId == 0)
    {
        loopId = 1024;
        drawLCD();
    }
    loopId--;
Victor Dubois's avatar
Victor Dubois committed
}