Provides class structure for simple control of Nixie Tubes using custom PCB
Diff: NixieTube.cpp
- Revision:
- 0:34f3e0f37c55
- Child:
- 1:0470cc006ce7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NixieTube.cpp Mon Dec 05 21:35:57 2016 +0000 @@ -0,0 +1,116 @@ +#include "NixieTube.h" +/* Not Currently Implmented +#define TUBE_1_LED 0x00800 +#define TUBE_2_LED 0x01000 +#define TUBE_3_LED 0x02000 +#define TUBE_4_LED 0x04000 +#define TUBE_5_LED 0x08000 +#define TUBE_6_LED 0x10000 +*/ +#define TUBE_1_CATH 0x20000 +#define TUBE_2_CATH 0x40000 +#define TUBE_3_CATH 0x80000 +#define TUBE_4_CATH 0x100000 +#define TUBE_5_CATH 0x200000 +#define TUBE_6_CATH 0x400000 +#define START_THREAD 1 +Mutex nixie_mutex; + +NixieTube::NixieTube(PinName sdi, PinName scl, PinName rcl, PinName cen): _thread(&NixieTube::threadStarter, this, osPriorityNormal,1024),_sdi(sdi), _scl(scl), _rcl(rcl), _cen(cen){ + digit1 = 1; + digit2 = 2; + digit3 = 3; + digit4 = 4; + delay1 = 0.0005; + delay2 = 0.0045; + brightness = 0; + _cen.write(1.0); + _cen.period_us(10000); + _thread.signal_set(START_THREAD); +} + +void NixieTube::threadStarter(void const *p) { + NixieTube *instance = (NixieTube*)p; + instance->threadWorker(); +} + +void NixieTube::threadWorker() { + _thread.signal_wait(START_THREAD); + while(1) { + nixie_thread(); + } +} + +NixieTube::~NixieTube() +{ +} + +int NixieTube::nixie_id_convert(int digit) { + if (digit == 0 || digit == -1) { + return digit + 1; + } + if (digit < 10) { + return 11 - digit; + } + if (digit == 10) { + return 11; + } + return 0; +} + +void NixieTube::send_nixie_shiftreg(int cathode_id, int led_bitfield, int tube_bitfield) { + + int buffer = 0; + buffer = 1 << (cathode_id-1) | led_bitfield | tube_bitfield; + + for (int i=23; i >= 0; i--) { + _sdi = buffer & (1 << i); + _scl = 1; + _scl = 0; // Whats going on here? + } + _rcl = 1; + _rcl = 0; // Whats going on here? + +} + +void NixieTube::nixie_thread() { + while (1) { + nixie_mutex.lock(); + send_nixie_shiftreg(nixie_id_convert(digit1), 0, TUBE_1_CATH); + Thread::wait(1); + send_nixie_shiftreg(0, 0, 0); + Thread::wait(1); + send_nixie_shiftreg(nixie_id_convert(digit2), 0, TUBE_2_CATH); + Thread::wait(1); + send_nixie_shiftreg(0, 0, 0); + Thread::wait(1); + send_nixie_shiftreg(nixie_id_convert(digit3), 0, TUBE_3_CATH); + Thread::wait(1); + send_nixie_shiftreg(0, 0, 0); + Thread::wait(1); + send_nixie_shiftreg(nixie_id_convert(digit4), 0, TUBE_4_CATH); + Thread::wait(1); + send_nixie_shiftreg(0, 0, 0); + Thread::wait(1); + nixie_mutex.unlock(); + } +} +void NixieTube::start_nixie(){ + //thread = new Thread(nixie_thread, this); + } +void NixieTube::update_nixie_tube(int ref,int val){ + switch(ref){ + case(1): + digit1 = val; + case(2): + digit2 = val; + case(3): + digit3 = val; + case(4): + digit4 = val; + } +} +void NixieTube::set_dim(float duty,int pulsewidth){ + _cen.write(duty); + _cen.period_us(pulsewidth); +} \ No newline at end of file