Compare commits

3 Commits

Author SHA1 Message Date
490d76dbe3 Implementación de la clase CapturaImagen, donde se toma una captura de pantalla de la imagen del escaneo, la cual se almacena en carpetas separadas por fecha. 2026-04-30 10:15:33 -06:00
2e45a0562e Cambios en la Etiqueta.prn
Se agregaron dos nuevos valores: $v4 y $v5 para agregar un número de serie y la fecha de impresión.
Cambios en el modo debug para realizar pruebas de impresorea sin el sensor
2026-03-24 15:59:13 -06:00
7c8fcb16ae # Cambios en la etiqueta
Se agregaron dos variables nuevas para las etiquetas
$V4$ - Número consecutivo
$V5$ - Fecha/Hora de ejecución-impresión

Se agregó una condición para que el consecutivo se reinicie cada dia.

Se arreglaron algunos errores de compilación
2026-03-12 11:40:14 -06:00
12 changed files with 586 additions and 54 deletions

126
ScanBox/CapturaImagen.cs Normal file
View File

@@ -0,0 +1,126 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ScaBox30
{
public class CapturaImagen : IDisposable
{
private Bitmap screenshot;
/// <summary>
/// Captura una zona específica de la pantalla a partir de un PictureBox
/// </summary>
/// <param name="pictureBox">El PictureBox a capturar</param>
/// <param name="delayMs">Delay en milisegundos antes de capturar (por defecto 500ms)</param>
public Bitmap CapturarImg(PictureBox pictureBox, int delayMs = 500)
{
try
{
if (pictureBox == null)
{
MessageBox.Show("El PictureBox no puede ser nulo.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
// Forzar que la UI se redibuje antes de capturar
pictureBox.Refresh();
Application.DoEvents();
// Esperar a que la imagen se actualice completamente
System.Threading.Thread.Sleep(delayMs);
// Obtener las coordenadas en pantalla del PictureBox
Point screenLocation = pictureBox.PointToScreen(Point.Empty);
int x = screenLocation.X;
int y = screenLocation.Y;
int width = pictureBox.Width;
int height = pictureBox.Height;
// Crear una imagen con el tamaño del PictureBox
screenshot = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(screenshot))
{
// Capturar la zona específica de la pantalla
g.CopyFromScreen(x, y, 0, 0, new Size(width, height));
}
return screenshot;
}
catch (Exception ex)
{
MessageBox.Show($"Error al capturar pantalla:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
public void GuardarImg(string productNum, string operatorTag)
{
// Validar que la captura existe
if (screenshot == null)
{
MessageBox.Show("No hay captura de pantalla disponible. Realiza una captura primero.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
try
{
// Crear la carpeta de destino
string picturesPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "BoxScaner");
string capturesFolder = Path.Combine(picturesPath, Globals.consecDate.ToString("yyyy-MM-dd"));
if (!Directory.Exists(capturesFolder))
{
Directory.CreateDirectory(capturesFolder);
}
// Generar nombre de archivo con timestamp y sanitizar caracteres inválidos
string timestamp = DateTime.Now.ToString("HH-mm-ss");
string safeProductNum = Path.GetInvalidFileNameChars().Aggregate(productNum, (current, c) => current.Replace(c.ToString(), ""));
string safeOperatorTag = Path.GetInvalidFileNameChars().Aggregate(operatorTag, (current, c) => current.Replace(c.ToString(), ""));
// Formato de fecha juliano: yyyyDDD
int julianDay = Globals.consecDate.DayOfYear;
string julianDate = $"{Globals.consecDate:yyyy}{julianDay:000}";
// Formato: CONSECUTIVO_yyyyDDD_TIMESTAMP_PRODUCTO_OPERADOR.png
string fileName = Path.Combine(capturesFolder,
$"{Globals.consec:D5}_{julianDate}_{timestamp}_{safeProductNum}_{safeOperatorTag}.png");
// Guardar la captura como PNG
screenshot.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show($"Acceso denegado al guardar imagen:\n{ex.Message}", "Error de permisos", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (IOException ex)
{
MessageBox.Show($"Error al guardar imagen:\n{ex.Message}", "Error de I/O", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show($"Error inesperado al guardar imagen:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Libera los recursos de la captura de pantalla
/// </summary>
public void Dispose()
{
if (screenshot != null)
{
screenshot.Dispose();
screenshot = null;
}
}
}
}

View File

@@ -33,6 +33,7 @@ namespace ScaBox30.Controller
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine(e); Console.WriteLine(e);
System.Windows.Forms.MessageBox.Show("Error al conectar con la BD: " + e.Message);
} }
} }

View File

@@ -49,7 +49,7 @@ namespace ScaBox30.Controller
#endregion #endregion
#region ZEBRA -> buildPrn() #region ZEBRA -> buildPrn()
public void buildPrn(String v1, String v2, String v3, String barcode) public void buildPrn(String v1, String v2, String v3, String v4, DateTime v5, String barcode)
{ {
try try
{ {
@@ -85,6 +85,16 @@ namespace ScaBox30.Controller
{ {
etiqueta += line.Replace("$V3$", v3); etiqueta += line.Replace("$V3$", v3);
} }
else if (line.Contains("$V4$"))
{
etiqueta += line.Replace("$V4$", v4.ToString()); //consecutivo
}
else if (line.Contains("$V5$"))
{
// Insertar fecha formateada en formato juliano (yyyyDDD)
int julianDay = v5.DayOfYear;
etiqueta += line.Replace("$V5$", $"{v5:yyyy}{julianDay:000}"); // yyyyDDD
}
else else
{ {
etiqueta += line; etiqueta += line;
@@ -94,7 +104,6 @@ namespace ScaBox30.Controller
} }
} }
#endregion #endregion

View File

@@ -0,0 +1,308 @@
# ?? Gu<47>a de Pruebas sin Sensor SR-X300W
## Estado Actual
? **La variable `Globals.debug = true` ya est<73> activada** en `Globals.cs`
## <20>C<EFBFBD>mo Funciona el Modo Debug?
### 1. **Flujo de Ejecuci<63>n con Debug Activado**
Cuando presionas el bot<6F>n **"Ejecutar Lectura"** (`TgrBtn_Click`):
```
???????????????????????????????????????????????????????????????
? Bot<6F>n "Ejecutar Lectura" ? TgrBtn_Click() ?
???????????????????????????????????????????????????????????????
?
?
???????????????????????????????????
? <20>Se encontr<74> sensor? (reader_found) ?
???????????????????????????????????
?
???????????????????????
? ?
S<> (real) NO (debug)
? ?
? ?
Conecta a ???????????????????????????
sensor real ? <20>Globals.debug = true? ?
Env<6E>a LON ???????????????????????????
? ?
? ???????????????
? ? ?
? S<> NO
? ? ?
? ? ?
? Usa datos (No hace nada)
? simulados
???????????????????????????
?
?
ReceivedDataWrite()
(Procesa datos igual que
si vinieran del sensor real)
```
### 2. **Datos de Prueba Disponibles**
En `Globals.cs` tienes definido:
```csharp
private static string codigo = "0037613825"; // 30 lentes
public static string testdata = codigo + ":001," +
codigo + ":002," +
codigo + ":003," +
// ... hasta
codigo + ":030";
```
**Esto significa:** Se simula una lectura de 30 lentes, todos con el c<>digo `0037613825`.
---
## ?? Pasos para Hacer Pruebas
### **Paso 1: Verificar que Debug est<73> Activado**
Abre `Globals.cs` y confirma:
```csharp
public static Boolean debug = true; // ? Debe estar en true
```
### **Paso 2: Aseg<65>rate que el Sensor NO se Encuentra**
Cuando inicies el programa:
- Si el sensor est<73> en la red, se conectar<61> autom<6F>ticamente
- Si el sensor NO est<73> disponible:
- La etiqueta `sr2000w_ip_lbl` mostrar<61> `0.0.0.0` en rojo
- El bot<6F>n "Ejecutar Lectura" estar<61> deshabilitado EN MODO AUTOM<4F>TICO
- ? **Esto es correcto para debug**
### **Paso 3: Cambiar a Modo Manual**
1. Haz clic en el bot<6F>n **"Cambiar Modo"**
2. Selecciona **"Manual"**
3. El bot<6F>n "Ejecutar Lectura" ahora se habilitar<61>
### **Paso 4: Ejecutar la Prueba**
1. Haz clic en **"Ejecutar Lectura"**
2. **En la consola de Visual Studio ver<65>s:**
```
Ejecutando: BLOAD,1 en la linea XXX
Ejecutando: LON en la linea XXX
```
3. El programa usar<61> `Globals.testdata` en lugar del sensor
### **Paso 5: Espera los Resultados**
En el textbox "Data" ver<65>s:
```
0037613825:001,0037613825:002,0037613825:003,...,0037613825:030
```
**Resultados esperados:**
- ? **30 lentes OK** (todos el mismo c<>digo)
- El contador mostrar<61>: **OK: 30, NOK: 0, Questionable: 0**
- Se guardar<61> en CSV (si aplica)
- Se imprimir<69> en la etiqueta (si la impresora est<73> habilitada)
---
## ?? C<>mo Modificar los Datos de Prueba
### **Cambiar el C<>digo de Prueba**
En `Globals.cs`, busca esta l<>nea:
```csharp
private static string codigo = "0037613825"; // 30 lentes
```
C<EFBFBD>mbialo al c<>digo que desees probar:
```csharp
private static string codigo = "0123456789"; // Tu c<>digo
```
### **Cambiar la Cantidad de Lentes**
Actualmente simula 30 lentes (posiciones 001 a 030).
Para cambiar a 45 lentes, modifica:
```csharp
public static string testdata = codigo + ":001," +
codigo + ":002," +
// ... agrega m<>s l<>neas hasta :045
codigo + ":045";
```
### **Simular Errores (C<>digos Incorrectos)**
Para probar c<>mo reacciona el programa ante c<>digos incorrectos:
```csharp
public static string testdata = codigo + ":001," +
codigo + ":002," +
// ...
"0199170978" + ":015," + // ?? C<>digo diferente en posici<63>n 15
// ...
codigo + ":030";
```
**Resultado esperado:**
- OK: 29, NOK: 1
- El programa mostrar<61> **"X"** en la posici<63>n 15 con fondo rojo
### **Simular Lectura con Error**
```csharp
public static string testdata = "ERROR," + // Fuerza un error
codigo + ":001," +
// ... resto de datos
```
**Resultado esperado:**
- OK: 29, NOK: 0, Questionable: 1
---
## ?? Monitorizar Ejecuci<63>n
### **Ver Mensajes en Consola**
En Visual Studio:
1. **Debug ? Windows ? Output** (o `Ctrl + Alt + O`)
2. Ver<65>s todos los comandos ejecutados:
```
[TCP] Conectando a 192.168.100.100:9004...
ERROR: IpAddress no configurada (esperado en modo debug)
Ejecutando: BLOAD,1 en la linea 456
Ejecutando: LON en la linea 458
```
### **Ver Datos Procesados**
En el textbox etiquetado **"Data"** (arriba a la izquierda):
- Muestra los datos recibidos en bruto
- Se actualiza autom<6F>ticamente
### **Ver Resultados**
Los contadores en la pantalla:
- **OK:** Lentes que coinciden con el c<>digo master
- **NOK:** Lentes con c<>digo incorrecto
- **Questionable:** Lecturas con error
---
## ?? Flujo Completo de Prueba
```
1. Inicia ScanBox
?? Busca sensor en la red
?? No lo encuentra ? sr2000w_ip_lbl = 0.0.0.0 (rojo)
2. Cambias a "Modo Manual"
?? Bot<6F>n "Ejecutar Lectura" se habilita
3. Haces clic en "Ejecutar Lectura"
?? Verifica reader_found = false
?? Entra al bloque: if (Globals.debug)
?? Llama: ReceivedDataWrite(Globals.testdata)
4. ReceivedDataWrite procesa testdata
?? Divide por comas
?? Extrae c<>digo y posici<63>n
?? Compara con "master code"
?? Marca OK o NOK
5. Actualiza pantalla
?? Muestra contadores
?? Dibuja etiquetas (OK en verde, X en rojo)
?? Guarda en CSV si aplica
?? Imprime etiqueta si est<73> habilitado
6. El programa est<73> listo para otra lectura
```
---
## ?? Notas Importantes
1. **Debug solo funciona sin sensor:**
- Si conectas un sensor real, el programa lo usar<61>
- Para forzar debug, comenta la b<>squeda de sensores
2. **El c<>digo debe existir en la base de datos:**
- Si el c<>digo en `testdata` no est<73> en `data.json`, mostrar<61> error
- Verifica que `0037613825` exista en tu `data.json`
3. **La cantidad de lentes debe coincidir con la configuraci<63>n:**
- En `App.config`: `program1_OPCcodes = 1` (para 1 lente)
- Si `testdata` tiene 30 lentes, necesita un programa con 30+ lentes
4. **Cada lectura limpia los datos:**
- El textbox "Data" se borra despu<70>s de 5 segundos (configurable)
- Los contadores se reinician
---
## ?? Ejemplo Pr<50>ctico
### **Escenario: Probar con 3 c<>digos incorrectos en 30**
Modificar `Globals.cs`:
```csharp
private static string codigo = "0037613825";
public static string testdata = codigo + ":001," +
codigo + ":002," +
codigo + ":003," +
"9999999999" + ":004," + // ? C<>digo incorrecto
codigo + ":005," +
codigo + ":006," +
"1111111111" + ":007," + // ? C<>digo incorrecto
codigo + ":008," +
// ... m<>s l<>neas ...
"2222222222" + ":030"; // ? C<>digo incorrecto
```
**Resultado esperado:**
- OK: 27
- NOK: 3
- Fondo rojo ? "Uno o m<>s c<>digos son incorrectos"
- Opci<63>n para repetir o guardar
---
## ?? Casos de Prueba Recomendados
| Caso | Modificaci<63>n en testdata | Resultado Esperado |
|------|--------------------------|-------------------|
| **OK Completo** | Todos con mismo c<>digo | OK: 30, NOK: 0, Questionable: 0 |
| **Parcial OK** | 15 OK, 15 NOK | OK: 15, NOK: 15, Questionable: 0 |
| **Con Error** | Agregar "ERROR," | OK: 29, NOK: 0, Questionable: 1 |
| **C<>digo Incorrecto** | Cambiar c<>digo en posici<63>n 15 | OK: 29, NOK: 1, Questionable: 0 |
| **Caja Vac<61>a** | "ERROR," solo | OK: 0, NOK: 0, Questionable: 1 |
---
## ? Checklist para Empezar
- [ ] Verificar `Globals.debug = true`
- [ ] Verificar que el sensor NO est<73> disponible
- [ ] Verificar que el c<>digo en `testdata` existe en `data.json`
- [ ] Cambiar a "Modo Manual"
- [ ] Hacer clic en "Ejecutar Lectura"
- [ ] Ver resultados en pantalla
- [ ] Revisar la consola de Visual Studio para detalles
---
**<EFBFBD>Ya tienes todo lo necesario para hacer pruebas sin sensor!** ??

View File

@@ -19,9 +19,11 @@ namespace ScaBox30
public static List<User> users = new List<User>(); public static List<User> users = new List<User>();
public static List<Config> config = new List<Config>(); public static List<Config> config = new List<Config>();
public static Boolean valid_user = false; public static Boolean valid_user = false;
public static Boolean debug = false; public static Boolean debug = true;
public static Boolean boxcapacity = false; public static Boolean boxcapacity = false;
public static Config cfg = new Config(); public static Config cfg = new Config();
public static int consec = 1;
public static DateTime consecDate = DateTime.MinValue;
//Fields //Fields
@@ -61,7 +63,7 @@ namespace ScaBox30
//0037614674:001:26/583,0037614674:002:182/471,0037614674:003:281/474,0037614674:004:383/466,0037614674:005:487/463,0037614674:006:593/464,0037614674:007:695/461,0037614674:008:806/464,0037614674:009:913/476,0037614674:010:1021/479,0037614674:011:1136/487,0037614674:012:1231/486,0037614674:013:1337/484,0037614674:014:1441/489,0037614674:015:1545/482,0037614674:016:1653/488,0037614674:017:109/739,0037614674:018:440/731,0037614674:019:794/742,0037614674:020:1152/750,0037614674:021:1499/755,0037614674:022:51/1050,0037614674:023:201/948,0037614674:024:297/952,0037614674:025:402/954,0037614674:026:503/950,0037614674:027:605/957,0037614674:028:711/949,0037614674:029:817/955,0037614674:030:922/957,0037614674:031:1023/955,0037614674:032:1129/952,0037614674:033:1236/956,0037614674:034:1337/957,0037614674:035:1442/955,0037614674:036:1542/958,0037614674:037:1645/962,0037614674:038:1787/372,0037614674:039:1796/479,0037614674:040:1806/591,0037614674:041:1847/689,0037614674:042:1849/791,0037614674:043:1798/905,0037614674:044:1786/1018,0037614674:045:1784/1129 //0037614674:001:26/583,0037614674:002:182/471,0037614674:003:281/474,0037614674:004:383/466,0037614674:005:487/463,0037614674:006:593/464,0037614674:007:695/461,0037614674:008:806/464,0037614674:009:913/476,0037614674:010:1021/479,0037614674:011:1136/487,0037614674:012:1231/486,0037614674:013:1337/484,0037614674:014:1441/489,0037614674:015:1545/482,0037614674:016:1653/488,0037614674:017:109/739,0037614674:018:440/731,0037614674:019:794/742,0037614674:020:1152/750,0037614674:021:1499/755,0037614674:022:51/1050,0037614674:023:201/948,0037614674:024:297/952,0037614674:025:402/954,0037614674:026:503/950,0037614674:027:605/957,0037614674:028:711/949,0037614674:029:817/955,0037614674:030:922/957,0037614674:031:1023/955,0037614674:032:1129/952,0037614674:033:1236/956,0037614674:034:1337/957,0037614674:035:1442/955,0037614674:036:1542/958,0037614674:037:1645/962,0037614674:038:1787/372,0037614674:039:1796/479,0037614674:040:1806/591,0037614674:041:1847/689,0037614674:042:1849/791,0037614674:043:1798/905,0037614674:044:1786/1018,0037614674:045:1784/1129
/*public static string testdata = codigo + ":001:1138/525," + public static string testdata = codigo + ":001:1138/525," +
codigo + ":002:1138/525," + codigo + ":002:1138/525," +
codigo + ":003:1138/525," + codigo + ":003:1138/525," +
codigo + ":004:1138/525," + codigo + ":004:1138/525," +
@@ -107,9 +109,9 @@ namespace ScaBox30
codigo + ":042:1138/525," + codigo + ":042:1138/525," +
codigo + ":043:1138/525," + codigo + ":043:1138/525," +
//codigo + ":044:1138/525," + //codigo + ":044:1138/525," +
codigo + ":045:1138/525";*/ codigo + ":045:1138/525";
public static string testdata = codigo + ":001," + /* public static string testdata = codigo + ":001," +
codigo + ":002," + codigo + ":002," +
codigo + ":003," + codigo + ":003," +
codigo + ":004," + codigo + ":004," +
@@ -139,7 +141,8 @@ namespace ScaBox30
codigo + ":028," + codigo + ":028," +
codigo + ":029," + codigo + ":029," +
codigo + ":030"; codigo + ":030";
//"0199170978" + ":030"; //"0199170978" + ":030";
//"ERROR"; //"ERROR";
*/
} }
} }

View File

@@ -66,6 +66,7 @@
this.sr2000w_ip_lbl = new System.Windows.Forms.Label(); this.sr2000w_ip_lbl = new System.Windows.Forms.Label();
this.version = new System.Windows.Forms.Label(); this.version = new System.Windows.Forms.Label();
this.reader_connector = new System.Windows.Forms.Timer(this.components); this.reader_connector = new System.Windows.Forms.Timer(this.components);
this.bttnQA = new System.Windows.Forms.Button();
this.panelTitleBar.SuspendLayout(); this.panelTitleBar.SuspendLayout();
this.panelBody.SuspendLayout(); this.panelBody.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.blackimg_picbx)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.blackimg_picbx)).BeginInit();
@@ -166,6 +167,7 @@
// panelBody // panelBody
// //
this.panelBody.BackColor = System.Drawing.Color.WhiteSmoke; this.panelBody.BackColor = System.Drawing.Color.WhiteSmoke;
this.panelBody.Controls.Add(this.bttnQA);
this.panelBody.Controls.Add(this.labelRate); this.panelBody.Controls.Add(this.labelRate);
this.panelBody.Controls.Add(this.btnConfiguración); this.panelBody.Controls.Add(this.btnConfiguración);
this.panelBody.Controls.Add(this.barcode_lbl); this.panelBody.Controls.Add(this.barcode_lbl);
@@ -274,7 +276,7 @@
this.btnBD.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); this.btnBD.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(119)))), ((int)(((byte)(232)))));
this.btnBD.CausesValidation = false; this.btnBD.CausesValidation = false;
this.btnBD.ForeColor = System.Drawing.Color.White; this.btnBD.ForeColor = System.Drawing.Color.White;
this.btnBD.Location = new System.Drawing.Point(1001, 609); this.btnBD.Location = new System.Drawing.Point(956, 609);
this.btnBD.Name = "btnBD"; this.btnBD.Name = "btnBD";
this.btnBD.Size = new System.Drawing.Size(44, 58); this.btnBD.Size = new System.Drawing.Size(44, 58);
this.btnBD.TabIndex = 107; this.btnBD.TabIndex = 107;
@@ -434,7 +436,7 @@
this.DataText.Multiline = true; this.DataText.Multiline = true;
this.DataText.Name = "DataText"; this.DataText.Name = "DataText";
this.DataText.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.DataText.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.DataText.Size = new System.Drawing.Size(983, 58); this.DataText.Size = new System.Drawing.Size(938, 58);
this.DataText.TabIndex = 91; this.DataText.TabIndex = 91;
// //
// TgrBtn // TgrBtn
@@ -531,7 +533,7 @@
this.version.Name = "version"; this.version.Name = "version";
this.version.Size = new System.Drawing.Size(64, 21); this.version.Size = new System.Drawing.Size(64, 21);
this.version.TabIndex = 87; this.version.TabIndex = 87;
this.version.Text = "5.1"; this.version.Text = "5.0.2";
this.version.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.version.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
// //
// reader_connector // reader_connector
@@ -540,6 +542,20 @@
this.reader_connector.Interval = 5000; this.reader_connector.Interval = 5000;
this.reader_connector.Tick += new System.EventHandler(this.reader_connector_Tick); this.reader_connector.Tick += new System.EventHandler(this.reader_connector_Tick);
// //
// bttnQA
//
this.bttnQA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bttnQA.BackColor = System.Drawing.Color.Maroon;
this.bttnQA.CausesValidation = false;
this.bttnQA.ForeColor = System.Drawing.Color.White;
this.bttnQA.Location = new System.Drawing.Point(1003, 609);
this.bttnQA.Name = "bttnQA";
this.bttnQA.Size = new System.Drawing.Size(44, 58);
this.bttnQA.TabIndex = 114;
this.bttnQA.Text = "QA";
this.bttnQA.UseVisualStyleBackColor = false;
this.bttnQA.Click += new System.EventHandler(this.bttnQA_Click_1);
//
// Principal // Principal
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -605,5 +621,6 @@
private System.Windows.Forms.Button btnConfiguración; private System.Windows.Forms.Button btnConfiguración;
private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label labelRate; private System.Windows.Forms.Label labelRate;
private System.Windows.Forms.Button bttnQA;
} }
} }

View File

@@ -1,4 +1,4 @@
//using Keyence.AutoID.SDK; //using Keyence.AutoID.SDK;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration; using System.Configuration;
@@ -13,6 +13,7 @@ using ScaBox30.Model;
using ScaBox30.Controller; using ScaBox30.Controller;
using System.Text.Json; using System.Text.Json;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Reflection;
namespace ScaBox30 namespace ScaBox30
{ {
@@ -96,6 +97,9 @@ namespace ScaBox30
// Zebra printer variables // Zebra printer variables
ZebraController ZT231 = new ZebraController("Etiqueta.prn"); ZebraController ZT231 = new ZebraController("Etiqueta.prn");
// Screenshot capture variables
CapturaImagen capturaImagen = new CapturaImagen();
ErrorCode code_actual = ErrorCode.None; ErrorCode code_actual = ErrorCode.None;
@@ -158,7 +162,7 @@ namespace ScaBox30
m_searcher.Start((res) => m_searcher.Start((res) =>
{ {
//Define searched actions here.Defined actions work asynchronously. //Defines searched actions here.Defined actions work asynchronously.
//"SearchListUp" works when a reader was searched. //"SearchListUp" works when a reader was searched.
BeginInvoke(new delegateUserControl(SearchListUp), res.IpAddress); BeginInvoke(new delegateUserControl(SearchListUp), res.IpAddress);
}); });
@@ -188,6 +192,9 @@ namespace ScaBox30
// CARGA DE CONFIGURACIONES // CARGA DE CONFIGURACIONES
LoadConfigJson(Globals.config_json); LoadConfigJson(Globals.config_json);
// Initialize daily consecutive date to today to avoid unexpected reset on first print
Globals.consecDate = DateTime.Today;
if (Globals.cfg.printerenabled) if (Globals.cfg.printerenabled)
{ {
btnPrinter.ForeColor = Color.White; btnPrinter.ForeColor = Color.White;
@@ -344,14 +351,14 @@ namespace ScaBox30
if (received_data_package != "") if (received_data_package != "")
{ {
// En la exploración obtenemos los códigos recibidos y encontramos el que se repita más veces // En la exploraci<EFBFBD>n obtenemos los c<EFBFBD>digos recibidos y encontramos el que se repita m<EFBFBD>s veces
string[] tempTriad = new string[3]; string[] tempTriad = new string[3];
string boxType = ""; string boxType = "";
string command = "BLOAD,"; string command = "BLOAD,";
string response = ""; string response = "";
Data element = null; Data element = null;
// Limpieza de códigos coincidentes cada lectura // Limpieza de c<EFBFBD>digos coincidentes cada lectura
foundCodes.Clear(); foundCodes.Clear();
for (int i = 0; i < individual_receivedData.Count(); i++) for (int i = 0; i < individual_receivedData.Count(); i++)
{ {
@@ -371,8 +378,6 @@ namespace ScaBox30
string found_code = keyOfMaxCount; string found_code = keyOfMaxCount;
element = Globals.actual_data.Find(x => x.CCE.Equals(found_code)); //Busca el elemento que coincide con el codigo -> obtiene fila con la informacion de la etiqueta element = Globals.actual_data.Find(x => x.CCE.Equals(found_code)); //Busca el elemento que coincide con el codigo -> obtiene fila con la informacion de la etiqueta
Console.WriteLine($"Buscando código: '{found_code}'");
Console.WriteLine($"Total registros en BD: {Globals.actual_data.Count}");
Globals.found_element = element; Globals.found_element = element;
} }
@@ -393,7 +398,7 @@ namespace ScaBox30
labelCapacity.Text = temp.Length > 2 ? temp.Substring(0, 2) : temp; labelCapacity.Text = temp.Length > 2 ? temp.Substring(0, 2) : temp;
// El layout no está programado en el scanner // El layout no est<EFBFBD> programado en el scanner
if (boxType == null) if (boxType == null)
{ {
ClearScreen(); ClearScreen();
@@ -405,12 +410,18 @@ namespace ScaBox30
{ {
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber(); int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Console.WriteLine("Ejecutando: {0} en la linea {1}", command, lineNumber + 2); Console.WriteLine("Ejecutando: {0} en la linea {1}", command, lineNumber + 2);
response = m_reader.ExecCommand(command); // En modo debug, no enviar comando al sensor
if (!Globals.debug)
{
response = m_reader.ExecCommand(command);
}
else
{
response = "OK"; // Simular respuesta
}
System.Threading.Thread.Sleep(Globals.cfg.interval); System.Threading.Thread.Sleep(Globals.cfg.interval);
} }
Console.WriteLine("[DEBUG] BLOAD completado, esperando 300ms para estabilización...");
System.Threading.Thread.Sleep(300); // El sensor necesita tiempo después de cambiar programa
response = ""; response = "";
@@ -433,7 +444,7 @@ namespace ScaBox30
response = ""; response = "";
} }
} }
//Console.WriteLine(command); Console.WriteLine(command);
} }
@@ -506,9 +517,6 @@ namespace ScaBox30
{ {
ok_count++; ok_count++;
labels_ok2[ordered_receivedData[i + 1].position].Visible = true; labels_ok2[ordered_receivedData[i + 1].position].Visible = true;
//labels_ok2[ordered_receivedData[i + 1].position].Text = "OK";
//labels_ok2[ordered_receivedData[i + 1].position].Text = ordered_receivedData[i + 1].position.ToString();
//labels_ok2[ordered_receivedData[i + 1].position].Text = Globals.cfg.resultado.Equals("number") ? ordered_receivedData[i + 1].position.ToString() : "OK" ;
switch (Globals.cfg.resultado) switch (Globals.cfg.resultado)
{ {
case "number": case "number":
@@ -532,9 +540,6 @@ namespace ScaBox30
{ {
bad_count++; bad_count++;
labels_ok2[ordered_receivedData[i + 1].position].Visible = true; labels_ok2[ordered_receivedData[i + 1].position].Visible = true;
//labels_ok2[ordered_receivedData[i + 1].position].Text = "X";
//labels_ok2[ordered_receivedData[i + 1].position].Text = ordered_receivedData[i + 1].position.ToString();
//labels_ok2[ordered_receivedData[i + 1].position].Text = Globals.cfg.resultado.Equals("number") ? ordered_receivedData[i + 1].position.ToString() : "X";
switch (Globals.cfg.resultado) switch (Globals.cfg.resultado)
{ {
case "number": case "number":
@@ -576,8 +581,12 @@ namespace ScaBox30
TgrBtn.Enabled = true; TgrBtn.Enabled = true;
//Change background color to red //Change background color to red
this.BackColor = Color.Red; this.BackColor = Color.Red;
DialogResult dialogResult = RJMessageBox.Show("Uno o más codigos son incorrectos!", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Error); DialogResult dialogResult = RJMessageBox.Show("Uno o m<EFBFBD>s codigos son incorrectos!", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.BackColor = SystemColors.Control; this.BackColor = SystemColors.Control;
// Capturar zona del PictureBox cuando hay errores para auditor<6F>a
capturaImagen.CapturarImg(blackimg_picbx);
capturaImagen.GuardarImg(barcode_lbl.Text + "_ERROR", operatorTag);
} }
//If 1 or more codes are questionable (utr_count>0) the user has to decide if the results are added to the csv file //If 1 or more codes are questionable (utr_count>0) the user has to decide if the results are added to the csv file
@@ -588,7 +597,7 @@ namespace ScaBox30
TgrBtn.Enabled = true; TgrBtn.Enabled = true;
//Change background color to red //Change background color to red
this.BackColor = Color.Red; this.BackColor = Color.Red;
DialogResult dialogResult = RJMessageBox.Show("¿Desea realizar la prueba de nuevo?", "ScanBox", MessageBoxButtons.YesNo, MessageBoxIcon.Information); DialogResult dialogResult = RJMessageBox.Show("<EFBFBD>Desea realizar la prueba de nuevo?", "ScanBox", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
this.BackColor = SystemColors.Control; this.BackColor = SystemColors.Control;
if (dialogResult == DialogResult.Yes) if (dialogResult == DialogResult.Yes)
@@ -608,6 +617,10 @@ namespace ScaBox30
labelRate.Text = (time.TotalMilliseconds / 1000).ToString().Substring(0, 5) + " Seg."; labelRate.Text = (time.TotalMilliseconds / 1000).ToString().Substring(0, 5) + " Seg.";
TgrBtn.Enabled = true; TgrBtn.Enabled = true;
save_data = true; save_data = true;
// Capturar zona del PictureBox despu<70>s del segundo escaneo exitoso
capturaImagen.CapturarImg(blackimg_picbx);
capturaImagen.GuardarImg(barcode_lbl.Text, operatorTag);
} }
@@ -627,7 +640,7 @@ namespace ScaBox30
} }
catch (IOException) catch (IOException)
{ {
RJMessageBox.Show("¡El archivo se encuentra abierto!\nCierre el archivo y repita la lectura.", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Warning); RJMessageBox.Show("<EFBFBD>El archivo se encuentra abierto!\nCierre el archivo y repita la lectura.", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} }
} }
else else
@@ -684,7 +697,7 @@ namespace ScaBox30
} }
else else
{ {
RJMessageBox.Show("El opc no tiene un boxcapacity correcto. Por favor configúrelo en la base de datos primero y después repita la prueba.", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Stop); RJMessageBox.Show("El opc no tiene un boxcapacity correcto. Por favor config<EFBFBD>relo en la base de datos primero y despu<EFBFBD>s repita la prueba.", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Stop);
} }
save_data = false; save_data = false;
@@ -697,7 +710,7 @@ namespace ScaBox30
private void btnToogleMode_Click(object sender, EventArgs e) private void btnToogleMode_Click(object sender, EventArgs e)
{ {
DialogResult result = RJMessageBox.Show("Desea cambiar el modo de operación a " + (scanbox ? operation_mode.manual : operation_mode.automatico) + "?", "ScanBox", MessageBoxButtons.OKCancel); DialogResult result = RJMessageBox.Show("Desea cambiar el modo de operaci<EFBFBD>n a " + (scanbox ? operation_mode.manual : operation_mode.automatico) + "?", "ScanBox", MessageBoxButtons.OKCancel);
if (result == DialogResult.OK) if (result == DialogResult.OK)
{ {
@@ -714,7 +727,8 @@ namespace ScaBox30
{ {
//ESTABLECE EL MODO DE OPERACION A MANUAL (ESCANER 1D) //ESTABLECE EL MODO DE OPERACION A MANUAL (ESCANER 1D)
scanbox = false; scanbox = false;
TgrBtn.Enabled = false; // En modo manual, habilitar el bot<6F>n si debug est<73> activado o hay sensor
TgrBtn.Enabled = (Globals.debug || reader_connected) ? true : false;
UpdateTgrBtn(); UpdateTgrBtn();
KeyPreview = true; //Habilita el scanner 1d KeyPreview = true; //Habilita el scanner 1d
ActiveControl = barcode_lbl; ActiveControl = barcode_lbl;
@@ -744,9 +758,6 @@ namespace ScaBox30
//disable image clear timer //disable image clear timer
timer1.Enabled = false; timer1.Enabled = false;
//Disable button for re-clic and master barcode from being scanned //Disable button for re-clic and master barcode from being scanned
TgrBtn.Enabled = false; TgrBtn.Enabled = false;
UpdateTgrBtn(); UpdateTgrBtn();
@@ -763,8 +774,8 @@ namespace ScaBox30
// REFERENCIA DE COMANDOS UTILIZADOS OBTENIDOS DEL MANUAL // REFERENCIA DE COMANDOS UTILIZADOS OBTENIDOS DEL MANUAL
// LON -> Inicia la lectura // LON -> Inicia la lectura
// BLOAD -> Carga archivos de copia de seguridad // BLOAD -> Carga archivos de copia de seguridad
// RP -> Comando de configuración de operación // RP -> Comando de configuraci<EFBFBD>n de operaci<EFBFBD>n
// RP 215 -> Especificación de rango de captura de imagen // RP 215 -> Especificaci<EFBFBD>n de rango de captura de imagen
if (reader_found) if (reader_found)
{ {
@@ -772,7 +783,7 @@ namespace ScaBox30
string command = "BLOAD," + program; string command = "BLOAD," + program;
string response = ""; string response = "";
//Envía el comando hasta obtener una respuest //Env<EFBFBD>a el comando hasta obtener una respuest
while (response.Equals(string.Empty)) while (response.Equals(string.Empty))
{ {
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber(); int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
@@ -809,16 +820,32 @@ namespace ScaBox30
//Dispose before closing Form for avoiding error. //Dispose before closing Form for avoiding error.
private void Form1_FormClosing(object sender, FormClosingEventArgs e) private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{ {
m_reader.Dispose(); m_reader?.Dispose();
m_searcher.Dispose(); m_searcher?.Dispose();
liveviewForm1.Dispose(); liveviewForm1?.Dispose();
capturaImagen?.Dispose();
} }
private Form CreateDataUIInstance()
{
// Use reflection to instantiate the Form type named "DataUI" (avoids compiler ambiguity if a generated resource class shares the name)
var asm = typeof(Principal).Assembly;
var dataUiType = asm.GetTypes().FirstOrDefault(t => t.Name == "DataUI" && typeof(Form).IsAssignableFrom(t));
if (dataUiType != null)
{
return Activator.CreateInstance(dataUiType) as Form;
}
return null;
}
private void btnBD_MouseClick(object sender, MouseEventArgs e) private void btnBD_MouseClick(object sender, MouseEventArgs e)
{ {
DataUI data = new DataUI(); var dataForm = CreateDataUIInstance();
data.ShowDialog(); if (dataForm != null)
{
dataForm.ShowDialog();
}
} }
@@ -920,7 +947,6 @@ namespace ScaBox30
string sr2000w_ip; string sr2000w_ip;
sr2000w_ip = Globals.cfg.ipscanner; sr2000w_ip = Globals.cfg.ipscanner;
if (reader_found) if (reader_found)
{ {
//Stop liveview. //Stop liveview.
@@ -1033,7 +1059,7 @@ namespace ScaBox30
{ {
sensor_ip_list.Add(ip); sensor_ip_list.Add(ip);
//if (ConfigurationManager.AppSettings.Get("sr2000w_ip") == ip) //if (ConfigurationManager.AppSettings.Get("sr2000w_ip") == ip)
if (Globals.cfg.ipscanner == ip) if ( Globals.cfg.ipscanner == ip)
{ {
sr2000w_ip_lbl.Text = ip; sr2000w_ip_lbl.Text = ip;
reader_found = true; reader_found = true;
@@ -1084,7 +1110,7 @@ namespace ScaBox30
Globals.cfg.usbprinter = "none"; Globals.cfg.usbprinter = "none";
Globals.cfg.ipprinter = "192.168.100.101"; Globals.cfg.ipprinter = "192.168.100.101";
Globals.cfg.printertype = "eth"; // Puede ser eth o usb Globals.cfg.printertype = "eth"; // Puede ser eth o usb
Globals.cfg.resultado = "label"; // Etiquetas mostradas en el layout (OK,X), Región ó (OK,X) + Región Globals.cfg.resultado = "label"; // Etiquetas mostradas en el layout (OK,X), Regi<EFBFBD>n <EFBFBD> (OK,X) + Regi<EFBFBD>n
Globals.cfg.printerenabled = true; Globals.cfg.printerenabled = true;
Globals.config.Clear(); Globals.config.Clear();
@@ -1112,8 +1138,25 @@ namespace ScaBox30
// | | // | |
// | | // | |
// -----------------* // -----------------*
// (c,d) // (c,d)
// En modo debug, no intentar leer del sensor
if (Globals.debug)
{
// Usar valores por defecto para debug
xLeftCornner = 0;
yLeftCornner = 0;
xScale = 1;
yScale = 1;
globalScale = 1;
imgWidth = liveviewForm1?.Bounds.Width ?? 800;
imgHeight = liveviewForm1?.Bounds.Height ?? 600;
xOffset = 0;
yOffset = 0;
return;
}
//Get LiveView Size for scale and scale from sensor using command RP,215 //Get LiveView Size for scale and scale from sensor using command RP,215
imageAreaStr = m_reader.ExecCommand("RP,215"); //Read captured image area imageAreaStr = m_reader.ExecCommand("RP,215"); //Read captured image area
//List<string> coordinates = (from Match m in Regex.Matches(imageAreaStr, @"\d{4}") select m.Value).Where(p => !string.IsNullOrEmpty(p)).ToList(); //List<string> coordinates = (from Match m in Regex.Matches(imageAreaStr, @"\d{4}") select m.Value).Where(p => !string.IsNullOrEmpty(p)).ToList();
@@ -1165,16 +1208,26 @@ namespace ScaBox30
if (Globals.cfg.printerenabled) if (Globals.cfg.printerenabled)
{ {
// Reset daily consecutive counter if day changed
if (Globals.consecDate.Date != DateTime.Today)
{
Globals.consec = 1;
Globals.consecDate = DateTime.Today;
}
string etiqueta = barcode_lbl.Text; string etiqueta = barcode_lbl.Text;
if (Globals.found_element.CCE == etiqueta) if (Globals.found_element.CCE == etiqueta)
{ {
String v1 = Globals.found_element.nom_1; String v1 = Globals.found_element.nom_1;
String v2 = Globals.found_element.@base + " / " + Globals.found_element.addition + " " + Globals.found_element.oeil; String v2 = Globals.found_element.@base + " / " + Globals.found_element.addition + " " + Globals.found_element.oeil;
String v3 = btnToogleMode.Text == operation_mode.manual ? "" : completa_parcial + " contiene: " + ok_count.ToString() + " de: " + Globals.found_element.Box_Capacity.Substring(0, 2); // Mostrar informaci<63>n en todos los modos (manual y scanbox)
String v3 = completa_parcial + ": " + ok_count.ToString() + " de " + Globals.found_element.Box_Capacity.Substring(0, 2);
String v4 = Globals.consec.ToString("D5"); //Numero consecutivo
DateTime v5 = DateTime.Now; //Fecha y hora de impresi<73>n
String barcode = Globals.found_element.CCE; String barcode = Globals.found_element.CCE;
ZT231.buildPrn(v1, v2, v3, barcode); ZT231.buildPrn(v1, v2, v3, v4, v5, barcode);
switch (Globals.cfg.printertype) switch (Globals.cfg.printertype)
{ {
@@ -1186,6 +1239,7 @@ namespace ScaBox30
break; break;
} }
} }
Globals.consec++;
} }
} }
@@ -1249,13 +1303,20 @@ namespace ScaBox30
{ {
if (result != DialogResult.Cancel) if (result != DialogResult.Cancel)
{ {
RJMessageBox.Show("No tiene permiso para realizar esta acción", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Warning); RJMessageBox.Show("No tiene permiso para realizar esta acci<EFBFBD>n", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} }
} }
} }
} }
private void bttnQA_Click_1(object sender, EventArgs e)
{
}
} }
} }

View File

@@ -124,7 +124,7 @@
<data name="blackimg_picbx.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="blackimg_picbx.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAA44AAAGLCAIAAAAHx1tZAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO iVBORw0KGgoAAAANSUhEUgAAA44AAAGLCAIAAAAHx1tZAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAABCxJREFUeF7twTEBAAAAwqD1T20Gf6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA wgAADsIBFShKgAAABCxJREFUeF7twTEBAAAAwqD1T20Gf6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@@ -149,7 +149,7 @@
<value>105, 12</value> <value>105, 12</value>
</metadata> </metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>51</value> <value>25</value>
</metadata> </metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>

File diff suppressed because one or more lines are too long

View File

@@ -215,6 +215,7 @@
<Compile Include="Ayuda.Designer.cs"> <Compile Include="Ayuda.Designer.cs">
<DependentUpon>Ayuda.cs</DependentUpon> <DependentUpon>Ayuda.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="CapturaImagen.cs" />
<Compile Include="ConfigTable.cs" /> <Compile Include="ConfigTable.cs" />
<Compile Include="Controller\DbController.cs" /> <Compile Include="Controller\DbController.cs" />
<Compile Include="Controller\ZebraController.cs" /> <Compile Include="Controller\ZebraController.cs" />
@@ -299,6 +300,8 @@
<EmbeddedResource Include="Usuario.resx"> <EmbeddedResource Include="Usuario.resx">
<DependentUpon>Usuario.cs</DependentUpon> <DependentUpon>Usuario.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<None Include="data.json" />
<None Include="GUIA_PRUEBAS_SIN_SENSOR.md" />
<None Include="packages.config" /> <None Include="packages.config" />
<None Include="Properties\Settings.settings"> <None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator> <Generator>SettingsSingleFileGenerator</Generator>
@@ -329,6 +332,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Resources\chat.png" /> <None Include="Resources\chat.png" />
<None Include="Resources\data.json" />
<None Include="Resources\error.png" /> <None Include="Resources\error.png" />
<None Include="Resources\exclamation.png" /> <None Include="Resources\exclamation.png" />
<None Include="Resources\information.png" /> <None Include="Resources\information.png" />

1
ScanBox/data.json Normal file

File diff suppressed because one or more lines are too long

1
data.json Normal file

File diff suppressed because one or more lines are too long