Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
widgets/EACompass.cpp
- Committer:
- richardparker
- Date:
- 2010-11-01
- Revision:
- 7:6cf21b018420
- Parent:
- 4:f8f7f4f9c58d
File content as of revision 7:6cf21b018420:
// Copyright 2010 Richard Parker
#include "mbed.h"
#include "EACompass.h"
#include "../graphics/EAPen.h"
#include "../graphics/EAColor.h"
#include "../screen/EALCD.h"
EACompass::EACompass( short x, 
              short y, 
              unsigned short diameter, 
              unsigned short angle)
{
    setX(x);
    setY(y);
    setWidth(diameter);
    setHeight(diameter);
    
    setAngle(angle);    
}
EACompass::~EACompass()
{
}
void EACompass::paint(EALCD& lcd)
{
    // Draw the outer ring.
    lcd.drawFilledEllipse(x(), y(), diameter(), diameter());
    
    // Now draw the pointer.
    _drawPointer(lcd);
    
    // Next draw the angle value.
    _drawAngle(lcd);
}
void EACompass::update(EALCD& lcd, float angle)
{
    // Clear the old pointer.
    EAColor oldColour = lcd.pen().color();
    EAColor bg = lcd.brush().color();
    EAPen p;
    
    p.setColor(bg);
    lcd.setPen(p);    
    _drawPointer(lcd);
    _drawAngle(lcd);
    
    p.setColor(oldColour);
    lcd.setPen(p);
  
    // Now set the new angle and draw the pointer.
    setAngle(angle);
    
    _drawPointer(lcd);
    _drawAngle(lcd);
}
void EACompass::_drawPointer(EALCD& lcd)
{
    unsigned short r = diameter()/2;
    unsigned short h = r - 10;
    short oy = h * sin(angle());
    short ox = h * cos(angle());
    
    short x0 = r + x() - ox;
    short y0 = r + y() + oy;
    short x1 = r + x() + ox;
    short y1 = r + y() - oy;
    
    // Draw main line.        
    lcd.drawLine(x0, y0, x1, y1);
    
    // Draw ball at north end.
    lcd.drawFilledEllipse(x1-5, y1-5, 10, 10);
}
void EACompass::_drawAngle(EALCD& lcd)
{
    short tx = x() + (diameter()/2);
    short ty = y() + diameter();
    EAFont font;
    
    font.load("/local/small.fnt");   
    lcd.setFont(font);  
    /*
    REVISIT - formatting string to draw heading.
    char angleBuffer[5];
    float angleDeg = (angle() * 180)/PI;
    sprintf(angleBuffer, "%03.0f", angleDeg);
    
    lcd.drawText(tx, ty, angleBuffer);
    */
    
}