Skip to content

Commit feeca8f

Browse files
committed
run event when vm is idle
1 parent 08d996c commit feeca8f

16 files changed

Lines changed: 102 additions & 43 deletions

File tree

port/linux/package/pikascript/TemplateDevice.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class GPIO(PikaStdDevice.GPIO):
1010
def platformSetMode(self): ...
1111
def platformRead(self): ...
1212
def platformGetEventId(self): ...
13+
def eventTest(self): ...
1314

1415

1516
class Time(PikaStdDevice.Time):

port/linux/package/pikascript/pikascript-lib/TemplateDevice/TemplateDevice_GPIO.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,14 @@ void TemplateDevice_GPIO_platformGetEventId(PikaObj* self) {
1414
obj_setInt(self, "eventId", GPIO_PA8_EVENT_ID);
1515
}
1616
}
17+
18+
19+
extern PikaEventListener* g_pika_device_event_listener;
20+
#define EVENT_SIGAL_IO_RISING_EDGE 0x01
21+
#define EVENT_SIGAL_IO_FALLING_EDGE 0x02
22+
#define GPIO_PA8_EVENT_ID 0x08
23+
24+
void TemplateDevice_GPIO_eventTest(PikaObj *self){
25+
pks_eventLisener_sendSignal(g_pika_device_event_listener, GPIO_PA8_EVENT_ID,
26+
EVENT_SIGAL_IO_FALLING_EDGE);
27+
}

src/PikaCompiler.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,11 +329,9 @@ int LibObj_saveLibraryFile(LibObj* self, char* output_file_name) {
329329
}
330330

331331
int LibObj_loadLibrary(LibObj* self, uint8_t* library_bytes) {
332-
#ifndef _WIN32
333-
if (0 != ((uintptr_t)library_bytes & 0x03)) {
332+
if (0 != ((intptr_t)library_bytes & 0x03)) {
334333
return PIKA_RES_ERR_UNALIGNED_PTR;
335334
}
336-
#endif
337335

338336
char* magic_code = (char*)library_bytes;
339337

src/PikaObj.c

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,9 +1307,7 @@ PikaObj* Obj_linkLibraryFile(PikaObj* self, char* input_file_name) {
13071307
PikaObj* obj_linkLibrary(PikaObj* self, uint8_t* library_bytes) {
13081308
obj_newMetaObj(self, "@lib", New_LibObj);
13091309
LibObj* lib = obj_getObj(self, "@lib");
1310-
if(0 != LibObj_loadLibrary(lib, library_bytes)){
1311-
__platform_printf("VM Error: load bytecode library failed\r\n");
1312-
}
1310+
LibObj_loadLibrary(lib, library_bytes);
13131311
return self;
13141312
}
13151313

@@ -1428,20 +1426,11 @@ void pks_eventLisener_deinit(PikaEventListener** p_self) {
14281426
}
14291427
}
14301428

1431-
void pks_eventLisener_sendSignal(PikaEventListener* self,
1432-
uint32_t eventId,
1433-
int eventSignal) {
1434-
PikaObj* eventHandleObj = pks_eventLisener_getEventHandleObj(self, eventId);
1435-
if (NULL == eventHandleObj) {
1436-
__platform_printf(
1437-
"Error: can not find event handler by id: [0x%02x]\r\n", eventId);
1438-
return;
1439-
}
1440-
obj_setInt(eventHandleObj, "eventSignal", eventSignal);
1429+
void __eventLisener_runEvent(PikaObj* eventHandleObj) {
14411430
/* clang-format off */
14421431
PIKA_PYTHON(
14431432
eventCallBack(eventSignal)
1444-
)
1433+
)
14451434
/* clang-format on */
14461435
const uint8_t bytes[] = {
14471436
0x08, 0x00, 0x00, 0x00, /* instruct array size */
@@ -1454,6 +1443,31 @@ void pks_eventLisener_sendSignal(PikaEventListener* self,
14541443
pikaVM_runByteCode(eventHandleObj, (uint8_t*)bytes);
14551444
}
14561445

1446+
void pks_eventLisener_sendSignal(PikaEventListener* self,
1447+
uint32_t eventId,
1448+
int eventSignal) {
1449+
PikaObj* eventHandleObj = pks_eventLisener_getEventHandleObj(self, eventId);
1450+
if (NULL == eventHandleObj) {
1451+
__platform_printf(
1452+
"Error: can not find event handler by id: [0x%02x]\r\n", eventId);
1453+
return;
1454+
}
1455+
obj_setInt(eventHandleObj, "eventSignal", eventSignal);
1456+
if (0 == VMSignal_getVMCnt()) {
1457+
/* no vm is running, run event handler directly */
1458+
__eventLisener_runEvent(eventHandleObj);
1459+
return;
1460+
}
1461+
/* push event handler to vm event list */
1462+
if (PIKA_RES_OK != VMSignal_pushEvent(eventHandleObj)) {
1463+
__platform_printf(
1464+
"OverflowError: event list is full, please use bigger "
1465+
"PIKA_EVENT_LIST_SIZE\r\n");
1466+
while (1) {
1467+
}
1468+
}
1469+
}
1470+
14571471
/* print major version info */
14581472
void pks_printVersion(void) {
14591473
__platform_printf("pikascript-core==v%d.%d.%d (%s)\r\n", PIKA_VERSION_MAJOR,

src/PikaObj.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,5 +470,6 @@ void _obj_updateProxyFlag(PikaObj* self);
470470
_obj_updateProxyFlag((_self))
471471

472472
Arg* _obj_getProp(PikaObj* obj, char* name);
473+
void __eventLisener_runEvent(PikaObj* eventHandleObj);
473474

474475
#endif

src/PikaParser.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -881,24 +881,24 @@ char* Lexer_getOperator(Args* outBuffs, char* stmt) {
881881
const char void_str[] = "";
882882

883883
void LexToken_update(struct LexToken* lex_token) {
884-
lex_token->type = Token_getType(lex_token->token);
884+
lex_token->type = Token_getType(lex_token->tokenStream);
885885
if (lex_token->type == TOKEN_strEnd) {
886886
lex_token->pyload = (char*)void_str;
887887
} else {
888-
lex_token->pyload = Token_getPyload(lex_token->token);
888+
lex_token->pyload = Token_getPyload(lex_token->tokenStream);
889889
}
890890
}
891891

892892
void Cursor_iterStart(struct Cursor* cs) {
893893
cs->iter_index++;
894894
cs->iter_buffs = New_strBuff();
895895
/* token1 is the last token */
896-
cs->token1.token = strsCopy(cs->iter_buffs, arg_getStr(cs->last_token));
896+
cs->token1.tokenStream = strsCopy(cs->iter_buffs, arg_getStr(cs->last_token));
897897
/* token2 is the next token */
898-
cs->token2.token = TokenStream_pop(cs->iter_buffs, &cs->tokenStream);
898+
cs->token2.tokenStream = TokenStream_pop(cs->iter_buffs, &cs->tokenStream);
899899
/* store last token */
900900
arg_deinit(cs->last_token);
901-
cs->last_token = arg_newStr(cs->token2.token);
901+
cs->last_token = arg_newStr(cs->token2.tokenStream);
902902

903903
LexToken_update(&cs->token1);
904904
LexToken_update(&cs->token2);
@@ -924,7 +924,7 @@ void Cursor_iterStart(struct Cursor* cs) {
924924

925925
void LexToken_init(struct LexToken* lt) {
926926
lt->pyload = NULL;
927-
lt->token = NULL;
927+
lt->tokenStream = NULL;
928928
lt->type = TOKEN_strEnd;
929929
}
930930

src/PikaParser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ typedef struct GenRule {
7979

8080
typedef struct LexToken LexToken;
8181
struct LexToken {
82-
char* token;
82+
char* tokenStream;
8383
enum TokenType type;
8484
char* pyload;
8585
};

src/PikaPlatform.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,13 @@
3636
#include <stdlib.h>
3737
#include <string.h>
3838

39-
#define _pika_assert(expr) \
40-
if (!(expr)) { \
41-
__platform_printf("Assertion failed: %s\nfile: %s:%d\n", #expr, \
42-
__FILE__, __LINE__); \
43-
abort(); \
44-
}
45-
4639
/* clang-format off */
4740
#if PIKA_ASSERT_ENABLE
48-
#define pika_assert(expr) _pika_assert(expr)
41+
#define pika_assert(expr) \
42+
if(!(expr)) { \
43+
__platform_printf("Assertion failed: %s\nfile: %s:%d\n", #expr, __FILE__, __LINE__); \
44+
abort(); \
45+
}
4946
#else
5047
#define pika_assert(...)
5148
#endif
@@ -98,6 +95,7 @@ typedef enum {
9895
PIKA_RES_ERR_SYNTAX_ERROR,
9996
PIKA_RES_ERR_IO,
10097
PIKA_RES_ERR_ASSERT,
98+
PIKA_RES_ERR_SIGNAL_EVENT_FULL,
10199
} PIKA_RES;
102100

103101
/* clang-format off */

src/PikaVM.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,28 @@
3939
static volatile VMSignal PikaVMSignal = {
4040
.signal_ctrl = VM_SIGNAL_CTRL_NONE,
4141
.vm_cnt = 0,
42+
.event_top = 0,
4243
};
4344

45+
int VMSignal_getVMCnt(void) {
46+
return PikaVMSignal.vm_cnt;
47+
}
48+
49+
PIKA_RES VMSignal_pushEvent(PikaObj* eventHandleObj) {
50+
if (PikaVMSignal.event_top >= PIKA_EVENT_LIST_SIZE) {
51+
return PIKA_RES_ERR_SIGNAL_EVENT_FULL;
52+
}
53+
PikaVMSignal.event_obj_list[PikaVMSignal.event_top++] = eventHandleObj;
54+
return PIKA_RES_OK;
55+
}
56+
57+
PikaObj* VMSignal_popEvent(void) {
58+
if (PikaVMSignal.event_top <= 0) {
59+
return NULL;
60+
}
61+
return PikaVMSignal.event_obj_list[--PikaVMSignal.event_top];
62+
}
63+
4464
VM_SIGNAL_CTRL VMSignal_getCtrl(void) {
4565
return PikaVMSignal.signal_ctrl;
4666
}
@@ -2856,7 +2876,7 @@ void VMState_solveUnusedStack(VMState* vm) {
28562876
} else if (type == ARG_TYPE_BYTES) {
28572877
arg_printBytes(arg);
28582878
} else if (ARG_TYPE_POINTER == type ||
2859-
ARG_TYPE_METHOD_NATIVE_CONSTRUCTOR == type) {
2879+
ARG_TYPE_METHOD_NATIVE_CONSTRUCTOR) {
28602880
__platform_printf("%p\r\n", arg_getPtr(arg));
28612881
}
28622882
arg_deinit(arg);
@@ -2913,6 +2933,10 @@ static VMParameters* __pikaVM_runByteCodeFrameWithState(
29132933
__pks_hook_instruct();
29142934
}
29152935
#endif
2936+
PikaObj* eventHandleObj = VMSignal_popEvent();
2937+
if (NULL != eventHandleObj) {
2938+
__eventLisener_runEvent(eventHandleObj);
2939+
}
29162940
if (0 != vm.error_code) {
29172941
vm.line_error_code = vm.error_code;
29182942
InstructUnit* head_ins_unit = this_ins_unit;

src/PikaVM.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ typedef struct VMSignal VMSignal;
108108
struct VMSignal {
109109
VM_SIGNAL_CTRL signal_ctrl;
110110
int vm_cnt;
111+
PikaObj* event_obj_list[PIKA_EVENT_LIST_SIZE];
112+
int event_top;
111113
};
112114

113115
VMParameters* pikaVM_run(PikaObj* self, char* pyLine);
@@ -230,5 +232,8 @@ void __vm_Dict___init__(PikaObj* self);
230232
VM_SIGNAL_CTRL VMSignal_getCtrl(void);
231233
void pks_vm_exit(void);
232234
void pks_vmSignal_setCtrlElear(void);
235+
int VMSignal_getVMCnt(void);
236+
PikaObj* VMSignal_popEvent(void);
237+
PIKA_RES VMSignal_pushEvent(PikaObj* eventHandleObj);
233238

234239
#endif

0 commit comments

Comments
 (0)