diff --git a/MySensors.h b/MySensors.h index 272784d..0a7b4af 100644 --- a/MySensors.h +++ b/MySensors.h @@ -103,6 +103,8 @@ #include "drivers/NVM/VirtualPage.cpp" #include "drivers/NVM/NVRAM.cpp" #include "hal/architecture/MyHwNRF5.cpp" +#elif defined(__arm__) && defined(TEENSYDUINO) +#include "hal/architecture/MyHwTeensy3.cpp" #elif defined(__linux__) #include "hal/architecture/MyHwLinuxGeneric.cpp" #endif @@ -429,6 +431,8 @@ MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs #include "hal/architecture/MyMainLinux.cpp" #elif defined(ARDUINO_ARCH_STM32F1) #include "hal/architecture/MyMainSTM32F1.cpp" +#elif defined(TEENSYDUINO) +#include "hal/architecture/MyMainTeensy3.cpp" #else #include "hal/architecture/MyMainDefault.cpp" #endif diff --git a/drivers/extEEPROM/extEEPROM.h b/drivers/extEEPROM/extEEPROM.h index 449c305..1fe49a4 100644 --- a/drivers/extEEPROM/extEEPROM.h +++ b/drivers/extEEPROM/extEEPROM.h @@ -1,4 +1,4 @@ -/*-----------------------------------------------------------------------------* +/*-----------------------------------------------------------------------------* * extEEPROM.h - Arduino library to support external I2C EEPROMs. * * * * This library will work with most I2C serial EEPROM chips between 2k bits * @@ -92,7 +92,7 @@ public: * @param pageSize * @param eepromAddr */ - extEEPROM(eeprom_size_t deviceCapacity, byte nDevice, unsigned int pageSize, //!< extEEPROM() + extEEPROM(eeprom_size_t deviceCapacity, byte nDevice, unsigned int pageSize, byte eepromAddr = 0x50); byte begin(twiClockFreq_t twiFreq = twiClock100kHz); //!< begin() byte write(unsigned long addr, byte *values, unsigned int nBytes); //!< write() diff --git a/hal/architecture/MyHwTeensy3.cpp b/hal/architecture/MyHwTeensy3.cpp new file mode 100644 index 0000000..df88314 --- /dev/null +++ b/hal/architecture/MyHwTeensy3.cpp @@ -0,0 +1,145 @@ +/** +* The MySensors Arduino library handles the wireless radio link and protocol +* between your home built sensors/actuators and HA controller of choice. +* The sensors forms a self healing radio network with optional repeaters. Each +* repeater and gateway builds a routing tables in EEPROM which keeps track of the +* network topology allowing messages to be routed to nodes. +* +* Created by Henrik Ekblad +* Copyright (C) 2013-2017 Sensnology AB +* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors +* +* Documentation: http://www.mysensors.org +* Support Forum: http://forum.mysensors.org +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* version 2 as published by the Free Software Foundation. +*/ + +#include "MyHwTeensy3.h" + + +/* +int8_t pinIntTrigger = 0; +void wakeUp() //place to send the interrupts +{ + pinIntTrigger = 1; +} +void wakeUp2() //place to send the second interrupts +{ + pinIntTrigger = 2; +} + +// Watchdog Timer interrupt service routine. This routine is required +// to allow automatic WDIF and WDIE bit clearance in hardware. +ISR (WDT_vect) +{ + // WDIE & WDIF is cleared in hardware upon entering this ISR + wdt_disable(); +} +*/ + +bool hwInit(void) +{ + MY_SERIALDEVICE.begin(MY_BAUD_RATE); +#if defined(MY_GATEWAY_SERIAL) + while (!MY_SERIALDEVICE) {} +#endif + return true; +} + +void hwWatchdogReset(void) +{ + // TODO: Not supported! +} + +void hwReboot(void) +{ + SCB_AIRCR = 0x05FA0004; + while (true); +} + +int8_t hwSleep(unsigned long ms) +{ + // TODO: Not supported! + (void)ms; + return MY_SLEEP_NOT_POSSIBLE; +} + +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) +{ + // TODO: Not supported! + (void)interrupt; + (void)mode; + (void)ms; + return MY_SLEEP_NOT_POSSIBLE; +} + +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, + unsigned long ms) +{ + // TODO: Not supported! + (void)interrupt1; + (void)mode1; + (void)interrupt2; + (void)mode2; + (void)ms; + return MY_SLEEP_NOT_POSSIBLE; +} + +bool hwUniqueID(unique_id_t *uniqueID) +{ +#if defined(__MKL26Z64__) + memcpy((uint8_t*)uniqueID, &SIM_UIDMH, 12); + memset((uint8_t*)uniqueID + 12, 0, 4); +#else + memcpy((uint8_t*)uniqueID, &SIM_UIDH, 16); +#endif + return true; +} + +uint16_t hwCPUVoltage() +{ + // TODO: Not supported! + return 0; +} + +uint16_t hwCPUFrequency() +{ + // TODO: currently reporting compile time frequency (in 1/10MHz) + return F_CPU / 100000UL; +} + +uint16_t hwFreeMem() +{ + // TODO: Not supported! + return 0; +} + +void hwDebugPrint(const char *fmt, ...) +{ + char fmtBuffer[MY_SERIAL_OUTPUT_SIZE]; +#ifdef MY_GATEWAY_FEATURE + // prepend debug message to be handled correctly by controller (C_INTERNAL, I_LOG_MESSAGE) + snprintf_P(fmtBuffer, sizeof(fmtBuffer), PSTR("0;255;%d;0;%d;%lu "), + C_INTERNAL, I_LOG_MESSAGE, hwMillis()); + MY_SERIALDEVICE.print(fmtBuffer); +#else + // prepend timestamp + MY_SERIALDEVICE.print(hwMillis()); + MY_SERIALDEVICE.print(F(" ")); +#endif + va_list args; + va_start(args, fmt); +#ifdef MY_GATEWAY_FEATURE + // Truncate message if this is gateway node + vsnprintf_P(fmtBuffer, sizeof(fmtBuffer), fmt, args); + fmtBuffer[sizeof(fmtBuffer) - 2] = '\n'; + fmtBuffer[sizeof(fmtBuffer) - 1] = '\0'; +#else + vsnprintf_P(fmtBuffer, sizeof(fmtBuffer), fmt, args); +#endif + va_end(args); + MY_SERIALDEVICE.print(fmtBuffer); +} \ No newline at end of file diff --git a/hal/architecture/MyHwTeensy3.h b/hal/architecture/MyHwTeensy3.h new file mode 100644 index 0000000..59e31b7 --- /dev/null +++ b/hal/architecture/MyHwTeensy3.h @@ -0,0 +1,58 @@ +/** +* The MySensors Arduino library handles the wireless radio link and protocol +* between your home built sensors/actuators and HA controller of choice. +* The sensors forms a self healing radio network with optional repeaters. Each +* repeater and gateway builds a routing tables in EEPROM which keeps track of the +* network topology allowing messages to be routed to nodes. +* +* Created by Henrik Ekblad +* Copyright (C) 2013-2017 Sensnology AB +* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors +* +* Documentation: http://www.mysensors.org +* Support Forum: http://forum.mysensors.org +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* version 2 as published by the Free Software Foundation. +*/ + +#ifndef MyHwTeensy3_h +#define MyHwTeensy3_h + +#include "MyHw.h" +#ifdef __cplusplus +#include +#endif +#include "util/atomic.h" + +#ifndef _BV +#define _BV(x) (1<<(x)) +#endif + +// Define these as macros to save valuable space +#define hwDigitalWrite(__pin, __value) digitalWriteFast(__pin, __value) +#define hwDigitalRead(__pin) digitalReadFast(__pin) +#define hwPinMode(__pin, __value) pinMode(__pin, __value) +#define hwMillis() millis() + +// TODO: use hardware random number generator if Teensy 3.5 or 3.6 +#define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN)) + +bool hwInit(void); +void hwWatchdogReset(void); +void hwReboot(void); + +// Teensy 3.x implements avr-libc EEPROM API +#define hwReadConfig(__pos) eeprom_read_byte((uint8_t*)(__pos)) +#define hwWriteConfig(__pos, __val) eeprom_update_byte((uint8_t*)(__pos), (__val)) +#define hwReadConfigBlock(__buf, __pos, __length) eeprom_read_block((void*)(__buf), (void*)(__pos), (__length)) +#define hwWriteConfigBlock(__buf, __pos, __length) eeprom_update_block((void*)(__buf), (void*)(__pos), (__length)) + +#ifndef MY_SERIALDEVICE +#define MY_SERIALDEVICE Serial +#endif + +#define MY_CRITICAL_SECTION ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + +#endif \ No newline at end of file diff --git a/hal/architecture/MyMainTeensy3.cpp b/hal/architecture/MyMainTeensy3.cpp new file mode 100644 index 0000000..be68688 --- /dev/null +++ b/hal/architecture/MyMainTeensy3.cpp @@ -0,0 +1,31 @@ +/* + * The MySensors Arduino library handles the wireless radio link and protocol + * between your home built sensors/actuators and HA controller of choice. + * The sensors forms a self healing radio network with optional repeaters. Each + * repeater and gateway builds a routing tables in EEPROM which keeps track of the + * network topology allowing messages to be routed to nodes. + * + * Created by Henrik Ekblad + * Copyright (C) 2013-2017 Sensnology AB + * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors + * + * Documentation: http://www.mysensors.org + * Support Forum: http://forum.mysensors.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + */ + +int main(void) +{ + _begin(); // Startup MySensors library + for(;;) { + _process(); // Process incoming data + if (loop) { + loop(); // Call sketch loop + } + yield(); + } + return 0; +}