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, Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met: 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_ */