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_
|
#ifndef _ECC_H_
|
||||||
#define _ECC_H_H
|
#define _ECC_H_H
|
||||||
|
#include <sysdefs.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
|
@ -3,21 +3,36 @@
|
||||||
#include "basic/basic.h"
|
#include "basic/basic.h"
|
||||||
#include "funk/nrf24l01p.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;
|
static uint8_t chrg=1;
|
||||||
|
|
||||||
void VoltageCheck(void){
|
void VoltageCheck(void){
|
||||||
|
uint32_t v;
|
||||||
chrg=gpioGetValue(RB_PWR_CHRG);
|
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);
|
v *= 10560;
|
||||||
results *= 10560;
|
v /= 1024;
|
||||||
results /= 1024;
|
|
||||||
results += 50;
|
//add the drop over the voltage switch
|
||||||
if( results < 3500 ){
|
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();
|
nrf_off();
|
||||||
gpioSetValue (RB_PWR_GOOD, 0);
|
gpioSetValue (RB_PWR_GOOD, 0);
|
||||||
gpioSetValue (RB_LCD_BL, 0);
|
gpioSetValue (RB_LCD_BL, 0);
|
||||||
|
|
||||||
|
//put the chip into deep power down
|
||||||
SCB_SCR |= SCB_SCR_SLEEPDEEP;
|
SCB_SCR |= SCB_SCR_SLEEPDEEP;
|
||||||
PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN;
|
PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN;
|
||||||
__asm volatile ("WFI");
|
__asm volatile ("WFI");
|
||||||
|
@ -25,7 +40,8 @@ void VoltageCheck(void){
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t GetVoltage(void){
|
uint32_t GetVoltage(void){
|
||||||
return results;
|
return voltage/8;
|
||||||
|
//return voltage;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t GetChrgStat(void){
|
uint8_t GetChrgStat(void){
|
||||||
|
|
|
@ -39,20 +39,12 @@
|
||||||
#ifndef _SYSDEFS_H_
|
#ifndef _SYSDEFS_H_
|
||||||
#define _SYSDEFS_H_
|
#define _SYSDEFS_H_
|
||||||
|
|
||||||
|
#include "../sysdefs.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.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 pREG8 (REG8 *)
|
||||||
#define pREG16 (REG16 *)
|
#define pREG16 (REG16 *)
|
||||||
#define pREG32 (REG32 *)
|
#define pREG32 (REG32 *)
|
||||||
|
|
|
@ -48,12 +48,12 @@ int mesh_sanity(uint8_t * pkt){
|
||||||
if(MO_TYPE(pkt)=='T' && MO_TIME(pkt)<86400)
|
if(MO_TYPE(pkt)=='T' && MO_TIME(pkt)<86400)
|
||||||
return MP_OK;
|
return MP_OK;
|
||||||
if(MO_TYPE(pkt)>='A' && MO_TYPE(pkt)<='Z'){
|
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;
|
return MP_SEND|MP_RECV;
|
||||||
if(MO_TIME(pkt)<1324602000)
|
if(MO_TIME(pkt)<1325376000) /* 1.1.2012 */
|
||||||
return MP_SEND|MP_RECV;
|
return MP_SEND|MP_RECV;
|
||||||
}else if(MO_TYPE(pkt)>='a' && MO_TYPE(pkt)<='z'){
|
}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;
|
return MP_SEND;
|
||||||
if(MO_TIME(pkt)<0)
|
if(MO_TIME(pkt)<0)
|
||||||
return MP_SEND;
|
return MP_SEND;
|
||||||
|
|
|
@ -72,6 +72,17 @@ static void openbeaconRead()
|
||||||
|
|
||||||
void openbeaconSetup(void)
|
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();
|
oid = GetUUID32();
|
||||||
strength = 0;
|
strength = 0;
|
||||||
#if SAVE_OPENBEACON
|
#if SAVE_OPENBEACON
|
||||||
|
@ -137,8 +148,6 @@ static void openbeaconSendPacket(uint32_t id, uint32_t seq,
|
||||||
|
|
||||||
void openbeaconSend(void)
|
void openbeaconSend(void)
|
||||||
{
|
{
|
||||||
//uint8_t status;
|
|
||||||
|
|
||||||
nrf_config_get(&oldconfig);
|
nrf_config_get(&oldconfig);
|
||||||
|
|
||||||
nrf_set_channel(OPENBEACON_CHANNEL);
|
nrf_set_channel(OPENBEACON_CHANNEL);
|
||||||
|
@ -153,6 +162,6 @@ void openbeaconSend(void)
|
||||||
openbeaconSaveBlock();
|
openbeaconSaveBlock();
|
||||||
#endif
|
#endif
|
||||||
nrf_config_set(&oldconfig);
|
nrf_config_set(&oldconfig);
|
||||||
//return status;
|
nrf_set_strength(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,8 @@ $(LDFILE):
|
||||||
%.o : %.c
|
%.o : %.c
|
||||||
$(CC) $(CFLAGS) -o $@ $<
|
$(CC) $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
%.elf: %.o $(FIRMWARE) $(LDFILE)
|
%.elf: %.o $(FIRMWARE) $(LDFILE) libmemcpy.a
|
||||||
$(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $<
|
$(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $< -L. -lmemcpy
|
||||||
$(SIZE) $@
|
$(SIZE) $@
|
||||||
|
|
||||||
%.bin: %.elf
|
%.bin: %.elf
|
||||||
|
@ -85,6 +85,13 @@ $(OBJS): usetable.h
|
||||||
usetable.h:
|
usetable.h:
|
||||||
./mktable.pl
|
./mktable.pl
|
||||||
|
|
||||||
|
help/memcpy.o: help/memcpy.c
|
||||||
|
|
||||||
|
libmemcpy.a: help/memcpy.o
|
||||||
|
$(AR) rcs $@ $<
|
||||||
|
$(RANLIB) $(RANLIBFLAGS) $@
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|
||||||
.PHONY: $(LDFILE)
|
.PHONY: $(LDFILE)
|
||||||
|
|
|
@ -95,6 +95,7 @@ void m_time(void){
|
||||||
lcdPrint(":");
|
lcdPrint(":");
|
||||||
lcdPrint(IntToStr(tm->tm_sec,2,F_LONG|F_ZEROS));
|
lcdPrint(IntToStr(tm->tm_sec,2,F_LONG|F_ZEROS));
|
||||||
lcdNl();
|
lcdNl();
|
||||||
|
lcdPrint(" ");
|
||||||
lcdPrint(IntToStr(tm->tm_mday,2,F_LONG));
|
lcdPrint(IntToStr(tm->tm_mday,2,F_LONG));
|
||||||
lcdPrint(".");
|
lcdPrint(".");
|
||||||
lcdPrint(IntToStr(tm->tm_mon+1,2,0));
|
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;
|
use strict;
|
||||||
|
|
||||||
my $DIR="l0dable";
|
my $DIR="l0dable";
|
||||||
|
my $memcpy;
|
||||||
|
|
||||||
if( -d "../$DIR"){
|
if( -d "../$DIR"){
|
||||||
chdir("..");
|
chdir("..");
|
||||||
|
@ -105,10 +106,16 @@ for my $idx (0..$#symb){
|
||||||
print C "$_,";
|
print C "$_,";
|
||||||
};
|
};
|
||||||
print I "#define $_ ($types{$_}(TheTable[$idx]))";
|
print I "#define $_ ($types{$_}(TheTable[$idx]))";
|
||||||
|
if($_ eq "memcpy" || $_ eq "memmove"){
|
||||||
|
$memcpy=$idx
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
print C "};";
|
print C "};";
|
||||||
|
|
||||||
|
if (defined($memcpy)){
|
||||||
|
print I "#define _memcpy_nr $memcpy";
|
||||||
|
};
|
||||||
close(I);
|
close(I);
|
||||||
close(H);
|
close(H);
|
||||||
close(C);
|
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){
|
int getrelease(void){
|
||||||
return 0x0000010b;
|
return 0x0000010d;
|
||||||
};
|
};
|
||||||
|
|
|
@ -36,10 +36,10 @@
|
||||||
*/
|
*/
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
#ifndef _SYSDEFS_H_
|
#ifndef _GLOBAL_SYSDEFS_H_
|
||||||
#define _SYSDEFS_H_
|
#define _GLOBAL_SYSDEFS_H_
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
@ -53,18 +53,9 @@ typedef volatile uint16_t REG16;
|
||||||
typedef volatile uint32_t REG32;
|
typedef volatile uint32_t REG32;
|
||||||
typedef unsigned char byte_t;
|
typedef unsigned char byte_t;
|
||||||
|
|
||||||
#define pREG8 (REG8 *)
|
|
||||||
#define pREG16 (REG16 *)
|
|
||||||
#define pREG32 (REG32 *)
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL ((void *) 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Save some space
|
// Save some space
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
#define memcpy memmove
|
#define memcpy memmove
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use IO::Select;
|
use IO::Select;
|
||||||
use Digest::CRC qw(crc16 crcccitt);
|
use Digest::CRC qw(crcccitt);
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
|
||||||
$|=1;
|
$|=1;
|
||||||
|
|
||||||
|
@ -13,19 +14,88 @@ my @fh;
|
||||||
my $read;
|
my $read;
|
||||||
|
|
||||||
sub sprint{
|
sub sprint{
|
||||||
my @str=split(//,shift);
|
return join("",map {
|
||||||
for (@str){
|
|
||||||
if (ord($_)>30 && ord($_)<127){
|
if (ord($_)>30 && ord($_)<127){
|
||||||
print $_;
|
$_;
|
||||||
}else{
|
}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;
|
my $sel = IO::Select->new;
|
||||||
|
|
||||||
|
@ -34,48 +104,89 @@ $sel->add(\*SER);
|
||||||
my $cmd=shift;
|
my $cmd=shift;
|
||||||
|
|
||||||
if($cmd =~ /^r/){
|
if($cmd =~ /^r/){
|
||||||
|
|
||||||
|
readbeacon();
|
||||||
$cmd=~s/r//;
|
$cmd=~s/r//;
|
||||||
$cmd+=1;
|
$cmd=100 if $cmd+0==0;
|
||||||
my $fmt=shift;
|
my $fmt=shift;
|
||||||
|
my $arg=shift || undef;
|
||||||
my $read="";
|
my $read="";
|
||||||
while($cmd-->0){
|
|
||||||
while($read !~ /\\1.*\\0/){
|
while($cmd>0){
|
||||||
my $rr="";
|
if(length($read)>2 && $read !~ /^\\1/){
|
||||||
if (@fh = $sel->can_read(100)) {
|
$read=~s/^(.[^\\]*)//s;
|
||||||
sysread($fh[0],$rr,1024);
|
print "Unparseable stuff: <",sprint($1),">\n";
|
||||||
$rr=~s/\\\\/\\/g;
|
# print "Rest was: ",sprint($read),"!\n";
|
||||||
$read.=$rr;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
while ($read =~ s/\\1(.*?)\\0//){
|
if ($read !~ s/^\\1(.*?)\\0//s){
|
||||||
|
my $rr="";
|
||||||
|
sysread(SER,$rr,1024);
|
||||||
|
$read.=$rr;
|
||||||
|
}else{
|
||||||
my $str=$1;
|
my $str=$1;
|
||||||
my $cs=substr($str,0,length($str)-2);
|
$str=~s/\\\\/\\/g; # dequote
|
||||||
my $crc=unpack("n",substr($str,length($str)-2,2));
|
my $pkt_crc= unpack("n",substr($str,length($str)-2,2));
|
||||||
my $crc2= crcccitt($cs),"\n";
|
my $calc_crc= crcccitt(substr($str,0,length($str)-2));
|
||||||
|
|
||||||
if($fmt eq "m"){
|
if($fmt eq "m"){
|
||||||
my $i=substr($str,0,1);
|
my $i=substr($str,0,1);
|
||||||
print "M [",substr($str,0,1),"] ";
|
next if(defined $arg && $arg ne $i);
|
||||||
|
print "M [$i] ";
|
||||||
print "g=",unpack("C",substr($str,1,1))," ";
|
print "g=",unpack("C",substr($str,1,1))," ";
|
||||||
if($i eq "T"){
|
if($i eq "T"){
|
||||||
print "t=",unpack("N",substr($str,2,4))," ";
|
print "t=";
|
||||||
print "(",scalar gmtime unpack("N",substr($str,2,4)),") ";
|
# print unpack("N",substr($str,2,4))," ";
|
||||||
print "beacon=",unpack("H*",substr($str,26,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"){
|
}elsif($i eq "B"){
|
||||||
print "t=",unpack("N",substr($str,2,4))," ";
|
print "t=",unpack("N",substr($str,2,4))," ";
|
||||||
print "ID=",unpack("c",substr($str,6,1))," ";
|
print "ID=",unpack("c",substr($str,6,1))," ";
|
||||||
print "HOP=",unpack("n",substr($str,11,4))," ";
|
print "HOP=",unpack("n",substr($str,11,4))," ";
|
||||||
|
}else{
|
||||||
|
print "<??: ",unpack("H*",substr($str,2,length($str)-4)),">";
|
||||||
};
|
};
|
||||||
# print "\n";
|
# 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"){
|
}elsif($fmt eq "x"){
|
||||||
print "<",unpack("H*",$str),">";
|
print "<",unpack("H*",$str),">";
|
||||||
}else{
|
}else{
|
||||||
print "Read: <"; sprint $str; print ">\n";
|
print "<", sprint($str), ">\n";
|
||||||
};
|
};
|
||||||
print "CRCFAIL" if ($crc ne $crc2);
|
print "CRCFAIL" if ($pkt_crc ne $calc_crc);
|
||||||
print "\n";
|
print "\n";
|
||||||
|
$cmd--;
|
||||||
|
next;
|
||||||
|
};
|
||||||
|
if($read !~ /^\\1/){
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
print "rest: <"; sprint $read; print ">\n";
|
if(length($read)>0){
|
||||||
|
print "rest: <", sprint($read), ">\n";
|
||||||
|
};
|
||||||
exit;
|
exit;
|
||||||
}elsif ($cmd eq "pM"){
|
}elsif ($cmd eq "pM"){
|
||||||
syswrite(SER, '\3ORBIT\0');
|
syswrite(SER, '\3ORBIT\0');
|
||||||
|
@ -89,28 +200,28 @@ if($cmd =~ /^r/){
|
||||||
syswrite(SER, '\6'.pack("H*","10").'\0');
|
syswrite(SER, '\6'.pack("H*","10").'\0');
|
||||||
}elsif ($cmd eq "mt"){
|
}elsif ($cmd eq "mt"){
|
||||||
my $par=pack("H*",shift);
|
my $par=pack("H*",shift);
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
syswrite(SER, '\3'.$par.'\0');
|
syswrite(SER, '\3'.$par.'\0');
|
||||||
}elsif ($cmd eq "mta"){
|
}elsif ($cmd eq "mta"){
|
||||||
my $par=shift;
|
my $par=shift;
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
print "len: ",length($par),"\n";
|
print "len: ",length($par),"\n";
|
||||||
syswrite(SER, '\3'.$par.'\0');
|
syswrite(SER, '\3'.$par.'\0');
|
||||||
}elsif ($cmd eq "mr"){
|
}elsif ($cmd eq "mr"){
|
||||||
my $par=pack("H*",shift);
|
my $par=pack("H*",shift);
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
syswrite(SER, '\4'.$par.'\0');
|
syswrite(SER, '\4'.$par.'\0');
|
||||||
}elsif ($cmd eq "mra"){
|
}elsif ($cmd eq "mra"){
|
||||||
my $par=shift;
|
my $par=shift;
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
syswrite(SER, '\4'.$par.'\0');
|
syswrite(SER, '\4'.$par.'\0');
|
||||||
}elsif ($cmd eq "ch"){
|
}elsif ($cmd eq "ch"){
|
||||||
my $par=pack("H*",shift);
|
my $par=pack("H*",shift);
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
syswrite(SER, '\5'.$par.'\0');
|
syswrite(SER, '\5'.$par.'\0');
|
||||||
}elsif ($cmd eq "len"){
|
}elsif ($cmd eq "len"){
|
||||||
my $par=pack("H*",shift);
|
my $par=pack("H*",shift);
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
syswrite(SER, '\6'.$par.'\0');
|
syswrite(SER, '\6'.$par.'\0');
|
||||||
}elsif ($cmd =~ /^S/){
|
}elsif ($cmd =~ /^S/){
|
||||||
$cmd=~s/S//;
|
$cmd=~s/S//;
|
||||||
|
@ -177,13 +288,35 @@ if($cmd =~ /^r/){
|
||||||
$par.=pack("N",0);
|
$par.=pack("N",0);
|
||||||
$par.=pack("N",0);
|
$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{
|
}else{
|
||||||
die;
|
die;
|
||||||
};
|
};
|
||||||
|
|
||||||
$par.=pack("n",crcccitt($par));
|
$par.=pack("n",crcccitt($par));
|
||||||
# $par.="00";
|
# $par.="00";
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par),">\n";
|
||||||
while($cmd-->0){
|
while($cmd-->0){
|
||||||
syswrite(SER, '\1'.$par.'\0');
|
syswrite(SER, '\1'.$par.'\0');
|
||||||
print "len: ",length($par),"\n" if($cmd==0);
|
print "len: ",length($par),"\n" if($cmd==0);
|
||||||
|
@ -198,7 +331,7 @@ if($cmd =~ /^r/){
|
||||||
};
|
};
|
||||||
|
|
||||||
if($cmd==0){
|
if($cmd==0){
|
||||||
print "Send: <"; sprint $read; print ">\n";
|
print "Send: <". sprint($read) , ">\n";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}elsif ($cmd =~ /^s/){
|
}elsif ($cmd =~ /^s/){
|
||||||
|
@ -206,7 +339,7 @@ if($cmd =~ /^r/){
|
||||||
$cmd+=1;
|
$cmd+=1;
|
||||||
my $par=pack("H*",shift);
|
my $par=pack("H*",shift);
|
||||||
$par.=pack("n",crcccitt($par));
|
$par.=pack("n",crcccitt($par));
|
||||||
print "Write: <"; sprint $par; print ">\n";
|
print "Write: <", sprint($par), ">\n";
|
||||||
while($cmd-->0){
|
while($cmd-->0){
|
||||||
syswrite(SER, '\1'.$par.'\0');
|
syswrite(SER, '\1'.$par.'\0');
|
||||||
print "len: ",length($par),"\n";
|
print "len: ",length($par),"\n";
|
||||||
|
@ -220,14 +353,14 @@ if($cmd =~ /^r/){
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
print "Send: <"; sprint $read; print ">\n";
|
print "Send: <", sprint($read) , ">\n";
|
||||||
};
|
};
|
||||||
}else{
|
}else{
|
||||||
die;
|
die "Option not understood\n";
|
||||||
};
|
};
|
||||||
|
|
||||||
if (@fh = $sel->can_read(10)) {
|
if (@fh = $sel->can_read(10)) {
|
||||||
sysread($fh[0],$read,1024);
|
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
|
cd ../../firmware && make clean && make && make l0dables
|
||||||
|
|
||||||
|
setup:
|
||||||
cp ../../firmware/firmware.bin .
|
cp ../../firmware/firmware.bin .
|
||||||
-mkdir files
|
-mkdir files
|
||||||
cp ../../firmware/l0dable/*c0d files
|
cp ../../firmware/l0dable/*c0d files
|
||||||
|
@ -14,8 +20,9 @@ setup:
|
||||||
@echo
|
@echo
|
||||||
@echo Now run ./smartflash
|
@echo Now run ./smartflash
|
||||||
|
|
||||||
|
run:
|
||||||
|
./smartflash
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f firmware.bin generate-keys
|
rm -f firmware.bin generate-keys
|
||||||
rm -rf files
|
rm -rf files
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue