123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /*
- * This file is part of Espruino, a JavaScript interpreter for Microcontrollers
- *
- * Copyright (C) 2013 Gordon Williams <gw@pur3.co.uk>
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * ----------------------------------------------------------------------------
- * Platform Specific part of Hardware interface Layer
- * ----------------------------------------------------------------------------
- */
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/time.h>
- #include <signal.h>
- #include <inttypes.h>
- #include "jshardware.h"
- #include "jsutils.h"
- #include "jsparse.h"
- #include "jsinteractive.h"
- #include "jspininfo.h"
- #include <rtthread.h>
- // ----------------------------------------------------------------------------
- // for non-blocking IO
- void reset_terminal_mode()
- {
- }
- void set_conio_terminal_mode()
- {
- }
- struct
- {
- struct rt_semaphore sem;
- rt_device_t device;
- } dev4js;
- rt_err_t es_rx_ind(rt_device_t dev, rt_size_t size)
- {
- rt_sem_release(&dev4js.sem);
- return RT_EOK;
- }
- static int kbhit(void)
- {
- while (rt_sem_take(&dev4js.sem, RT_WAITING_FOREVER) != RT_EOK);
- return 1;
- }
- static char getch()
- {
- unsigned char c;
- if (rt_device_read(dev4js.device, 0, &c, 1) == 1) {
- if (c=='\3') exit(0); // ctrl-c
- return c;
- }
- }
- void jshInit() {
- rt_sem_init(&dev4js.sem, "jssem", 0, RT_IPC_FLAG_PRIO);
- }
- void jshKill() {
- }
- void jshIdle() {
- //while (kbhit()) {
- // jshPushIOCharEvent(EV_USBSERIAL, (char)getch());
- //}
- }
- // ----------------------------------------------------------------------------
- int jshGetSerialNumber(unsigned char *data, int maxChars) {
- long initialSerial = 0;
- long long serial = 0xDEADDEADDEADDEADL;
- memcpy(&data[0], &initialSerial, 4);
- memcpy(&data[4], &serial, 8);
- return 12;
- }
- unsigned int jshGetRegistrationCode() {
- unsigned int code = 0xFFFFFFFF;
- return code;
- }
- void jshSetRegistrationCode(unsigned int code) {
- }
- // ----------------------------------------------------------------------------
- void jshInterruptOff() {
- }
- void jshInterruptOn() {
- }
- void jshDelayMicroseconds(int microsec) {
- int ms = (microsec + 999) / 1000;
- rt_thread_sleep(rt_tick_from_millisecond(ms)); // don't sleep much if we have watches - we need to keep polling them
- }
- bool jshGetPinStateIsManual(Pin pin) {
- return false;
- }
- void jshSetPinStateIsManual(Pin pin, bool manual) {
- }
- void jshPinSetState(Pin pin, JshPinState state) {
- }
- JshPinState jshPinGetState(Pin pin) {
- return JSHPINSTATE_UNDEFINED;
- }
- void jshPinSetValue(Pin pin, bool value) {
- }
- bool jshPinGetValue(Pin pin) {
- return false;
- }
- bool jshIsDeviceInitialised(IOEventFlags device) { return true; }
- bool jshIsUSBSERIALConnected() {
- return false;
- }
- JsSysTime jshGetTimeFromMilliseconds(JsVarFloat ms) {
- return (JsSysTime)(ms*1000);
- }
- JsVarFloat jshGetMillisecondsFromTime(JsSysTime time) {
- return ((JsVarFloat)time)/1000;
- }
- JsSysTime jshGetSystemTime() {
- //struct timeval tm;
- //gettimeofday(&tm, 0);
- //return tm.tv_sec*1000000L + tm.tv_usec;
- return rt_tick_get() * (1000 / RT_TICK_PER_SECOND) * 1000;
- }
- // ----------------------------------------------------------------------------
- bool jshPinInput(Pin pin) {
- bool value = false;
- jsError("Invalid pin!");
- return value;
- }
- JsVarFloat jshPinAnalog(Pin pin) {
- JsVarFloat value = 0;
- jsError("Analog is not supported on this device.");
- return value;
- }
- void jshPinOutput(Pin pin, bool value) {
- }
- bool jshPinOutputAtTime(JsSysTime time, Pin pin, bool value) {
- // FIXME
- }
- void jshPinAnalogOutput(Pin pin, JsVarFloat value, JsVarFloat freq) { // if freq<=0, the default is used
- }
- void jshPinPulse(Pin pin, bool value, JsVarFloat time) {
- }
- void jshPinWatch(Pin pin, bool shouldWatch) {
- }
- bool jshGetWatchedPinState(IOEventFlags device) {
- return false;
- }
- bool jshIsEventForPin(IOEvent *event, Pin pin) {
- return false;
- }
- void jshUSARTSetup(IOEventFlags device, JshUSARTInfo *inf) {
- }
- /** Kick a device into action (if required). For instance we may need
- * to set up interrupts */
- void jshUSARTKick(IOEventFlags device) {
- }
- void jshSPISetup(IOEventFlags device, JshSPIInfo *inf) {
- }
- /** Send data through the given SPI device (if data>=0), and return the result
- * of the previous send (or -1). If data<0, no data is sent and the function
- * waits for data to be returned */
- int jshSPISend(IOEventFlags device, int data) {
- }
- /** Send 16 bit data through the given SPI device. */
- void jshSPISend16(IOEventFlags device, int data) {
- }
- /** Set whether to send 16 bits or 8 over SPI */
- void jshSPISet16(IOEventFlags device, bool is16) {
- }
- void jshI2CSetup(IOEventFlags device, JshI2CInfo *inf) {
- }
- void jshI2CWrite(IOEventFlags device, unsigned char address, int nBytes, const unsigned char *data) {
- }
- void jshI2CRead(IOEventFlags device, unsigned char address, int nBytes, unsigned char *data) {
- }
- void jshSaveToFlash() {
- }
- void jshLoadFromFlash() {
- }
- bool jshFlashContainsCode() {
- }
- /// Enter simple sleep mode (can be woken up by interrupts). Returns true on success
- bool jshSleep(JsSysTime timeUntilWake) {
- bool hasWatches = false;
- int ms = (hasWatches ? 1000 : (10*1000)) / 1000;
- rt_thread_sleep(rt_tick_from_millisecond(ms)); // don't sleep much if we have watches - we need to keep polling them
- return true;
- }
|