Import of the real code

This commit is contained in:
Jonas Widen 2020-04-25 19:55:38 +02:00
parent 35c61ace5e
commit 6f70008a42
6 changed files with 446 additions and 1 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
build
nexa

View File

@ -1,4 +1,4 @@
Copyright (c) <year> <owner>. All rights reserved.
Copyright (c) 2012, Jonas Widén (jonas.widen@widens.eu). All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

34
Makefile Normal file
View File

@ -0,0 +1,34 @@
BUILD_DIR = build
CFLAGS += -std=gnu99 -W -Wall -pedantic
CFLAGS += -Wstrict-prototypes -Wundef -Werror
CFLAGS += -ffunction-sections
CFLAGS += -Os -g
CFLAGS += -DNEXA_PIN=29
LDFLAGS += -lwiringPi
srcs += main.c
srcs += nexa_new.c
objs = $(srcs:%.c=${BUILD_DIR}/%.o)
target = nexa
${BUILD_DIR}/%.o: %.c
@echo "[CC] $< -> $@"
@$(CC) -c $(CFLAGS) -o $@ $<
$(target): $(BUILD_DIR) $(objs)
@echo "[LINK] $@"
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(objs)
${BUILD_DIR}:
@mkdir -p $@
clean:
@rm -rf $(objs) $(asm_objs) $(target) $(target.elf) ${BUILD_DIR}
.PHONY: clean
-include $(srcs:%.c=%.d)

66
main.c Normal file
View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2012, Jonas Widén (jonas.widen@gmail.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "nexa_new.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int opt;
uint8_t channel = 0;
uint8_t button = 0;
nexa_activation_t status = NEXA_ACTIVATION_ON;
while ((opt = getopt(argc, argv, "c:b:s:")) != -1) {
switch (opt) {
case 'c':
channel = atoi(optarg);
break;
case 'b':
button = atoi(optarg);
break;
case 's':
status = atoi(optarg) ? NEXA_ACTIVATION_ON : NEXA_ACTIVATION_OFF;
break;
default: /* '?' */
fprintf(stderr, "Usage: %s [-c channel] [-b button] [-s status]\n",
argv[0]);
exit(EXIT_FAILURE);
}
}
nexa_new_init();
nexa_new_transmit(channel,
button,
status,
NEXA_DIM_LEVEL_1,
false);
return 0;
}

263
nexa_new.c Normal file
View File

@ -0,0 +1,263 @@
/*
* Copyright (c) 2012, Jonas Widén (jonas.widen@widens.eu)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "nexa_new.h"
#include <stdint.h>
#include <unistd.h>
#include <wiringPi.h>
#define NEXA_DELAY_HIGH 250
#define NEXA_DELAY_ZERO 1250
#define NEXA_DELAY_ONE 250
#define NEXA_DELAY_SYNC 2500
#define NEXA_RESENDS 6
#define NEXA_CLASS_1 (0x5)
#define NEXA_CLASS_2 (0x6)
#define NEXA_CLASS_3 (0x9)
#define NEXA_CLASS_4 (0xa)
static void send_zero(void)
{
digitalWrite(NEXA_PIN, HIGH);
usleep(NEXA_DELAY_HIGH);
digitalWrite(NEXA_PIN, LOW);
usleep(NEXA_DELAY_ZERO);
}
static void send_one(void)
{
digitalWrite(NEXA_PIN, HIGH);
usleep(NEXA_DELAY_HIGH);
digitalWrite(NEXA_PIN, LOW);
usleep(NEXA_DELAY_ONE);
}
static void send_sync(void)
{
digitalWrite(NEXA_PIN, HIGH);
usleep(NEXA_DELAY_HIGH);
digitalWrite(NEXA_PIN, LOW);
usleep(NEXA_DELAY_SYNC);
}
static void send_nibble(uint8_t nibble)
{
if (nibble & 0x08) send_one(); else send_zero();
if (nibble & 0x04) send_one(); else send_zero();
if (nibble & 0x02) send_one(); else send_zero();
if (nibble & 0x01) send_one(); else send_zero();
}
static void send_id(void)
{
uint8_t i;
uint8_t id[7] = {0x96, 0xa5, 0x55, 0xa5, 0x55, 0x55, 0x6};
for (i = 0; i < 7; ++i) {
if (i < 6) {
send_nibble((id[i] >> 4) & 0x0f);
}
send_nibble(id[i] & 0x0f);
}
}
static void send_group(bool group_mode)
{
if (group_mode) {
send_zero();
send_one();
}
else {
send_one();
send_zero();
}
}
static void send_activation(nexa_activation_t mode)
{
switch(mode) {
case NEXA_ACTIVATION_OFF:
send_one();
send_zero();
break;
case NEXA_ACTIVATION_ON:
send_zero();
send_one();
break;
case NEXA_ACTIVATION_DIM:
send_one();
send_one();
break;
default:
send_one();
send_zero();
break;
}
}
static void send_dim_level(nexa_dim_level_t level)
{
switch(level) {
case NEXA_DIM_LEVEL_1:
send_nibble(NEXA_CLASS_1);
send_nibble(NEXA_CLASS_2);
break;
case NEXA_DIM_LEVEL_2:
send_nibble(NEXA_CLASS_3);
send_nibble(NEXA_CLASS_2);
break;
case NEXA_DIM_LEVEL_3:
send_nibble(NEXA_CLASS_2);
send_nibble(NEXA_CLASS_2);
break;
case NEXA_DIM_LEVEL_4:
send_nibble(NEXA_CLASS_4);
send_nibble(NEXA_CLASS_2);
break;
case NEXA_DIM_LEVEL_5:
send_nibble(NEXA_CLASS_1);
send_nibble(NEXA_CLASS_4);
break;
case NEXA_DIM_LEVEL_6:
send_nibble(NEXA_CLASS_3);
send_nibble(NEXA_CLASS_4);
break;
case NEXA_DIM_LEVEL_7:
send_nibble(NEXA_CLASS_2);
send_nibble(NEXA_CLASS_4);
break;
case NEXA_DIM_LEVEL_8:
send_nibble(NEXA_CLASS_4);
send_nibble(NEXA_CLASS_4);
break;
case NEXA_DIM_LEVEL_9:
send_nibble(NEXA_CLASS_1);
send_nibble(NEXA_CLASS_3);
break;
case NEXA_DIM_LEVEL_10:
send_nibble(NEXA_CLASS_3);
send_nibble(NEXA_CLASS_3);
break;
case NEXA_DIM_LEVEL_11:
send_nibble(NEXA_CLASS_2);
send_nibble(NEXA_CLASS_3);
break;
case NEXA_DIM_LEVEL_12:
send_nibble(NEXA_CLASS_4);
send_nibble(NEXA_CLASS_3);
break;
case NEXA_DIM_LEVEL_13:
send_nibble(NEXA_CLASS_2);
send_nibble(NEXA_CLASS_1);
break;
case NEXA_DIM_LEVEL_14:
send_nibble(NEXA_CLASS_4);
send_nibble(NEXA_CLASS_1);
break;
case NEXA_DIM_LEVEL_15:
send_nibble(NEXA_CLASS_3);
send_nibble(NEXA_CLASS_1);
break;
case NEXA_DIM_LEVEL_16:
send_nibble(NEXA_CLASS_1);
send_nibble(NEXA_CLASS_1);
break;
}
}
static void send_channel(nexa_channel_t channel)
{
switch(channel) {
case NEXA_CHANNEL_1:
send_nibble(NEXA_CLASS_1);
break;
case NEXA_CHANNEL_2:
send_nibble(NEXA_CLASS_2);
break;
case NEXA_CHANNEL_3:
send_nibble(NEXA_CLASS_3);
break;
case NEXA_CHANNEL_4:
send_nibble(NEXA_CLASS_4);
break;
default:
send_nibble(NEXA_CLASS_1);
break;
}
}
static void send_button(nexa_button_t channel)
{
switch(channel) {
case NEXA_BUTTON_1:
send_nibble(NEXA_CLASS_1);
break;
case NEXA_BUTTON_2:
send_nibble(NEXA_CLASS_2);
break;
case NEXA_BUTTON_3:
send_nibble(NEXA_CLASS_3);
break;
case NEXA_BUTTON_4:
send_nibble(NEXA_CLASS_4);
break;
default:
send_nibble(NEXA_CLASS_1);
break;
}
}
void nexa_new_init(void)
{
wiringPiSetup();
pinMode(NEXA_PIN, OUTPUT);
digitalWrite(NEXA_PIN, LOW);
}
void nexa_new_transmit(nexa_channel_t channel,
nexa_button_t button,
nexa_activation_t activation,
nexa_dim_level_t level,
bool group_mode)
{
uint8_t i;
for (i = 0; i < NEXA_RESENDS; ++i) {
send_sync();
send_id();
send_group(group_mode);
send_activation(activation);
send_channel(channel);
send_button(button);
if (activation == NEXA_ACTIVATION_DIM) {
send_dim_level(level);
}
send_zero();
usleep(10);
}
}

80
nexa_new.h Normal file
View File

@ -0,0 +1,80 @@
/*
* Copyright (c) 2012, Jonas Widén (jonas.widen@widens.eu)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef NEXA_NEW_H_
#define NEXA_NEW_H_
#include <stdint.h>
#include <stdbool.h>
typedef enum {
NEXA_ACTIVATION_OFF,
NEXA_ACTIVATION_ON,
NEXA_ACTIVATION_DIM
} nexa_activation_t;
typedef enum {
NEXA_DIM_LEVEL_1,
NEXA_DIM_LEVEL_2,
NEXA_DIM_LEVEL_3,
NEXA_DIM_LEVEL_4,
NEXA_DIM_LEVEL_5,
NEXA_DIM_LEVEL_6,
NEXA_DIM_LEVEL_7,
NEXA_DIM_LEVEL_8,
NEXA_DIM_LEVEL_9,
NEXA_DIM_LEVEL_10,
NEXA_DIM_LEVEL_11,
NEXA_DIM_LEVEL_12,
NEXA_DIM_LEVEL_13,
NEXA_DIM_LEVEL_14,
NEXA_DIM_LEVEL_15,
NEXA_DIM_LEVEL_16
} nexa_dim_level_t;
typedef enum {
NEXA_CHANNEL_1,
NEXA_CHANNEL_2,
NEXA_CHANNEL_3,
NEXA_CHANNEL_4
} nexa_channel_t;
typedef enum {
NEXA_BUTTON_1,
NEXA_BUTTON_2,
NEXA_BUTTON_3,
NEXA_BUTTON_4
} nexa_button_t;
void nexa_new_init(void);
void nexa_new_transmit(nexa_channel_t channel,
nexa_button_t button,
nexa_activation_t activation,
nexa_dim_level_t level,
bool group_mode);
#endif /* NEXA_NEW_H_ */