init
This commit is contained in:
		
						commit
						c185c20a79
					
				| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
# files and dirs for backup:
 | 
			
		||||
SAVEDIR=/salad/screenshots/
 | 
			
		||||
DATETIME=`date "+%Y-%m-%d-%H-%M-%S"`
 | 
			
		||||
ffmpeg -rtsp_transport tcp -i 'rtsp://ip.of.web.cam/user=admin&password=&channel=1&stream=0.sdp' -f image2 -vframes 1 -pix_fmt yuvj420p ${SAVEDIR}${DATETIME}.jpeg
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
# channel 1 off
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio36/value
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
# channel 1 on
 | 
			
		||||
echo 0 >/sys/class/gpio/gpio36/value
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
# channel 2 off
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio37/value
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
# channel 2 on
 | 
			
		||||
echo 0 >/sys/class/gpio/gpio37/value
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
HOUR=`date "+%H"`
 | 
			
		||||
CH1STATUS=`gpio read 21`
 | 
			
		||||
cd /salad
 | 
			
		||||
if [ "$HOUR" = "10" ] || [ "$HOUR" = "11" ] || [ "$HOUR" = "12" ] || [ "$HOUR" = "13" ]
 | 
			
		||||
then
 | 
			
		||||
    if [ "$CH1STATUS" = "0" ]; then
 | 
			
		||||
        echo $CH1STATUS
 | 
			
		||||
        sh ch1off.sh
 | 
			
		||||
        echo off
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
    if [ "$CH1STATUS" = "1" ]; then
 | 
			
		||||
        echo $CH1STATUS
 | 
			
		||||
        sh ch1on.sh
 | 
			
		||||
        echo on
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
sudo -u root sh /salad/checkled.sh
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
cd /salad
 | 
			
		||||
DATETIME=`date "+%Y-%m-%d-%H-%M"`
 | 
			
		||||
HUM=`dht22 -p 38 -s hum`
 | 
			
		||||
sleep 1
 | 
			
		||||
TEMP=`dht22 -p 38 -s temp`
 | 
			
		||||
echo "$DATETIME HUM = $HUM TEMP = $TEMP" >> SALAD_log.txt
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
dht22: *.c
 | 
			
		||||
		g++ -fpermissive -Wno-write-strings -o dht22 *.c
 | 
			
		||||
 | 
			
		||||
install: dht22
 | 
			
		||||
		sudo cp dht22 /usr/local/bin/
 | 
			
		||||
		sudo chown root /usr/local/bin/dht22
 | 
			
		||||
		sudo chmod u+s /usr/local/bin/dht22
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,57 @@
 | 
			
		|||
## DHT11/22 for Pine A64
 | 
			
		||||
 | 
			
		||||
This is simple C application that reads DHT11/22 sensor using one wire protocol.
 | 
			
		||||
 | 
			
		||||
### Compile
 | 
			
		||||
 | 
			
		||||
Compile directly on Pine A64.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
apt-get install build-essential
 | 
			
		||||
make
 | 
			
		||||
sudo make install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Use it
 | 
			
		||||
 | 
			
		||||
Find a PINE GPIO number: http://joey.hazlett.us/pine64/pine64_pins.html
 | 
			
		||||
 | 
			
		||||
Execute in terminal:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dht22 -p <pin-number> -d 1000
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
It will read DHT connected on <pin-number> value every 1000ms continuously.
 | 
			
		||||
 | 
			
		||||
### Read specific value
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
dht22 -p <pin-number> -s hum
 | 
			
		||||
dht22 -p <pin-number> -s temp
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Use with Home-Assistant
 | 
			
		||||
 | 
			
		||||
Add this to your configuration file:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
sensor:
 | 
			
		||||
- platform: command_line
 | 
			
		||||
  name: office_room
 | 
			
		||||
  unit_of_measurement: "°C"
 | 
			
		||||
  command: "dht22 -r 10 -s temp -p 71"
 | 
			
		||||
- platform: command_line
 | 
			
		||||
  name: office_room
 | 
			
		||||
  unit_of_measurement: "humidity"
 | 
			
		||||
  command: "dht22 -r 10 -s hum -p 71"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Dependencies
 | 
			
		||||
 | 
			
		||||
For controlling the GPIO's I used this RPi.GPIO-PineA64:
 | 
			
		||||
https://github.com/swkim01/RPi.GPIO-PineA64/blob/master/source/c_gpio.c
 | 
			
		||||
 | 
			
		||||
## Author
 | 
			
		||||
 | 
			
		||||
Kamil Trzciński, ayufan@ayufan.eu
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,439 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright (c) 2012-2015 Ben Croston
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
			
		||||
this software and associated documentation files (the "Software"), to deal in
 | 
			
		||||
the Software without restriction, including without limitation the rights to
 | 
			
		||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
			
		||||
of the Software, and to permit persons to whom the Software is furnished to do
 | 
			
		||||
so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <sys/mman.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "c_gpio.h"
 | 
			
		||||
 | 
			
		||||
#define BCM2708_PERI_BASE_DEFAULT   0x20000000
 | 
			
		||||
#define BCM2709_PERI_BASE_DEFAULT   0x3f000000
 | 
			
		||||
#define GPIO_BASE_OFFSET            0x200000
 | 
			
		||||
#define FSEL_OFFSET                 0   // 0x0000
 | 
			
		||||
#define SET_OFFSET                  7   // 0x001c / 4
 | 
			
		||||
#define CLR_OFFSET                  10  // 0x0028 / 4
 | 
			
		||||
#define PINLEVEL_OFFSET             13  // 0x0034 / 4
 | 
			
		||||
#define EVENT_DETECT_OFFSET         16  // 0x0040 / 4
 | 
			
		||||
#define RISING_ED_OFFSET            19  // 0x004c / 4
 | 
			
		||||
#define FALLING_ED_OFFSET           22  // 0x0058 / 4
 | 
			
		||||
#define HIGH_DETECT_OFFSET          25  // 0x0064 / 4
 | 
			
		||||
#define LOW_DETECT_OFFSET           28  // 0x0070 / 4
 | 
			
		||||
#define PULLUPDN_OFFSET             37  // 0x0094 / 4
 | 
			
		||||
#define PULLUPDNCLK_OFFSET          38  // 0x0098 / 4
 | 
			
		||||
 | 
			
		||||
#define PAGE_SIZE  (4*1024)
 | 
			
		||||
#define BLOCK_SIZE (4*1024)
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// For Pine A64/A64+ Board
 | 
			
		||||
//
 | 
			
		||||
#define PINEA64_GPIO_MASK	(0xFFFFFF80)
 | 
			
		||||
#define SUNXI_GPIO_BASE		0x01C20000
 | 
			
		||||
#define SUNXI_GPIO_REG_OFFSET   0x800
 | 
			
		||||
#define PINEA64_GPIO_BASE	(SUNXI_GPIO_BASE + SUNXI_GPIO_REG_OFFSET)
 | 
			
		||||
#define SUNXI_CFG_OFFSET	0x00
 | 
			
		||||
#define SUNXI_DATA_OFFSET	0x10
 | 
			
		||||
#define SUNXI_PUD_OFFSET	0x1C
 | 
			
		||||
#define SUNXI_BANK_SIZE		0x24
 | 
			
		||||
 | 
			
		||||
#define MAP_SIZE        (4096*2)
 | 
			
		||||
#define MAP_MASK        (MAP_SIZE - 1)
 | 
			
		||||
 | 
			
		||||
typedef struct sunxi_gpio {
 | 
			
		||||
    unsigned int CFG[4];
 | 
			
		||||
    unsigned int DAT;
 | 
			
		||||
    unsigned int DRV[2];
 | 
			
		||||
    unsigned int PULL[2];
 | 
			
		||||
} sunxi_gpio_t;
 | 
			
		||||
 | 
			
		||||
/* gpio interrupt control */
 | 
			
		||||
typedef struct sunxi_gpio_int {
 | 
			
		||||
    unsigned int CFG[3];
 | 
			
		||||
    unsigned int CTL;
 | 
			
		||||
    unsigned int STA;
 | 
			
		||||
    unsigned int DEB;
 | 
			
		||||
} sunxi_gpio_int_t;
 | 
			
		||||
 | 
			
		||||
typedef struct sunxi_gpio_reg {
 | 
			
		||||
    struct sunxi_gpio gpio_bank[9];
 | 
			
		||||
    unsigned char res[0xbc];
 | 
			
		||||
    struct sunxi_gpio_int gpio_int;
 | 
			
		||||
} sunxi_gpio_reg_t;
 | 
			
		||||
 | 
			
		||||
#define GPIO_BANK(pin)  ((pin) >> 5)
 | 
			
		||||
#define GPIO_NUM(pin)   ((pin) & 0x1F)
 | 
			
		||||
 | 
			
		||||
#define GPIO_CFG_INDEX(pin)     (((pin) & 0x1F) >> 3)
 | 
			
		||||
#define GPIO_CFG_OFFSET(pin)    ((((pin) & 0x1F) & 0x7) << 2)
 | 
			
		||||
 | 
			
		||||
#define GPIO_PUL_INDEX(pin)     (((pin) & 0x1F )>> 4)
 | 
			
		||||
#define GPIO_PUL_OFFSET(pin)    (((pin) & 0x0F) << 1)
 | 
			
		||||
 | 
			
		||||
int pinea64_found = 1;
 | 
			
		||||
 | 
			
		||||
static volatile uint32_t *pio_map;
 | 
			
		||||
// end of Pine A64/A64+
 | 
			
		||||
 | 
			
		||||
static volatile uint32_t *gpio_map;
 | 
			
		||||
 | 
			
		||||
void short_wait(void)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i=0; i<150; i++) {    // wait 150 cycles
 | 
			
		||||
        asm volatile("nop");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int setup(void)
 | 
			
		||||
{
 | 
			
		||||
    int mem_fd;
 | 
			
		||||
    uint8_t *gpio_mem;
 | 
			
		||||
    uint32_t peri_base;
 | 
			
		||||
    uint32_t gpio_base;
 | 
			
		||||
    unsigned char buf[4];
 | 
			
		||||
    FILE *fp;
 | 
			
		||||
    char buffer[1024];
 | 
			
		||||
    char hardware[1024];
 | 
			
		||||
    int found = 0;
 | 
			
		||||
 | 
			
		||||
pinea64_found = 1;
 | 
			
		||||
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    // try /dev/gpiomem first - this does not require root privs
 | 
			
		||||
    if ((mem_fd = open("/dev/gpiomem", O_RDWR|O_SYNC)) > 0)
 | 
			
		||||
    {
 | 
			
		||||
        gpio_map = (uint32_t *)mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0);
 | 
			
		||||
        if ((uint32_t)gpio_map < 0) {
 | 
			
		||||
            return SETUP_MMAP_FAIL;
 | 
			
		||||
        } else {
 | 
			
		||||
            return SETUP_OK;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // revert to /dev/mem method - requires root
 | 
			
		||||
 | 
			
		||||
    // determine peri_base
 | 
			
		||||
    if ((fp = fopen("/proc/device-tree/soc/ranges", "rb")) != NULL) {
 | 
			
		||||
        // get peri base from device tree
 | 
			
		||||
        fseek(fp, 4, SEEK_SET);
 | 
			
		||||
        if (fread(buf, 1, sizeof buf, fp) == sizeof buf) {
 | 
			
		||||
            peri_base = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3] << 0;
 | 
			
		||||
        }
 | 
			
		||||
        fclose(fp);
 | 
			
		||||
    } else {
 | 
			
		||||
        // guess peri base based on /proc/cpuinfo hardware field
 | 
			
		||||
        if ((fp = fopen("/proc/cpuinfo", "r")) == NULL)
 | 
			
		||||
            return SETUP_CPUINFO_FAIL;
 | 
			
		||||
 | 
			
		||||
        while(!feof(fp) && !found) {
 | 
			
		||||
            fgets(buffer, sizeof(buffer), fp);
 | 
			
		||||
            sscanf(buffer, "Hardware	: %s", hardware);
 | 
			
		||||
            if (strcmp(hardware, "BCM2708") == 0 || strcmp(hardware, "BCM2835") == 0) {
 | 
			
		||||
                // pi 1 hardware
 | 
			
		||||
                peri_base = BCM2708_PERI_BASE_DEFAULT;
 | 
			
		||||
                found = 1;
 | 
			
		||||
            } else if (strcmp(hardware, "BCM2709") == 0 || strcmp(hardware, "BCM2836") == 0) {
 | 
			
		||||
                // pi 2 hardware
 | 
			
		||||
                peri_base = BCM2709_PERI_BASE_DEFAULT;
 | 
			
		||||
                found = 1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        fclose(fp);
 | 
			
		||||
        if (!found)
 | 
			
		||||
            return SETUP_NOT_RPI_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gpio_base = peri_base + GPIO_BASE_OFFSET;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    // mmap the GPIO memory registers
 | 
			
		||||
    if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0)
 | 
			
		||||
        return SETUP_DEVMEM_FAIL;
 | 
			
		||||
 | 
			
		||||
    if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL)
 | 
			
		||||
        return SETUP_MALLOC_FAIL;
 | 
			
		||||
 | 
			
		||||
    if ((uint32_t)gpio_mem % PAGE_SIZE)
 | 
			
		||||
        gpio_mem += PAGE_SIZE - ((uint32_t)gpio_mem % PAGE_SIZE);
 | 
			
		||||
 | 
			
		||||
  if ( pinea64_found )  {
 | 
			
		||||
    gpio_map = (uint32_t *)mmap( (caddr_t)gpio_mem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd, SUNXI_GPIO_BASE);
 | 
			
		||||
    pio_map = gpio_map + (SUNXI_GPIO_REG_OFFSET>>2);
 | 
			
		||||
  } else {
 | 
			
		||||
    gpio_map = (uint32_t *)mmap( (void *)gpio_mem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd, gpio_base);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    if ((uint32_t)gpio_map < 0)
 | 
			
		||||
        return SETUP_MMAP_FAIL;
 | 
			
		||||
 | 
			
		||||
    return SETUP_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void clear_event_detect(int gpio)
 | 
			
		||||
{
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    int offset = EVENT_DETECT_OFFSET + (gpio/32);
 | 
			
		||||
    int shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    *(gpio_map+offset) |= (1 << shift);
 | 
			
		||||
    short_wait();
 | 
			
		||||
    *(gpio_map+offset) = 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int eventdetected(int gpio)
 | 
			
		||||
{
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    int offset, value, bit;
 | 
			
		||||
 | 
			
		||||
    offset = EVENT_DETECT_OFFSET + (gpio/32);
 | 
			
		||||
    bit = (1 << (gpio%32));
 | 
			
		||||
    value = *(gpio_map+offset) & bit;
 | 
			
		||||
    if (value)
 | 
			
		||||
        clear_event_detect(gpio);
 | 
			
		||||
    return value;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_rising_event(int gpio, int enable)
 | 
			
		||||
{
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    int offset = RISING_ED_OFFSET + (gpio/32);
 | 
			
		||||
    int shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    if (enable)
 | 
			
		||||
        *(gpio_map+offset) |= 1 << shift;
 | 
			
		||||
    else
 | 
			
		||||
        *(gpio_map+offset) &= ~(1 << shift);
 | 
			
		||||
    clear_event_detect(gpio);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_falling_event(int gpio, int enable)
 | 
			
		||||
{
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    int offset = FALLING_ED_OFFSET + (gpio/32);
 | 
			
		||||
    int shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    if (enable) {
 | 
			
		||||
        *(gpio_map+offset) |= (1 << shift);
 | 
			
		||||
        *(gpio_map+offset) = (1 << shift);
 | 
			
		||||
    } else {
 | 
			
		||||
        *(gpio_map+offset) &= ~(1 << shift);
 | 
			
		||||
    }
 | 
			
		||||
    clear_event_detect(gpio);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_high_event(int gpio, int enable)
 | 
			
		||||
{
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    int offset = HIGH_DETECT_OFFSET + (gpio/32);
 | 
			
		||||
    int shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    if (enable)
 | 
			
		||||
        *(gpio_map+offset) |= (1 << shift);
 | 
			
		||||
    else
 | 
			
		||||
        *(gpio_map+offset) &= ~(1 << shift);
 | 
			
		||||
    clear_event_detect(gpio);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_low_event(int gpio, int enable)
 | 
			
		||||
{
 | 
			
		||||
  if ( !pinea64_found )  {
 | 
			
		||||
    int offset = LOW_DETECT_OFFSET + (gpio/32);
 | 
			
		||||
    int shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    if (enable)
 | 
			
		||||
        *(gpio_map+offset) |= 1 << shift;
 | 
			
		||||
    else
 | 
			
		||||
        *(gpio_map+offset) &= ~(1 << shift);
 | 
			
		||||
    clear_event_detect(gpio);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t sunxi_readl(volatile uint32_t *addr)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t val = 0;
 | 
			
		||||
    uint32_t mmap_base = (uint32_t)addr & (~MAP_MASK);
 | 
			
		||||
    uint32_t mmap_seek = ((uint32_t)addr - mmap_base) >> 2;
 | 
			
		||||
    val = *(gpio_map + mmap_seek);
 | 
			
		||||
    return val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sunxi_writel(volatile uint32_t *addr, uint32_t val)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mmap_base = (uint32_t)addr & (~MAP_MASK);
 | 
			
		||||
    uint32_t mmap_seek =( (uint32_t)addr - mmap_base) >> 2;
 | 
			
		||||
    *(gpio_map + mmap_seek) = val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_pullupdn(int gpio, int pud)
 | 
			
		||||
{
 | 
			
		||||
  if ( pinea64_found )  {
 | 
			
		||||
    uint32_t regval = 0;
 | 
			
		||||
    int bank = GPIO_BANK(gpio); //gpio >> 5
 | 
			
		||||
    int index = GPIO_PUL_INDEX(gpio); // (gpio & 0x1f) >> 4
 | 
			
		||||
    int offset = GPIO_PUL_OFFSET(gpio); // (gpio) & 0x0F) << 1
 | 
			
		||||
 | 
			
		||||
    sunxi_gpio_t *pio = &((sunxi_gpio_reg_t *) pio_map)->gpio_bank[bank];
 | 
			
		||||
 | 
			
		||||
    regval = *(&pio->PULL[0] + index);
 | 
			
		||||
    regval &= ~(3 << offset);
 | 
			
		||||
    regval |= pud << offset;
 | 
			
		||||
    *(&pio->PULL[0] + index) = regval;
 | 
			
		||||
  } else {
 | 
			
		||||
    int clk_offset = PULLUPDNCLK_OFFSET + (gpio/32);
 | 
			
		||||
    int shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    if (pud == PUD_DOWN)
 | 
			
		||||
        *(gpio_map+PULLUPDN_OFFSET) = (*(gpio_map+PULLUPDN_OFFSET) & ~3) | PUD_DOWN;
 | 
			
		||||
    else if (pud == PUD_UP)
 | 
			
		||||
        *(gpio_map+PULLUPDN_OFFSET) = (*(gpio_map+PULLUPDN_OFFSET) & ~3) | PUD_UP;
 | 
			
		||||
    else  // pud == PUD_OFF
 | 
			
		||||
        *(gpio_map+PULLUPDN_OFFSET) &= ~3;
 | 
			
		||||
 | 
			
		||||
    short_wait();
 | 
			
		||||
    *(gpio_map+clk_offset) = 1 << shift;
 | 
			
		||||
    short_wait();
 | 
			
		||||
    *(gpio_map+PULLUPDN_OFFSET) &= ~3;
 | 
			
		||||
    *(gpio_map+clk_offset) = 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void setup_gpio(int gpio, int direction, int pud)
 | 
			
		||||
{
 | 
			
		||||
  if ( pinea64_found )  {
 | 
			
		||||
    uint32_t regval = 0;
 | 
			
		||||
    int bank = GPIO_BANK(gpio); //gpio >> 5
 | 
			
		||||
    int index = GPIO_CFG_INDEX(gpio); // (gpio & 0x1F) >> 3
 | 
			
		||||
    int offset = GPIO_CFG_OFFSET(gpio); // ((gpio & 0x1F) & 0x7) << 2
 | 
			
		||||
 | 
			
		||||
    sunxi_gpio_t *pio = &((sunxi_gpio_reg_t *) pio_map)->gpio_bank[bank];
 | 
			
		||||
 | 
			
		||||
    set_pullupdn(gpio, pud);
 | 
			
		||||
 | 
			
		||||
    regval = *(&pio->CFG[0] + index);
 | 
			
		||||
    regval &= ~(0x7 << offset); // 0xf?
 | 
			
		||||
    if (INPUT == direction) {
 | 
			
		||||
        *(&pio->CFG[0] + index) = regval;
 | 
			
		||||
    } else if (OUTPUT == direction) {
 | 
			
		||||
        regval |=  (1 << offset);
 | 
			
		||||
        *(&pio->CFG[0] + index) = regval;
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("line:%dgpio number error\n",__LINE__);
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    int offset = FSEL_OFFSET + (gpio/10);
 | 
			
		||||
    int shift = (gpio%10)*3;
 | 
			
		||||
 | 
			
		||||
    set_pullupdn(gpio, pud);
 | 
			
		||||
    if (direction == OUTPUT)
 | 
			
		||||
        *(gpio_map+offset) = (*(gpio_map+offset) & ~(7<<shift)) | (1<<shift);
 | 
			
		||||
    else  // direction == INPUT
 | 
			
		||||
        *(gpio_map+offset) = (*(gpio_map+offset) & ~(7<<shift));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Contribution by Eric Ptak <trouch@trouch.com>
 | 
			
		||||
int gpio_function(int gpio)
 | 
			
		||||
{
 | 
			
		||||
  if ( pinea64_found )  {
 | 
			
		||||
    uint32_t regval = 0;
 | 
			
		||||
    int bank = GPIO_BANK(gpio); //gpio >> 5
 | 
			
		||||
    int index = GPIO_CFG_INDEX(gpio); // (gpio & 0x1F) >> 3
 | 
			
		||||
    int offset = GPIO_CFG_OFFSET(gpio); // ((gpio & 0x1F) & 0x7) << 2
 | 
			
		||||
 | 
			
		||||
    sunxi_gpio_t *pio = &((sunxi_gpio_reg_t *) pio_map)->gpio_bank[bank];
 | 
			
		||||
 | 
			
		||||
    regval = *(&pio->CFG[0] + index);
 | 
			
		||||
    regval >>= offset;
 | 
			
		||||
    regval &= 7;
 | 
			
		||||
    return regval; // 0=input, 1=output, 4=alt0
 | 
			
		||||
  } else {
 | 
			
		||||
    int offset = FSEL_OFFSET + (gpio/10);
 | 
			
		||||
    int shift = (gpio%10)*3;
 | 
			
		||||
    int value = *(gpio_map+offset);
 | 
			
		||||
    value >>= shift;
 | 
			
		||||
    value &= 7;
 | 
			
		||||
    return value; // 0=input, 1=output, 4=alt0
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void output_gpio(int gpio, int value)
 | 
			
		||||
{
 | 
			
		||||
  if ( pinea64_found )  {
 | 
			
		||||
    int bank = GPIO_BANK(gpio); //gpio >> 5
 | 
			
		||||
    int num = GPIO_NUM(gpio); // gpio & 0x1F
 | 
			
		||||
 | 
			
		||||
    sunxi_gpio_t *pio = &((sunxi_gpio_reg_t *) pio_map)->gpio_bank[bank];
 | 
			
		||||
 | 
			
		||||
    if (value == 0)
 | 
			
		||||
        *(&pio->DAT) &= ~(1 << num);
 | 
			
		||||
    else
 | 
			
		||||
        *(&pio->DAT) |= (1 << num);
 | 
			
		||||
  } else {
 | 
			
		||||
    int offset, shift;
 | 
			
		||||
 | 
			
		||||
    if (value) // value == HIGH
 | 
			
		||||
        offset = SET_OFFSET + (gpio/32);
 | 
			
		||||
    else       // value == LOW
 | 
			
		||||
       offset = CLR_OFFSET + (gpio/32);
 | 
			
		||||
 | 
			
		||||
    shift = (gpio%32);
 | 
			
		||||
 | 
			
		||||
    *(gpio_map+offset) = 1 << shift;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int input_gpio(int gpio)
 | 
			
		||||
{
 | 
			
		||||
  if ( pinea64_found )  {
 | 
			
		||||
    uint32_t regval = 0;
 | 
			
		||||
    int bank = GPIO_BANK(gpio); //gpio >> 5
 | 
			
		||||
    int num = GPIO_NUM(gpio); // gpio & 0x1F
 | 
			
		||||
 | 
			
		||||
    sunxi_gpio_t *pio = &((sunxi_gpio_reg_t *) pio_map)->gpio_bank[bank];
 | 
			
		||||
 | 
			
		||||
    regval = *(&pio->DAT);
 | 
			
		||||
    regval = regval >> num;
 | 
			
		||||
    regval &= 1;
 | 
			
		||||
    return regval;
 | 
			
		||||
  } else {
 | 
			
		||||
   int offset, value, mask;
 | 
			
		||||
 | 
			
		||||
   offset = PINLEVEL_OFFSET + (gpio/32);
 | 
			
		||||
   mask = (1 << gpio%32);
 | 
			
		||||
   value = *(gpio_map+offset) & mask;
 | 
			
		||||
   return value;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cleanup(void)
 | 
			
		||||
{
 | 
			
		||||
    munmap((void *)gpio_map, BLOCK_SIZE);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright (c) 2012-2015 Ben Croston
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
			
		||||
this software and associated documentation files (the "Software"), to deal in
 | 
			
		||||
the Software without restriction, including without limitation the rights to
 | 
			
		||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
			
		||||
of the Software, and to permit persons to whom the Software is furnished to do
 | 
			
		||||
so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int setup(void);
 | 
			
		||||
void setup_gpio(int gpio, int direction, int pud);
 | 
			
		||||
int gpio_function(int gpio);
 | 
			
		||||
void output_gpio(int gpio, int value);
 | 
			
		||||
int input_gpio(int gpio);
 | 
			
		||||
void set_rising_event(int gpio, int enable);
 | 
			
		||||
void set_falling_event(int gpio, int enable);
 | 
			
		||||
void set_high_event(int gpio, int enable);
 | 
			
		||||
void set_low_event(int gpio, int enable);
 | 
			
		||||
int eventdetected(int gpio);
 | 
			
		||||
void cleanup(void);
 | 
			
		||||
 | 
			
		||||
#define SETUP_OK           0
 | 
			
		||||
#define SETUP_DEVMEM_FAIL  1
 | 
			
		||||
#define SETUP_MALLOC_FAIL  2
 | 
			
		||||
#define SETUP_MMAP_FAIL    3
 | 
			
		||||
#define SETUP_CPUINFO_FAIL 4
 | 
			
		||||
#define SETUP_NOT_RPI_FAIL 5
 | 
			
		||||
 | 
			
		||||
#define INPUT  1 // is really 0 for control register!
 | 
			
		||||
#define OUTPUT 0 // is really 1 for control register!
 | 
			
		||||
#define ALT0   4
 | 
			
		||||
 | 
			
		||||
#define HIGH 1
 | 
			
		||||
#define LOW  0
 | 
			
		||||
 | 
			
		||||
#define PUD_OFF  0
 | 
			
		||||
#define PUD_UP   1
 | 
			
		||||
#define PUD_DOWN 2
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,190 @@
 | 
			
		|||
#include "wiringPi.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <sys/resource.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#define MAX_TIMINGS	  86
 | 
			
		||||
 | 
			
		||||
int DHT_PIN = 0;
 | 
			
		||||
 | 
			
		||||
int read_dht_data(float *h, float *t)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t j = 0, i;
 | 
			
		||||
  int data[5] = { 0, 0, 0, 0, 0 };
 | 
			
		||||
 | 
			
		||||
  pinMode(DHT_PIN, OUTPUT);
 | 
			
		||||
  digitalWrite(DHT_PIN, LOW);
 | 
			
		||||
  delay(18);
 | 
			
		||||
  digitalWrite(DHT_PIN, HIGH);
 | 
			
		||||
  delayMicroseconds(10);
 | 
			
		||||
 | 
			
		||||
  pinMode(DHT_PIN, INPUT);
 | 
			
		||||
 | 
			
		||||
  uint8_t laststate	= HIGH;
 | 
			
		||||
  unsigned int lasttime = micros();
 | 
			
		||||
 | 
			
		||||
  for(i = 0; i < MAX_TIMINGS; i++) {
 | 
			
		||||
    int state;
 | 
			
		||||
    unsigned int current;
 | 
			
		||||
 | 
			
		||||
    while (true) {
 | 
			
		||||
      state = digitalRead(DHT_PIN);
 | 
			
		||||
      current = micros();
 | 
			
		||||
      if (current - lasttime > 200) {
 | 
			
		||||
        goto finish;
 | 
			
		||||
      }
 | 
			
		||||
      if (laststate != state) {
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* ignore first 3 transitions */
 | 
			
		||||
    if ((i >= 4) && (i % 2 == 0)) {
 | 
			
		||||
      /* shove each bit into the storage bytes */
 | 
			
		||||
      data[j / 8] <<= 1;
 | 
			
		||||
      if ((current - lasttime) > 60)
 | 
			
		||||
      data[j / 8] |= 1;
 | 
			
		||||
      j++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    laststate = state;
 | 
			
		||||
    lasttime = current;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  finish:
 | 
			
		||||
 | 
			
		||||
  if (j < 40) {
 | 
			
		||||
    fprintf(stderr, "Not enough bits: %d\n", j);
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (data[4] != ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
 | 
			
		||||
    fprintf(stderr, "Invalid CRC\n");
 | 
			
		||||
    return -2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (h) {
 | 
			
		||||
    *h = (float)((data[0] << 8) + data[1]) / 10;
 | 
			
		||||
    if (*h > 100) {
 | 
			
		||||
      *h = data[0];	// for DHT11
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (t) {
 | 
			
		||||
    *t = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
 | 
			
		||||
    if (*t > 125) {
 | 
			
		||||
      *t = data[2];	// for DHT11
 | 
			
		||||
    }
 | 
			
		||||
    if (data[2] & 0x80)	{
 | 
			
		||||
      *t = -*t;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void setprio() {
 | 
			
		||||
  id_t pid = getpid();
 | 
			
		||||
  int ret = setpriority(PRIO_PROCESS, pid, 10000);
 | 
			
		||||
  if (ret < 0) {
 | 
			
		||||
    fprintf(stderr, "Failed to set prio: %d\n", errno);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void usage(const char *cmd) {
 | 
			
		||||
  fprintf(stderr, "Usage: %s [-d <delaymsec>] [-r <retry>] [-p <pin>] [-s all|hum|temp]\n", cmd);
 | 
			
		||||
  exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  int delaymsec = 0;
 | 
			
		||||
  int retry = 2;
 | 
			
		||||
  int whattoshow = 0;
 | 
			
		||||
 | 
			
		||||
  while (true) {
 | 
			
		||||
    switch (getopt(argc, argv, "d:r:p:s:")) {
 | 
			
		||||
      case -1:
 | 
			
		||||
      goto done;
 | 
			
		||||
 | 
			
		||||
      case 'd':
 | 
			
		||||
      delaymsec = atoi(optarg);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
      case 'r':
 | 
			
		||||
      retry = atoi(optarg);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
      case 'p':
 | 
			
		||||
      DHT_PIN = atoi(optarg);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
      case 's':
 | 
			
		||||
      if (!strcmp(optarg, "all")) {
 | 
			
		||||
        whattoshow = 0;
 | 
			
		||||
      } else if (!strcmp(optarg, "hum")) {
 | 
			
		||||
        whattoshow = 1;
 | 
			
		||||
      } else if (!strcmp(optarg, "temp")) {
 | 
			
		||||
        whattoshow = 2;
 | 
			
		||||
      } else {
 | 
			
		||||
        usage(argv[0]);
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
      default: /* '?' */
 | 
			
		||||
      usage(argv[0]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  done:
 | 
			
		||||
 | 
			
		||||
  if (DHT_PIN <= 0) {
 | 
			
		||||
    fprintf(stderr, "Missing DHT PIN. Go to: http://joey.hazlett.us/pine64/pine64_pins.html\n");
 | 
			
		||||
    usage(argv[0]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (wiringPiSetup()) {
 | 
			
		||||
    fprintf(stderr, "Failed to configure GPIO\n");
 | 
			
		||||
    usage(argv[0]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setprio();
 | 
			
		||||
 | 
			
		||||
  while (1) {
 | 
			
		||||
    float h = 0, c = 0;
 | 
			
		||||
 | 
			
		||||
    for(int i = 0; i <= retry; ++i) {
 | 
			
		||||
      if(read_dht_data(&h, &c) == 0) {
 | 
			
		||||
        switch(whattoshow) {
 | 
			
		||||
          case 0:
 | 
			
		||||
          printf("Humidity: %.1f %%\n", h);
 | 
			
		||||
          printf("Temperature: %.1f *C\n", c);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
          case 1:
 | 
			
		||||
          printf("%.1f\n", h);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
          case 2:
 | 
			
		||||
          printf("%.1f\n", c);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(delaymsec > 0) {
 | 
			
		||||
      delay(delaymsec);
 | 
			
		||||
    } else {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return(0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import string
 | 
			
		||||
 | 
			
		||||
def convert(value):
 | 
			
		||||
	value = value.upper()
 | 
			
		||||
	alp = value[1]
 | 
			
		||||
	idx = string.ascii_uppercase.index(alp)
 | 
			
		||||
	num = int(value[2:], 10)
 | 
			
		||||
	res = idx * 32 + num
 | 
			
		||||
	return res
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
	args = sys.argv[1:]
 | 
			
		||||
	if not args:
 | 
			
		||||
		print("Usage: %s <pin>" % sys.argv[0])
 | 
			
		||||
		sys.exit(1)
 | 
			
		||||
 | 
			
		||||
	print("%d" % convert(args[0]))
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,103 @@
 | 
			
		|||
// License MIT
 | 
			
		||||
// Compatibility layer done by Kamil Trzcinski <ayufan@ayufan.eu>
 | 
			
		||||
 | 
			
		||||
#include "wiringPi.h"
 | 
			
		||||
 | 
			
		||||
static uint64_t epochMilli, epochMicro;
 | 
			
		||||
 | 
			
		||||
int wiringPiSetup()
 | 
			
		||||
{
 | 
			
		||||
  initialiseEpoch();
 | 
			
		||||
  return setup();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int digitalRead(int gpio)
 | 
			
		||||
{
 | 
			
		||||
  return input_gpio(gpio);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void digitalWrite(int gpio, int value)
 | 
			
		||||
{
 | 
			
		||||
  output_gpio(gpio, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pinMode(int gpio, int direction)
 | 
			
		||||
{
 | 
			
		||||
  setup_gpio(gpio, direction, PUD_UP);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// The functions belowe are copied from wiringPi
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
void initialiseEpoch (void)
 | 
			
		||||
{
 | 
			
		||||
  struct timeval tv ;
 | 
			
		||||
 | 
			
		||||
  gettimeofday (&tv, NULL) ;
 | 
			
		||||
  epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000    + (uint64_t)(tv.tv_usec / 1000) ;
 | 
			
		||||
  epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void delayMicrosecondsHard (unsigned int howLong)
 | 
			
		||||
{
 | 
			
		||||
  struct timeval tNow, tLong, tEnd ;
 | 
			
		||||
 | 
			
		||||
  gettimeofday (&tNow, NULL) ;
 | 
			
		||||
  tLong.tv_sec  = howLong / 1000000 ;
 | 
			
		||||
  tLong.tv_usec = howLong % 1000000 ;
 | 
			
		||||
  timeradd (&tNow, &tLong, &tEnd) ;
 | 
			
		||||
 | 
			
		||||
  while (timercmp (&tNow, &tEnd, <))
 | 
			
		||||
    gettimeofday (&tNow, NULL) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void delayMicroseconds (unsigned int howLong)
 | 
			
		||||
{
 | 
			
		||||
  struct timespec sleeper ;
 | 
			
		||||
  unsigned int uSecs = howLong % 1000000 ;
 | 
			
		||||
  unsigned int wSecs = howLong / 1000000 ;
 | 
			
		||||
 | 
			
		||||
  /**/ if (howLong ==   0)
 | 
			
		||||
    return ;
 | 
			
		||||
  else if (howLong  < 100)
 | 
			
		||||
    delayMicrosecondsHard (howLong) ;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    sleeper.tv_sec  = wSecs ;
 | 
			
		||||
    sleeper.tv_nsec = (long)(uSecs * 1000L) ;
 | 
			
		||||
    nanosleep (&sleeper, NULL) ;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void delay (unsigned int howLong)
 | 
			
		||||
{
 | 
			
		||||
  struct timespec sleeper, dummy ;
 | 
			
		||||
 | 
			
		||||
  sleeper.tv_sec  = (time_t)(howLong / 1000) ;
 | 
			
		||||
  sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ;
 | 
			
		||||
 | 
			
		||||
  nanosleep (&sleeper, &dummy) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int millis (void)
 | 
			
		||||
{
 | 
			
		||||
  struct timeval tv ;
 | 
			
		||||
  uint64_t now ;
 | 
			
		||||
 | 
			
		||||
  gettimeofday (&tv, NULL) ;
 | 
			
		||||
  now  = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ;
 | 
			
		||||
 | 
			
		||||
  return (uint32_t)(now - epochMilli) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int micros (void)
 | 
			
		||||
{
 | 
			
		||||
  struct timeval tv ;
 | 
			
		||||
  uint64_t now ;
 | 
			
		||||
 | 
			
		||||
  gettimeofday (&tv, NULL) ;
 | 
			
		||||
  now  = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ;
 | 
			
		||||
 | 
			
		||||
  return (uint32_t)(now - epochMicro) ;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
// License MIT
 | 
			
		||||
// Compatibility layer done by Kamil Trzcinski <ayufan@ayufan.eu>
 | 
			
		||||
 | 
			
		||||
#include "c_gpio.h"
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
int wiringPiSetup();
 | 
			
		||||
int digitalRead(int gpio);
 | 
			
		||||
void digitalWrite(int gpio, int value);
 | 
			
		||||
void pinMode(int gpio, int direction);
 | 
			
		||||
void initialiseEpoch (void);
 | 
			
		||||
void delayMicrosecondsHard (unsigned int howLong);
 | 
			
		||||
void delayMicroseconds (unsigned int howLong);
 | 
			
		||||
void delay (unsigned int howLong);
 | 
			
		||||
unsigned int millis (void);
 | 
			
		||||
unsigned int micros (void);
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
#! /bin/sh
 | 
			
		||||
 | 
			
		||||
ntpdate -q 0.rhel.pool.ntp.org
 | 
			
		||||
 | 
			
		||||
echo 361 >/sys/class/gpio/export
 | 
			
		||||
echo out >/sys/class/gpio/gpio361/direction
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio361/value
 | 
			
		||||
 | 
			
		||||
echo 68 >/sys/class/gpio/export
 | 
			
		||||
echo out >/sys/class/gpio/gpio68/direction
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio68/value
 | 
			
		||||
 | 
			
		||||
echo 36 >/sys/class/gpio/export
 | 
			
		||||
echo out >/sys/class/gpio/gpio36/direction
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio36/value
 | 
			
		||||
 | 
			
		||||
echo 37 >/sys/class/gpio/export
 | 
			
		||||
echo out >/sys/class/gpio/gpio37/direction
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio37/value
 | 
			
		||||
 | 
			
		||||
echo 39 >/sys/class/gpio/export
 | 
			
		||||
echo out >/sys/class/gpio/gpio39/direction
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio39/value
 | 
			
		||||
 | 
			
		||||
echo 101 >/sys/class/gpio/export
 | 
			
		||||
echo out >/sys/class/gpio/gpio101/direction
 | 
			
		||||
echo 1 >/sys/class/gpio/gpio101/value
 | 
			
		||||
 | 
			
		||||
echo 38 >/sys/class/gpio/export
 | 
			
		||||
echo in >/sys/class/gpio/gpio38/direction
 | 
			
		||||
 | 
			
		||||
sleep 120
 | 
			
		||||
ntpdate -q 0.rhel.pool.ntp.org
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
# 10-15sec for photo
 | 
			
		||||
SAVEDIR=/salad/screenshots/
 | 
			
		||||
DATETIME=`date "+%Y-%m-%d-%H-%M-%S"`
 | 
			
		||||
CH1STATUS=`gpio read 21`
 | 
			
		||||
cd /salad
 | 
			
		||||
./ch2on.sh
 | 
			
		||||
sleep 0.5
 | 
			
		||||
./ch1off.sh
 | 
			
		||||
sleep 9
 | 
			
		||||
ffmpeg -rtsp_transport tcp -i 'rtsp://ip.of.web.cam/user=admin&password=&channel=1&stream=0.sdp' -f image2 -vframes 1 -pix_fmt yuvj420p ${SAVEDIR}${DATETIME}.jpeg
 | 
			
		||||
if [ "$CH1STATUS" = 0 ]
 | 
			
		||||
then
 | 
			
		||||
    ./ch1on.sh
 | 
			
		||||
fi
 | 
			
		||||
sleep 0.1
 | 
			
		||||
./ch2off.sh
 | 
			
		||||
		Loading…
	
		Reference in New Issue