A simple Oscilloscope that log each pin's data change Please dump log and analyze using Excel x-y chart type!
Diff: Scope.cpp
- Revision:
- 0:6c6d961dc8b3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Scope.cpp Sun May 10 13:16:26 2015 +0000 @@ -0,0 +1,70 @@ +#include "Scope.h" + +namespace steeven { + +ScopePin::ScopePin(PinName pin, char id, Scope *scope) : + _pin(pin), _id(id), _scope(scope) { + _pin.fall(this, &ScopePin::on_fall); + _pin.rise(this, &ScopePin::on_rise); +} + +void ScopePin::on_fall() { + _scope->log(_id, 0); +} +void ScopePin::on_rise() { + _scope->log(_id, 1); +} + +Scope::Scope(int buf_len) : + _buf_len(buf_len) { + _cnt = 0; + _buf_cnt = 0; + _buf = new ScopeData[buf_len]; + _timer.start(); +} + +void Scope::add(PinName pin, const char *name) { + new ScopePin(pin, _cnt, this); + _names[_cnt] = name; +// printf("%s ", _names[_cnt]); + _cnt++; +} + +void Scope::log(char id, int v) { + if (_buf_cnt >= _buf_len) + error("Scope buffer overflow!\n"); + _buf[_buf_cnt].id = (char) (v << 7) + id; + _buf[_buf_cnt].time = _timer.read(); + _buf_cnt++; +} + +void Scope::dump(BufferedSerial *logger) { + int i, j, k; + + logger->putc('\n'); + + // channel names; + logger->puts("time\t"); + for (i = 0; i < _cnt; ++i) { + logger->puts(_names[i]); + logger->putc('\t'); + } + logger->putc('\n'); + + // channel data + for (j = 0; j < _cnt; ++j) { // buy channel + for (i = 0; i < _buf_cnt; ++i) { // find in all data + if ((_buf[i].id & 0x7f) == j) { // if this pin + logger->printf("%f\t", _buf[i].time); + for (k = 0; k < j; ++k) + logger->putc('\t'); + logger->printf("%d", ((_buf[i].id & 0x80) > 0 ? 1 : 0) + j * 2); // add offset + logger->putc('\n'); + } + } + } + + //clear data + _buf_cnt = 0; +} +}