Glue logic must implement:
if (debug command queue is not empty) execute debug command else if (executing a thread) run VM else if (event queue is not empty) fetch event run VM else sleep until something happens
#define ASEBA_NATIVES_STD_DESCRIPTIONS |
&AsebaNativeDescription_veccopy, \ &AsebaNativeDescription_vecfill, \ &AsebaNativeDescription_vecaddscalar, \ &AsebaNativeDescription_vecadd, \ &AsebaNativeDescription_vecsub, \ &AsebaNativeDescription_vecmul, \ &AsebaNativeDescription_vecdiv, \ &AsebaNativeDescription_vecmin, \ &AsebaNativeDescription_vecmax, \ &AsebaNativeDescription_vecdot, \ &AsebaNativeDescription_vecstat, \ &AsebaNativeDescription_mathmuldiv, \ &AsebaNativeDescription_mathatan2, \ &AsebaNativeDescription_mathsin, \ &AsebaNativeDescription_mathcos, \ &AsebaNativeDescription_mathrot2, \ &AsebaNativeDescription_mathsqrt, \ &AsebaNativeDescription_vecnonzerosequence
snippet to include descriptions of standard native functions
#define ASEBA_NATIVES_STD_FUNCTIONS |
AsebaNative_veccopy, \ AsebaNative_vecfill, \ AsebaNative_vecaddscalar, \ AsebaNative_vecadd, \ AsebaNative_vecsub, \ AsebaNative_vecmul, \ AsebaNative_vecdiv, \ AsebaNative_vecmin, \ AsebaNative_vecmax, \ AsebaNative_vecdot, \ AsebaNative_vecstat, \ AsebaNative_mathmuldiv, \ AsebaNative_mathatan2, \ AsebaNative_mathsin, \ AsebaNative_mathcos, \ AsebaNative_mathrot2, \ AsebaNative_mathsqrt, \ AsebaNative_vecnonzerosequence
snippet to include standard native functions
#define AsebaMaskClear | ( | v, | |||
m | ) | ((v) &= (~(m))) |
#define AsebaMaskIsClear | ( | v, | |||
m | ) | (((v) & (m)) == 0) |
#define AsebaMaskIsSet | ( | v, | |||
m | ) | (((v) & (m)) != 0) |
#define AsebaMaskSet | ( | v, | |||
m | ) | ((v) |= (m)) |
#define BIT_CLR | ( | v, | |||
b | ) | ((v) &= (~(1 << (b)))) |
#define BIT_SET | ( | v, | |||
b | ) | ((v) |= (1 << (b))) |
#define GET_BIT | ( | v, | |||
b | ) | (((v) >> (b)) & 0x1) |
typedef void(* AsebaNativeFunctionPointer)(AsebaVMState *vm) |
anonymous enum |
void AsebaDebugBareRun | ( | AsebaVMState * | vm, | |
uint16 | stepsLimit | |||
) |
void AsebaDebugBreakpointRun | ( | AsebaVMState * | vm, | |
uint16 | stepsLimit | |||
) |
void AsebaNative_mathatan2 | ( | AsebaVMState * | vm | ) |
Function to perform atan2
void AsebaNative_mathcos | ( | AsebaVMState * | vm | ) |
Function to perform cos
void AsebaNative_mathmuldiv | ( | AsebaVMState * | vm | ) |
Function to perform dest = (a*b)/c in 32 bits
void AsebaNative_mathrot2 | ( | AsebaVMState * | vm | ) |
Function to perform the rotation of a vector
void AsebaNative_mathsin | ( | AsebaVMState * | vm | ) |
Function to perform sin
void AsebaNative_mathsqrt | ( | AsebaVMState * | vm | ) |
Function to perform sqrt
void AsebaNative_vecadd | ( | AsebaVMState * | vm | ) |
Function to add two vectors
void AsebaNative_vecaddscalar | ( | AsebaVMState * | vm | ) |
Function to add a scalar to each element of a vector
void AsebaNative_veccopy | ( | AsebaVMState * | vm | ) |
Function to copy a vector
void AsebaNative_vecdiv | ( | AsebaVMState * | vm | ) |
Function to divide two vectors elements by elements
void AsebaNative_vecdot | ( | AsebaVMState * | vm | ) |
Function to perform a dot product on a vector
void AsebaNative_vecfill | ( | AsebaVMState * | vm | ) |
Function to fill all the elements of a vector to a specific value
void AsebaNative_vecmax | ( | AsebaVMState * | vm | ) |
Function to take the element by element maximum
void AsebaNative_vecmin | ( | AsebaVMState * | vm | ) |
Function to take the element by element minimum
void AsebaNative_vecmul | ( | AsebaVMState * | vm | ) |
Function to multiply two vectors elements by elements
void AsebaNative_vecnonzerosequence | ( | AsebaVMState * | vm | ) |
Function to get the middle index of the largest sequence of non-zero elements
void AsebaNative_vecstat | ( | AsebaVMState * | vm | ) |
Function to perform statistics on a vector
void AsebaNative_vecsub | ( | AsebaVMState * | vm | ) |
Function to substract two vectors
void AsebaNativeFunction | ( | AsebaVMState * | vm, | |
uint16 | id | |||
) |
Called by AsebaStep to perform a native function call.
Definition at line 35 of file LocalVirtualMachine.cpp.
static sint16 AsebaNativePopArg | ( | AsebaVMState * | vm | ) | [inline, static] |
void AsebaPutVmToSleep | ( | AsebaVMState * | vm | ) |
Called by AsebaVMDebugMessage when VM must put to node in deep sleep. Write an empty function to leave feature unsupported
Definition at line 921 of file challenge.cpp.
void AsebaResetIntoBootloader | ( | AsebaVMState * | vm | ) |
Called by AsebaVMDebugMessage when VM must restart the node and enter to the bootloader, write an empty function to leave feature unsupported
Definition at line 976 of file challenge.cpp.
void AsebaSendDescription | ( | AsebaVMState * | vm | ) |
Called by AsebaVMDebugMessage when VM must send its description on the network.
Definition at line 97 of file vm-buffer.c.
void AsebaSendMessage | ( | AsebaVMState * | vm, | |
uint16 | id, | |||
void * | data, | |||
uint16 | size | |||
) |
Called by AsebaStep if there is a message (not an user event) to send. size is given in number of bytes.
Definition at line 71 of file vm-buffer.c.
void AsebaSendVariables | ( | AsebaVMState * | vm, | |
uint16 | start, | |||
uint16 | length | |||
) |
Called by AsebaVMDebugMessage when some variables must be sent efficiently
Definition at line 84 of file vm-buffer.c.
uint16 AsebaVMCheckBreakpoint | ( | AsebaVMState * | vm | ) |
uint16 AsebaVMClearBreakpoint | ( | AsebaVMState * | vm, | |
uint16 | pc | |||
) |
void AsebaVMClearBreakpoints | ( | AsebaVMState * | vm | ) |
void AsebaVMDebugMessage | ( | AsebaVMState * | vm, | |
uint16 | id, | |||
uint16 * | data, | |||
uint16 | dataLength | |||
) |
Execute a debug action from a debug message. dataLength is given in number of uint16.
static sint16 AsebaVMDoBinaryOperation | ( | AsebaVMState * | vm, | |
sint16 | valueOne, | |||
sint16 | valueTwo, | |||
uint16 | op | |||
) | [static] |
static sint16 AsebaVMDoUnaryOperation | ( | AsebaVMState * | vm, | |
sint16 | value, | |||
uint16 | op | |||
) | [static] |
void AsebaVMEmitNodeSpecificError | ( | AsebaVMState * | vm, | |
const char * | message | |||
) |
Can be called by glue code (including native functions), to stop vm and emit a node specific error
uint16 AsebaVMGetEventAddress | ( | AsebaVMState * | vm, | |
uint16 | event | |||
) |
Return the starting address of an event, or 0 if the event is not handled.
void AsebaVMInit | ( | AsebaVMState * | vm | ) |
Setup the execution status of the VM. This is not sufficient to have a working VM. nodeId and bytecode, variables, and stack along with their sizes must be set outside this function. The content of the variable array is zeroed by this function.
uint16 AsebaVMRun | ( | AsebaVMState * | vm, | |
uint16 | stepsLimit | |||
) |
Run the VM depending on the current execution mode. Either run or step, depending of the current mode. If stepsLimit > 0, execute at maximim stepsLimit Return 1 if anything was executed, 0 otherwise.
void AsebaVMSendExecutionStateChanged | ( | AsebaVMState * | vm | ) |
uint8 AsebaVMSetBreakpoint | ( | AsebaVMState * | vm, | |
uint16 | pc | |||
) |
uint16 AsebaVMSetupEvent | ( | AsebaVMState * | vm, | |
uint16 | event | |||
) |
Setup VM to execute an event. If event is not handled, VM is not ready for run. Return the starting address of the event, or 0 if the event is not handled.
uint16 AsebaVMShouldDropPacket | ( | AsebaVMState * | vm, | |
uint16 | source, | |||
const uint8 * | data | |||
) |
Return non-zero if VM will ignore the packet, 0 otherwise
void AsebaVMStep | ( | AsebaVMState * | vm | ) |
void AsebaWriteBytecode | ( | AsebaVMState * | vm | ) |
Called by AsebaVMDebugMessage when VM must write its bytecode to flash, write an empty function to leave feature unsupported
Definition at line 972 of file challenge.cpp.
const sint16 aseba_atan_table[20 *8+1] = { 652, 735, 816, 896, 977, 1058, 1139, 1218, 1300, 1459, 1620, 1777, 1935, 2093, 2250, 2403, 2556, 2868, 3164, 3458, 3748, 4029, 4307, 4578, 4839, 5359, 5836, 6290, 6720, 7126, 7507, 7861, 8203, 8825, 9357, 9839, 10260, 10640, 10976, 11281, 11557, 12037, 12425, 12755, 13036, 13277, 13486, 13671, 13837, 14112, 14331, 14514, 14666, 14796, 14907, 15003, 15091, 15235, 15348, 15441, 15519, 15585, 15642, 15691, 15736, 15808, 15865, 15912, 15951, 15984, 16013, 16037, 16060, 16096, 16125, 16148, 16168, 16184, 16199, 16211, 16222, 16240, 16255, 16266, 16276, 16284, 16292, 16298, 16303, 16312, 16320, 16325, 16331, 16334, 16338, 16341, 16344, 16348, 16352, 16355, 16357, 16360, 16361, 16363, 16364, 16366, 16369, 16369, 16371, 16372, 16373, 16373, 16375, 16375, 16377, 16376, 16378, 16378, 16378, 16379, 16379, 16380, 16380, 16380, 16382, 16381, 16381, 16381, 16382, 16382, 16382, 16382, 16382, 16382, 16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384 } [static] |
const sint16 aseba_sin_table[128+1] = {0, 403, 804, 1207, 1608, 2010, 2411, 2812, 3212, 3612, 4011, 4411, 4808, 5206, 5603, 5998, 6393, 6787, 7180, 7572, 7962, 8352, 8740, 9127, 9513, 9896, 10279, 10660, 11040, 11417, 11794, 12167, 12540, 12911, 13279, 13646, 14010, 14373, 14733, 15091, 15447, 15801, 16151, 16500, 16846, 17190, 17531, 17869, 18205, 18538, 18868, 19196, 19520, 19842, 20160, 20476, 20788, 21097, 21403, 21706, 22006, 22302, 22595, 22884, 23171, 23453, 23732, 24008, 24279, 24548, 24812, 25073, 25330, 25583, 25833, 26078, 26320, 26557, 26791, 27020, 27246, 27467, 27684, 27897, 28106, 28311, 28511, 28707, 28899, 29086, 29269, 29448, 29622, 29792, 29957, 30117, 30274, 30425, 30572, 30715, 30852, 30985, 31114, 31238, 31357, 31471, 31581, 31686, 31786, 31881, 31972, 32057, 32138, 32215, 32285, 32352, 32413, 32470, 32521, 32569, 32610, 32647, 32679, 32706, 32728, 32746, 32758, 32766, 32767, } [static] |
{ "math.nzseq", "write to dest the middle index of the largest sequence of non-zero elements from src, -1 if not found or if smaller than minLength", { { 1, "dest" }, { -1, "src" }, { 1, "minLength" }, { 0, 0 } } }
Description of AsebaNative_vecnonzerosequence