The iPod controller that I submitted for the mbed challenge

Dependencies:   mbed Motordriver PID

ipodcontrol.h

Committer:
networker
Date:
2011-05-04
Revision:
0:371773dd3dd1

File content as of revision 0:371773dd3dd1:

#ifndef IPODCONTROL_H
#define IPODCONTROL_H
#include "ipod.h"

enum types { top, playlist=1, artist=2, album=3, genre=4, song=5, composer=6, podcast=8};
enum _mode { nav, playback, fastf, fastr, stopfast};

class ipodControl {
    static const int maxdepth = 5;
    static const char *toplevel[];
    static const types paths[][maxdepth];
    unsigned path, level;
    _mode  mode;
    unsigned items, current;
    unsigned last[maxdepth];
    unsigned elapsed, tracklength, newpos;
    unsigned status;
    ipod& pod;
    char *name;
    bool wrap;
    void Next() { current++; if (current == items) current = wrap ? 0 : items-1;}
    void Prev() { if (current == 0) current = wrap ? items-1 : 0; else current--;}
    enum { usIdle, usGet_time_status, usGet_title, usGet_artist, usStartPoll, usStopPoll} update_state;
protected:
    void updater(unsigned);
public:
    ipodControl(ipod& p) ;
//commands
    void OK() { OK(current);}
    void OK(unsigned item);
    void Menu();
    void Fwd() {pod.SendAirCmd(command, next);}
    void Rev() {pod.SendAirCmd(command, prev);}
    void PlayPause() {pod.SendAirCmd(command, play);}
    void Right();
    void Left();
    void MoveTo(float);
    bool readName();
    void StartPolling() { pod.SendAirCmd(polling, 1);}
    void Update(){update_state = usGet_time_status; pod.SendAirCmd(polling, 0); pod.SendAirCmd(get_time_status); printf("Update: getting status\n");}
//setters
    void setWrap(bool w=true) { wrap = w;}
//getters
    _mode getMode(){ return mode;}
    const char* getPathStr() const { return toplevel[path];}
    const char* getTypeStr() const { types t = paths[path][level]; if (t==top) return "Music"; return toplevel[t-1];}
    types getType() { return paths[path][level];}
    unsigned getItems() { return items;}
    unsigned getElapsed() { return elapsed;}
    unsigned getTrackLength() { return tracklength;}
    float getPos() { return (float)elapsed/(float)tracklength;}
//event processing
    void poll();
    void (*OnTitle)(const char*);
    void (*OnAlbum)(const char*);
    void (*OnArtist)(const char*);
    void (*OnGetNames)(unsigned, const char*);
    void (*OnTrackChange)(unsigned);
    void (*OnTime)(unsigned);
    void (*OnStatus)(unsigned, unsigned, unsigned);
    void (*OnError)(unsigned, unsigned);
};

#endif