@@ -231,6 +231,79 @@ static int lua_camera_read(lua_State *L)
231231 return 1 ;
232232}
233233
234+ static int lua_camera_read_raw (lua_State * L )
235+ {
236+ lua_Integer bytes_requested = luaL_checkinteger (L , 1 );
237+ if (bytes_requested <= 0 )
238+ {
239+ luaL_error (L , "bytes must be greater than 0" );
240+ }
241+
242+ size_t bytes_remaining = bytes_requested ;
243+
244+ uint8_t * payload = malloc (bytes_requested );
245+ if (payload == NULL )
246+ {
247+ luaL_error (L , "bytes requested is too large" );
248+ }
249+
250+ uint16_t image_bytes_available = get_bytes_available ();
251+
252+ // Append image data
253+ if (image_bytes_available > 0 )
254+ {
255+ if (bytes_remaining > 0 )
256+ {
257+
258+ // append image data
259+ size_t length = bytes_remaining < image_bytes_available
260+ ? bytes_remaining
261+ : image_bytes_available ;
262+
263+ spi_read (FPGA ,
264+ 0x22 ,
265+ payload + bytes_requested - bytes_remaining ,
266+ length );
267+
268+ bytes_remaining -= length ;
269+ }
270+ }
271+
272+ else
273+ {
274+ // append footer 0xFF
275+ if (bytes_remaining > 0 && jpeg_footer_bytes_sent_out == 0 )
276+ {
277+ payload [bytes_requested - bytes_remaining ] = 0xFF ;
278+ jpeg_footer_bytes_sent_out ++ ;
279+ bytes_remaining -- ;
280+ }
281+
282+ // append footer 0xD9
283+ if (bytes_remaining > 0 && jpeg_footer_bytes_sent_out == 1 )
284+ {
285+ payload [bytes_requested - bytes_remaining ] = 0xD9 ;
286+ jpeg_footer_bytes_sent_out ++ ;
287+ bytes_remaining -- ;
288+ }
289+ }
290+
291+ // Return nill if nothing was written to payload
292+ if (bytes_remaining == bytes_requested )
293+ {
294+ lua_pushnil (L );
295+ }
296+
297+ // Otherwise return payload
298+ else
299+ {
300+ lua_pushlstring (L , (char * )payload , bytes_requested - bytes_remaining );
301+ }
302+
303+ free (payload );
304+ return 1 ;
305+ }
306+
234307static int lua_camera_auto (lua_State * L )
235308{
236309 if (nrf_gpio_pin_out_read (CAMERA_SLEEP_PIN ) == false)
@@ -625,6 +698,9 @@ void lua_open_camera_library(lua_State *L)
625698 lua_pushcfunction (L , lua_camera_read );
626699 lua_setfield (L , -2 , "read" );
627700
701+ lua_pushcfunction (L , lua_camera_read_raw );
702+ lua_setfield (L , -2 , "read_raw" );
703+
628704 lua_pushcfunction (L , lua_camera_auto );
629705 lua_setfield (L , -2 , "auto" );
630706
0 commit comments