initial cleanup and mapping
This commit is contained in:
134
devLib/Makefile
Normal file
134
devLib/Makefile
Normal file
@@ -0,0 +1,134 @@
|
||||
# Makefile:
|
||||
# wiringPi device - Wiring Compatable library for the Raspberry Pi
|
||||
#
|
||||
# Copyright (c) 2012-2013 Gordon Henderson
|
||||
#################################################################################
|
||||
# This file is part of wiringPi:
|
||||
# https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
#
|
||||
# wiringPi is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# wiringPi is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
#################################################################################
|
||||
|
||||
DYN_VERS_MAJ=2
|
||||
DYN_VERS_MIN=0
|
||||
|
||||
VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN)
|
||||
DESTDIR=/usr
|
||||
PREFIX=/local
|
||||
|
||||
STATIC=libwiringPiDev.a
|
||||
DYNAMIC=libwiringPiDev.so.$(VERSION)
|
||||
|
||||
#DEBUG = -g -O0
|
||||
DEBUG = -O2
|
||||
CC = gcc
|
||||
INCLUDE = -I.
|
||||
CFLAGS = $(DEBUG) -Wformat=2 -Wall $(INCLUDE) -Winline -pipe -fPIC
|
||||
|
||||
LIBS =
|
||||
|
||||
###############################################################################
|
||||
|
||||
SRC = ds1302.c maxdetect.c piNes.c \
|
||||
gertboard.c piFace.c \
|
||||
lcd128x64.c lcd.c \
|
||||
piGlow.c
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
all: $(DYNAMIC)
|
||||
|
||||
static: $(STATIC)
|
||||
|
||||
$(STATIC): $(OBJ)
|
||||
@echo "[Link (Static)]"
|
||||
@ar rcs $(STATIC) $(OBJ)
|
||||
@ranlib $(STATIC)
|
||||
# @size $(STATIC)
|
||||
|
||||
$(DYNAMIC): $(OBJ)
|
||||
@echo "[Link (Dynamic)]"
|
||||
@$(CC) -shared -Wl,-soname,libwiringPiDev.so -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ)
|
||||
|
||||
.c.o:
|
||||
@echo [Compile] $<
|
||||
@$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
.PHONEY: clean
|
||||
clean:
|
||||
@echo "[Clean]"
|
||||
@rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.*
|
||||
|
||||
.PHONEY: tags
|
||||
tags: $(SRC)
|
||||
@echo [ctags]
|
||||
@ctags $(SRC)
|
||||
|
||||
|
||||
.PHONEY: install-headers
|
||||
install-headers:
|
||||
@echo "[Install Headers]"
|
||||
@install -m 0755 -d $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 ds1302.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 maxdetect.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 piNes.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 gertboard.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 piFace.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 lcd128x64.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 lcd.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 piGlow.h $(DESTDIR)$(PREFIX)/include
|
||||
|
||||
.PHONEY: install
|
||||
install: $(DYNAMIC) install-headers
|
||||
@echo "[Install Dynamic Lib]"
|
||||
@install -m 0755 -d $(DESTDIR)$(PREFIX)/lib
|
||||
@install -m 0755 libwiringPiDev.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)
|
||||
@ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) $(DESTDIR)/lib/libwiringPiDev.so
|
||||
@ldconfig
|
||||
|
||||
.PHONEY: install-static
|
||||
install-static: $(STATIC) install-headers
|
||||
@echo "[Install Static Lib]"
|
||||
@install -m 0755 -d $(DESTDIR)$(PREFIX)/lib
|
||||
@install -m 0755 libwiringPiDev.a $(DESTDIR)$(PREFIX)/lib
|
||||
|
||||
.PHONEY: uninstall
|
||||
uninstall:
|
||||
@echo "[UnInstall]"
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/ds1302.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/maxdetect.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/piNes.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/gertboard.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/piFace.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/lcd128x64.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/lcd.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/piGlow.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.*
|
||||
@ldconfig
|
||||
|
||||
|
||||
.PHONEY: depend
|
||||
depend:
|
||||
makedepend -Y $(SRC)
|
||||
|
||||
# DO NOT DELETE
|
||||
|
||||
ds1302.o: ds1302.h
|
||||
maxdetect.o: maxdetect.h
|
||||
piNes.o: piNes.h
|
||||
gertboard.o: gertboard.h
|
||||
piFace.o: piFace.h
|
||||
lcd128x64.o: font.h lcd128x64.h
|
||||
lcd.o: lcd.h
|
||||
piGlow.o: piGlow.h
|
240
devLib/ds1302.c
Normal file
240
devLib/ds1302.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* ds1302.c:
|
||||
* Real Time clock
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "ds1302.h"
|
||||
|
||||
// Register defines
|
||||
|
||||
#define RTC_SECS 0
|
||||
#define RTC_MINS 1
|
||||
#define RTC_HOURS 2
|
||||
#define RTC_DATE 3
|
||||
#define RTC_MONTH 4
|
||||
#define RTC_DAY 5
|
||||
#define RTC_YEAR 6
|
||||
#define RTC_WP 7
|
||||
#define RTC_TC 8
|
||||
#define RTC_BM 31
|
||||
|
||||
|
||||
// Locals
|
||||
|
||||
static int dPin, cPin, sPin ;
|
||||
|
||||
/*
|
||||
* dsShiftIn:
|
||||
* Shift a number in from the chip, LSB first. Note that the data is
|
||||
* sampled on the trailing edge of the last clock, so it's valid immediately.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static unsigned int dsShiftIn (void)
|
||||
{
|
||||
uint8_t value = 0 ;
|
||||
int i ;
|
||||
|
||||
pinMode (dPin, INPUT) ; delayMicroseconds (1) ;
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
{
|
||||
value |= (digitalRead (dPin) << i) ;
|
||||
digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ;
|
||||
digitalWrite (cPin, LOW) ; delayMicroseconds (1) ;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* dsShiftOut:
|
||||
* A normal LSB-first shift-out, just slowed down a bit - the Pi is
|
||||
* a bit faster than the chip can handle.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void dsShiftOut (unsigned int data)
|
||||
{
|
||||
int i ;
|
||||
|
||||
pinMode (dPin, OUTPUT) ;
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
{
|
||||
digitalWrite (dPin, data & (1 << i)) ; delayMicroseconds (1) ;
|
||||
digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ;
|
||||
digitalWrite (cPin, LOW) ; delayMicroseconds (1) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ds1302regRead: ds1302regWrite:
|
||||
* Read/Write a value to an RTC Register or RAM location on the chip
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static unsigned int ds1302regRead (const int reg)
|
||||
{
|
||||
unsigned int data ;
|
||||
|
||||
digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
|
||||
dsShiftOut (reg) ;
|
||||
data = dsShiftIn () ;
|
||||
digitalWrite (sPin, LOW) ; delayMicroseconds (1) ;
|
||||
|
||||
return data ;
|
||||
}
|
||||
|
||||
static void ds1302regWrite (const int reg, const unsigned int data)
|
||||
{
|
||||
digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
|
||||
dsShiftOut (reg) ;
|
||||
dsShiftOut (data) ;
|
||||
digitalWrite (sPin, LOW) ; delayMicroseconds (1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ds1302rtcWrite: ds1302rtcRead:
|
||||
* Writes/Reads the data to/from the RTC register
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
unsigned int ds1302rtcRead (const int reg)
|
||||
{
|
||||
return ds1302regRead (0x81 | ((reg & 0x1F) << 1)) ;
|
||||
}
|
||||
|
||||
void ds1302rtcWrite (int reg, unsigned int data)
|
||||
{
|
||||
ds1302regWrite (0x80 | ((reg & 0x1F) << 1), data) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ds1302ramWrite: ds1302ramRead:
|
||||
* Writes/Reads the data to/from the RTC register
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
unsigned int ds1302ramRead (const int addr)
|
||||
{
|
||||
return ds1302regRead (0xC1 | ((addr & 0x1F) << 1)) ;
|
||||
}
|
||||
|
||||
void ds1302ramWrite (const int addr, const unsigned int data)
|
||||
{
|
||||
ds1302regWrite ( 0xC0 | ((addr & 0x1F) << 1), data) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* ds1302clockRead:
|
||||
* Read all 8 bytes of the clock in a single operation
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ds1302clockRead (int clockData [8])
|
||||
{
|
||||
int i ;
|
||||
unsigned int regVal = 0x81 | ((RTC_BM & 0x1F) << 1) ;
|
||||
|
||||
digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
|
||||
|
||||
dsShiftOut (regVal) ;
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
clockData [i] = dsShiftIn () ;
|
||||
|
||||
digitalWrite (sPin, LOW) ; delayMicroseconds (1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ds1302clockWrite:
|
||||
* Write all 8 bytes of the clock in a single operation
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ds1302clockWrite (const int clockData [8])
|
||||
{
|
||||
int i ;
|
||||
unsigned int regVal = 0x80 | ((RTC_BM & 0x1F) << 1) ;
|
||||
|
||||
digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
|
||||
|
||||
dsShiftOut (regVal) ;
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
dsShiftOut (clockData [i]) ;
|
||||
|
||||
digitalWrite (sPin, LOW) ; delayMicroseconds (1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ds1302trickleCharge:
|
||||
* Set the bits on the trickle charger.
|
||||
* Probably best left alone...
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ds1302trickleCharge (const int diodes, const int resistors)
|
||||
{
|
||||
if (diodes + resistors == 0)
|
||||
ds1302rtcWrite (RTC_TC, 0x5C) ; // Disabled
|
||||
else
|
||||
ds1302rtcWrite (RTC_TC, 0xA0 | ((diodes & 3) << 2) | (resistors & 3)) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ds1302setup:
|
||||
* Initialise the chip & remember the pins we're using
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ds1302setup (const int clockPin, const int dataPin, const int csPin)
|
||||
{
|
||||
dPin = dataPin ;
|
||||
cPin = clockPin ;
|
||||
sPin = csPin ;
|
||||
|
||||
digitalWrite (dPin, LOW) ;
|
||||
digitalWrite (cPin, LOW) ;
|
||||
digitalWrite (sPin, LOW) ;
|
||||
|
||||
pinMode (dPin, OUTPUT) ;
|
||||
pinMode (cPin, OUTPUT) ;
|
||||
pinMode (sPin, OUTPUT) ;
|
||||
|
||||
ds1302rtcWrite (RTC_WP, 0) ; // Remove write-protect
|
||||
}
|
44
devLib/ds1302.h
Normal file
44
devLib/ds1302.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* ds1302.h:
|
||||
* Real Time clock
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern unsigned int ds1302rtcRead (const int reg) ;
|
||||
extern void ds1302rtcWrite (const int reg, const unsigned int data) ;
|
||||
|
||||
extern unsigned int ds1302ramRead (const int addr) ;
|
||||
extern void ds1302ramWrite (const int addr, const unsigned int data) ;
|
||||
|
||||
extern void ds1302clockRead (int clockData [8]) ;
|
||||
extern void ds1302clockWrite (const int clockData [8]) ;
|
||||
|
||||
extern void ds1302trickleCharge (const int diodes, const int resistors) ;
|
||||
|
||||
extern void ds1302setup (const int clockPin, const int dataPin, const int csPin) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
2577
devLib/font.h
Normal file
2577
devLib/font.h
Normal file
File diff suppressed because it is too large
Load Diff
164
devLib/gertboard.c
Normal file
164
devLib/gertboard.c
Normal file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
* gertboard.c:
|
||||
* Access routines for the SPI devices on the Gertboard
|
||||
* Copyright (c) 2012 Gordon Henderson
|
||||
*
|
||||
* The Gertboard has:
|
||||
*
|
||||
* An MCP3002 dual-channel A to D convertor connected
|
||||
* to the SPI bus, selected by chip-select A, and:
|
||||
*
|
||||
* An MCP4802 dual-channel D to A convertor connected
|
||||
* to the SPI bus, selected via chip-select B.
|
||||
*
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/spi/spidev.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <wiringPiSPI.h>
|
||||
|
||||
#include "gertboard.h"
|
||||
|
||||
// The A-D convertor won't run at more than 1MHz @ 3.3v
|
||||
|
||||
#define SPI_ADC_SPEED 1000000
|
||||
#define SPI_DAC_SPEED 1000000
|
||||
#define SPI_A2D 0
|
||||
#define SPI_D2A 1
|
||||
|
||||
|
||||
/*
|
||||
* gertboardAnalogWrite:
|
||||
* Write an 8-bit data value to the MCP4802 Analog to digital
|
||||
* convertor on the Gertboard.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void gertboardAnalogWrite (const int chan, const int value)
|
||||
{
|
||||
uint8_t spiData [2] ;
|
||||
uint8_t chanBits, dataBits ;
|
||||
|
||||
if (chan == 0)
|
||||
chanBits = 0x30 ;
|
||||
else
|
||||
chanBits = 0xB0 ;
|
||||
|
||||
chanBits |= ((value >> 4) & 0x0F) ;
|
||||
dataBits = ((value << 4) & 0xF0) ;
|
||||
|
||||
spiData [0] = chanBits ;
|
||||
spiData [1] = dataBits ;
|
||||
|
||||
wiringPiSPIDataRW (SPI_D2A, spiData, 2) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* gertboardAnalogRead:
|
||||
* Return the analog value of the given channel (0/1).
|
||||
* The A/D is a 10-bit device
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int gertboardAnalogRead (const int chan)
|
||||
{
|
||||
uint8_t spiData [2] ;
|
||||
|
||||
uint8_t chanBits ;
|
||||
|
||||
if (chan == 0)
|
||||
chanBits = 0b11010000 ;
|
||||
else
|
||||
chanBits = 0b11110000 ;
|
||||
|
||||
spiData [0] = chanBits ;
|
||||
spiData [1] = 0 ;
|
||||
|
||||
wiringPiSPIDataRW (SPI_A2D, spiData, 2) ;
|
||||
|
||||
return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* gertboardSPISetup:
|
||||
* Initialise the SPI bus, etc.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int gertboardSPISetup (void)
|
||||
{
|
||||
if (wiringPiSPISetup (SPI_A2D, SPI_ADC_SPEED) < 0)
|
||||
return -1 ;
|
||||
|
||||
if (wiringPiSPISetup (SPI_D2A, SPI_DAC_SPEED) < 0)
|
||||
return -1 ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* New wiringPi node extension methods.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myAnalogRead (struct wiringPiNodeStruct *node, const int chan)
|
||||
{
|
||||
return gertboardAnalogRead (chan - node->pinBase) ;
|
||||
}
|
||||
|
||||
static void myAnalogWrite (struct wiringPiNodeStruct *node, const int chan, const int value)
|
||||
{
|
||||
gertboardAnalogWrite (chan - node->pinBase, value) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* gertboardAnalogSetup:
|
||||
* Create a new wiringPi device node for the analog devices on the
|
||||
* Gertboard. We create one node with 2 pins - each pin being read
|
||||
* and write - although the operations actually go to different
|
||||
* hardware devices.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int gertboardAnalogSetup (const int pinBase)
|
||||
{
|
||||
struct wiringPiNodeStruct *node ;
|
||||
int x ;
|
||||
|
||||
if (( x = gertboardSPISetup ()) != 0)
|
||||
return x;
|
||||
|
||||
node = wiringPiNewNode (pinBase, 2) ;
|
||||
node->analogRead = myAnalogRead ;
|
||||
node->analogWrite = myAnalogWrite ;
|
||||
|
||||
return 0 ;
|
||||
}
|
45
devLib/gertboard.h
Normal file
45
devLib/gertboard.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* gertboard.h:
|
||||
* Access routines for the SPI devices on the Gertboard
|
||||
* Copyright (c) 2012 Gordon Henderson
|
||||
*
|
||||
* The Gertboard has an MCP4802 dual-channel D to A convertor
|
||||
* connected to the SPI bus, selected via chip-select B.
|
||||
*
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Old routines
|
||||
|
||||
extern void gertboardAnalogWrite (const int chan, const int value) ;
|
||||
extern int gertboardAnalogRead (const int chan) ;
|
||||
extern int gertboardSPISetup (void) ;
|
||||
|
||||
// New
|
||||
|
||||
extern int gertboardAnalogSetup (const int pinBase) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
495
devLib/lcd.c
Normal file
495
devLib/lcd.c
Normal file
@@ -0,0 +1,495 @@
|
||||
/*
|
||||
* lcd.c:
|
||||
* Text-based LCD driver.
|
||||
* This is designed to drive the parallel interface LCD drivers
|
||||
* based in the Hitachi HD44780U controller and compatables.
|
||||
*
|
||||
* Copyright (c) 2012 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "lcd.h"
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
// HD44780U Commands
|
||||
|
||||
#define LCD_CLEAR 0x01
|
||||
#define LCD_HOME 0x02
|
||||
#define LCD_ENTRY 0x04
|
||||
#define LCD_CTRL 0x08
|
||||
#define LCD_CDSHIFT 0x10
|
||||
#define LCD_FUNC 0x20
|
||||
#define LCD_CGRAM 0x40
|
||||
#define LCD_DGRAM 0x80
|
||||
|
||||
// Bits in the entry register
|
||||
|
||||
#define LCD_ENTRY_SH 0x01
|
||||
#define LCD_ENTRY_ID 0x02
|
||||
|
||||
// Bits in the control register
|
||||
|
||||
#define LCD_BLINK_CTRL 0x01
|
||||
#define LCD_CURSOR_CTRL 0x02
|
||||
#define LCD_DISPLAY_CTRL 0x04
|
||||
|
||||
// Bits in the function register
|
||||
|
||||
#define LCD_FUNC_F 0x04
|
||||
#define LCD_FUNC_N 0x08
|
||||
#define LCD_FUNC_DL 0x10
|
||||
|
||||
#define LCD_CDSHIFT_RL 0x04
|
||||
|
||||
struct lcdDataStruct
|
||||
{
|
||||
int bits, rows, cols ;
|
||||
int rsPin, strbPin ;
|
||||
int dataPins [8] ;
|
||||
int cx, cy ;
|
||||
} ;
|
||||
|
||||
struct lcdDataStruct *lcds [MAX_LCDS] ;
|
||||
|
||||
static int lcdControl ;
|
||||
|
||||
// Row offsets
|
||||
|
||||
static const int rowOff [4] = { 0x00, 0x40, 0x14, 0x54 } ;
|
||||
|
||||
|
||||
/*
|
||||
* strobe:
|
||||
* Toggle the strobe (Really the "E") pin to the device.
|
||||
* According to the docs, data is latched on the falling edge.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void strobe (const struct lcdDataStruct *lcd)
|
||||
{
|
||||
|
||||
// Note timing changes for new version of delayMicroseconds ()
|
||||
|
||||
digitalWrite (lcd->strbPin, 1) ; delayMicroseconds (50) ;
|
||||
digitalWrite (lcd->strbPin, 0) ; delayMicroseconds (50) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sentDataCmd:
|
||||
* Send an data or command byte to the display.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sendDataCmd (const struct lcdDataStruct *lcd, unsigned char data)
|
||||
{
|
||||
register unsigned char myData = data ;
|
||||
unsigned char i, d4 ;
|
||||
|
||||
if (lcd->bits == 4)
|
||||
{
|
||||
d4 = (myData >> 4) & 0x0F;
|
||||
for (i = 0 ; i < 4 ; ++i)
|
||||
{
|
||||
digitalWrite (lcd->dataPins [i], (d4 & 1)) ;
|
||||
d4 >>= 1 ;
|
||||
}
|
||||
strobe (lcd) ;
|
||||
|
||||
d4 = myData & 0x0F ;
|
||||
for (i = 0 ; i < 4 ; ++i)
|
||||
{
|
||||
digitalWrite (lcd->dataPins [i], (d4 & 1)) ;
|
||||
d4 >>= 1 ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
{
|
||||
digitalWrite (lcd->dataPins [i], (myData & 1)) ;
|
||||
myData >>= 1 ;
|
||||
}
|
||||
}
|
||||
strobe (lcd) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* putCommand:
|
||||
* Send a command byte to the display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void putCommand (const struct lcdDataStruct *lcd, unsigned char command)
|
||||
{
|
||||
digitalWrite (lcd->rsPin, 0) ;
|
||||
sendDataCmd (lcd, command) ;
|
||||
delay (2) ;
|
||||
}
|
||||
|
||||
static void put4Command (const struct lcdDataStruct *lcd, unsigned char command)
|
||||
{
|
||||
register unsigned char myCommand = command ;
|
||||
register unsigned char i ;
|
||||
|
||||
digitalWrite (lcd->rsPin, 0) ;
|
||||
|
||||
for (i = 0 ; i < 4 ; ++i)
|
||||
{
|
||||
digitalWrite (lcd->dataPins [i], (myCommand & 1)) ;
|
||||
myCommand >>= 1 ;
|
||||
}
|
||||
strobe (lcd) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************
|
||||
* User Callable code below here
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* lcdHome: lcdClear:
|
||||
* Home the cursor or clear the screen.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdHome (const int fd)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
putCommand (lcd, LCD_HOME) ;
|
||||
lcd->cx = lcd->cy = 0 ;
|
||||
delay (5) ;
|
||||
}
|
||||
|
||||
void lcdClear (const int fd)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
putCommand (lcd, LCD_CLEAR) ;
|
||||
putCommand (lcd, LCD_HOME) ;
|
||||
lcd->cx = lcd->cy = 0 ;
|
||||
delay (5) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdDisplay: lcdCursor: lcdCursorBlink:
|
||||
* Turn the display, cursor, cursor blinking on/off
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdDisplay (const int fd, int state)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
if (state)
|
||||
lcdControl |= LCD_DISPLAY_CTRL ;
|
||||
else
|
||||
lcdControl &= ~LCD_DISPLAY_CTRL ;
|
||||
|
||||
putCommand (lcd, LCD_CTRL | lcdControl) ;
|
||||
}
|
||||
|
||||
void lcdCursor (const int fd, int state)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
if (state)
|
||||
lcdControl |= LCD_CURSOR_CTRL ;
|
||||
else
|
||||
lcdControl &= ~LCD_CURSOR_CTRL ;
|
||||
|
||||
putCommand (lcd, LCD_CTRL | lcdControl) ;
|
||||
}
|
||||
|
||||
void lcdCursorBlink (const int fd, int state)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
if (state)
|
||||
lcdControl |= LCD_BLINK_CTRL ;
|
||||
else
|
||||
lcdControl &= ~LCD_BLINK_CTRL ;
|
||||
|
||||
putCommand (lcd, LCD_CTRL | lcdControl) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdSendCommand:
|
||||
* Send any arbitary command to the display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdSendCommand (const int fd, unsigned char command)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
putCommand (lcd, command) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdPosition:
|
||||
* Update the position of the cursor on the display.
|
||||
* Ignore invalid locations.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdPosition (const int fd, int x, int y)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
if ((x > lcd->cols) || (x < 0))
|
||||
return ;
|
||||
if ((y > lcd->rows) || (y < 0))
|
||||
return ;
|
||||
|
||||
putCommand (lcd, x + (LCD_DGRAM | rowOff [y])) ;
|
||||
|
||||
lcd->cx = x ;
|
||||
lcd->cy = y ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdCharDef:
|
||||
* Defines a new character in the CGRAM
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdCharDef (const int fd, int index, unsigned char data [8])
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
int i ;
|
||||
|
||||
putCommand (lcd, LCD_CGRAM | ((index & 7) << 3)) ;
|
||||
|
||||
digitalWrite (lcd->rsPin, 1) ;
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
sendDataCmd (lcd, data [i]) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdPutchar:
|
||||
* Send a data byte to be displayed on the display. We implement a very
|
||||
* simple terminal here - with line wrapping, but no scrolling. Yet.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdPutchar (const int fd, unsigned char data)
|
||||
{
|
||||
struct lcdDataStruct *lcd = lcds [fd] ;
|
||||
|
||||
digitalWrite (lcd->rsPin, 1) ;
|
||||
sendDataCmd (lcd, data) ;
|
||||
|
||||
if (++lcd->cx == lcd->cols)
|
||||
{
|
||||
lcd->cx = 0 ;
|
||||
if (++lcd->cy == lcd->rows)
|
||||
lcd->cy = 0 ;
|
||||
|
||||
putCommand (lcd, lcd->cx + (LCD_DGRAM | rowOff [lcd->cy])) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdPuts:
|
||||
* Send a string to be displayed on the display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdPuts (const int fd, const char *string)
|
||||
{
|
||||
while (*string)
|
||||
lcdPutchar (fd, *string++) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdPrintf:
|
||||
* Printf to an LCD display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcdPrintf (const int fd, const char *message, ...)
|
||||
{
|
||||
va_list argp ;
|
||||
char buffer [1024] ;
|
||||
|
||||
va_start (argp, message) ;
|
||||
vsnprintf (buffer, 1023, message, argp) ;
|
||||
va_end (argp) ;
|
||||
|
||||
lcdPuts (fd, buffer) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcdInit:
|
||||
* Take a lot of parameters and initialise the LCD, and return a handle to
|
||||
* that LCD, or -1 if any error.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int lcdInit (const int rows, const int cols, const int bits,
|
||||
const int rs, const int strb,
|
||||
const int d0, const int d1, const int d2, const int d3, const int d4,
|
||||
const int d5, const int d6, const int d7)
|
||||
{
|
||||
static int initialised = 0 ;
|
||||
|
||||
unsigned char func ;
|
||||
int i ;
|
||||
int lcdFd = -1 ;
|
||||
struct lcdDataStruct *lcd ;
|
||||
|
||||
if (initialised == 0)
|
||||
{
|
||||
initialised = 1 ;
|
||||
for (i = 0 ; i < MAX_LCDS ; ++i)
|
||||
lcds [i] = NULL ;
|
||||
}
|
||||
|
||||
// Simple sanity checks
|
||||
|
||||
if (! ((bits == 4) || (bits == 8)))
|
||||
return -1 ;
|
||||
|
||||
if ((rows < 0) || (rows > 20))
|
||||
return -1 ;
|
||||
|
||||
if ((cols < 0) || (cols > 20))
|
||||
return -1 ;
|
||||
|
||||
// Create a new LCD:
|
||||
|
||||
for (i = 0 ; i < MAX_LCDS ; ++i)
|
||||
{
|
||||
if (lcds [i] == NULL)
|
||||
{
|
||||
lcdFd = i ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
if (lcdFd == -1)
|
||||
return -1 ;
|
||||
|
||||
lcd = (struct lcdDataStruct *)malloc (sizeof (struct lcdDataStruct)) ;
|
||||
if (lcd == NULL)
|
||||
return -1 ;
|
||||
|
||||
lcd->rsPin = rs ;
|
||||
lcd->strbPin = strb ;
|
||||
lcd->bits = 8 ; // For now - we'll set it properly later.
|
||||
lcd->rows = rows ;
|
||||
lcd->cols = cols ;
|
||||
lcd->cx = 0 ;
|
||||
lcd->cy = 0 ;
|
||||
|
||||
lcd->dataPins [0] = d0 ;
|
||||
lcd->dataPins [1] = d1 ;
|
||||
lcd->dataPins [2] = d2 ;
|
||||
lcd->dataPins [3] = d3 ;
|
||||
lcd->dataPins [4] = d4 ;
|
||||
lcd->dataPins [5] = d5 ;
|
||||
lcd->dataPins [6] = d6 ;
|
||||
lcd->dataPins [7] = d7 ;
|
||||
|
||||
lcds [lcdFd] = lcd ;
|
||||
|
||||
digitalWrite (lcd->rsPin, 0) ; pinMode (lcd->rsPin, OUTPUT) ;
|
||||
digitalWrite (lcd->strbPin, 0) ; pinMode (lcd->strbPin, OUTPUT) ;
|
||||
|
||||
for (i = 0 ; i < bits ; ++i)
|
||||
{
|
||||
digitalWrite (lcd->dataPins [i], 0) ;
|
||||
pinMode (lcd->dataPins [i], OUTPUT) ;
|
||||
}
|
||||
delay (35) ; // mS
|
||||
|
||||
|
||||
// 4-bit mode?
|
||||
// OK. This is a PIG and it's not at all obvious from the documentation I had,
|
||||
// so I guess some others have worked through either with better documentation
|
||||
// or more trial and error... Anyway here goes:
|
||||
//
|
||||
// It seems that the controller needs to see the FUNC command at least 3 times
|
||||
// consecutively - in 8-bit mode. If you're only using 8-bit mode, then it appears
|
||||
// that you can get away with one func-set, however I'd not rely on it...
|
||||
//
|
||||
// So to set 4-bit mode, you need to send the commands one nibble at a time,
|
||||
// the same three times, but send the command to set it into 8-bit mode those
|
||||
// three times, then send a final 4th command to set it into 4-bit mode, and only
|
||||
// then can you flip the switch for the rest of the library to work in 4-bit
|
||||
// mode which sends the commands as 2 x 4-bit values.
|
||||
|
||||
if (bits == 4)
|
||||
{
|
||||
func = LCD_FUNC | LCD_FUNC_DL ; // Set 8-bit mode 3 times
|
||||
put4Command (lcd, func >> 4) ; delay (35) ;
|
||||
put4Command (lcd, func >> 4) ; delay (35) ;
|
||||
put4Command (lcd, func >> 4) ; delay (35) ;
|
||||
func = LCD_FUNC ; // 4th set: 4-bit mode
|
||||
put4Command (lcd, func >> 4) ; delay (35) ;
|
||||
lcd->bits = 4 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
func = LCD_FUNC | LCD_FUNC_DL ;
|
||||
putCommand (lcd, func ) ; delay (35) ;
|
||||
putCommand (lcd, func ) ; delay (35) ;
|
||||
putCommand (lcd, func ) ; delay (35) ;
|
||||
}
|
||||
|
||||
if (lcd->rows > 1)
|
||||
{
|
||||
func |= LCD_FUNC_N ;
|
||||
putCommand (lcd, func) ; delay (35) ;
|
||||
}
|
||||
|
||||
// Rest of the initialisation sequence
|
||||
|
||||
lcdDisplay (lcdFd, TRUE) ;
|
||||
lcdCursor (lcdFd, FALSE) ;
|
||||
lcdCursorBlink (lcdFd, FALSE) ;
|
||||
lcdClear (lcdFd) ;
|
||||
|
||||
putCommand (lcd, LCD_ENTRY | LCD_ENTRY_ID) ;
|
||||
putCommand (lcd, LCD_CDSHIFT | LCD_CDSHIFT_RL) ;
|
||||
|
||||
return lcdFd ;
|
||||
}
|
52
devLib/lcd.h
Normal file
52
devLib/lcd.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* lcd.h:
|
||||
* Text-based LCD driver.
|
||||
* This is designed to drive the parallel interface LCD drivers
|
||||
* based in the Hitachi HD44780U controller and compatables.
|
||||
*
|
||||
* Copyright (c) 2012 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#define MAX_LCDS 8
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void lcdHome (const int fd) ;
|
||||
extern void lcdClear (const int fd) ;
|
||||
extern void lcdDisplay (const int fd, int state) ;
|
||||
extern void lcdCursor (const int fd, int state) ;
|
||||
extern void lcdCursorBlink (const int fd, int state) ;
|
||||
extern void lcdSendCommand (const int fd, unsigned char command) ;
|
||||
extern void lcdPosition (const int fd, int x, int y) ;
|
||||
extern void lcdCharDef (const int fd, int index, unsigned char data [8]) ;
|
||||
extern void lcdPutchar (const int fd, unsigned char data) ;
|
||||
extern void lcdPuts (const int fd, const char *string) ;
|
||||
extern void lcdPrintf (const int fd, const char *message, ...) ;
|
||||
|
||||
extern int lcdInit (const int rows, const int cols, const int bits,
|
||||
const int rs, const int strb,
|
||||
const int d0, const int d1, const int d2, const int d3, const int d4,
|
||||
const int d5, const int d6, const int d7) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
673
devLib/lcd128x64.c
Normal file
673
devLib/lcd128x64.c
Normal file
@@ -0,0 +1,673 @@
|
||||
/*
|
||||
* lcd128x64.c:
|
||||
* Graphics-based LCD driver.
|
||||
* This is designed to drive the parallel interface LCD drivers
|
||||
* based on the generic 12864H chips
|
||||
*
|
||||
* There are many variations on these chips, however they all mostly
|
||||
* seem to be similar.
|
||||
* This implementation has the Pins from the Pi hard-wired into it,
|
||||
* in particular wiringPi pins 0-7 so that we can use
|
||||
* digitalWriteByete() to speed things up somewhat.
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "font.h"
|
||||
#include "lcd128x64.h"
|
||||
|
||||
// Size
|
||||
|
||||
#define LCD_WIDTH 128
|
||||
#define LCD_HEIGHT 64
|
||||
|
||||
// Hardware Pins
|
||||
// Note pins 0-7 are the 8-bit data port
|
||||
|
||||
#define CS1 10
|
||||
#define CS2 11
|
||||
#define STROBE 12
|
||||
#define RS 13
|
||||
|
||||
// Software copy of the framebuffer
|
||||
// it's 8-bit deep although the display itself is only 1-bit deep.
|
||||
|
||||
static unsigned char frameBuffer [LCD_WIDTH * LCD_HEIGHT] ;
|
||||
|
||||
static int maxX, maxY ;
|
||||
static int lastX, lastY ;
|
||||
static int xOrigin, yOrigin ;
|
||||
static int lcdOrientation = 0 ;
|
||||
|
||||
/*
|
||||
* strobe:
|
||||
* Toggle the strobe (Really the "E") pin to the device.
|
||||
* According to the docs, data is latched on the falling edge.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void strobe (void)
|
||||
{
|
||||
digitalWrite (STROBE, 1) ; delayMicroseconds (1) ;
|
||||
digitalWrite (STROBE, 0) ; delayMicroseconds (5) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sentData:
|
||||
* Send an data or command byte to the display.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sendData (const int data, const int chip)
|
||||
{
|
||||
digitalWrite (chip, 0) ;
|
||||
digitalWriteByte (data) ;
|
||||
strobe () ;
|
||||
digitalWrite (chip, 1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sendCommand:
|
||||
* Send a command byte to the display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sendCommand (const int command, const int chip)
|
||||
{
|
||||
digitalWrite (RS, 0) ;
|
||||
sendData (command, chip) ;
|
||||
digitalWrite (RS, 1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* setCol: SetLine:
|
||||
* Set the column and line addresses
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void setCol (int col, const int chip)
|
||||
{ sendCommand (0x40 | (col & 0x3F), chip) ; }
|
||||
|
||||
static void setLine (int line, const int chip)
|
||||
{ sendCommand (0xB8 | (line & 0x07), chip) ; }
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64update:
|
||||
* Copy our software version to the real display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64update (void)
|
||||
{
|
||||
int line, x, y, fbLoc ;
|
||||
unsigned char byte ;
|
||||
|
||||
// Left side
|
||||
|
||||
for (line = 0 ; line < 8 ; ++line)
|
||||
{
|
||||
setCol (0, CS1) ;
|
||||
setLine (line, CS1) ;
|
||||
|
||||
for (x = 63 ; x >= 0 ; --x)
|
||||
{
|
||||
byte = 0 ;
|
||||
for (y = 0 ; y < 8 ; ++y)
|
||||
{
|
||||
fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ;
|
||||
if (frameBuffer [fbLoc] != 0)
|
||||
byte |= (1 << y) ;
|
||||
}
|
||||
sendData (byte, CS1) ;
|
||||
}
|
||||
}
|
||||
|
||||
// Right side
|
||||
|
||||
for (line = 0 ; line < 8 ; ++line)
|
||||
{
|
||||
setCol (0, CS2) ;
|
||||
setLine (line, CS2) ;
|
||||
|
||||
for (x = 127 ; x >= 64 ; --x)
|
||||
{
|
||||
byte = 0 ;
|
||||
for (y = 0 ; y < 8 ; ++y)
|
||||
{
|
||||
fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ;
|
||||
if (frameBuffer [fbLoc] != 0)
|
||||
byte |= (1 << y) ;
|
||||
}
|
||||
sendData (byte, CS2) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64setOrigin:
|
||||
* Set the display offset origin
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64setOrigin (int x, int y)
|
||||
{
|
||||
xOrigin = x ;
|
||||
yOrigin = y ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64setOrientation:
|
||||
* Set the display orientation:
|
||||
* 0: Normal, the display is portrait mode, 0,0 is top left
|
||||
* 1: Landscape
|
||||
* 2: Portrait, flipped
|
||||
* 3: Landscape, flipped
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64setOrientation (int orientation)
|
||||
{
|
||||
lcdOrientation = orientation & 3 ;
|
||||
|
||||
lcd128x64setOrigin (0,0) ;
|
||||
|
||||
switch (lcdOrientation)
|
||||
{
|
||||
case 0:
|
||||
maxX = LCD_WIDTH ;
|
||||
maxY = LCD_HEIGHT ;
|
||||
break ;
|
||||
|
||||
case 1:
|
||||
maxX = LCD_HEIGHT ;
|
||||
maxY = LCD_WIDTH ;
|
||||
break ;
|
||||
|
||||
case 2:
|
||||
maxX = LCD_WIDTH ;
|
||||
maxY = LCD_HEIGHT ;
|
||||
break ;
|
||||
|
||||
case 3:
|
||||
maxX = LCD_HEIGHT ;
|
||||
maxY = LCD_WIDTH ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64orientCoordinates:
|
||||
* Adjust the coordinates given to the display orientation
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64orientCoordinates (int *x, int *y)
|
||||
{
|
||||
register int tmp ;
|
||||
|
||||
*x += xOrigin ;
|
||||
*y += yOrigin ;
|
||||
*y = maxY - *y - 1 ;
|
||||
|
||||
switch (lcdOrientation)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 1:
|
||||
tmp = maxY - *y - 1 ;
|
||||
*y = *x ;
|
||||
*x = tmp ;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
*x = maxX - *x - 1 ;
|
||||
*y = maxY - *y - 1 ;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
*x = maxX - *x - 1 ;
|
||||
tmp = *y ;
|
||||
*y = *x ;
|
||||
*x = tmp ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64getScreenSize:
|
||||
* Return the max X & Y screen sizes. Needs to be called again, if you
|
||||
* change screen orientation.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64getScreenSize (int *x, int *y)
|
||||
{
|
||||
*x = maxX ;
|
||||
*y = maxY ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************
|
||||
* Standard Graphical Functions
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64point:
|
||||
* Plot a pixel.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64point (int x, int y, int colour)
|
||||
{
|
||||
lastX = x ;
|
||||
lastY = y ;
|
||||
|
||||
lcd128x64orientCoordinates (&x, &y) ;
|
||||
|
||||
if ((x < 0) || (x >= LCD_WIDTH) || (y < 0) || (y >= LCD_HEIGHT))
|
||||
return ;
|
||||
|
||||
frameBuffer [x + y * LCD_WIDTH] = colour ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64line: lcd128x64lineTo:
|
||||
* Classic Bressenham Line code
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64line (int x0, int y0, int x1, int y1, int colour)
|
||||
{
|
||||
int dx, dy ;
|
||||
int sx, sy ;
|
||||
int err, e2 ;
|
||||
|
||||
lastX = x1 ;
|
||||
lastY = y1 ;
|
||||
|
||||
dx = abs (x1 - x0) ;
|
||||
dy = abs (y1 - y0) ;
|
||||
|
||||
sx = (x0 < x1) ? 1 : -1 ;
|
||||
sy = (y0 < y1) ? 1 : -1 ;
|
||||
|
||||
err = dx - dy ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
lcd128x64point (x0, y0, colour) ;
|
||||
|
||||
if ((x0 == x1) && (y0 == y1))
|
||||
break ;
|
||||
|
||||
e2 = 2 * err ;
|
||||
|
||||
if (e2 > -dy)
|
||||
{
|
||||
err -= dy ;
|
||||
x0 += sx ;
|
||||
}
|
||||
|
||||
if (e2 < dx)
|
||||
{
|
||||
err += dx ;
|
||||
y0 += sy ;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void lcd128x64lineTo (int x, int y, int colour)
|
||||
{
|
||||
lcd128x64line (lastX, lastY, x, y, colour) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64rectangle:
|
||||
* A rectangle is a spoilt days fishing
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled)
|
||||
{
|
||||
register int x ;
|
||||
|
||||
if (filled)
|
||||
{
|
||||
/**/ if (x1 == x2)
|
||||
lcd128x64line (x1, y1, x2, y2, colour) ;
|
||||
else if (x1 < x2)
|
||||
for (x = x1 ; x <= x2 ; ++x)
|
||||
lcd128x64line (x, y1, x, y2, colour) ;
|
||||
else
|
||||
for (x = x2 ; x <= x1 ; ++x)
|
||||
lcd128x64line (x, y1, x, y2, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64line (x1, y1, x2, y1, colour) ;
|
||||
lcd128x64lineTo (x2, y2, colour) ;
|
||||
lcd128x64lineTo (x1, y2, colour) ;
|
||||
lcd128x64lineTo (x1, y1, colour) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64circle:
|
||||
* This is the midpoint circle algorithm.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64circle (int x, int y, int r, int colour, int filled)
|
||||
{
|
||||
int ddF_x = 1 ;
|
||||
int ddF_y = -2 * r ;
|
||||
|
||||
int f = 1 - r ;
|
||||
int x1 = 0 ;
|
||||
int y1 = r ;
|
||||
|
||||
if (filled)
|
||||
{
|
||||
lcd128x64line (x, y + r, x, y - r, colour) ;
|
||||
lcd128x64line (x + r, y, x - r, y, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64point (x, y + r, colour) ;
|
||||
lcd128x64point (x, y - r, colour) ;
|
||||
lcd128x64point (x + r, y, colour) ;
|
||||
lcd128x64point (x - r, y, colour) ;
|
||||
}
|
||||
|
||||
while (x1 < y1)
|
||||
{
|
||||
if (f >= 0)
|
||||
{
|
||||
y1-- ;
|
||||
ddF_y += 2 ;
|
||||
f += ddF_y ;
|
||||
}
|
||||
x1++ ;
|
||||
ddF_x += 2 ;
|
||||
f += ddF_x ;
|
||||
if (filled)
|
||||
{
|
||||
lcd128x64line (x + x1, y + y1, x - x1, y + y1, colour) ;
|
||||
lcd128x64line (x + x1, y - y1, x - x1, y - y1, colour) ;
|
||||
lcd128x64line (x + y1, y + x1, x - y1, y + x1, colour) ;
|
||||
lcd128x64line (x + y1, y - x1, x - y1, y - x1, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64point (x + x1, y + y1, colour) ; lcd128x64point (x - x1, y + y1, colour) ;
|
||||
lcd128x64point (x + x1, y - y1, colour) ; lcd128x64point (x - x1, y - y1, colour) ;
|
||||
lcd128x64point (x + y1, y + x1, colour) ; lcd128x64point (x - y1, y + x1, colour) ;
|
||||
lcd128x64point (x + y1, y - x1, colour) ; lcd128x64point (x - y1, y - x1, colour) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64ellipse:
|
||||
* Fast ellipse drawing algorithm by
|
||||
* John Kennedy
|
||||
* Mathematics Department
|
||||
* Santa Monica College
|
||||
* 1900 Pico Blvd.
|
||||
* Santa Monica, CA 90405
|
||||
* jrkennedy6@gmail.com
|
||||
* -Confirned in email this algorithm is in the public domain -GH-
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void plot4ellipsePoints (int cx, int cy, int x, int y, int colour, int filled)
|
||||
{
|
||||
if (filled)
|
||||
{
|
||||
lcd128x64line (cx + x, cy + y, cx - x, cy + y, colour) ;
|
||||
lcd128x64line (cx - x, cy - y, cx + x, cy - y, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64point (cx + x, cy + y, colour) ;
|
||||
lcd128x64point (cx - x, cy + y, colour) ;
|
||||
lcd128x64point (cx - x, cy - y, colour) ;
|
||||
lcd128x64point (cx + x, cy - y, colour) ;
|
||||
}
|
||||
}
|
||||
|
||||
void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled)
|
||||
{
|
||||
int x, y ;
|
||||
int xChange, yChange, ellipseError ;
|
||||
int twoAsquare, twoBsquare ;
|
||||
int stoppingX, stoppingY ;
|
||||
|
||||
twoAsquare = 2 * xRadius * xRadius ;
|
||||
twoBsquare = 2 * yRadius * yRadius ;
|
||||
|
||||
x = xRadius ;
|
||||
y = 0 ;
|
||||
|
||||
xChange = yRadius * yRadius * (1 - 2 * xRadius) ;
|
||||
yChange = xRadius * xRadius ;
|
||||
|
||||
ellipseError = 0 ;
|
||||
stoppingX = twoBsquare * xRadius ;
|
||||
stoppingY = 0 ;
|
||||
|
||||
while (stoppingX >= stoppingY) // 1st set of points
|
||||
{
|
||||
plot4ellipsePoints (cx, cy, x, y, colour, filled) ;
|
||||
++y ;
|
||||
stoppingY += twoAsquare ;
|
||||
ellipseError += yChange ;
|
||||
yChange += twoAsquare ;
|
||||
|
||||
if ((2 * ellipseError + xChange) > 0 )
|
||||
{
|
||||
--x ;
|
||||
stoppingX -= twoBsquare ;
|
||||
ellipseError += xChange ;
|
||||
xChange += twoBsquare ;
|
||||
}
|
||||
}
|
||||
|
||||
x = 0 ;
|
||||
y = yRadius ;
|
||||
|
||||
xChange = yRadius * yRadius ;
|
||||
yChange = xRadius * xRadius * (1 - 2 * yRadius) ;
|
||||
|
||||
ellipseError = 0 ;
|
||||
stoppingX = 0 ;
|
||||
stoppingY = twoAsquare * yRadius ;
|
||||
|
||||
while (stoppingX <= stoppingY) //2nd set of points
|
||||
{
|
||||
plot4ellipsePoints (cx, cy, x, y, colour, filled) ;
|
||||
++x ;
|
||||
stoppingX += twoBsquare ;
|
||||
ellipseError += xChange ;
|
||||
xChange += twoBsquare ;
|
||||
|
||||
if ((2 * ellipseError + yChange) > 0 )
|
||||
{
|
||||
--y ;
|
||||
stoppingY -= twoAsquare ;
|
||||
ellipseError += yChange ;
|
||||
yChange += twoAsquare ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64putchar:
|
||||
* Print a single character to the screen
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol)
|
||||
{
|
||||
int y1, y2 ;
|
||||
|
||||
unsigned char line ;
|
||||
unsigned char *fontPtr ;
|
||||
|
||||
// Can't print if we're offscreen
|
||||
|
||||
//if ((x < 0) || (x >= (maxX - fontWidth)) || (y < 0) || (y >= (maxY - fontHeight)))
|
||||
// return ;
|
||||
|
||||
fontPtr = font + c * fontHeight ;
|
||||
|
||||
for (y1 = fontHeight - 1 ; y1 >= 0 ; --y1)
|
||||
{
|
||||
y2 = y + y1 ;
|
||||
line = *fontPtr++ ;
|
||||
lcd128x64point (x + 0, y2, (line & 0x80) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 1, y2, (line & 0x40) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 2, y2, (line & 0x20) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 3, y2, (line & 0x10) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 4, y2, (line & 0x08) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 5, y2, (line & 0x04) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 6, y2, (line & 0x02) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 7, y2, (line & 0x01) == 0 ? bgCol : fgCol) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64puts:
|
||||
* Send a string to the display. Obeys \n and \r formatting
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol)
|
||||
{
|
||||
int c, mx, my ;
|
||||
|
||||
mx = x ; my = y ;
|
||||
|
||||
while (*str)
|
||||
{
|
||||
c = *str++ ;
|
||||
|
||||
if (c == '\r')
|
||||
{
|
||||
mx = x ;
|
||||
continue ;
|
||||
}
|
||||
|
||||
if (c == '\n')
|
||||
{
|
||||
mx = x ;
|
||||
my -= fontHeight ;
|
||||
continue ;
|
||||
}
|
||||
|
||||
lcd128x64putchar (mx, my, c, bgCol, fgCol) ;
|
||||
|
||||
mx += fontWidth ;
|
||||
if (mx >= (maxX - fontWidth))
|
||||
{
|
||||
mx = 0 ;
|
||||
my -= fontHeight ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64clear:
|
||||
* Clear the display to the given colour.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64clear (int colour)
|
||||
{
|
||||
register int i ;
|
||||
register unsigned char *ptr = frameBuffer ;
|
||||
|
||||
for (i = 0 ; i < (maxX * maxY) ; ++i)
|
||||
*ptr++ = colour ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64setup:
|
||||
* Initialise the display and GPIO.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int lcd128x64setup (void)
|
||||
{
|
||||
int i ;
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pinMode (i, OUTPUT) ;
|
||||
|
||||
digitalWrite (CS1, 1) ;
|
||||
digitalWrite (CS2, 1) ;
|
||||
digitalWrite (STROBE, 0) ;
|
||||
digitalWrite (RS, 1) ;
|
||||
|
||||
pinMode (CS1, OUTPUT) ;
|
||||
pinMode (CS2, OUTPUT) ;
|
||||
pinMode (STROBE, OUTPUT) ;
|
||||
pinMode (RS, OUTPUT) ;
|
||||
|
||||
sendCommand (0x3F, CS1) ; // Display ON
|
||||
sendCommand (0xC0, CS1) ; // Set display start line to 0
|
||||
|
||||
sendCommand (0x3F, CS2) ; // Display ON
|
||||
sendCommand (0xC0, CS2) ; // Set display start line to 0
|
||||
|
||||
lcd128x64clear (0) ;
|
||||
lcd128x64setOrientation (0) ;
|
||||
lcd128x64update () ;
|
||||
|
||||
return 0 ;
|
||||
}
|
39
devLib/lcd128x64.h
Normal file
39
devLib/lcd128x64.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* lcd128x64.h:
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
extern void lcd128x64setOrigin (int x, int y) ;
|
||||
extern void lcd128x64setOrientation (int orientation) ;
|
||||
extern void lcd128x64orientCoordinates (int *x, int *y) ;
|
||||
extern void lcd128x64getScreenSize (int *x, int *y) ;
|
||||
extern void lcd128x64point (int x, int y, int colour) ;
|
||||
extern void lcd128x64line (int x0, int y0, int x1, int y1, int colour) ;
|
||||
extern void lcd128x64lineTo (int x, int y, int colour) ;
|
||||
extern void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) ;
|
||||
extern void lcd128x64circle (int x, int y, int r, int colour, int filled) ;
|
||||
extern void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) ;
|
||||
extern void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) ;
|
||||
extern void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) ;
|
||||
extern void lcd128x64update (void) ;
|
||||
extern void lcd128x64clear (int colour) ;
|
||||
|
||||
extern int lcd128x64setup (void) ;
|
165
devLib/maxdetect.c
Normal file
165
devLib/maxdetect.c
Normal file
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* maxdetect.c:
|
||||
* Driver for the MaxDetect series sensors
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
//#include <stdio.h>
|
||||
//#include <stdlib.h>
|
||||
//#include <unistd.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "maxdetect.h"
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* maxDetectLowHighWait:
|
||||
* Wait for a transition from high to low on the bus
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void maxDetectLowHighWait (const int pin)
|
||||
{
|
||||
unsigned int timeOut = millis () + 2000 ;
|
||||
|
||||
while (digitalRead (pin) == HIGH)
|
||||
if (millis () > timeOut)
|
||||
return ;
|
||||
|
||||
while (digitalRead (pin) == LOW)
|
||||
if (millis () > timeOut)
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* maxDetectClockByte:
|
||||
* Read in a single byte from the MaxDetect bus
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static unsigned int maxDetectClockByte (const int pin)
|
||||
{
|
||||
unsigned int byte = 0 ;
|
||||
int bit ;
|
||||
|
||||
for (bit = 0 ; bit < 8 ; ++bit)
|
||||
{
|
||||
maxDetectLowHighWait (pin) ;
|
||||
|
||||
// bit starting now - we need to time it.
|
||||
|
||||
delayMicroseconds (30) ;
|
||||
byte <<= 1 ;
|
||||
if (digitalRead (pin) == HIGH) // It's a 1
|
||||
byte |= 1 ;
|
||||
}
|
||||
|
||||
return byte ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* maxDetectRead:
|
||||
* Read in and return the 4 data bytes from the MaxDetect sensor.
|
||||
* Return TRUE/FALSE depending on the checksum validity
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int maxDetectRead (const int pin, unsigned char buffer [4])
|
||||
{
|
||||
int i ;
|
||||
unsigned int checksum ;
|
||||
unsigned char localBuf [5] ;
|
||||
|
||||
// Wake up the RHT03 by pulling the data line low, then high
|
||||
// Low for 10mS, high for 40uS.
|
||||
|
||||
pinMode (pin, OUTPUT) ;
|
||||
digitalWrite (pin, 0) ; delay (10) ;
|
||||
digitalWrite (pin, 1) ; delayMicroseconds (40) ;
|
||||
pinMode (pin, INPUT) ;
|
||||
|
||||
// Now wait for sensor to pull pin low
|
||||
|
||||
maxDetectLowHighWait (pin) ;
|
||||
|
||||
// and read in 5 bytes (40 bits)
|
||||
|
||||
for (i = 0 ; i < 5 ; ++i)
|
||||
localBuf [i] = maxDetectClockByte (pin) ;
|
||||
|
||||
checksum = 0 ;
|
||||
for (i = 0 ; i < 4 ; ++i)
|
||||
{
|
||||
buffer [i] = localBuf [i] ;
|
||||
checksum += localBuf [i] ;
|
||||
}
|
||||
checksum &= 0xFF ;
|
||||
|
||||
return checksum == localBuf [4] ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* readRHT03:
|
||||
* Read the Temperature & Humidity from an RHT03 sensor
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int readRHT03 (const int pin, int *temp, int *rh)
|
||||
{
|
||||
static unsigned int nextTime = 0 ;
|
||||
static int lastTemp = 0 ;
|
||||
static int lastRh = 0 ;
|
||||
static int lastResult = TRUE ;
|
||||
|
||||
unsigned char buffer [4] ;
|
||||
|
||||
// Don't read more than once a second
|
||||
|
||||
if (millis () < nextTime)
|
||||
{
|
||||
*temp = lastTemp ;
|
||||
*rh = lastRh ;
|
||||
return lastResult ;
|
||||
}
|
||||
|
||||
lastResult = maxDetectRead (pin, buffer) ;
|
||||
|
||||
if (lastResult)
|
||||
{
|
||||
*temp = lastTemp = (buffer [2] * 256 + buffer [3]) ;
|
||||
*rh = lastRh = (buffer [0] * 256 + buffer [1]) ;
|
||||
nextTime = millis () + 2000 ;
|
||||
return TRUE ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE ;
|
||||
}
|
||||
}
|
40
devLib/maxdetect.h
Normal file
40
devLib/maxdetect.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* maxdetect.h:
|
||||
* Driver for the MaxDetect series sensors
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Main generic function
|
||||
|
||||
int maxDetectRead (const int pin, unsigned char buffer [4]) ;
|
||||
|
||||
// Individual sensors
|
||||
|
||||
int readRHT03 (const int pin, int *temp, int *rh) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
112
devLib/piFace.c
Normal file
112
devLib/piFace.c
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* piFace.:
|
||||
* This file to interface with the PiFace peripheral device which
|
||||
* has an MCP23S17 GPIO device connected via the SPI bus.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <mcp23s17.h>
|
||||
|
||||
#include "piFace.h"
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalWrite:
|
||||
* Perform the digitalWrite function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
digitalWrite (pin + 16, value) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalRead:
|
||||
* Perform the digitalRead function on the PiFace board
|
||||
* With a slight twist - if we read from base + 8, then we
|
||||
* read from the output latch...
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
if ((pin - node->pinBase) >= 8)
|
||||
return digitalRead (pin + 8) ;
|
||||
else
|
||||
return digitalRead (pin + 16 + 8) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myPullUpDnControl:
|
||||
* Perform the pullUpDnControl function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud)
|
||||
{
|
||||
pullUpDnControl (pin + 16 + 8, pud) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* piFaceSetup
|
||||
* We're going to create an instance of the mcp23s17 here, then
|
||||
* provide our own read/write routines on-top of it...
|
||||
* The supplied PiFace code (in Pithon) treats it as an 8-bit device
|
||||
* where you write the output ports and read the input port using the
|
||||
* same pin numbers, however I have had a request to be able to read
|
||||
* the output port, so reading 8..15 will read the output latch.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int piFaceSetup (const int pinBase)
|
||||
{
|
||||
int i ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
// Create an mcp23s17 instance:
|
||||
|
||||
mcp23s17Setup (pinBase + 16, 0, 0) ;
|
||||
|
||||
// Set the direction bits
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
{
|
||||
pinMode (pinBase + 16 + i, OUTPUT) ; // Port A is the outputs
|
||||
pinMode (pinBase + 16 + 8 + i, INPUT) ; // Port B inputs.
|
||||
}
|
||||
|
||||
node = wiringPiNewNode (pinBase, 16) ;
|
||||
node->digitalRead = myDigitalRead ;
|
||||
node->digitalWrite = myDigitalWrite ;
|
||||
node->pullUpDnControl = myPullUpDnControl ;
|
||||
|
||||
return 0 ;
|
||||
}
|
32
devLib/piFace.h
Normal file
32
devLib/piFace.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* piFace.h:
|
||||
* Control the PiFace Interface board for the Raspberry Pi
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int piFaceSetup (const int pinBase) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
178
devLib/piFaceOld.c
Normal file
178
devLib/piFaceOld.c
Normal file
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
* piFace.:
|
||||
* Arduino compatable (ish) Wiring library for the Raspberry Pi
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
*
|
||||
* This file to interface with the PiFace peripheral device which
|
||||
* has an MCP23S17 GPIO device connected via the SPI bus.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <wiringPiSPI.h>
|
||||
|
||||
#include "../wiringPi/mcp23x0817.h"
|
||||
|
||||
#include "piFace.h"
|
||||
|
||||
#define PIFACE_SPEED 4000000
|
||||
#define PIFACE_DEVNO 0
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* writeByte:
|
||||
* Write a byte to a register on the MCP23S17 on the SPI bus.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void writeByte (uint8_t reg, uint8_t data)
|
||||
{
|
||||
uint8_t spiData [4] ;
|
||||
|
||||
spiData [0] = CMD_WRITE ;
|
||||
spiData [1] = reg ;
|
||||
spiData [2] = data ;
|
||||
|
||||
wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* readByte:
|
||||
* Read a byte from a register on the MCP23S17 on the SPI bus.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static uint8_t readByte (uint8_t reg)
|
||||
{
|
||||
uint8_t spiData [4] ;
|
||||
|
||||
spiData [0] = CMD_READ ;
|
||||
spiData [1] = reg ;
|
||||
|
||||
wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ;
|
||||
|
||||
return spiData [2] ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalWrite:
|
||||
* Perform the digitalWrite function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
uint8_t mask, old ;
|
||||
|
||||
pin -= node->pinBase ;
|
||||
mask = 1 << pin ;
|
||||
old = readByte (MCP23x17_GPIOA) ;
|
||||
|
||||
if (value == 0)
|
||||
old &= (~mask) ;
|
||||
else
|
||||
old |= mask ;
|
||||
|
||||
writeByte (MCP23x17_GPIOA, old) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalRead:
|
||||
* Perform the digitalRead function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
uint8_t mask, reg ;
|
||||
|
||||
mask = 1 << ((pin - node->pinBase) & 7) ;
|
||||
|
||||
if (pin < 8)
|
||||
reg = MCP23x17_GPIOB ; // Input regsiter
|
||||
else
|
||||
reg = MCP23x17_OLATA ; // Output latch regsiter
|
||||
|
||||
if ((readByte (reg) & mask) != 0)
|
||||
return HIGH ;
|
||||
else
|
||||
return LOW ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myPullUpDnControl:
|
||||
* Perform the pullUpDnControl function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud)
|
||||
{
|
||||
uint8_t mask, old ;
|
||||
|
||||
mask = 1 << (pin - node->pinBase) ;
|
||||
old = readByte (MCP23x17_GPPUB) ;
|
||||
|
||||
if (pud == 0)
|
||||
old &= (~mask) ;
|
||||
else
|
||||
old |= mask ;
|
||||
|
||||
writeByte (MCP23x17_GPPUB, old) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* piFaceSetup
|
||||
* Setup the SPI interface and initialise the MCP23S17 chip
|
||||
* We create one node with 16 pins - each if the first 8 pins being read
|
||||
* and write - although the operations actually go to different
|
||||
* hardware ports. The top 8 let you read the state of the output register.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int piFaceSetup (const int pinBase)
|
||||
{
|
||||
int x ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((x = wiringPiSPISetup (PIFACE_DEVNO, PIFACE_SPEED)) < 0)
|
||||
return x ;
|
||||
|
||||
// Setup the MCP23S17
|
||||
|
||||
writeByte (MCP23x17_IOCON, IOCON_INIT) ;
|
||||
writeByte (MCP23x17_IODIRA, 0x00) ; // Port A -> Outputs
|
||||
writeByte (MCP23x17_IODIRB, 0xFF) ; // Port B -> Inputs
|
||||
|
||||
node = wiringPiNewNode (pinBase, 16) ;
|
||||
node->digitalRead = myDigitalRead ;
|
||||
node->digitalWrite = myDigitalWrite ;
|
||||
node->pullUpDnControl = myPullUpDnControl ;
|
||||
|
||||
return 0 ;
|
||||
}
|
118
devLib/piGlow.c
Normal file
118
devLib/piGlow.c
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* piGlow.c:
|
||||
* Easy access to the Pimoroni PiGlow board.
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <sn3218.h>
|
||||
|
||||
#include "piGlow.h"
|
||||
|
||||
#define PIGLOW_BASE 577
|
||||
|
||||
static int leg0 [6] = { 6, 7, 8, 5, 4, 9 } ;
|
||||
static int leg1 [6] = { 17, 16, 15, 13, 11, 10 } ;
|
||||
static int leg2 [6] = { 0, 1, 2, 3, 14, 12 } ;
|
||||
|
||||
|
||||
/*
|
||||
* piGlow1:
|
||||
* Light up an individual LED
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void piGlow1 (const int leg, const int ring, const int intensity)
|
||||
{
|
||||
int *legLeds ;
|
||||
|
||||
if ((leg < 0) || (leg > 2)) return ;
|
||||
if ((ring < 0) || (ring > 5)) return ;
|
||||
|
||||
/**/ if (leg == 0)
|
||||
legLeds = leg0 ;
|
||||
else if (leg == 1)
|
||||
legLeds = leg1 ;
|
||||
else
|
||||
legLeds = leg2 ;
|
||||
|
||||
analogWrite (PIGLOW_BASE + legLeds [ring], intensity) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* piGlowLeg:
|
||||
* Light up all 6 LEDs on a leg
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void piGlowLeg (const int leg, const int intensity)
|
||||
{
|
||||
int i ;
|
||||
int *legLeds ;
|
||||
|
||||
if ((leg < 0) || (leg > 2))
|
||||
return ;
|
||||
|
||||
/**/ if (leg == 0)
|
||||
legLeds = leg0 ;
|
||||
else if (leg == 1)
|
||||
legLeds = leg1 ;
|
||||
else
|
||||
legLeds = leg2 ;
|
||||
|
||||
for (i = 0 ; i < 6 ; ++i)
|
||||
analogWrite (PIGLOW_BASE + legLeds [i], intensity) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* piGlowRing:
|
||||
* Light up 3 LEDs in a ring. Ring 0 is the outermost, 5 the innermost
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void piGlowRing (const int ring, const int intensity)
|
||||
{
|
||||
if ((ring < 0) || (ring > 5))
|
||||
return ;
|
||||
|
||||
analogWrite (PIGLOW_BASE + leg0 [ring], intensity) ;
|
||||
analogWrite (PIGLOW_BASE + leg1 [ring], intensity) ;
|
||||
analogWrite (PIGLOW_BASE + leg2 [ring], intensity) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* piGlowSetup:
|
||||
* Initialise the board & remember the pins we're using
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void piGlowSetup (int clear)
|
||||
{
|
||||
sn3218Setup (PIGLOW_BASE) ;
|
||||
|
||||
if (clear)
|
||||
{
|
||||
piGlowLeg (0, 0) ;
|
||||
piGlowLeg (1, 0) ;
|
||||
piGlowLeg (2, 0) ;
|
||||
}
|
||||
}
|
45
devLib/piGlow.h
Normal file
45
devLib/piGlow.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* piglow.h:
|
||||
* Easy access to the Pimoroni PiGlow board.
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#define PIGLOW_RED 0
|
||||
#define PIGLOW_YELLOW 1
|
||||
#define PIGLOW_ORANGE 2
|
||||
#define PIGLOW_GREEN 3
|
||||
#define PIGLOW_BLUE 4
|
||||
#define PIGLOW_WHITE 5
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void piGlow1 (const int leg, const int ring, const int intensity) ;
|
||||
extern void piGlowLeg (const int leg, const int intensity) ;
|
||||
extern void piGlowRing (const int ring, const int intensity) ;
|
||||
extern void piGlowSetup (int clear) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
113
devLib/piNes.c
Normal file
113
devLib/piNes.c
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* piNes.c:
|
||||
* Driver for the NES Joystick controller on the Raspberry Pi
|
||||
* Copyright (c) 2012 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "piNes.h"
|
||||
|
||||
#define MAX_NES_JOYSTICKS 8
|
||||
|
||||
#define NES_RIGHT 0x01
|
||||
#define NES_LEFT 0x02
|
||||
#define NES_DOWN 0x04
|
||||
#define NES_UP 0x08
|
||||
#define NES_START 0x10
|
||||
#define NES_SELECT 0x20
|
||||
#define NES_B 0x40
|
||||
#define NES_A 0x80
|
||||
|
||||
|
||||
#define PULSE_TIME 25
|
||||
|
||||
// Data to store the pins for each controller
|
||||
|
||||
struct nesPinsStruct
|
||||
{
|
||||
unsigned int cPin, dPin, lPin ;
|
||||
} ;
|
||||
|
||||
static struct nesPinsStruct nesPins [MAX_NES_JOYSTICKS] ;
|
||||
|
||||
static int joysticks = 0 ;
|
||||
|
||||
|
||||
/*
|
||||
* setupNesJoystick:
|
||||
* Create a new NES joystick interface, program the pins, etc.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int setupNesJoystick (int dPin, int cPin, int lPin)
|
||||
{
|
||||
if (joysticks == MAX_NES_JOYSTICKS)
|
||||
return -1 ;
|
||||
|
||||
nesPins [joysticks].dPin = dPin ;
|
||||
nesPins [joysticks].cPin = cPin ;
|
||||
nesPins [joysticks].lPin = lPin ;
|
||||
|
||||
digitalWrite (lPin, LOW) ;
|
||||
digitalWrite (cPin, LOW) ;
|
||||
|
||||
pinMode (lPin, OUTPUT) ;
|
||||
pinMode (cPin, OUTPUT) ;
|
||||
pinMode (dPin, INPUT) ;
|
||||
|
||||
return joysticks++ ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* readNesJoystick:
|
||||
* Do a single scan of the NES Joystick.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
unsigned int readNesJoystick (int joystick)
|
||||
{
|
||||
unsigned int value = 0 ;
|
||||
int i ;
|
||||
|
||||
struct nesPinsStruct *pins = &nesPins [joystick] ;
|
||||
|
||||
// Toggle Latch - which presents the first bit
|
||||
|
||||
digitalWrite (pins->lPin, HIGH) ; delayMicroseconds (PULSE_TIME) ;
|
||||
digitalWrite (pins->lPin, LOW) ; delayMicroseconds (PULSE_TIME) ;
|
||||
|
||||
// Read first bit
|
||||
|
||||
value = digitalRead (pins->dPin) ;
|
||||
|
||||
// Now get the next 7 bits with the clock
|
||||
|
||||
for (i = 0 ; i < 7 ; ++i)
|
||||
{
|
||||
digitalWrite (pins->cPin, HIGH) ; delayMicroseconds (PULSE_TIME) ;
|
||||
digitalWrite (pins->cPin, LOW) ; delayMicroseconds (PULSE_TIME) ;
|
||||
value = (value << 1) | digitalRead (pins->dPin) ;
|
||||
}
|
||||
|
||||
return value ^ 0xFF ;
|
||||
}
|
45
devLib/piNes.h
Normal file
45
devLib/piNes.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* piNes.h:
|
||||
* Driver for the NES Joystick controller on the Raspberry Pi
|
||||
* Copyright (c) 2012 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#define MAX_NES_JOYSTICKS 8
|
||||
|
||||
#define NES_RIGHT 0x01
|
||||
#define NES_LEFT 0x02
|
||||
#define NES_DOWN 0x04
|
||||
#define NES_UP 0x08
|
||||
#define NES_START 0x10
|
||||
#define NES_SELECT 0x20
|
||||
#define NES_B 0x40
|
||||
#define NES_A 0x80
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int setupNesJoystick (int dPin, int cPin, int lPin) ;
|
||||
extern unsigned int readNesJoystick (int joystick) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
Reference in New Issue
Block a user