rt-thread-official/components/external/espruino/targets/rtthread/jshardware.c

256 lines
5.4 KiB
C

/*
* 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;
}