Provides class structure for simple control of Nixie Tubes using custom PCB

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