1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-11-30 08:24:11 +01:00
LibrePilot/flight/Libraries/PyMite/lib/ipm.py

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: