diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/.cproject b/Firmware for NCS314 v3.x/DisplayNixie3x/.cproject new file mode 100644 index 0000000..97ef612 --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/.cproject @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/.project b/Firmware for NCS314 v3.x/DisplayNixie3x/.project new file mode 100644 index 0000000..041b610 --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/.project @@ -0,0 +1,27 @@ + + + DisplayNixie3x + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/.settings/language.settings.xml b/Firmware for NCS314 v3.x/DisplayNixie3x/.settings/language.settings.xml new file mode 100644 index 0000000..9ff0d1a --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/Firmware for NCS314 v3.x/DisplayNixie3x/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..86c4b17 --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPATH/delimiter=\: +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPLUS_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/C_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/LIBRARY_PATH/delimiter=\: +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/appendContributed=true diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/DisplayNixie3x b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/DisplayNixie3x new file mode 100644 index 0000000..677bb84 Binary files /dev/null and b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/DisplayNixie3x differ diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/makefile b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/makefile new file mode 100644 index 0000000..2bd1d14 --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/makefile @@ -0,0 +1,59 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(CC_DEPS)),) +-include $(CC_DEPS) +endif +ifneq ($(strip $(C++_DEPS)),) +-include $(C++_DEPS) +endif +ifneq ($(strip $(C_UPPER_DEPS)),) +-include $(C_UPPER_DEPS) +endif +ifneq ($(strip $(CXX_DEPS)),) +-include $(CXX_DEPS) +endif +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +ifneq ($(strip $(CPP_DEPS)),) +-include $(CPP_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: DisplayNixie3x + +# Tool invocations +DisplayNixie3x: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: Cross G++ Linker' + g++ -o "DisplayNixie3x" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(CC_DEPS)$(C++_DEPS)$(EXECUTABLES)$(OBJS)$(C_UPPER_DEPS)$(CXX_DEPS)$(C_DEPS)$(CPP_DEPS) DisplayNixie3x + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include ../makefile.targets diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/objects.mk b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/objects.mk new file mode 100644 index 0000000..188e58f --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -lwiringPi + diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/sources.mk b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/sources.mk new file mode 100644 index 0000000..f9fe80f --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/sources.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C_UPPER_SRCS := +CXX_SRCS := +C++_SRCS := +OBJ_SRCS := +CC_SRCS := +ASM_SRCS := +C_SRCS := +CPP_SRCS := +O_SRCS := +S_UPPER_SRCS := +CC_DEPS := +C++_DEPS := +EXECUTABLES := +OBJS := +C_UPPER_DEPS := +CXX_DEPS := +C_DEPS := +CPP_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +src \ + diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/DisplayNixie3x.d b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/DisplayNixie3x.d new file mode 100644 index 0000000..cdeb97a --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/DisplayNixie3x.d @@ -0,0 +1 @@ +src/DisplayNixie3x.d: ../src/DisplayNixie3x.cpp diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/DisplayNixie3x.o b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/DisplayNixie3x.o new file mode 100644 index 0000000..f77db47 Binary files /dev/null and b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/DisplayNixie3x.o differ diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/subdir.mk b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/subdir.mk new file mode 100644 index 0000000..31b0814 --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/Debug/src/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +CPP_SRCS += \ +../src/DisplayNixie3x.cpp + +OBJS += \ +./src/DisplayNixie3x.o + +CPP_DEPS += \ +./src/DisplayNixie3x.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: Cross G++ Compiler' + g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/Firmware for NCS314 v3.x/DisplayNixie3x/src/DisplayNixie3x.cpp b/Firmware for NCS314 v3.x/DisplayNixie3x/src/DisplayNixie3x.cpp new file mode 100644 index 0000000..5532d0e --- /dev/null +++ b/Firmware for NCS314 v3.x/DisplayNixie3x/src/DisplayNixie3x.cpp @@ -0,0 +1,373 @@ +//============================================================================ +// Name : DisplayNixie.cpp +// Author : GRA&AFCH +// Version : v1.0 +// Copyright : Free +// Description : Display time on shields NCS314 v3.x +// Date : 27.04.2020 +//============================================================================ + +#define _VERSION "1.0 for NCS314 HW Version 3.x" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + +using namespace std; +#define LEpin 3 +#define SHDNpin 2 +#define UP_BUTTON_PIN 1 +#define DOWN_BUTTON_PIN 4 +#define MODE_BUTTON_PIN 5 +#define BUZZER_PIN 0 +#define I2CAdress 0x68 +#define I2CFlush 0 + +#define DEBOUNCE_DELAY 150 +#define TOTAL_DELAY 17 + +#define SECOND_REGISTER 0x0 +#define MINUTE_REGISTER 0x1 +#define HOUR_REGISTER 0x2 +#define WEEK_REGISTER 0x3 +#define DAY_REGISTER 0x4 +#define MONTH_REGISTER 0x5 +#define YEAR_REGISTER 0x6 + +#define RED_LIGHT_PIN 28 +#define GREEN_LIGHT_PIN 27 +#define BLUE_LIGHT_PIN 29 +#define MAX_POWER 100 + +#define UPPER_DOTS_MASK 0x80000000 +#define LOWER_DOTS_MASK 0x40000000 + +#define LEFT_REPR_START 5 +#define LEFT_BUFFER_START 0 +#define RIGHT_REPR_START 2 +#define RIGHT_BUFFER_START 4 + +uint16_t SymbolArray[10]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; + +int fileDesc; +int redLight = 100; +int greenLight = 0; +int blueLight = 0; +int lightCycle = 0; +bool dotState = 0; +int rotator = 0; + +int bcdToDec(int val) { + return ((val / 16 * 10) + (val % 16)); +} + +int decToBcd(int val) { + return ((val / 10 * 16) + (val % 10)); +} + +tm addHourToDate(tm date) { + date.tm_hour += 1; + mktime(&date); + return date; +} + +tm addMinuteToDate(tm date) { + date.tm_min += 1; + mktime(&date); + return date; +} + +tm getRTCDate() { + wiringPiI2CWrite(fileDesc, I2CFlush); + tm date; + date.tm_sec = bcdToDec(wiringPiI2CReadReg8(fileDesc,SECOND_REGISTER)); + date.tm_min = bcdToDec(wiringPiI2CReadReg8(fileDesc,MINUTE_REGISTER)); + date.tm_hour = bcdToDec(wiringPiI2CReadReg8(fileDesc,HOUR_REGISTER)); + date.tm_wday = bcdToDec(wiringPiI2CReadReg8(fileDesc,WEEK_REGISTER)); + date.tm_mday = bcdToDec(wiringPiI2CReadReg8(fileDesc,DAY_REGISTER)); + date.tm_mon = bcdToDec(wiringPiI2CReadReg8(fileDesc,MONTH_REGISTER)); + date.tm_year = bcdToDec(wiringPiI2CReadReg8(fileDesc,YEAR_REGISTER)); + date.tm_isdst = 0; + return date; +} + +void updateRTCHour(tm date) { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,HOUR_REGISTER,decToBcd(date.tm_hour)); + wiringPiI2CWrite(fileDesc, I2CFlush); +} + +void updateRTCMinute(tm date) { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,MINUTE_REGISTER,decToBcd(date.tm_min)); + wiringPiI2CWriteReg8(fileDesc,HOUR_REGISTER,decToBcd(date.tm_hour)); + wiringPiI2CWrite(fileDesc, I2CFlush); +} +void resetRTCSecond() { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,SECOND_REGISTER, 0); + wiringPiI2CWrite(fileDesc, I2CFlush); +} + +void writeRTCDate(tm date) { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,SECOND_REGISTER,decToBcd(date.tm_sec)); + wiringPiI2CWriteReg8(fileDesc,MINUTE_REGISTER,decToBcd(date.tm_min)); + wiringPiI2CWriteReg8(fileDesc,HOUR_REGISTER,decToBcd(date.tm_hour)); + wiringPiI2CWriteReg8(fileDesc,WEEK_REGISTER,decToBcd(date.tm_wday)); + wiringPiI2CWriteReg8(fileDesc,DAY_REGISTER,decToBcd(date.tm_mday)); + wiringPiI2CWriteReg8(fileDesc,MONTH_REGISTER,decToBcd(date.tm_mon)); + wiringPiI2CWriteReg8(fileDesc,YEAR_REGISTER,decToBcd(date.tm_year)); + wiringPiI2CWrite(fileDesc, I2CFlush); +} + +void initPin(int pin) { + pinMode(pin, INPUT); + pullUpDnControl(pin, PUD_UP); + +} + +void funcMode(void) { + static unsigned long modeTime = 0; + if ((millis() - modeTime) > DEBOUNCE_DELAY) { + puts("MODE button was pressed."); + resetRTCSecond(); + modeTime = millis(); + } +} + +void dotBlink() +{ + static unsigned int lastTimeBlink=millis(); + + if ((millis() - lastTimeBlink) > 1000) + { + lastTimeBlink=millis(); + dotState = !dotState; + } +} + +/*void rotateFireWorks() { + int fireworks[] = {0,0,1, + -1,0,0, + 0,1,0, + 0,0,-1, + 1,0,0, + 0,-1,0 + }; + redLight += fireworks[rotator * 3]; + greenLight += fireworks[rotator * 3 + 1]; + blueLight += fireworks[rotator * 3 + 2]; + softPwmWrite(RED_LIGHT_PIN, redLight); + softPwmWrite(GREEN_LIGHT_PIN, greenLight); + softPwmWrite(BLUE_LIGHT_PIN, blueLight); + lightCycle = lightCycle + 1; + if (lightCycle == MAX_POWER) { + rotator = rotator + 1; + lightCycle = 0; + } + if (rotator > 5) + rotator = 0; +}*/ + +uint32_t get32Rep(char * _stringToDisplay, int start) { + uint32_t var32 = 0; + + var32= (SymbolArray[_stringToDisplay[start]-0x30])<<20; + var32|=(SymbolArray[_stringToDisplay[start - 1]-0x30])<<10; + var32|=(SymbolArray[_stringToDisplay[start - 2]-0x30]); + return var32; +} + +void fillBuffer(uint32_t var32, unsigned char * buffer, int start) { + + buffer[start] = var32>>24; + buffer[start + 1] = var32>>16; + buffer[start + 2] = var32>>8; + buffer[start + 3] = var32; +} + + +uint32_t addBlinkTo32Rep(uint32_t var) { + if (dotState) + { + var &=~LOWER_DOTS_MASK; + var &=~UPPER_DOTS_MASK; + } + else + { + var |=LOWER_DOTS_MASK; + var |=UPPER_DOTS_MASK; + } + return var; +} + +char _stringToDisplay[8]; +void doIndication(); + +int main(int argc, char* argv[]) { + printf("Nixie Clock v%s \n\r", _VERSION); + wiringPiSetup(); + //softToneCreate (BUZZER_PIN); + //softToneWrite(BUZZER_PIN, 1000); + softPwmCreate(RED_LIGHT_PIN, 100, MAX_POWER); + softPwmCreate(GREEN_LIGHT_PIN, 0, MAX_POWER); + softPwmCreate(BLUE_LIGHT_PIN, 0, MAX_POWER); + initPin(UP_BUTTON_PIN); + initPin(DOWN_BUTTON_PIN); + initPin(MODE_BUTTON_PIN); + wiringPiISR(MODE_BUTTON_PIN,INT_EDGE_RISING,&funcMode); + fileDesc = wiringPiI2CSetup(I2CAdress); + + tm date = getRTCDate(); + time_t seconds = time(NULL); + tm* timeinfo = localtime (&seconds); + date.tm_mday = timeinfo->tm_mday; + date.tm_wday = timeinfo->tm_wday; + date.tm_mon = timeinfo->tm_mon + 1; + date.tm_year = timeinfo->tm_year - 100; + writeRTCDate(date); + + if (wiringPiSPISetupMode (0, 2000000, 3)) { + puts("SPI ok"); + } + else { + puts("SPI NOT ok"); + return 0; + } + + pinMode(SHDNpin, OUTPUT); + digitalWrite(SHDNpin, HIGH); //HIGH = ON + + long hourDelay = millis(); + long minuteDelay = hourDelay; + do { + //char _stringToDisplay[8]; + date = getRTCDate(); + char* format ="%H%M%S"; + strftime(_stringToDisplay, 8, format, &date); + + + pinMode(LEpin, OUTPUT); + dotBlink(); + + doIndication(); + + if (digitalRead(UP_BUTTON_PIN) == 0 && (millis() - hourDelay) > DEBOUNCE_DELAY) { + updateRTCHour(addHourToDate(date)); + hourDelay = millis(); + } + if (digitalRead(DOWN_BUTTON_PIN) == 0 && (millis() - minuteDelay) > DEBOUNCE_DELAY) { + updateRTCMinute(addMinuteToDate(date)); + minuteDelay = millis(); + } + +// rotateFireWorks(); + + delay (TOTAL_DELAY); + } + while (true); + return 0; +} + + +#define UpperDotsMask 0x80000000 +#define LowerDotsMask 0x40000000 + +void doIndication() +{ + + unsigned long Var32=0; + unsigned long New32_L=0; + unsigned long New32_H=0; + unsigned char buff[8]; + + long digits=atoi(_stringToDisplay); + + /********************************************************** + * Data format incomin [H1][H2][M1][M2][S1][S2] + *********************************************************/ + + //-------- REG 1 ----------------------------------------------- + Var32=0; + + Var32|=(unsigned long)(SymbolArray[digits%10])<<20; // s2 + digits=digits/10; + + Var32|=(unsigned long)(SymbolArray[digits%10])<<10; //s1 + digits=digits/10; + + Var32|=(unsigned long)(SymbolArray[digits%10]); //m2 + digits=digits/10; + + if (dotState) Var32|=LowerDotsMask; + else Var32&=~LowerDotsMask; + + if (dotState) Var32|=UpperDotsMask; + else Var32&=~UpperDotsMask; + + for (int i=1; i<=32; i++) + { + i=i+32; + int newindex=16*(3-(ceil((float)i/4)*4-i))+ceil((float)i/4); + i=i-32; + if (newindex<=32) bitWrite(New32_L, newindex-1, bitRead(Var32, i-1)); + else bitWrite(New32_H, newindex-32-1, bitRead(Var32, i-1)); + } + //------------------------------------------------------------------------- + + //-------- REG 0 ----------------------------------------------- + Var32=0; + + Var32|=(unsigned long)(SymbolArray[digits%10])<<20; // m1 + digits=digits/10; + + Var32|= (unsigned long)(SymbolArray[digits%10])<<10; //h2 + digits=digits/10; + + Var32|= (unsigned long)SymbolArray[digits%10]; //h1 + digits=digits/10; + + if (dotState) Var32|=LowerDotsMask; + else Var32&=~LowerDotsMask; + + if (dotState) Var32|=UpperDotsMask; + else Var32&=~UpperDotsMask; + + for (int i=1; i<=32; i++) + { + int newindex=16*(3-(ceil((float)i/4)*4-i))+ceil((float)i/4); + if (newindex<=32) bitWrite(New32_L, newindex-1, bitRead(Var32, i-1)); + else bitWrite(New32_H, newindex-32-1, bitRead(Var32, i-1)); + } + + buff[0] = New32_H>>24; + buff[1] = New32_H>>16; + buff[2] = New32_H>>8; + buff[3] = New32_H; + + buff[4] = New32_L>>24; + buff[5] = New32_L>>16; + buff[6] = New32_L>>8; + buff[7] = New32_L; + + wiringPiSPIDataRW(0, buff, 8); + + digitalWrite(LEpin, HIGH); // <<-- H -> L + + digitalWrite(LEpin, LOW); //<<-- H -> L + +//------------------------------------------------------------------------- +} + diff --git a/Firmware for NCS318/DisplayNixie/.cproject b/Firmware for NCS318/DisplayNixie/.cproject new file mode 100644 index 0000000..f15b22f --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/.cproject @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware for NCS318/DisplayNixie/.project b/Firmware for NCS318/DisplayNixie/.project new file mode 100644 index 0000000..654b804 --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/.project @@ -0,0 +1,27 @@ + + + DisplayNixie + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Firmware for NCS318/DisplayNixie/.settings/language.settings.xml b/Firmware for NCS318/DisplayNixie/.settings/language.settings.xml new file mode 100644 index 0000000..d04974f --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware for NCS318/DisplayNixie/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/Firmware for NCS318/DisplayNixie/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..86c4b17 --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPATH/delimiter=\: +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPLUS_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/C_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/LIBRARY_PATH/delimiter=\: +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.cross.exe.debug.493283321/appendContributed=true diff --git a/Firmware for NCS318/DisplayNixie/Debug/DisplayNixie b/Firmware for NCS318/DisplayNixie/Debug/DisplayNixie new file mode 100644 index 0000000..64bc9ab Binary files /dev/null and b/Firmware for NCS318/DisplayNixie/Debug/DisplayNixie differ diff --git a/Firmware for NCS318/DisplayNixie/Debug/makefile b/Firmware for NCS318/DisplayNixie/Debug/makefile new file mode 100644 index 0000000..6bd9144 --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/Debug/makefile @@ -0,0 +1,59 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(CC_DEPS)),) +-include $(CC_DEPS) +endif +ifneq ($(strip $(C++_DEPS)),) +-include $(C++_DEPS) +endif +ifneq ($(strip $(C_UPPER_DEPS)),) +-include $(C_UPPER_DEPS) +endif +ifneq ($(strip $(CXX_DEPS)),) +-include $(CXX_DEPS) +endif +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +ifneq ($(strip $(CPP_DEPS)),) +-include $(CPP_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: DisplayNixie + +# Tool invocations +DisplayNixie: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: Cross G++ Linker' + g++ -o "DisplayNixie" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(CC_DEPS)$(C++_DEPS)$(EXECUTABLES)$(OBJS)$(C_UPPER_DEPS)$(CXX_DEPS)$(C_DEPS)$(CPP_DEPS) DisplayNixie + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include ../makefile.targets diff --git a/Firmware for NCS318/DisplayNixie/Debug/objects.mk b/Firmware for NCS318/DisplayNixie/Debug/objects.mk new file mode 100644 index 0000000..188e58f --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -lwiringPi + diff --git a/Firmware for NCS318/DisplayNixie/Debug/sources.mk b/Firmware for NCS318/DisplayNixie/Debug/sources.mk new file mode 100644 index 0000000..f9fe80f --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/Debug/sources.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C_UPPER_SRCS := +CXX_SRCS := +C++_SRCS := +OBJ_SRCS := +CC_SRCS := +ASM_SRCS := +C_SRCS := +CPP_SRCS := +O_SRCS := +S_UPPER_SRCS := +CC_DEPS := +C++_DEPS := +EXECUTABLES := +OBJS := +C_UPPER_DEPS := +CXX_DEPS := +C_DEPS := +CPP_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +src \ + diff --git a/Firmware for NCS318/DisplayNixie/Debug/src/DisplayNixie.d b/Firmware for NCS318/DisplayNixie/Debug/src/DisplayNixie.d new file mode 100644 index 0000000..c8efe49 --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/Debug/src/DisplayNixie.d @@ -0,0 +1 @@ +src/DisplayNixie.d: ../src/DisplayNixie.cpp diff --git a/Firmware for NCS318/DisplayNixie/Debug/src/DisplayNixie.o b/Firmware for NCS318/DisplayNixie/Debug/src/DisplayNixie.o new file mode 100644 index 0000000..c77852d Binary files /dev/null and b/Firmware for NCS318/DisplayNixie/Debug/src/DisplayNixie.o differ diff --git a/Firmware for NCS318/DisplayNixie/Debug/src/subdir.mk b/Firmware for NCS318/DisplayNixie/Debug/src/subdir.mk new file mode 100644 index 0000000..c0ecb23 --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/Debug/src/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +CPP_SRCS += \ +../src/DisplayNixie.cpp + +OBJS += \ +./src/DisplayNixie.o + +CPP_DEPS += \ +./src/DisplayNixie.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: Cross G++ Compiler' + g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/Firmware for NCS318/DisplayNixie/src/DisplayNixie.cpp b/Firmware for NCS318/DisplayNixie/src/DisplayNixie.cpp new file mode 100644 index 0000000..41e4811 --- /dev/null +++ b/Firmware for NCS318/DisplayNixie/src/DisplayNixie.cpp @@ -0,0 +1,287 @@ +//============================================================================ +// Name : DisplayNixie.cpp +// Author : GRA&AFCH +// Version : v1.3 +// Copyright : Free +// Description : Display time on shields NCS318 v1.1 +//============================================================================ + +#define _VERSION "1.3" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +#define LEpin 3 +#define UP_BUTTON_PIN 1 +#define DOWN_BUTTON_PIN 4 +#define MODE_BUTTON_PIN 5 +#define BUZZER_PIN 0 +#define I2CAdress 0x68 +#define I2CFlush 0 + +#define DEBOUNCE_DELAY 150 +#define TOTAL_DELAY 17 + +#define SECOND_REGISTER 0x0 +#define MINUTE_REGISTER 0x1 +#define HOUR_REGISTER 0x2 +#define WEEK_REGISTER 0x3 +#define DAY_REGISTER 0x4 +#define MONTH_REGISTER 0x5 +#define YEAR_REGISTER 0x6 + +//#define RED_LIGHT_PIN 28 +//#define GREEN_LIGHT_PIN 27 +//#define BLUE_LIGHT_PIN 29 +#define MAX_POWER 100 + +#define UPPER_DOTS_MASK 0x80000000 +#define LOWER_DOTS_MASK 0x40000000 + +#define LEFT_REPR_START 5 +#define LEFT_BUFFER_START 0 +#define RIGHT_REPR_START 2 +#define RIGHT_BUFFER_START 4 + +uint16_t SymbolArray[10]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; + +int fileDesc; +int redLight = 100; +int greenLight = 0; +int blueLight = 0; +int lightCycle = 0; +bool dotState = 0; +int rotator = 0; + +int bcdToDec(int val) { + return ((val / 16 * 10) + (val % 16)); +} + +int decToBcd(int val) { + return ((val / 10 * 16) + (val % 10)); +} + +tm addHourToDate(tm date) { + date.tm_hour += 1; + mktime(&date); + return date; +} + +tm addMinuteToDate(tm date) { + date.tm_min += 1; + mktime(&date); + return date; +} + +tm getRTCDate() { + wiringPiI2CWrite(fileDesc, I2CFlush); + tm date; + date.tm_sec = bcdToDec(wiringPiI2CReadReg8(fileDesc,SECOND_REGISTER)); + date.tm_min = bcdToDec(wiringPiI2CReadReg8(fileDesc,MINUTE_REGISTER)); + date.tm_hour = bcdToDec(wiringPiI2CReadReg8(fileDesc,HOUR_REGISTER)); + date.tm_wday = bcdToDec(wiringPiI2CReadReg8(fileDesc,WEEK_REGISTER)); + date.tm_mday = bcdToDec(wiringPiI2CReadReg8(fileDesc,DAY_REGISTER)); + date.tm_mon = bcdToDec(wiringPiI2CReadReg8(fileDesc,MONTH_REGISTER)); + date.tm_year = bcdToDec(wiringPiI2CReadReg8(fileDesc,YEAR_REGISTER)); + date.tm_isdst = 0; + return date; +} + +void updateRTCHour(tm date) { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,HOUR_REGISTER,decToBcd(date.tm_hour)); + wiringPiI2CWrite(fileDesc, I2CFlush); +} + +void updateRTCMinute(tm date) { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,MINUTE_REGISTER,decToBcd(date.tm_min)); + wiringPiI2CWriteReg8(fileDesc,HOUR_REGISTER,decToBcd(date.tm_hour)); + wiringPiI2CWrite(fileDesc, I2CFlush); +} +void resetRTCSecond() { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,SECOND_REGISTER, 0); + wiringPiI2CWrite(fileDesc, I2CFlush); +} + +void writeRTCDate(tm date) { + wiringPiI2CWrite(fileDesc, I2CFlush); + wiringPiI2CWriteReg8(fileDesc,SECOND_REGISTER,decToBcd(date.tm_sec)); + wiringPiI2CWriteReg8(fileDesc,MINUTE_REGISTER,decToBcd(date.tm_min)); + wiringPiI2CWriteReg8(fileDesc,HOUR_REGISTER,decToBcd(date.tm_hour)); + wiringPiI2CWriteReg8(fileDesc,WEEK_REGISTER,decToBcd(date.tm_wday)); + wiringPiI2CWriteReg8(fileDesc,DAY_REGISTER,decToBcd(date.tm_mday)); + wiringPiI2CWriteReg8(fileDesc,MONTH_REGISTER,decToBcd(date.tm_mon)); + wiringPiI2CWriteReg8(fileDesc,YEAR_REGISTER,decToBcd(date.tm_year)); + wiringPiI2CWrite(fileDesc, I2CFlush); +} + +void initPin(int pin) { + pinMode(pin, INPUT); + pullUpDnControl(pin, PUD_UP); + +} + +void funcMode(void) { + static unsigned long modeTime = 0; + if ((millis() - modeTime) > DEBOUNCE_DELAY) { + puts("MODE button was pressed."); + resetRTCSecond(); + modeTime = millis(); + } +} + + + +uint32_t get32Rep(char * _stringToDisplay, int start) { + uint32_t var32 = 0; + + var32= (SymbolArray[_stringToDisplay[start]-0x30])<<20; + var32|=(SymbolArray[_stringToDisplay[start - 1]-0x30])<<10; + var32|=(SymbolArray[_stringToDisplay[start - 2]-0x30]); + return var32; +} + +void fillBuffer(uint32_t var32, unsigned char * buffer, int start) { + buffer[start] = var32>>24; + buffer[start + 1] = var32>>16; + buffer[start + 2] = var32>>8; + buffer[start + 3] = var32; +} + +void dotBlink() +{ + static unsigned int lastTimeBlink=millis(); + + if ((millis() - lastTimeBlink) > 1000) + { + lastTimeBlink=millis(); + dotState = !dotState; + } +} +/* +void rotateFireWorks() { + int fireworks[] = {0,0,1, + -1,0,0, + 0,1,0, + 0,0,-1, + 1,0,0, + 0,-1,0 + }; + redLight += fireworks[rotator * 3]; + greenLight += fireworks[rotator * 3 + 1]; + blueLight += fireworks[rotator * 3 + 2]; + softPwmWrite(RED_LIGHT_PIN, redLight); + softPwmWrite(GREEN_LIGHT_PIN, greenLight); + softPwmWrite(BLUE_LIGHT_PIN, blueLight); + lightCycle = lightCycle + 1; + if (lightCycle == MAX_POWER) { + rotator = rotator + 1; + lightCycle = 0; + } + if (rotator > 5) + rotator = 0; +}*/ + +uint32_t addBlinkTo32Rep(uint32_t var) { + if (dotState) + { + var &=~LOWER_DOTS_MASK; + var &=~UPPER_DOTS_MASK; + } + else + { + var |=LOWER_DOTS_MASK; + var |=UPPER_DOTS_MASK; + } + return var; +} + + +int main(int argc, char* argv[]) { + printf("Nixie Clock v%s \n\r", _VERSION); + wiringPiSetup(); + //softToneCreate (BUZZER_PIN); + //softToneWrite(BUZZER_PIN, 1000); + + /*softPwmCreate(RED_LIGHT_PIN, 100, MAX_POWER); + softPwmCreate(GREEN_LIGHT_PIN, 0, MAX_POWER); + softPwmCreate(BLUE_LIGHT_PIN, 0, MAX_POWER); + */ + initPin(UP_BUTTON_PIN); + initPin(DOWN_BUTTON_PIN); + initPin(MODE_BUTTON_PIN); + //wiringPiISR(MODE_BUTTON_PIN,INT_EDGE_RISING,&funcMode); + fileDesc = wiringPiI2CSetup(I2CAdress); + + tm date = getRTCDate(); + time_t seconds = time(NULL); + tm* timeinfo = localtime (&seconds); + date.tm_mday = timeinfo->tm_mday; + date.tm_wday = timeinfo->tm_wday; + date.tm_mon = timeinfo->tm_mon + 1; + date.tm_year = timeinfo->tm_year - 100; + writeRTCDate(date); + + if (wiringPiSPISetupMode (0, 2000000, 2)) { + puts("SPI ok"); + } + else { + puts("SPI NOT ok"); + return 0; + } + + long hourDelay = millis(); + long minuteDelay = hourDelay; + long modeDelay=hourDelay; + do { + char _stringToDisplay[8]; + date = getRTCDate(); + char* format ="%H%M%S"; + strftime(_stringToDisplay, 8, format, &date); + + + pinMode(LEpin, OUTPUT); + dotBlink(); + + unsigned char buff[8]; + + uint32_t var32 = get32Rep(_stringToDisplay, LEFT_REPR_START); + var32 = addBlinkTo32Rep(var32); + fillBuffer(var32, buff , LEFT_BUFFER_START); + + var32 = get32Rep(_stringToDisplay, RIGHT_REPR_START); + var32 = addBlinkTo32Rep(var32); + fillBuffer(var32, buff , RIGHT_BUFFER_START); + + if (digitalRead(UP_BUTTON_PIN) == 0 && (millis() - hourDelay) > DEBOUNCE_DELAY) { + updateRTCHour(addHourToDate(date)); + hourDelay = millis(); + } + if (digitalRead(DOWN_BUTTON_PIN) == 0 && (millis() - minuteDelay) > DEBOUNCE_DELAY) { + updateRTCMinute(addMinuteToDate(date)); + minuteDelay = millis(); + } + + if (digitalRead(MODE_BUTTON_PIN) == 0 && (millis() - modeDelay) > DEBOUNCE_DELAY) { + resetRTCSecond(); + modeDelay = millis(); + } + + //rotateFireWorks(); + digitalWrite(LEpin, LOW); + wiringPiSPIDataRW(0, buff, 8); + digitalWrite(LEpin, HIGH); + delay (TOTAL_DELAY); + } + while (true); + return 0; +} diff --git a/Firmware/src/DisplayNixie.cpp b/Firmware/src/DisplayNixie.cpp index 0325053..07a5ccf 100644 --- a/Firmware/src/DisplayNixie.cpp +++ b/Firmware/src/DisplayNixie.cpp @@ -1,12 +1,12 @@ //============================================================================ // Name : DisplayNixie.cpp // Author : GRA&AFCH -// Version : v1.2 +// Version : v2.3 // Copyright : Free // Description : Display time on shields NCS314 v2.x or NCS312 //============================================================================ -#define _VERSION "1.2" +#define _VERSION "2.3" #include #include @@ -18,6 +18,8 @@ #include using namespace std; +#define R5222_PIN 22 +bool HV5222; #define LEpin 3 #define UP_BUTTON_PIN 1 #define DOWN_BUTTON_PIN 4 @@ -205,6 +207,8 @@ uint32_t addBlinkTo32Rep(uint32_t var) { return var; } +//uint64_t* reverseBit(uint64_t num); +uint64_t reverseBit(uint64_t num); int main(int argc, char* argv[]) { printf("Nixie Clock v%s \n\r", _VERSION); @@ -217,7 +221,7 @@ int main(int argc, char* argv[]) { initPin(UP_BUTTON_PIN); initPin(DOWN_BUTTON_PIN); initPin(MODE_BUTTON_PIN); - wiringPiISR(MODE_BUTTON_PIN,INT_EDGE_RISING,&funcMode); + //wiringPiISR(MODE_BUTTON_PIN,INT_EDGE_RISING,&funcMode); fileDesc = wiringPiI2CSetup(I2CAdress); tm date = getRTCDate(); @@ -237,8 +241,15 @@ int main(int argc, char* argv[]) { return 0; } + pinMode(R5222_PIN, INPUT); + pullUpDnControl(R5222_PIN, PUD_UP); + HV5222=!digitalRead(R5222_PIN); + if (HV5222) puts("R52222 resistor detected. HV5222 algorithm is used."); + uint64_t reverseBuffValue; + long hourDelay = millis(); long minuteDelay = hourDelay; + long modeDelay = hourDelay; do { char _stringToDisplay[8]; date = getRTCDate(); @@ -253,10 +264,12 @@ int main(int argc, char* argv[]) { uint32_t var32 = get32Rep(_stringToDisplay, LEFT_REPR_START); var32 = addBlinkTo32Rep(var32); + fillBuffer(var32, buff , LEFT_BUFFER_START); var32 = get32Rep(_stringToDisplay, RIGHT_REPR_START); var32 = addBlinkTo32Rep(var32); + fillBuffer(var32, buff , RIGHT_BUFFER_START); if (digitalRead(UP_BUTTON_PIN) == 0 && (millis() - hourDelay) > DEBOUNCE_DELAY) { @@ -267,9 +280,27 @@ int main(int argc, char* argv[]) { updateRTCMinute(addMinuteToDate(date)); minuteDelay = millis(); } + if (digitalRead(MODE_BUTTON_PIN) == 0 && (millis() - modeDelay) > DEBOUNCE_DELAY) { + resetRTCSecond(); + modeDelay = millis(); + } rotateFireWorks(); digitalWrite(LEpin, LOW); + + if (HV5222) + { + reverseBuffValue=reverseBit(*(uint64_t*)buff); + buff[4]=reverseBuffValue; + buff[5]=reverseBuffValue>>8; + buff[6]=reverseBuffValue>>16; + buff[7]=reverseBuffValue>>24; + buff[0]=reverseBuffValue>>32; + buff[1]=reverseBuffValue>>40; + buff[2]=reverseBuffValue>>48; + buff[3]=reverseBuffValue>>56; + } + wiringPiSPIDataRW(0, buff, 8); digitalWrite(LEpin, HIGH); delay (TOTAL_DELAY); @@ -277,3 +308,16 @@ int main(int argc, char* argv[]) { while (true); return 0; } + +//uint64_t* reverseBit(uint64_t num) +uint64_t reverseBit(uint64_t num) +{ + uint64_t reverse_num=0; + int i; + for (i=0; i<64; i++) + { + if ((num & ((uint64_t)1<