Merge branch 'master' into meshdebug
Conflicts: firmware/funk/mesh.c firmware/main.c
This commit is contained in:
commit
44cd75423c
|
@ -1,5 +1,6 @@
|
|||
#ifndef _ECC_H_
|
||||
#define _ECC_H_H
|
||||
#include <sysdefs.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
|
@ -3,21 +3,36 @@
|
|||
#include "basic/basic.h"
|
||||
#include "funk/nrf24l01p.h"
|
||||
|
||||
static uint32_t results=5000;
|
||||
#define VOLTAGE_SAMPLES 8
|
||||
static uint32_t voltage=5000*VOLTAGE_SAMPLES;
|
||||
static uint8_t chrg=1;
|
||||
|
||||
void VoltageCheck(void){
|
||||
|
||||
uint32_t v;
|
||||
chrg=gpioGetValue(RB_PWR_CHRG);
|
||||
//slow down the adc for our high impedance voltage devider
|
||||
ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 100000 - 1 ) << 8;
|
||||
v = adcRead(1);
|
||||
//speed it up again
|
||||
ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 1000000 - 1 ) << 8;
|
||||
|
||||
results = adcRead(1);
|
||||
results *= 10560;
|
||||
results /= 1024;
|
||||
results += 50;
|
||||
if( results < 3500 ){
|
||||
v *= 10560;
|
||||
v /= 1024;
|
||||
|
||||
//add the drop over the voltage switch
|
||||
v += 50;
|
||||
|
||||
voltage -= voltage/VOLTAGE_SAMPLES;
|
||||
voltage += v;
|
||||
|
||||
//battery is assumed empty if the volatge falls bellow 3.5V
|
||||
if( voltage < (3500*VOLTAGE_SAMPLES) ){
|
||||
//if( voltage < 3500 ){
|
||||
nrf_off();
|
||||
gpioSetValue (RB_PWR_GOOD, 0);
|
||||
gpioSetValue (RB_LCD_BL, 0);
|
||||
|
||||
//put the chip into deep power down
|
||||
SCB_SCR |= SCB_SCR_SLEEPDEEP;
|
||||
PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN;
|
||||
__asm volatile ("WFI");
|
||||
|
@ -25,7 +40,8 @@ void VoltageCheck(void){
|
|||
};
|
||||
|
||||
uint32_t GetVoltage(void){
|
||||
return results;
|
||||
return voltage/8;
|
||||
//return voltage;
|
||||
};
|
||||
|
||||
uint8_t GetChrgStat(void){
|
||||
|
|
|
@ -39,20 +39,12 @@
|
|||
#ifndef _SYSDEFS_H_
|
||||
#define _SYSDEFS_H_
|
||||
|
||||
#include "../sysdefs.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// Stay compatible with ugly "windows" style
|
||||
#define BOOL bool
|
||||
#define TRUE true
|
||||
#define FALSE false
|
||||
|
||||
typedef volatile uint8_t REG8;
|
||||
typedef volatile uint16_t REG16;
|
||||
typedef volatile uint32_t REG32;
|
||||
typedef unsigned char byte_t;
|
||||
|
||||
#define pREG8 (REG8 *)
|
||||
#define pREG16 (REG16 *)
|
||||
#define pREG32 (REG32 *)
|
||||
|
|
|
@ -48,12 +48,12 @@ int mesh_sanity(uint8_t * pkt){
|
|||
if(MO_TYPE(pkt)=='T' && MO_TIME(pkt)<86400)
|
||||
return MP_OK;
|
||||
if(MO_TYPE(pkt)>='A' && MO_TYPE(pkt)<='Z'){
|
||||
if(MO_TIME(pkt)>1327519200)
|
||||
if(MO_TIME(pkt)>1370340000) /* 4.Jun 2013 */
|
||||
return MP_SEND|MP_RECV;
|
||||
if(MO_TIME(pkt)<1324602000)
|
||||
if(MO_TIME(pkt)<1325376000) /* 1.1.2012 */
|
||||
return MP_SEND|MP_RECV;
|
||||
}else if(MO_TYPE(pkt)>='a' && MO_TYPE(pkt)<='z'){
|
||||
if(MO_TIME(pkt)>16777216)
|
||||
if(MO_TIME(pkt)>16777216) /* 3-byte only */
|
||||
return MP_SEND;
|
||||
if(MO_TIME(pkt)<0)
|
||||
return MP_SEND;
|
||||
|
|
|
@ -72,6 +72,17 @@ static void openbeaconRead()
|
|||
|
||||
void openbeaconSetup(void)
|
||||
{
|
||||
uint8_t c = 0;
|
||||
uint8_t channels[] = {12,17,22,27,32,37,42,47,52,57,62,67,72};
|
||||
//nrf_startCW();
|
||||
while(0){
|
||||
delayms(20);
|
||||
nrf_set_channel(channels[c++]);
|
||||
if( c == sizeof(channels) ){
|
||||
c = 0;
|
||||
}
|
||||
}
|
||||
|
||||
oid = GetUUID32();
|
||||
strength = 0;
|
||||
#if SAVE_OPENBEACON
|
||||
|
@ -137,8 +148,6 @@ static void openbeaconSendPacket(uint32_t id, uint32_t seq,
|
|||
|
||||
void openbeaconSend(void)
|
||||
{
|
||||
//uint8_t status;
|
||||
|
||||
nrf_config_get(&oldconfig);
|
||||
|
||||
nrf_set_channel(OPENBEACON_CHANNEL);
|
||||
|
@ -153,6 +162,6 @@ void openbeaconSend(void)
|
|||
openbeaconSaveBlock();
|
||||
#endif
|
||||
nrf_config_set(&oldconfig);
|
||||
//return status;
|
||||
nrf_set_strength(3);
|
||||
}
|
||||
|
||||
|
|
|
@ -43,8 +43,8 @@ $(LDFILE):
|
|||
%.o : %.c
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
%.elf: %.o $(FIRMWARE) $(LDFILE)
|
||||
$(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $<
|
||||
%.elf: %.o $(FIRMWARE) $(LDFILE) libmemcpy.a
|
||||
$(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $< -L. -lmemcpy
|
||||
$(SIZE) $@
|
||||
|
||||
%.bin: %.elf
|
||||
|
@ -85,6 +85,13 @@ $(OBJS): usetable.h
|
|||
usetable.h:
|
||||
./mktable.pl
|
||||
|
||||
help/memcpy.o: help/memcpy.c
|
||||
|
||||
libmemcpy.a: help/memcpy.o
|
||||
$(AR) rcs $@ $<
|
||||
$(RANLIB) $(RANLIBFLAGS) $@
|
||||
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.PHONY: $(LDFILE)
|
||||
|
|
|
@ -95,6 +95,7 @@ void m_time(void){
|
|||
lcdPrint(":");
|
||||
lcdPrint(IntToStr(tm->tm_sec,2,F_LONG|F_ZEROS));
|
||||
lcdNl();
|
||||
lcdPrint(" ");
|
||||
lcdPrint(IntToStr(tm->tm_mday,2,F_LONG));
|
||||
lcdPrint(".");
|
||||
lcdPrint(IntToStr(tm->tm_mon+1,2,0));
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
#include <string.h>
|
||||
#include "../usetable.h"
|
||||
|
||||
#undef memcpy
|
||||
|
||||
void * memcpy(void *dst, const void *src, size_t len){
|
||||
return
|
||||
(*(void * (*)(void *, const void *, size_t ))(*(TheTable+_memcpy_nr)))
|
||||
(dst, src, len);
|
||||
};
|
|
@ -0,0 +1,148 @@
|
|||
#include <sysinit.h>
|
||||
|
||||
#include "basic/basic.h"
|
||||
#include "basic/byteorder.h"
|
||||
#include "lcd/lcd.h"
|
||||
#include "lcd/print.h"
|
||||
#include "funk/nrf24l01p.h"
|
||||
#include <string.h>
|
||||
#include "basic/random.h"
|
||||
#include "basic/config.h"
|
||||
#include "usetable.h"
|
||||
|
||||
|
||||
//channel and mac used to transmit game announcements
|
||||
#define ANNOUNCE_CHANNEL 87
|
||||
#define ANNOUNCE_MAC "REM0T"
|
||||
|
||||
struct NRF_CFG config;
|
||||
|
||||
struct packet{
|
||||
uint8_t len;
|
||||
uint8_t protocol;
|
||||
uint8_t command;
|
||||
uint32_t id;
|
||||
uint32_t ctr;
|
||||
|
||||
//union with 19 bytes data
|
||||
union content{
|
||||
struct button{
|
||||
uint8_t button;
|
||||
uint8_t reserved[18];
|
||||
}__attribute__((packed)) button;
|
||||
struct text{
|
||||
uint8_t x;
|
||||
uint8_t y;
|
||||
uint8_t flags;
|
||||
uint8_t text[16];
|
||||
}__attribute__((packed)) text;
|
||||
struct nick{
|
||||
uint8_t flags;
|
||||
uint8_t nick[18];
|
||||
}__attribute__((packed)) nick;
|
||||
struct nickrequest{
|
||||
uint8_t reserved[19];
|
||||
}__attribute__((packed)) nickrequest;
|
||||
struct ack{
|
||||
uint8_t flags;
|
||||
uint8_t reserved[18];
|
||||
}__attribute__((packed)) ack;
|
||||
struct announce{
|
||||
uint8_t gameMac[5];
|
||||
uint8_t gameChannel;
|
||||
//uint8_t playerMac[5]; playerMac = gameMac+1;
|
||||
uint16_t gameId;
|
||||
uint8_t gameFlags;
|
||||
uint8_t interval;
|
||||
uint8_t jitter;
|
||||
uint8_t gameTitle[8];
|
||||
}__attribute__((packed)) announce;
|
||||
struct join{
|
||||
uint16_t gameId;
|
||||
uint8_t reserved[17];
|
||||
}__attribute__((packed)) join;
|
||||
}c;
|
||||
uint16_t crc;
|
||||
}__attribute__((packed));
|
||||
|
||||
#define FLAGS_MASS_GAME 1
|
||||
#define FLAGS_SHORT_PACKET 2
|
||||
#define FLAGS_LONG_RECV 4
|
||||
|
||||
#define FLAGS_ACK_JOINOK 1
|
||||
#define MASS_ID 1
|
||||
|
||||
#define FLAGS_CLS 1
|
||||
|
||||
/**************************************************************************/
|
||||
/* l0dable for playing games which are announced by other r0kets with the l0dabel r_game */
|
||||
/* Values of buf[3]:
|
||||
* B: packet sent by player, contain information which button is pressed
|
||||
* T: packet sent by game, contain text for display
|
||||
* N: packet sent by game, requesting nick
|
||||
* n: packet sent player, containing nick
|
||||
* A: packet sent by game, announcing game
|
||||
* J: packet sent by player, requesting to join game
|
||||
* a: ack, packet with $ctr was received
|
||||
*/
|
||||
|
||||
void setLeft();
|
||||
void setRight();
|
||||
struct packet a;
|
||||
|
||||
void ram(void)
|
||||
{
|
||||
int priv = GLOBAL(privacy);
|
||||
|
||||
GLOBAL(privacy) = 3;
|
||||
config.nrmacs=1;
|
||||
config.maclen[0] = 32;
|
||||
config.channel = ANNOUNCE_CHANNEL;
|
||||
memcpy(config.mac0, ANNOUNCE_MAC, 5);
|
||||
memcpy(config.txmac, ANNOUNCE_MAC, 5);
|
||||
nrf_config_set(&config);
|
||||
|
||||
nrf_set_strength(3);
|
||||
int rnd;
|
||||
|
||||
volatile uint16_t i;
|
||||
while( 1 ){
|
||||
delayms(100);
|
||||
i = getRandom()&0xfff; while(i--);
|
||||
setJeopardy();
|
||||
nrf_snd_pkt_crc(sizeof(a),(uint8_t*)&a);
|
||||
}
|
||||
GLOBAL(privacy) = priv;
|
||||
};
|
||||
|
||||
|
||||
void setJeopardy()
|
||||
{
|
||||
a.len = 32;
|
||||
a.protocol = 'G';
|
||||
a.command = 'A';
|
||||
a.id = 0;
|
||||
a.ctr = 1;
|
||||
a.c.announce.gameMac[0] = 'B';
|
||||
a.c.announce.gameMac[1] = 'P';
|
||||
a.c.announce.gameMac[2] = 'O';
|
||||
a.c.announce.gameMac[3] = 'N';
|
||||
a.c.announce.gameMac[4] = 'G';
|
||||
|
||||
a.c.announce.gameChannel = 91;
|
||||
a.c.announce.gameId = 23;
|
||||
a.c.announce.gameFlags = 3;
|
||||
|
||||
a.c.announce.interval = 10;
|
||||
a.c.announce.jitter = 10;
|
||||
|
||||
a.c.announce.gameTitle[0] = 'J';
|
||||
a.c.announce.gameTitle[1] = 'e';
|
||||
a.c.announce.gameTitle[2] = 'o';
|
||||
a.c.announce.gameTitle[3] = 'p';
|
||||
a.c.announce.gameTitle[4] = 'r';
|
||||
a.c.announce.gameTitle[5] = 'd';
|
||||
a.c.announce.gameTitle[6] = 'y';
|
||||
a.c.announce.gameTitle[7] = 0;
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@
|
|||
use strict;
|
||||
|
||||
my $DIR="l0dable";
|
||||
my $memcpy;
|
||||
|
||||
if( -d "../$DIR"){
|
||||
chdir("..");
|
||||
|
@ -105,10 +106,16 @@ for my $idx (0..$#symb){
|
|||
print C "$_,";
|
||||
};
|
||||
print I "#define $_ ($types{$_}(TheTable[$idx]))";
|
||||
if($_ eq "memcpy" || $_ eq "memmove"){
|
||||
$memcpy=$idx
|
||||
};
|
||||
};
|
||||
|
||||
print C "};";
|
||||
|
||||
if (defined($memcpy)){
|
||||
print I "#define _memcpy_nr $memcpy";
|
||||
};
|
||||
close(I);
|
||||
close(H);
|
||||
close(C);
|
||||
|
|
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
* This l0dable by Benedikt Roth and Stefan Tomanek serves as your main
|
||||
* viewscreen, displaying your nickname the way you want it, and lets the
|
||||
* stars zoom by. You can accelerate your vessel by pushing the joystick
|
||||
* upwards or bring it to a halt by pressing it down - leaving your ship
|
||||
* drifting in the endless space. Attach two LEDs to the modulbus
|
||||
* connectors (SS2->GND, SS5->GND), so your r0ket can light up its nacelles
|
||||
* when breaking the warp barrier.
|
||||
*
|
||||
* commit 33fe346942176a0e988818980d04d1a8f746f894 1 parent 0eaf74fa87
|
||||
* wertarbyte authored August 13, 2011
|
||||
*/
|
||||
#include <sysinit.h>
|
||||
|
||||
#include "basic/basic.h"
|
||||
#include "basic/config.h"
|
||||
|
||||
#include "lcd/lcd.h"
|
||||
#include "lcd/print.h"
|
||||
|
||||
#include "usetable.h"
|
||||
|
||||
#define NUM_STARS 100
|
||||
#define SPEED_MAX 10
|
||||
#define SPEED_DEFAULT 4
|
||||
#define SPEED_STOP 0
|
||||
#define SPEED_WARP 6
|
||||
|
||||
// Two RGB LEDs on the Modulbus
|
||||
#define LEDA_R RB_SPI_SS0
|
||||
#define LEDA_G RB_SPI_SS1
|
||||
#define LEDA_B RB_SPI_SS2
|
||||
|
||||
#define LEDB_R RB_SPI_SS3
|
||||
#define LEDB_G RB_SPI_SS4
|
||||
#define LEDB_B RB_SPI_SS5
|
||||
|
||||
typedef struct {
|
||||
short x, y, z;
|
||||
} s_star;
|
||||
|
||||
typedef struct {
|
||||
short speed;
|
||||
} s_ship;
|
||||
|
||||
static s_ship ship = {SPEED_DEFAULT};
|
||||
|
||||
static s_star stars[NUM_STARS];
|
||||
|
||||
void init_star(s_star *star, int z);
|
||||
void set_warp_lights(uint8_t enabled);
|
||||
void drift_ship(void);
|
||||
|
||||
void ram(void)
|
||||
{
|
||||
short centerx = RESX >> 1;
|
||||
short centery = RESY >> 1;
|
||||
short i;
|
||||
uint8_t key = 0;
|
||||
|
||||
for (i = 0; i < NUM_STARS; i++) {
|
||||
init_star(stars + i, i + 1);
|
||||
}
|
||||
|
||||
static uint8_t count = 0;
|
||||
while(1) {
|
||||
count++;
|
||||
count%=256;
|
||||
key = getInputRaw();
|
||||
if (key == BTN_ENTER) {
|
||||
break;
|
||||
} else if ( count%4 == 0 ) {
|
||||
if (key == BTN_UP && ship.speed < SPEED_MAX) {
|
||||
ship.speed++;
|
||||
} else if (key == BTN_DOWN && ship.speed > SPEED_STOP) {
|
||||
ship.speed--;
|
||||
} else if (key ==BTN_NONE) {
|
||||
/* converge towards default speed */
|
||||
if (ship.speed < SPEED_DEFAULT) {
|
||||
ship.speed++;
|
||||
} else if (ship.speed > SPEED_DEFAULT) {
|
||||
ship.speed--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ship.speed > SPEED_WARP) {
|
||||
set_warp_lights(1);
|
||||
} else {
|
||||
set_warp_lights(0);
|
||||
}
|
||||
|
||||
if (ship.speed == 0 && count%6==0) drift_ship();
|
||||
|
||||
int dx=0;
|
||||
int dy=0;
|
||||
setExtFont(GLOBAL(nickfont));
|
||||
dx=DoString(0,0,GLOBAL(nickname));
|
||||
dx=(RESX-dx)/2;
|
||||
if(dx<0) dx=0;
|
||||
dy=(RESY-getFontHeight())/2;
|
||||
|
||||
lcdClear();
|
||||
DoString(dx,dy,GLOBAL(nickname));
|
||||
|
||||
for (i = 0; i < NUM_STARS; i++) {
|
||||
stars[i].z -= ship.speed;
|
||||
|
||||
if (ship.speed > 0 && stars[i].z <= 0)
|
||||
init_star(stars + i, i + 1);
|
||||
|
||||
short tempx = ((stars[i].x * 30) / stars[i].z) + centerx;
|
||||
short tempy = ((stars[i].y * 30) / stars[i].z) + centery;
|
||||
|
||||
if (tempx < 0 || tempx > RESX - 1 || tempy < 0 || tempy > RESY - 1) {
|
||||
if (ship.speed > 0) { /* if we are flying, generate new stars in front */
|
||||
init_star(stars + i, i + 1);
|
||||
} else { /* if we are drifting, simply move those stars to the other end */
|
||||
stars[i].x = (((tempx%RESX)-centerx)*stars[i].z)/30;
|
||||
stars[i].y = (((tempy%RESY)-centery)*stars[i].z)/30;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
lcdSetPixel(tempx, tempy, 1);
|
||||
if (stars[i].z < 50) {
|
||||
lcdSetPixel(tempx + 1, tempy, 1);
|
||||
}
|
||||
if (stars[i].z < 20) {
|
||||
lcdSetPixel(tempx, tempy + 1, 1);
|
||||
lcdSetPixel(tempx + 1, tempy + 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
lcdRefresh();
|
||||
|
||||
delayms_queue_plus(50,0);
|
||||
}
|
||||
set_warp_lights(0);
|
||||
}
|
||||
|
||||
void set_warp_lights(uint8_t enabled) {
|
||||
gpioSetValue(LEDA_R, 0);
|
||||
gpioSetValue(LEDA_G, 0);
|
||||
gpioSetValue(LEDA_B, enabled);
|
||||
|
||||
gpioSetValue(LEDB_R, 0);
|
||||
gpioSetValue(LEDB_G, 0);
|
||||
gpioSetValue(LEDB_B, enabled);
|
||||
}
|
||||
|
||||
void drift_ship(void) {
|
||||
uint8_t d_x = 1;
|
||||
uint8_t d_y = 1;
|
||||
for (uint8_t i = 0; i < NUM_STARS; i++) {
|
||||
stars[i].x += d_x;
|
||||
stars[i].y += d_y;
|
||||
}
|
||||
}
|
||||
|
||||
void init_star(s_star *star, int z)
|
||||
{
|
||||
star->x = (getRandom() % RESX) - (RESX >> 1);
|
||||
star->y = (getRandom() % RESY) - (RESY >> 1);
|
||||
star->z = z;
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
* coded by Thammi from Pentagon Village
|
||||
*/
|
||||
|
||||
#include <sysinit.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "basic/basic.h"
|
||||
#include "basic/random.h"
|
||||
#include "lcd/display.h"
|
||||
#include "usetable.h"
|
||||
|
||||
void randomizeCoin(int* x, int* y);
|
||||
|
||||
void ram() {
|
||||
int key;
|
||||
|
||||
int d = 0;
|
||||
int x = RESX / 2;
|
||||
int y = RESY / 2;
|
||||
|
||||
int p = 0;
|
||||
int q, r;
|
||||
|
||||
randomizeCoin(&q, &r);
|
||||
|
||||
lcdClear();
|
||||
|
||||
while (1) {
|
||||
// display
|
||||
lcdSetPixel(q, r, p % 3);
|
||||
lcdSetPixel(x, y, 1);
|
||||
lcdDisplay();
|
||||
|
||||
// wait
|
||||
|
||||
delayms(20);
|
||||
|
||||
// input
|
||||
|
||||
key=getInputRaw();
|
||||
|
||||
switch(key) {
|
||||
case BTN_RIGHT:
|
||||
d = 3;
|
||||
break;
|
||||
case BTN_LEFT:
|
||||
d = 2;
|
||||
break;
|
||||
case BTN_UP:
|
||||
d = 0;
|
||||
break;
|
||||
case BTN_DOWN:
|
||||
d = 1;
|
||||
break;
|
||||
case BTN_ENTER:
|
||||
return;
|
||||
}
|
||||
|
||||
// step
|
||||
|
||||
if(d > 1) {
|
||||
x = (RESX + x + (d & 1) * 2 - 1) % RESX;
|
||||
} else {
|
||||
y = (RESY + y + d * 2 - 1) % RESY;
|
||||
}
|
||||
|
||||
p += 1;
|
||||
|
||||
// collision
|
||||
|
||||
if(x == q && y == r) {
|
||||
p += 99;
|
||||
randomizeCoin(&q, &r);
|
||||
} else if(lcdGetPixel(x, y)) {
|
||||
lcdClear();
|
||||
lcdPrint("You failed,");
|
||||
lcdNl();
|
||||
lcdPrint(nickname);
|
||||
lcdPrint("!");
|
||||
lcdNl();
|
||||
lcdNl();
|
||||
lcdPrintInt(p);
|
||||
lcdPrintln(" points");
|
||||
lcdDisplay();
|
||||
|
||||
while(getInputRaw() != BTN_ENTER);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void randomizeCoin(int* x, int* y) {
|
||||
// WARNING: if you are really got at this the game freezes :D
|
||||
for(;;) {
|
||||
*x = getRandom() % RESX;
|
||||
*y = getRandom() % RESY;
|
||||
|
||||
if(!lcdGetPixel(*x, *y)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -77,5 +77,5 @@ int main(void) {
|
|||
}
|
||||
|
||||
int getrelease(void){
|
||||
return 0x0000010b;
|
||||
return 0x0000010d;
|
||||
};
|
||||
|
|
|
@ -36,10 +36,10 @@
|
|||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef _SYSDEFS_H_
|
||||
#define _SYSDEFS_H_
|
||||
#ifndef _GLOBAL_SYSDEFS_H_
|
||||
#define _GLOBAL_SYSDEFS_H_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
|
@ -53,18 +53,9 @@ typedef volatile uint16_t REG16;
|
|||
typedef volatile uint32_t REG32;
|
||||
typedef unsigned char byte_t;
|
||||
|
||||
#define pREG8 (REG8 *)
|
||||
#define pREG16 (REG16 *)
|
||||
#define pREG32 (REG32 *)
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void *) 0)
|
||||
#endif
|
||||
|
||||
// Save some space
|
||||
#ifndef SIMULATOR
|
||||
#define memcpy memmove
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
use strict;
|
||||
|
||||
use IO::Select;
|
||||
use Digest::CRC qw(crc16 crcccitt);
|
||||
use Digest::CRC qw(crcccitt);
|
||||
use POSIX qw(strftime);
|
||||
|
||||
$|=1;
|
||||
|
||||
|
@ -13,19 +14,88 @@ my @fh;
|
|||
my $read;
|
||||
|
||||
sub sprint{
|
||||
my @str=split(//,shift);
|
||||
for (@str){
|
||||
return join("",map {
|
||||
if (ord($_)>30 && ord($_)<127){
|
||||
print $_;
|
||||
$_;
|
||||
}else{
|
||||
print "[x",unpack("H*",$_),"]";
|
||||
};
|
||||
};
|
||||
"[x".unpack("H*",$_)."]";
|
||||
}
|
||||
}split(//,shift));
|
||||
};
|
||||
|
||||
my $ser=shift || "/dev/ttyS3";
|
||||
my %beacon;
|
||||
sub readbeacon{
|
||||
return if( ! -f "BEACON" );
|
||||
open(B,"<","BEACON") || die "open: $!";
|
||||
while(<B>){
|
||||
/(\w+)\s+(.*)/ && do {
|
||||
$beacon{$1}=$2;
|
||||
};
|
||||
};
|
||||
close(B);
|
||||
};
|
||||
sub resolvebeacon{
|
||||
my $b=shift;
|
||||
if(!$beacon{$b}){
|
||||
return $b;
|
||||
}else{
|
||||
return "$b ($beacon{$b})";
|
||||
};
|
||||
};
|
||||
sub addbeacon{
|
||||
my($b,$n)=@_;
|
||||
if(!$beacon{$b}){
|
||||
$beacon{$b}=$n;
|
||||
};
|
||||
};
|
||||
sub writebeacon{
|
||||
open(B,">","BEACON") || die "write: $!";
|
||||
for(sort keys %beacon){
|
||||
print B "$_ $beacon{$_}\n";
|
||||
};
|
||||
close(B);
|
||||
};
|
||||
|
||||
open(SER, "+<",$ser) || die "open: $!";
|
||||
my $ser="<undef>";
|
||||
|
||||
do {$ser=$_ if ( -e $_ ) } for qw(/dev/ttyS3 /dev/ttyACM0);
|
||||
|
||||
if ($ARGV[0] eq "-h"){
|
||||
print STDERR "Mini-Help:\n";
|
||||
print STDERR "-s <devicename>\n";
|
||||
print STDERR "\n";
|
||||
print STDERR "r<num> receive (number) pakets\n";
|
||||
print STDERR " - r x : hexdump packets\n";
|
||||
print STDERR " - r m : parse as mesh packet\n";
|
||||
print STDERR " - r m <letter>: and show only <letter>\n";
|
||||
print STDERR "\n";
|
||||
print STDERR "s<num> send packet (number) times\n";
|
||||
print STDERR " - s <hex> : send raw hexdump\n";
|
||||
print STDERR " - S ... : see source \n";
|
||||
print STDERR "\n";
|
||||
print STDERR "p config per preset\n";
|
||||
print STDERR "- pM - preset mesh\n";
|
||||
print STDERR "- pB - preset openbeacon\n";
|
||||
print STDERR "\n";
|
||||
print STDERR "etc...\n";
|
||||
exit(1);
|
||||
};
|
||||
if ($ARGV[0] eq "-s"){
|
||||
shift;
|
||||
$ser=shift;
|
||||
};
|
||||
|
||||
my $writend=0;
|
||||
if ($ARGV[0] eq "-w"){
|
||||
shift;
|
||||
$writend=1;
|
||||
};
|
||||
|
||||
END{
|
||||
writebeacon if($writend);
|
||||
};
|
||||
|
||||
open(SER, "+<",$ser) || die "open serial: $!";
|
||||
|
||||
my $sel = IO::Select->new;
|
||||
|
||||
|
@ -34,48 +104,89 @@ $sel->add(\*SER);
|
|||
my $cmd=shift;
|
||||
|
||||
if($cmd =~ /^r/){
|
||||
|
||||
readbeacon();
|
||||
$cmd=~s/r//;
|
||||
$cmd+=1;
|
||||
$cmd=100 if $cmd+0==0;
|
||||
my $fmt=shift;
|
||||
my $arg=shift || undef;
|
||||
my $read="";
|
||||
while($cmd-->0){
|
||||
while($read !~ /\\1.*\\0/){
|
||||
my $rr="";
|
||||
if (@fh = $sel->can_read(100)) {
|
||||
sysread($fh[0],$rr,1024);
|
||||
$rr=~s/\\\\/\\/g;
|
||||
$read.=$rr;
|
||||
}
|
||||
};
|
||||
while ($read =~ s/\\1(.*?)\\0//){
|
||||
my $str=$1;
|
||||
my $cs=substr($str,0,length($str)-2);
|
||||
my $crc=unpack("n",substr($str,length($str)-2,2));
|
||||
my $crc2= crcccitt($cs),"\n";
|
||||
if($fmt eq "m"){
|
||||
my $i=substr($str,0,1);
|
||||
print "M [",substr($str,0,1),"] ";
|
||||
print "g=",unpack("C",substr($str,1,1))," ";
|
||||
if($i eq "T"){
|
||||
print "t=",unpack("N",substr($str,2,4))," ";
|
||||
print "(",scalar gmtime unpack("N",substr($str,2,4)),") ";
|
||||
print "beacon=",unpack("H*",substr($str,26,4))," ";
|
||||
}elsif($i eq "B"){
|
||||
print "t=",unpack("N",substr($str,2,4))," ";
|
||||
print "ID=",unpack("c",substr($str,6,1))," ";
|
||||
print "HOP=",unpack("n",substr($str,11,4))," ";
|
||||
};
|
||||
# print "\n";
|
||||
|
||||
while($cmd>0){
|
||||
if(length($read)>2 && $read !~ /^\\1/){
|
||||
$read=~s/^(.[^\\]*)//s;
|
||||
print "Unparseable stuff: <",sprint($1),">\n";
|
||||
# print "Rest was: ",sprint($read),"!\n";
|
||||
};
|
||||
if ($read !~ s/^\\1(.*?)\\0//s){
|
||||
my $rr="";
|
||||
sysread(SER,$rr,1024);
|
||||
$read.=$rr;
|
||||
}else{
|
||||
my $str=$1;
|
||||
$str=~s/\\\\/\\/g; # dequote
|
||||
my $pkt_crc= unpack("n",substr($str,length($str)-2,2));
|
||||
my $calc_crc= crcccitt(substr($str,0,length($str)-2));
|
||||
|
||||
if($fmt eq "m"){
|
||||
my $i=substr($str,0,1);
|
||||
next if(defined $arg && $arg ne $i);
|
||||
print "M [$i] ";
|
||||
print "g=",unpack("C",substr($str,1,1))," ";
|
||||
if($i eq "T"){
|
||||
print "t=";
|
||||
# print unpack("N",substr($str,2,4))," ";
|
||||
print strftime("%Y-%m-%d %H:%M:%S",gmtime unpack("N",substr($str,2,4)));
|
||||
printf " (%+3d) ",unpack("N",substr($str,2,4))-(time+3600);
|
||||
print "beacon=",resolvebeacon(unpack("H*",substr($str,26,4)))," ";
|
||||
}elsif($i eq "i"){
|
||||
print "score=",unpack("N",substr($str,2,4))," ";
|
||||
print "nick=",unpack("Z*",substr($str,6,length($str)-8))," ";
|
||||
}elsif($i eq "B"){
|
||||
print "t=",unpack("N",substr($str,2,4))," ";
|
||||
print "ID=",unpack("c",substr($str,6,1))," ";
|
||||
print "HOP=",unpack("n",substr($str,11,4))," ";
|
||||
}else{
|
||||
print "<??: ",unpack("H*",substr($str,2,length($str)-4)),">";
|
||||
};
|
||||
# print "\n";
|
||||
}elsif($fmt eq "b"){
|
||||
my $i=substr($str,1,1);
|
||||
if($i eq "\x17"){
|
||||
print "BEACON ";
|
||||
print "ln=",unpack("C",substr($str,0,1))," ";
|
||||
print "bt=",unpack("H*",substr($str,2,1))," ";
|
||||
print "str=",unpack("H*",substr($str,3,1))," ";
|
||||
printf "idx=%08d ",unpack("N",substr($str,4,4));
|
||||
print "beacon=",resolvebeacon(unpack("H*",substr($str,8,4)))," ";
|
||||
if(unpack("H*",substr($str,12,2)) ne "ffff"){
|
||||
print "unused=",unpack("H*",substr($str,12,2))," ";
|
||||
};
|
||||
}elsif($i eq "\x23"){
|
||||
print "NICK ";
|
||||
print "beacon=",resolvebeacon(unpack("H*",substr($str,2,4)))," ";
|
||||
print "nick=",unpack("Z*",substr($str,6,length($str)-2))," ";
|
||||
addbeacon(unpack("H*",substr($str,2,4)),unpack("Z*",substr($str,6,length($str)-2)));
|
||||
}else{
|
||||
#<?:1023332ed221312d342e312e3400dddb>
|
||||
print "<?:",unpack("H*",$str),">";
|
||||
};
|
||||
}elsif($fmt eq "x"){
|
||||
print "<",unpack("H*",$str),">";
|
||||
}else{
|
||||
print "Read: <"; sprint $str; print ">\n";
|
||||
};
|
||||
print "CRCFAIL" if ($crc ne $crc2);
|
||||
print "\n";
|
||||
};
|
||||
};
|
||||
print "rest: <"; sprint $read; print ">\n";
|
||||
}else{
|
||||
print "<", sprint($str), ">\n";
|
||||
};
|
||||
print "CRCFAIL" if ($pkt_crc ne $calc_crc);
|
||||
print "\n";
|
||||
$cmd--;
|
||||
next;
|
||||
};
|
||||
if($read !~ /^\\1/){
|
||||
};
|
||||
};
|
||||
if(length($read)>0){
|
||||
print "rest: <", sprint($read), ">\n";
|
||||
};
|
||||
exit;
|
||||
}elsif ($cmd eq "pM"){
|
||||
syswrite(SER, '\3ORBIT\0');
|
||||
|
@ -89,28 +200,28 @@ if($cmd =~ /^r/){
|
|||
syswrite(SER, '\6'.pack("H*","10").'\0');
|
||||
}elsif ($cmd eq "mt"){
|
||||
my $par=pack("H*",shift);
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
syswrite(SER, '\3'.$par.'\0');
|
||||
}elsif ($cmd eq "mta"){
|
||||
my $par=shift;
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
print "len: ",length($par),"\n";
|
||||
syswrite(SER, '\3'.$par.'\0');
|
||||
}elsif ($cmd eq "mr"){
|
||||
my $par=pack("H*",shift);
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
syswrite(SER, '\4'.$par.'\0');
|
||||
}elsif ($cmd eq "mra"){
|
||||
my $par=shift;
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
syswrite(SER, '\4'.$par.'\0');
|
||||
}elsif ($cmd eq "ch"){
|
||||
my $par=pack("H*",shift);
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
syswrite(SER, '\5'.$par.'\0');
|
||||
}elsif ($cmd eq "len"){
|
||||
my $par=pack("H*",shift);
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
syswrite(SER, '\6'.$par.'\0');
|
||||
}elsif ($cmd =~ /^S/){
|
||||
$cmd=~s/S//;
|
||||
|
@ -177,13 +288,35 @@ if($cmd =~ /^r/){
|
|||
$par.=pack("N",0);
|
||||
$par.=pack("N",0);
|
||||
$par.=pack("N",0);
|
||||
}elsif($scmd eq "c"){
|
||||
$par.="\x1";
|
||||
$par.=chr(shift); #gen
|
||||
$par.=pack("N",scalar(time)+1*60*60+ 600);
|
||||
|
||||
$par.= pack("C",shift||0);
|
||||
$par.= pack("C",0);
|
||||
$par.= pack("C",0);
|
||||
$par.= pack("C",0);
|
||||
|
||||
$par.=pack("N",0);
|
||||
$par.=pack("N",0);
|
||||
$par.=pack("N",0);
|
||||
$par.=pack("N",0);
|
||||
$par.=pack("N",0);
|
||||
}elsif($scmd eq "i"){
|
||||
$par.="i";
|
||||
$par.=chr(shift); #gen
|
||||
$par.=pack("N",shift||42);
|
||||
|
||||
$par.=shift;
|
||||
$par.="\0"x(30-length($par));
|
||||
}else{
|
||||
die;
|
||||
};
|
||||
|
||||
$par.=pack("n",crcccitt($par));
|
||||
# $par.="00";
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par),">\n";
|
||||
while($cmd-->0){
|
||||
syswrite(SER, '\1'.$par.'\0');
|
||||
print "len: ",length($par),"\n" if($cmd==0);
|
||||
|
@ -198,7 +331,7 @@ if($cmd =~ /^r/){
|
|||
};
|
||||
|
||||
if($cmd==0){
|
||||
print "Send: <"; sprint $read; print ">\n";
|
||||
print "Send: <". sprint($read) , ">\n";
|
||||
};
|
||||
};
|
||||
}elsif ($cmd =~ /^s/){
|
||||
|
@ -206,7 +339,7 @@ if($cmd =~ /^r/){
|
|||
$cmd+=1;
|
||||
my $par=pack("H*",shift);
|
||||
$par.=pack("n",crcccitt($par));
|
||||
print "Write: <"; sprint $par; print ">\n";
|
||||
print "Write: <", sprint($par), ">\n";
|
||||
while($cmd-->0){
|
||||
syswrite(SER, '\1'.$par.'\0');
|
||||
print "len: ",length($par),"\n";
|
||||
|
@ -220,14 +353,14 @@ if($cmd =~ /^r/){
|
|||
}
|
||||
};
|
||||
|
||||
print "Send: <"; sprint $read; print ">\n";
|
||||
print "Send: <", sprint($read) , ">\n";
|
||||
};
|
||||
}else{
|
||||
die;
|
||||
die "Option not understood\n";
|
||||
};
|
||||
|
||||
if (@fh = $sel->can_read(10)) {
|
||||
sysread($fh[0],$read,1024);
|
||||
}
|
||||
print "PostRead: <"; sprint $read; print ">\n";
|
||||
print "PostRead: <", sprint($read), ">\n";
|
||||
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
setup:
|
||||
dwim: build setup
|
||||
|
||||
all: dwim run
|
||||
|
||||
build:
|
||||
cd ../../firmware && make clean && make && make l0dables
|
||||
|
||||
setup:
|
||||
cp ../../firmware/firmware.bin .
|
||||
-mkdir files
|
||||
cp ../../firmware/l0dable/*c0d files
|
||||
|
@ -14,8 +20,9 @@ setup:
|
|||
@echo
|
||||
@echo Now run ./smartflash
|
||||
|
||||
run:
|
||||
./smartflash
|
||||
|
||||
clean:
|
||||
rm -f firmware.bin generate-keys
|
||||
rm -rf files
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue