mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-05 13:24:11 +01:00
107 lines
2.7 KiB
Python
107 lines
2.7 KiB
Python
# This file is Copyright 2007, 2009, 2010 Dean Hall.
|
|
#
|
|
# This file is part of the Python-on-a-Chip program.
|
|
# Python-on-a-Chip is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
|
|
#
|
|
# Python-on-a-Chip is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
# A copy of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1
|
|
# is seen in the file COPYING in this directory.
|
|
|
|
## @file
|
|
# @copybrief ipm_target
|
|
|
|
## @package ipm_target
|
|
# @brief Provides PyMite's interactive interface for the target.
|
|
|
|
|
|
##
|
|
# Receives an image over the platform's standard connection.
|
|
# Returns the image in a string object
|
|
#
|
|
def _getImg():
|
|
"""__NATIVE__
|
|
PmReturn_t retval;
|
|
uint8_t imgType;
|
|
uint16_t imgSize;
|
|
uint8_t *pchunk;
|
|
pPmCodeImgObj_t pimg;
|
|
uint16_t i;
|
|
uint8_t b;
|
|
|
|
/* Get the image type */
|
|
retval = plat_getByte(&imgType);
|
|
PM_RETURN_IF_ERROR(retval);
|
|
|
|
/* Quit if a code image type was not received */
|
|
if (imgType != OBJ_TYPE_CIM)
|
|
{
|
|
PM_RAISE(retval, PM_RET_EX_STOP);
|
|
return retval;
|
|
}
|
|
|
|
/* Get the image size (little endien) */
|
|
retval = plat_getByte(&b);
|
|
PM_RETURN_IF_ERROR(retval);
|
|
imgSize = b;
|
|
retval = plat_getByte(&b);
|
|
PM_RETURN_IF_ERROR(retval);
|
|
imgSize |= (b << 8);
|
|
|
|
/* Get space for CodeImgObj */
|
|
retval = heap_getChunk(sizeof(PmCodeImgObj_t) + imgSize, &pchunk);
|
|
PM_RETURN_IF_ERROR(retval);
|
|
pimg = (pPmCodeImgObj_t)pchunk;
|
|
OBJ_SET_TYPE(pimg, OBJ_TYPE_CIO);
|
|
|
|
/* Start the image with the bytes that have already been received */
|
|
i = 0;
|
|
pimg->val[i++] = imgType;
|
|
pimg->val[i++] = imgSize & 0xFF;
|
|
pimg->val[i++] = (imgSize >> 8) & 0xFF;
|
|
|
|
/* Get the remaining bytes in the image */
|
|
for(; i < imgSize; i++)
|
|
{
|
|
retval = plat_getByte(&b);
|
|
PM_RETURN_IF_ERROR(retval);
|
|
|
|
pimg->val[i] = b;
|
|
}
|
|
|
|
/* Return the image as a code image object on the stack */
|
|
NATIVE_SET_TOS((pPmObj_t)pimg);
|
|
return retval;
|
|
"""
|
|
pass
|
|
|
|
|
|
def x04():
|
|
"""__NATIVE__
|
|
NATIVE_SET_TOS(PM_NONE);
|
|
return plat_putByte(0x04);
|
|
"""
|
|
pass
|
|
|
|
|
|
##
|
|
# Runs the target device-side interactive session.
|
|
#
|
|
def ipm(g={}):
|
|
while 1:
|
|
# Wait for a code image, make a code object from it
|
|
# and evaluate the code object.
|
|
# #180: One-liner turned into 3 so that objects get bound to roots
|
|
s = _getImg()
|
|
co = Co(s)
|
|
rv = eval(co, g)
|
|
x04()
|
|
|
|
# Execution should never reach here
|
|
# The while loop (above) probably caught a StopIteration, accidentally
|
|
assert False
|
|
|
|
# :mode=c:
|