A DTMF sequence editor and player for HAM radio equipment command & control.

Dependencies:   mbed ExtTextLCD

Committer:
osmeest
Date:
Mon Mar 07 22:51:19 2011 +0000
Revision:
0:1324e7d9d471

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
osmeest 0:1324e7d9d471 1 #include "system.hpp"
osmeest 0:1324e7d9d471 2 #include "state.hpp"
osmeest 0:1324e7d9d471 3
osmeest 0:1324e7d9d471 4 #include "mbed.h"
osmeest 0:1324e7d9d471 5
osmeest 0:1324e7d9d471 6 #include <cstring>
osmeest 0:1324e7d9d471 7 #include <algorithm>
osmeest 0:1324e7d9d471 8 #include <iostream>
osmeest 0:1324e7d9d471 9
osmeest 0:1324e7d9d471 10 BusOut stateLeds(LED1, LED2);
osmeest 0:1324e7d9d471 11
osmeest 0:1324e7d9d471 12 System::System(DisplayManager *display, KeyboardManager *keyboard, DtmfGenerator *dtmf) :
osmeest 0:1324e7d9d471 13 display_(display), keyboard_(keyboard), dtmf_(dtmf), state_(NULL), text_(), len_(0), pos_(0)
osmeest 0:1324e7d9d471 14 {
osmeest 0:1324e7d9d471 15 std::cout << "Init System" << "\r" << std::endl;
osmeest 0:1324e7d9d471 16
osmeest 0:1324e7d9d471 17 std::memset(this->states_, 0, sizeof(this->states_));
osmeest 0:1324e7d9d471 18 }
osmeest 0:1324e7d9d471 19
osmeest 0:1324e7d9d471 20 void System::registerState(StateId id, State *state)
osmeest 0:1324e7d9d471 21 {
osmeest 0:1324e7d9d471 22 std::cout << "Register System State " << id << "\r" << std::endl;
osmeest 0:1324e7d9d471 23 this->states_[id] = state;
osmeest 0:1324e7d9d471 24 if (this->state_ == NULL) {
osmeest 0:1324e7d9d471 25 setState(id);
osmeest 0:1324e7d9d471 26 }
osmeest 0:1324e7d9d471 27 }
osmeest 0:1324e7d9d471 28
osmeest 0:1324e7d9d471 29 void System::unregisterState(State *state)
osmeest 0:1324e7d9d471 30 {
osmeest 0:1324e7d9d471 31 State **begin = &this->states_[0];
osmeest 0:1324e7d9d471 32 State **end = begin + NumStates;
osmeest 0:1324e7d9d471 33 State **p = std::find(begin, end, state);
osmeest 0:1324e7d9d471 34 if (p != end) {
osmeest 0:1324e7d9d471 35 *p = NULL;
osmeest 0:1324e7d9d471 36 }
osmeest 0:1324e7d9d471 37
osmeest 0:1324e7d9d471 38 if (this->state_ == state) {
osmeest 0:1324e7d9d471 39 this->state_ = NULL;
osmeest 0:1324e7d9d471 40 }
osmeest 0:1324e7d9d471 41 }
osmeest 0:1324e7d9d471 42
osmeest 0:1324e7d9d471 43 void System::setState(StateId newState)
osmeest 0:1324e7d9d471 44 {
osmeest 0:1324e7d9d471 45 std::cout << "Set System state " << newState << "\r" << std::endl;
osmeest 0:1324e7d9d471 46 State *s = this->states_[newState];
osmeest 0:1324e7d9d471 47 if (!s) {
osmeest 0:1324e7d9d471 48 std::cout << "Target state not found !\r" << std::endl;
osmeest 0:1324e7d9d471 49 return;
osmeest 0:1324e7d9d471 50 }
osmeest 0:1324e7d9d471 51
osmeest 0:1324e7d9d471 52 if (s != this->state_) {
osmeest 0:1324e7d9d471 53 if (this->state_ != NULL) {
osmeest 0:1324e7d9d471 54 std::cout << "Exit current state\r" << std::endl;
osmeest 0:1324e7d9d471 55 this->state_->exitState();
osmeest 0:1324e7d9d471 56 }
osmeest 0:1324e7d9d471 57
osmeest 0:1324e7d9d471 58 stateLeds = 0;
osmeest 0:1324e7d9d471 59
osmeest 0:1324e7d9d471 60 if (s != NULL) {
osmeest 0:1324e7d9d471 61 std::cout << "Enter new state\r" << std::endl;
osmeest 0:1324e7d9d471 62 s->enterState();
osmeest 0:1324e7d9d471 63 }
osmeest 0:1324e7d9d471 64
osmeest 0:1324e7d9d471 65 stateLeds = newState+1;
osmeest 0:1324e7d9d471 66
osmeest 0:1324e7d9d471 67 this->state_ = s;
osmeest 0:1324e7d9d471 68 std::cout << "State change complete\r" << std::endl;
osmeest 0:1324e7d9d471 69 }
osmeest 0:1324e7d9d471 70 }
osmeest 0:1324e7d9d471 71
osmeest 0:1324e7d9d471 72 void System::insertSymbol(char ch)
osmeest 0:1324e7d9d471 73 {
osmeest 0:1324e7d9d471 74 std::cout << "System Insert '" << ch << "'\r" << std::endl;
osmeest 0:1324e7d9d471 75
osmeest 0:1324e7d9d471 76 if (this->len_ == 19) {
osmeest 0:1324e7d9d471 77 return;
osmeest 0:1324e7d9d471 78 }
osmeest 0:1324e7d9d471 79
osmeest 0:1324e7d9d471 80 if (this->pos_ == this->len_) {
osmeest 0:1324e7d9d471 81 this->text_.append(1, ch);
osmeest 0:1324e7d9d471 82 }
osmeest 0:1324e7d9d471 83 else {
osmeest 0:1324e7d9d471 84 this->text_.insert(this->pos_, 1, ch);
osmeest 0:1324e7d9d471 85 }
osmeest 0:1324e7d9d471 86 this->pos_++;
osmeest 0:1324e7d9d471 87 this->len_++;
osmeest 0:1324e7d9d471 88 }
osmeest 0:1324e7d9d471 89
osmeest 0:1324e7d9d471 90 void System::deleteCurrentSymbol()
osmeest 0:1324e7d9d471 91 {
osmeest 0:1324e7d9d471 92 std::cout << "System Delete" << "\r" << std::endl;
osmeest 0:1324e7d9d471 93 if (this->pos_ < this->len_) {
osmeest 0:1324e7d9d471 94 this->text_.erase(this->pos_, 1);
osmeest 0:1324e7d9d471 95 this->len_--;
osmeest 0:1324e7d9d471 96 if (this->pos_ > this->len_) {
osmeest 0:1324e7d9d471 97 this->pos_ = len_;
osmeest 0:1324e7d9d471 98 }
osmeest 0:1324e7d9d471 99 }
osmeest 0:1324e7d9d471 100 }
osmeest 0:1324e7d9d471 101
osmeest 0:1324e7d9d471 102 void System::clearText()
osmeest 0:1324e7d9d471 103 {
osmeest 0:1324e7d9d471 104 std::cout << "System Clear" << "\r" << std::endl;
osmeest 0:1324e7d9d471 105 this->text_.clear();
osmeest 0:1324e7d9d471 106 this->len_ = 0;
osmeest 0:1324e7d9d471 107 this->pos_ = 0;
osmeest 0:1324e7d9d471 108 }
osmeest 0:1324e7d9d471 109
osmeest 0:1324e7d9d471 110 void System::moveCursorTo(int pos)
osmeest 0:1324e7d9d471 111 {
osmeest 0:1324e7d9d471 112 std::cout << "System MoveTo " << pos << "/" << this->len_ << "\r" << std::endl;
osmeest 0:1324e7d9d471 113 if (pos < 0) {
osmeest 0:1324e7d9d471 114 pos = this->len_+1 + pos;
osmeest 0:1324e7d9d471 115 }
osmeest 0:1324e7d9d471 116 setCursorPosition(pos);
osmeest 0:1324e7d9d471 117 }
osmeest 0:1324e7d9d471 118
osmeest 0:1324e7d9d471 119 void System::moveCursorBy(int delta)
osmeest 0:1324e7d9d471 120 {
osmeest 0:1324e7d9d471 121 std::cout << "System MoveBy " << delta << "\r" << std::endl;
osmeest 0:1324e7d9d471 122 int pos = this->pos_ + delta;
osmeest 0:1324e7d9d471 123 setCursorPosition(pos);
osmeest 0:1324e7d9d471 124 }
osmeest 0:1324e7d9d471 125
osmeest 0:1324e7d9d471 126 void System::setCursorPosition(int pos)
osmeest 0:1324e7d9d471 127 {
osmeest 0:1324e7d9d471 128 std::cout << "System SetPos " << pos << "/" << this->len_ << "\r" << std::endl;
osmeest 0:1324e7d9d471 129 if (pos < 0) {
osmeest 0:1324e7d9d471 130 pos = 0;
osmeest 0:1324e7d9d471 131 }
osmeest 0:1324e7d9d471 132 else if (pos > this->len_) {
osmeest 0:1324e7d9d471 133 pos = this->len_;
osmeest 0:1324e7d9d471 134 }
osmeest 0:1324e7d9d471 135 this->pos_ = pos;
osmeest 0:1324e7d9d471 136 }
osmeest 0:1324e7d9d471 137
osmeest 0:1324e7d9d471 138 void System::handleKey(char ch)
osmeest 0:1324e7d9d471 139 {
osmeest 0:1324e7d9d471 140 this->state()->handleKey(ch);
osmeest 0:1324e7d9d471 141 }