@@ -231,6 +231,79 @@ static int lua_camera_read(lua_State *L)
231
231
return 1 ;
232
232
}
233
233
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
+
234
307
static int lua_camera_auto (lua_State * L )
235
308
{
236
309
if (nrf_gpio_pin_out_read (CAMERA_SLEEP_PIN ) == false)
@@ -625,6 +698,9 @@ void lua_open_camera_library(lua_State *L)
625
698
lua_pushcfunction (L , lua_camera_read );
626
699
lua_setfield (L , -2 , "read" );
627
700
701
+ lua_pushcfunction (L , lua_camera_read_raw );
702
+ lua_setfield (L , -2 , "read_raw" );
703
+
628
704
lua_pushcfunction (L , lua_camera_auto );
629
705
lua_setfield (L , -2 , "auto" );
630
706
0 commit comments